From 9ed9a9f1052e8eb02da3804c9e0fe431cb3c1de6 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Wed, 25 Jul 2007 07:09:26 +0000 Subject: [PATCH 0001/1156] Initial import git-svn-id: http://macvim.googlecode.com/svn/trunk@5 96c4425d-ca35-0410-94e5-3396d5c13a8f --- Colors.plist | 1326 ++++++++++++ Credits.rtf | 25 + English.lproj/InfoPlist.strings | Bin 0 -> 194 bytes English.lproj/MainMenu.nib/classes.nib | 23 + English.lproj/MainMenu.nib/info.nib | 21 + English.lproj/MainMenu.nib/keyedobjects.nib | Bin 0 -> 7901 bytes English.lproj/VimWindow.nib/classes.nib | 35 + English.lproj/VimWindow.nib/info.nib | 20 + English.lproj/VimWindow.nib/keyedobjects.nib | Bin 0 -> 5460 bytes Info.plist | 550 +++++ MMAppController.h | 25 + MMAppController.m | 182 ++ MMBackend.h | 81 + MMBackend.m | 1046 +++++++++ MMTextStorage.h | 60 + MMTextStorage.m | 554 +++++ MMTextView.h | 28 + MMTextView.m | 401 ++++ MMVimController.h | 34 + MMVimController.m | 819 +++++++ MMWindowController.h | 54 + MMWindowController.m | 987 +++++++++ MacVim.h | 102 + MacVim.m | 86 + MacVim.xcodeproj/project.pbxproj | 651 ++++++ MacVim.xcodeproj/winckler.mode1 | 1348 ++++++++++++ MacVim.xcodeproj/winckler.pbxuser | 247 +++ MacVim_Prefix.pch | 7 + .../English.lproj/InfoPlist.strings | Bin 0 -> 208 bytes .../English.lproj/MainMenu.nib/classes.nib | 24 + .../English.lproj/MainMenu.nib/info.nib | 21 + .../MainMenu.nib/keyedobjects.nib | Bin 0 -> 11566 bytes .../English.lproj/MainMenu.nib/objects.nib | Bin 0 -> 4740 bytes .../PSMTabBarControlInspector.nib/classes.nib | 22 + .../PSMTabBarControlInspector.nib/info.nib | 16 + .../keyedobjects.nib | Bin 0 -> 11273 bytes .../PSMTabBarControlInspector.nib/objects.nib | Bin 0 -> 4291 bytes .../PSMTabBarControlPalette.nib/classes.nib | 28 + .../PSMTabBarControlPalette.nib/info.nib | 16 + .../keyedobjects.nib | Bin 0 -> 3036 bytes .../PSMTabBarControlPalette.nib/objects.nib | Bin 0 -> 1004 bytes .../English.lproj/Window.nib/classes.nib | 38 + .../English.lproj/Window.nib/info.nib | 25 + .../English.lproj/Window.nib/keyedobjects.nib | Bin 0 -> 16340 bytes PSMTabBarControl/Info.plist | 24 + .../PSMTabBarControl.ibclassdescription | 7 + .../PSMTabBarControl.xcodeproj/johnp.mode1 | 1551 +++++++++++++ .../PSMTabBarControl.xcodeproj/johnp.pbxuser | 1920 +++++++++++++++++ .../project.pbxproj | 677 ++++++ .../PSMTabBarControl.xcodeproj/winckler.mode1 | 1330 ++++++++++++ .../winckler.pbxuser | 178 ++ .../PSMTabBarControlFramework-Info.plist | 22 + PSMTabBarControl/PSMTabBarControl_Prefix.pch | 8 + PSMTabBarControl/ReadMe.rtfd/TXT.rtf | 186 ++ PSMTabBarControl/ReadMe.rtfd/startpage.gif | Bin 0 -> 11246 bytes PSMTabBarControl/TabBarControlDemo-Info.plist | 24 + .../documentation/PSMTabBarControlDoc.html | 301 +++ .../documentation/frameset_styles.css | 943 ++++++++ PSMTabBarControl/images/32x32_log.tiff | Bin 0 -> 20328 bytes PSMTabBarControl/images/32x32cancel.png | Bin 0 -> 1447 bytes .../images/AquaTabClose_Front.tif | Bin 0 -> 15388 bytes .../images/AquaTabClose_Front_Pressed.tif | Bin 0 -> 15416 bytes .../images/AquaTabClose_Front_Rollover.tif | Bin 0 -> 15444 bytes PSMTabBarControl/images/AquaTabNew.png | Bin 0 -> 3139 bytes PSMTabBarControl/images/AquaTabNewPressed.png | Bin 0 -> 3157 bytes .../images/AquaTabNewRollover.png | Bin 0 -> 3147 bytes .../images/AquaTabsBackground.png | Bin 0 -> 3091 bytes PSMTabBarControl/images/AquaTabsDown.png | Bin 0 -> 2901 bytes .../images/AquaTabsDownGraphite.png | Bin 0 -> 843 bytes .../images/AquaTabsDownNonKey.png | Bin 0 -> 787 bytes PSMTabBarControl/images/AquaTabsSeparator.png | Bin 0 -> 257 bytes .../images/AquaTabsSeparatorDown.png | Bin 0 -> 264 bytes PSMTabBarControl/images/Folder.tif | Bin 0 -> 926 bytes PSMTabBarControl/images/Globe.tiff | Bin 0 -> 17104 bytes PSMTabBarControl/images/TabClose_Front.tif | Bin 0 -> 518 bytes .../images/TabClose_Front_Pressed.tif | Bin 0 -> 520 bytes .../images/TabClose_Front_Rollover.tif | Bin 0 -> 514 bytes PSMTabBarControl/images/TabControlRep.tif | Bin 0 -> 29768 bytes PSMTabBarControl/images/TabIcon.tif | Bin 0 -> 21160 bytes PSMTabBarControl/images/TabNewMetal.png | Bin 0 -> 3137 bytes .../images/TabNewMetalPressed.png | Bin 0 -> 3160 bytes .../images/TabNewMetalRollover.png | Bin 0 -> 3146 bytes PSMTabBarControl/images/Warning.png | Bin 0 -> 3412 bytes PSMTabBarControl/images/overflowImage.tiff | Bin 0 -> 1018 bytes .../images/overflowImagePressed.tif | Bin 0 -> 1018 bytes PSMTabBarControl/images/pi.png | Bin 0 -> 3396 bytes PSMTabBarControl/palette.table | 42 + PSMTabBarControl/source/AppController.h | 17 + PSMTabBarControl/source/AppController.m | 30 + PSMTabBarControl/source/FakeModel.h | 34 + PSMTabBarControl/source/FakeModel.m | 77 + .../source/NSBezierPath_AMShading.h | 23 + .../source/NSBezierPath_AMShading.m | 169 ++ PSMTabBarControl/source/PSMAquaTabStyle.h | 32 + PSMTabBarControl/source/PSMAquaTabStyle.m | 516 +++++ PSMTabBarControl/source/PSMMetalTabStyle.h | 26 + PSMTabBarControl/source/PSMMetalTabStyle.m | 524 +++++ .../source/PSMOverflowPopUpButton.h | 21 + .../source/PSMOverflowPopUpButton.m | 89 + .../source/PSMProgressIndicator.h | 23 + .../source/PSMProgressIndicator.m | 20 + PSMTabBarControl/source/PSMRolloverButton.h | 29 + PSMTabBarControl/source/PSMRolloverButton.m | 107 + PSMTabBarControl/source/PSMTabBarCell.h | 102 + PSMTabBarControl/source/PSMTabBarCell.m | 397 ++++ PSMTabBarControl/source/PSMTabBarControl.h | 124 ++ PSMTabBarControl/source/PSMTabBarControl.m | 1398 ++++++++++++ .../source/PSMTabBarControlInspector.h | 23 + .../source/PSMTabBarControlInspector.m | 99 + .../source/PSMTabBarControlPalette.h | 21 + .../source/PSMTabBarControlPalette.m | 35 + .../source/PSMTabBarControl_Prefix.pch | 8 + PSMTabBarControl/source/PSMTabDragAssistant.h | 84 + PSMTabBarControl/source/PSMTabDragAssistant.m | 439 ++++ PSMTabBarControl/source/PSMTabStyle.h | 52 + PSMTabBarControl/source/PSMUnifiedTabStyle.h | 24 + PSMTabBarControl/source/PSMUnifiedTabStyle.m | 529 +++++ PSMTabBarControl/source/WindowController.h | 58 + PSMTabBarControl/source/WindowController.m | 280 +++ PSMTabBarControl/source/main.m | 14 + PSMTabBarControl/version.plist | 16 + README | 145 ++ SpecialKeys.plist | 62 + TODO | 114 + Toolbar/Attention.png | Bin 0 -> 1931 bytes Toolbar/Copy.png | Bin 0 -> 1075 bytes Toolbar/Cut.png | Bin 0 -> 1379 bytes Toolbar/FindHelp.png | Bin 0 -> 1983 bytes Toolbar/FindNext.png | Bin 0 -> 1596 bytes Toolbar/FindPrev.png | Bin 0 -> 1595 bytes Toolbar/Help.png | Bin 0 -> 2461 bytes Toolbar/LoadSesn.png | Bin 0 -> 1757 bytes Toolbar/Make.png | Bin 0 -> 2113 bytes Toolbar/Open.png | Bin 0 -> 1365 bytes Toolbar/Paste.png | Bin 0 -> 1550 bytes Toolbar/Print.png | Bin 0 -> 1482 bytes Toolbar/Redo.png | Bin 0 -> 1236 bytes Toolbar/Replace.png | Bin 0 -> 1777 bytes Toolbar/RunCtags.png | Bin 0 -> 1225 bytes Toolbar/RunScript.png | Bin 0 -> 2166 bytes Toolbar/Save.png | Bin 0 -> 1440 bytes Toolbar/SaveAll.png | Bin 0 -> 2002 bytes Toolbar/SaveSesn.png | Bin 0 -> 2039 bytes Toolbar/TagJump.png | Bin 0 -> 1154 bytes Toolbar/Undo.png | Bin 0 -> 1178 bytes VimColorList.clr | 803 +++++++ doc-bm-c.icns | Bin 0 -> 39682 bytes doc-bm-h.icns | Bin 0 -> 39691 bytes doc-bm-html.icns | Bin 0 -> 40619 bytes doc-bm-java.icns | Bin 0 -> 40589 bytes doc-bm-php.icns | Bin 0 -> 40303 bytes doc-bm-pl.icns | Bin 0 -> 39845 bytes doc-bm-sh.icns | Bin 0 -> 39997 bytes doc-bm-tex.icns | Bin 0 -> 40095 bytes doc-bm-txt.icns | Bin 0 -> 40106 bytes doc-bm-xml.icns | Bin 0 -> 40446 bytes doc-bm.icns | Bin 0 -> 42287 bytes gui_macvim.m | 1200 +++++++++++ main.m | 16 + vim_gloss.icns | Bin 0 -> 55320 bytes 160 files changed, 23895 insertions(+) create mode 100644 Colors.plist create mode 100644 Credits.rtf create mode 100644 English.lproj/InfoPlist.strings create mode 100644 English.lproj/MainMenu.nib/classes.nib create mode 100644 English.lproj/MainMenu.nib/info.nib create mode 100644 English.lproj/MainMenu.nib/keyedobjects.nib create mode 100644 English.lproj/VimWindow.nib/classes.nib create mode 100644 English.lproj/VimWindow.nib/info.nib create mode 100644 English.lproj/VimWindow.nib/keyedobjects.nib create mode 100644 Info.plist create mode 100644 MMAppController.h create mode 100644 MMAppController.m create mode 100644 MMBackend.h create mode 100644 MMBackend.m create mode 100644 MMTextStorage.h create mode 100644 MMTextStorage.m create mode 100644 MMTextView.h create mode 100644 MMTextView.m create mode 100644 MMVimController.h create mode 100644 MMVimController.m create mode 100644 MMWindowController.h create mode 100644 MMWindowController.m create mode 100644 MacVim.h create mode 100644 MacVim.m create mode 100644 MacVim.xcodeproj/project.pbxproj create mode 100644 MacVim.xcodeproj/winckler.mode1 create mode 100644 MacVim.xcodeproj/winckler.pbxuser create mode 100644 MacVim_Prefix.pch create mode 100644 PSMTabBarControl/English.lproj/InfoPlist.strings create mode 100644 PSMTabBarControl/English.lproj/MainMenu.nib/classes.nib create mode 100644 PSMTabBarControl/English.lproj/MainMenu.nib/info.nib create mode 100644 PSMTabBarControl/English.lproj/MainMenu.nib/keyedobjects.nib create mode 100644 PSMTabBarControl/English.lproj/MainMenu.nib/objects.nib create mode 100644 PSMTabBarControl/English.lproj/PSMTabBarControlInspector.nib/classes.nib create mode 100644 PSMTabBarControl/English.lproj/PSMTabBarControlInspector.nib/info.nib create mode 100644 PSMTabBarControl/English.lproj/PSMTabBarControlInspector.nib/keyedobjects.nib create mode 100644 PSMTabBarControl/English.lproj/PSMTabBarControlInspector.nib/objects.nib create mode 100644 PSMTabBarControl/English.lproj/PSMTabBarControlPalette.nib/classes.nib create mode 100644 PSMTabBarControl/English.lproj/PSMTabBarControlPalette.nib/info.nib create mode 100644 PSMTabBarControl/English.lproj/PSMTabBarControlPalette.nib/keyedobjects.nib create mode 100644 PSMTabBarControl/English.lproj/PSMTabBarControlPalette.nib/objects.nib create mode 100644 PSMTabBarControl/English.lproj/Window.nib/classes.nib create mode 100644 PSMTabBarControl/English.lproj/Window.nib/info.nib create mode 100644 PSMTabBarControl/English.lproj/Window.nib/keyedobjects.nib create mode 100644 PSMTabBarControl/Info.plist create mode 100755 PSMTabBarControl/PSMTabBarControl.ibclassdescription create mode 100644 PSMTabBarControl/PSMTabBarControl.xcodeproj/johnp.mode1 create mode 100644 PSMTabBarControl/PSMTabBarControl.xcodeproj/johnp.pbxuser create mode 100644 PSMTabBarControl/PSMTabBarControl.xcodeproj/project.pbxproj create mode 100644 PSMTabBarControl/PSMTabBarControl.xcodeproj/winckler.mode1 create mode 100644 PSMTabBarControl/PSMTabBarControl.xcodeproj/winckler.pbxuser create mode 100644 PSMTabBarControl/PSMTabBarControlFramework-Info.plist create mode 100644 PSMTabBarControl/PSMTabBarControl_Prefix.pch create mode 100644 PSMTabBarControl/ReadMe.rtfd/TXT.rtf create mode 100644 PSMTabBarControl/ReadMe.rtfd/startpage.gif create mode 100644 PSMTabBarControl/TabBarControlDemo-Info.plist create mode 100644 PSMTabBarControl/documentation/PSMTabBarControlDoc.html create mode 100644 PSMTabBarControl/documentation/frameset_styles.css create mode 100644 PSMTabBarControl/images/32x32_log.tiff create mode 100644 PSMTabBarControl/images/32x32cancel.png create mode 100644 PSMTabBarControl/images/AquaTabClose_Front.tif create mode 100644 PSMTabBarControl/images/AquaTabClose_Front_Pressed.tif create mode 100644 PSMTabBarControl/images/AquaTabClose_Front_Rollover.tif create mode 100644 PSMTabBarControl/images/AquaTabNew.png create mode 100644 PSMTabBarControl/images/AquaTabNewPressed.png create mode 100644 PSMTabBarControl/images/AquaTabNewRollover.png create mode 100644 PSMTabBarControl/images/AquaTabsBackground.png create mode 100644 PSMTabBarControl/images/AquaTabsDown.png create mode 100644 PSMTabBarControl/images/AquaTabsDownGraphite.png create mode 100644 PSMTabBarControl/images/AquaTabsDownNonKey.png create mode 100644 PSMTabBarControl/images/AquaTabsSeparator.png create mode 100644 PSMTabBarControl/images/AquaTabsSeparatorDown.png create mode 100644 PSMTabBarControl/images/Folder.tif create mode 100644 PSMTabBarControl/images/Globe.tiff create mode 100644 PSMTabBarControl/images/TabClose_Front.tif create mode 100644 PSMTabBarControl/images/TabClose_Front_Pressed.tif create mode 100644 PSMTabBarControl/images/TabClose_Front_Rollover.tif create mode 100644 PSMTabBarControl/images/TabControlRep.tif create mode 100644 PSMTabBarControl/images/TabIcon.tif create mode 100644 PSMTabBarControl/images/TabNewMetal.png create mode 100644 PSMTabBarControl/images/TabNewMetalPressed.png create mode 100644 PSMTabBarControl/images/TabNewMetalRollover.png create mode 100644 PSMTabBarControl/images/Warning.png create mode 100755 PSMTabBarControl/images/overflowImage.tiff create mode 100755 PSMTabBarControl/images/overflowImagePressed.tif create mode 100644 PSMTabBarControl/images/pi.png create mode 100644 PSMTabBarControl/palette.table create mode 100644 PSMTabBarControl/source/AppController.h create mode 100644 PSMTabBarControl/source/AppController.m create mode 100644 PSMTabBarControl/source/FakeModel.h create mode 100644 PSMTabBarControl/source/FakeModel.m create mode 100755 PSMTabBarControl/source/NSBezierPath_AMShading.h create mode 100755 PSMTabBarControl/source/NSBezierPath_AMShading.m create mode 100644 PSMTabBarControl/source/PSMAquaTabStyle.h create mode 100644 PSMTabBarControl/source/PSMAquaTabStyle.m create mode 100644 PSMTabBarControl/source/PSMMetalTabStyle.h create mode 100644 PSMTabBarControl/source/PSMMetalTabStyle.m create mode 100644 PSMTabBarControl/source/PSMOverflowPopUpButton.h create mode 100644 PSMTabBarControl/source/PSMOverflowPopUpButton.m create mode 100644 PSMTabBarControl/source/PSMProgressIndicator.h create mode 100644 PSMTabBarControl/source/PSMProgressIndicator.m create mode 100644 PSMTabBarControl/source/PSMRolloverButton.h create mode 100644 PSMTabBarControl/source/PSMRolloverButton.m create mode 100644 PSMTabBarControl/source/PSMTabBarCell.h create mode 100644 PSMTabBarControl/source/PSMTabBarCell.m create mode 100644 PSMTabBarControl/source/PSMTabBarControl.h create mode 100644 PSMTabBarControl/source/PSMTabBarControl.m create mode 100644 PSMTabBarControl/source/PSMTabBarControlInspector.h create mode 100644 PSMTabBarControl/source/PSMTabBarControlInspector.m create mode 100644 PSMTabBarControl/source/PSMTabBarControlPalette.h create mode 100644 PSMTabBarControl/source/PSMTabBarControlPalette.m create mode 100644 PSMTabBarControl/source/PSMTabBarControl_Prefix.pch create mode 100644 PSMTabBarControl/source/PSMTabDragAssistant.h create mode 100644 PSMTabBarControl/source/PSMTabDragAssistant.m create mode 100644 PSMTabBarControl/source/PSMTabStyle.h create mode 100644 PSMTabBarControl/source/PSMUnifiedTabStyle.h create mode 100644 PSMTabBarControl/source/PSMUnifiedTabStyle.m create mode 100644 PSMTabBarControl/source/WindowController.h create mode 100644 PSMTabBarControl/source/WindowController.m create mode 100644 PSMTabBarControl/source/main.m create mode 100644 PSMTabBarControl/version.plist create mode 100644 README create mode 100644 SpecialKeys.plist create mode 100644 TODO create mode 100644 Toolbar/Attention.png create mode 100644 Toolbar/Copy.png create mode 100644 Toolbar/Cut.png create mode 100644 Toolbar/FindHelp.png create mode 100644 Toolbar/FindNext.png create mode 100644 Toolbar/FindPrev.png create mode 100644 Toolbar/Help.png create mode 100644 Toolbar/LoadSesn.png create mode 100644 Toolbar/Make.png create mode 100644 Toolbar/Open.png create mode 100644 Toolbar/Paste.png create mode 100644 Toolbar/Print.png create mode 100644 Toolbar/Redo.png create mode 100644 Toolbar/Replace.png create mode 100644 Toolbar/RunCtags.png create mode 100644 Toolbar/RunScript.png create mode 100644 Toolbar/Save.png create mode 100644 Toolbar/SaveAll.png create mode 100644 Toolbar/SaveSesn.png create mode 100644 Toolbar/TagJump.png create mode 100644 Toolbar/Undo.png create mode 100644 VimColorList.clr create mode 100644 doc-bm-c.icns create mode 100644 doc-bm-h.icns create mode 100644 doc-bm-html.icns create mode 100644 doc-bm-java.icns create mode 100644 doc-bm-php.icns create mode 100644 doc-bm-pl.icns create mode 100644 doc-bm-sh.icns create mode 100644 doc-bm-tex.icns create mode 100644 doc-bm-txt.icns create mode 100644 doc-bm-xml.icns create mode 100644 doc-bm.icns create mode 100644 gui_macvim.m create mode 100644 main.m create mode 100644 vim_gloss.icns diff --git a/Colors.plist b/Colors.plist new file mode 100644 index 0000000000..8cd93b13f8 --- /dev/null +++ b/Colors.plist @@ -0,0 +1,1326 @@ + + + + + aliceblue + 15792127 + antiquewhite + 16444374 + antiquewhite1 + 16773082 + antiquewhite2 + 15589068 + antiquewhite3 + 13418416 + antiquewhite4 + 9142904 + aquamarine + 8323028 + aquamarine1 + 8323028 + aquamarine2 + 7728582 + aquamarine3 + 6737066 + aquamarine4 + 4557683 + azure + 15794175 + azure1 + 15794175 + azure2 + 14675437 + azure3 + 12700876 + azure4 + 8555403 + beige + 16119259 + bisque + 16769987 + bisque1 + 16769987 + bisque2 + 15586742 + bisque3 + 13416093 + bisque4 + 9141610 + black + 0 + blanchedalmond + 16772044 + blue + 212 + blue1 + 255 + blue2 + 237 + blue3 + 204 + blue4 + 139 + blueviolet + 9054946 + brown + 8405056 + brown1 + 16728128 + brown2 + 15547195 + brown3 + 13382451 + brown4 + 9118499 + burlywood + 14596230 + burlywood1 + 16765850 + burlywood2 + 15582352 + burlywood3 + 13412989 + burlywood4 + 9139028 + cadetblue + 6200736 + cadetblue1 + 10024447 + cadetblue2 + 9364717 + cadetblue3 + 7980236 + cadetblue4 + 5473931 + chartreuse + 8322816 + chartreuse1 + 8322816 + chartreuse2 + 7728384 + chartreuse3 + 6736896 + chartreuse4 + 4557568 + chocolate + 13723933 + chocolate1 + 16743972 + chocolate2 + 15562016 + chocolate3 + 13395484 + chocolate4 + 9127186 + coral + 16744015 + coral1 + 16740950 + coral2 + 15559247 + coral3 + 13392709 + coral4 + 9125166 + cornflowerblue + 6591724 + cornsilk + 16775131 + cornsilk1 + 16775131 + cornsilk2 + 15591372 + cornsilk3 + 13420464 + cornsilk4 + 9144184 + cyan + 109545 + cyan1 + 65535 + cyan2 + 60909 + cyan3 + 52428 + cyan4 + 35723 + darkblue + 128 + darkcyan + 32896 + darkgoldenrod + 12092938 + darkgoldenrod1 + 16759054 + darkgoldenrod2 + 15576077 + darkgoldenrod3 + 13407244 + darkgoldenrod4 + 9135368 + darkgray + 8421504 + darkgreen + 32768 + darkgrey + 8421504 + darkkhaki + 12433002 + darkmagenta + 8388736 + darkolivegreen + 5532206 + darkolivegreen1 + 13303663 + darkolivegreen2 + 12381543 + darkolivegreen3 + 10669145 + darkolivegreen4 + 7244604 + darkorange + 16747264 + darkorange1 + 16743936 + darkorange2 + 15561984 + darkorange3 + 13395456 + darkorange4 + 9127168 + darkorchid + 10040012 + darkorchid1 + 12467711 + darkorchid2 + 11614957 + darkorchid3 + 10040012 + darkorchid4 + 6758795 + darkred + 8388608 + darksalmon + 15242617 + darkseagreen + 9419919 + darkseagreen1 + 12713921 + darkseagreen2 + 11857332 + darkseagreen3 + 10144922 + darkseagreen4 + 6916969 + darkslateblue + 4734091 + darkslategray + 3034702 + darkslategray1 + 9961471 + darkslategray2 + 9235949 + darkslategray3 + 7916748 + darkslategray4 + 5409675 + darkslategrey + 3034702 + darkturquoise + 52688 + darkviolet + 9699539 + darkyellow + 12237312 + deeppink + 16716691 + deeppink1 + 16716691 + deeppink2 + 15536777 + deeppink3 + 13373301 + deeppink4 + 9111887 + deepskyblue + 48895 + deepskyblue1 + 48895 + deepskyblue2 + 45549 + deepskyblue3 + 39372 + deepskyblue4 + 26507 + dimgray + 6908265 + dimgrey + 6908265 + dodgerblue + 1937407 + dodgerblue1 + 1937407 + dodgerblue2 + 1804013 + dodgerblue3 + 1536972 + dodgerblue4 + 1003147 + firebrick + 11608353 + firebrick1 + 16723759 + firebrick2 + 15543083 + firebrick3 + 13378853 + firebrick4 + 9116186 + floralwhite + 16775920 + forestgreen + 2198305 + gainsboro + 14408667 + ghostwhite + 16250879 + gold + 16766464 + gold1 + 16766464 + gold2 + 15583232 + gold3 + 13413376 + gold4 + 9139200 + goldenrod + 14263584 + goldenrod1 + 16761125 + goldenrod2 + 15578145 + goldenrod3 + 13408796 + goldenrod4 + 9136403 + gray + 12566463 + gray0 + 0 + gray1 + 197379 + gray10 + 1710618 + gray100 + 16777215 + gray11 + 1776411 + gray12 + 2039583 + gray13 + 2105376 + gray14 + 2368548 + gray15 + 2434341 + gray16 + 2697513 + gray17 + 2763306 + gray18 + 3026478 + gray19 + 3092271 + gray2 + 263172 + gray20 + 3355443 + gray21 + 3552822 + gray22 + 3618615 + gray23 + 3881787 + gray24 + 3947580 + gray25 + 4210752 + gray26 + 4276545 + gray27 + 4539717 + gray28 + 4605510 + gray29 + 4868682 + gray3 + 526344 + gray30 + 5066061 + gray31 + 5131854 + gray32 + 5395026 + gray33 + 5460819 + gray34 + 5723991 + gray35 + 5789784 + gray36 + 6052956 + gray37 + 6118749 + gray38 + 6381921 + gray39 + 6447714 + gray4 + 592137 + gray40 + 6710886 + gray41 + 6908265 + gray42 + 6974058 + gray43 + 7237230 + gray44 + 7303023 + gray45 + 7566195 + gray46 + 7631988 + gray47 + 7895160 + gray48 + 7960953 + gray49 + 8224125 + gray5 + 855309 + gray50 + 8289918 + gray51 + 8487297 + gray52 + 8750469 + gray53 + 8816262 + gray54 + 9079434 + gray55 + 9145227 + gray56 + 9408399 + gray57 + 9474192 + gray58 + 9737364 + gray59 + 9803157 + gray6 + 921102 + gray60 + 10066329 + gray61 + 10263708 + gray62 + 10329501 + gray63 + 10592673 + gray64 + 10658466 + gray65 + 10921638 + gray66 + 10987431 + gray67 + 11250603 + gray68 + 11316396 + gray69 + 11579568 + gray7 + 1184274 + gray70 + 11776947 + gray71 + 11842740 + gray72 + 12105912 + gray73 + 12171705 + gray74 + 12434877 + gray75 + 12500670 + gray76 + 12763842 + gray77 + 12829635 + gray78 + 13092807 + gray79 + 13158600 + gray8 + 1250067 + gray80 + 13421772 + gray81 + 13619151 + gray82 + 13684944 + gray83 + 13948116 + gray84 + 14013909 + gray85 + 14277081 + gray86 + 14342874 + gray87 + 14606046 + gray88 + 14671839 + gray89 + 14935011 + gray9 + 1513239 + gray90 + 15000804 + gray91 + 15198183 + gray92 + 15461355 + gray93 + 15527148 + gray94 + 15790320 + gray95 + 15856113 + gray96 + 16119285 + gray97 + 16185078 + gray98 + 16448250 + gray99 + 16514043 + green + 25617 + green1 + 65280 + green2 + 60672 + green3 + 52224 + green4 + 35584 + greenyellow + 11337518 + grey + 12566463 + grey0 + 0 + grey1 + 197379 + grey10 + 1710618 + grey100 + 16777215 + grey11 + 1776411 + grey12 + 2039583 + grey13 + 2105376 + grey14 + 2368548 + grey15 + 2434341 + grey16 + 2697513 + grey17 + 2763306 + grey18 + 3026478 + grey19 + 3092271 + grey2 + 263172 + grey20 + 3355443 + grey21 + 3552822 + grey22 + 3618615 + grey23 + 3881787 + grey24 + 3947580 + grey25 + 4210752 + grey26 + 4276545 + grey27 + 4539717 + grey28 + 4605510 + grey29 + 4868682 + grey3 + 526344 + grey30 + 5066061 + grey31 + 5131854 + grey32 + 5395026 + grey33 + 5460819 + grey34 + 5723991 + grey35 + 5789784 + grey36 + 6052956 + grey37 + 6118749 + grey38 + 6381921 + grey39 + 6447714 + grey4 + 592137 + grey40 + 6710886 + grey41 + 6908265 + grey42 + 6974058 + grey43 + 7237230 + grey44 + 7303023 + grey45 + 7566195 + grey46 + 7631988 + grey47 + 7895160 + grey48 + 7960953 + grey49 + 8224125 + grey5 + 855309 + grey50 + 8289918 + grey51 + 8487297 + grey52 + 8750469 + grey53 + 8816262 + grey54 + 9079434 + grey55 + 9145227 + grey56 + 9408399 + grey57 + 9474192 + grey58 + 9737364 + grey59 + 9803157 + grey6 + 921102 + grey60 + 10066329 + grey61 + 10263708 + grey62 + 10329501 + grey63 + 10592673 + grey64 + 10658466 + grey65 + 10921638 + grey66 + 10987431 + grey67 + 11250603 + grey68 + 11316396 + grey69 + 11579568 + grey7 + 1184274 + grey70 + 11776947 + grey71 + 11842740 + grey72 + 12105912 + grey73 + 12171705 + grey74 + 12434877 + grey75 + 12500670 + grey76 + 12763842 + grey77 + 12829635 + grey78 + 13092807 + grey79 + 13158600 + grey8 + 1250067 + grey80 + 13421772 + grey81 + 13619151 + grey82 + 13684944 + grey83 + 13948116 + grey84 + 14013909 + grey85 + 14277081 + grey86 + 14342874 + grey87 + 14606046 + grey88 + 14671839 + grey89 + 14935011 + grey9 + 1513239 + grey90 + 15000804 + grey91 + 15198183 + grey92 + 15461355 + grey93 + 15527148 + grey94 + 15790320 + grey95 + 15856113 + grey96 + 16119285 + grey97 + 16185078 + grey98 + 16448250 + grey99 + 16514043 + honeydew + 15794160 + honeydew1 + 15794160 + honeydew2 + 14675423 + honeydew3 + 12700865 + honeydew4 + 8555394 + hotpink + 16738740 + hotpink1 + 16740020 + hotpink2 + 15559334 + hotpink3 + 13394063 + hotpink4 + 9124449 + indianred + 13392988 + indianred1 + 16738922 + indianred2 + 15557218 + indianred3 + 13390932 + indianred4 + 9124410 + ivory + 16777200 + ivory1 + 16777200 + ivory2 + 15592927 + ivory3 + 13421761 + ivory4 + 9145218 + khaki + 15787659 + khaki1 + 16774543 + khaki2 + 15591045 + khaki3 + 13420147 + khaki4 + 9143886 + lavender + 15132410 + lavenderblush + 16773365 + lavenderblush1 + 16773365 + lavenderblush2 + 15589348 + lavenderblush3 + 13418948 + lavenderblush4 + 9142918 + lawngreen + 8190720 + lemonchiffon + 16775884 + lemonchiffon1 + 16775884 + lemonchiffon2 + 15591614 + lemonchiffon3 + 13420709 + lemonchiffon4 + 9144687 + lightblue + 10526975 + lightblue1 + 12513279 + lightblue2 + 11656941 + lightblue3 + 10076108 + lightblue4 + 6783627 + lightcoral + 15761536 + lightcyan + 10551295 + lightcyan1 + 14680063 + lightcyan2 + 13692397 + lightcyan3 + 11848908 + lightcyan4 + 7965579 + lightgoldenrod + 15588737 + lightgoldenrod1 + 16772235 + lightgoldenrod2 + 15588225 + lightgoldenrod3 + 13418095 + lightgoldenrod4 + 9142603 + lightgoldenrodyellow + 16448209 + lightgray + 14671839 + lightgreen + 10551200 + lightgrey + 14671839 + lightmagenta + 15769840 + lightpink + 16758209 + lightpink1 + 16756409 + lightpink2 + 15573676 + lightpink3 + 13405076 + lightpink4 + 9133669 + lightred + 16752800 + lightsalmon + 16752761 + lightsalmon1 + 16752761 + lightsalmon2 + 15570034 + lightsalmon3 + 13402465 + lightsalmon4 + 9131841 + lightseagreen + 2142634 + lightskyblue + 8834554 + lightskyblue1 + 11592447 + lightskyblue2 + 10736621 + lightskyblue3 + 9221580 + lightskyblue4 + 6323083 + lightslateblue + 8613887 + lightslategray + 7833497 + lightslategrey + 7833497 + lightsteelblue + 11584478 + lightsteelblue1 + 13296127 + lightsteelblue2 + 12374509 + lightsteelblue3 + 10663116 + lightsteelblue4 + 7240587 + lightyellow + 16777120 + lightyellow1 + 16777183 + lightyellow2 + 15592912 + lightyellow3 + 13421748 + lightyellow4 + 9145209 + limegreen + 3329074 + linen + 16445670 + magenta + 15796355 + magenta1 + 16711935 + magenta2 + 15532269 + magenta3 + 13369548 + magenta4 + 9109643 + maroon + 11546464 + maroon1 + 16724915 + maroon2 + 15544230 + maroon3 + 13379983 + maroon4 + 9116513 + mediumaquamarine + 6737066 + mediumblue + 204 + mediumorchid + 12145875 + mediumorchid1 + 14640895 + mediumorchid2 + 13655789 + mediumorchid3 + 11817676 + mediumorchid4 + 7944075 + mediumpurple + 9662426 + mediumpurple1 + 11239935 + mediumpurple2 + 10385645 + mediumpurple3 + 9005004 + mediumpurple4 + 6047371 + mediumseagreen + 3978096 + mediumslateblue + 8087533 + mediumspringgreen + 64153 + mediumturquoise + 4772044 + mediumvioletred + 13047173 + midnightblue + 1579119 + mintcream + 16121850 + mistyrose + 16770017 + mistyrose1 + 16770017 + mistyrose2 + 15586769 + mistyrose3 + 13416116 + mistyrose4 + 9141627 + moccasin + 16769972 + navajowhite + 16768684 + navajowhite1 + 16768684 + navajowhite2 + 15585185 + navajowhite3 + 13415307 + navajowhite4 + 9140317 + navy + 128 + navyblue + 128 + oldlace + 16643558 + olivedrab + 6983203 + olivedrab1 + 12582717 + olivedrab2 + 11791674 + olivedrab3 + 10079282 + olivedrab4 + 6916897 + orange + 16482304 + orange1 + 16753920 + orange2 + 15571200 + orange3 + 13403392 + orange4 + 9132288 + orangered + 16729344 + orangered1 + 16729344 + orangered2 + 15548416 + orangered3 + 13383424 + orangered4 + 9118976 + orchid + 14249941 + orchid1 + 16745210 + orchid2 + 15563240 + orchid3 + 13396424 + orchid4 + 9127561 + palegoldenrod + 15591338 + palegreen + 10025624 + palegreen1 + 10092441 + palegreen2 + 9432463 + palegreen3 + 8178812 + palegreen4 + 5475155 + paleturquoise + 11529709 + paleturquoise1 + 12255231 + paleturquoise2 + 11464173 + paleturquoise3 + 9817292 + paleturquoise4 + 6720395 + palevioletred + 14315411 + palevioletred1 + 16744875 + palevioletred2 + 15562910 + palevioletred3 + 13395849 + palevioletred4 + 9127516 + papayawhip + 16773077 + peachpuff + 16767417 + peachpuff1 + 16767417 + peachpuff2 + 15584172 + peachpuff3 + 13414292 + peachpuff4 + 9140069 + peru + 13403455 + pink + 16760779 + pink1 + 16757956 + pink2 + 15575224 + pink3 + 13406365 + pink4 + 9134699 + plum + 14524637 + plum1 + 16759551 + plum2 + 15576813 + plum3 + 13407692 + plum4 + 9135755 + powderblue + 11591654 + purple + 10494192 + purple1 + 10104831 + purple2 + 9448429 + purple3 + 8201676 + purple4 + 5511819 + red + 14485509 + red1 + 16711680 + red2 + 15532032 + red3 + 13369344 + red4 + 9109504 + rosybrown + 12357519 + rosybrown1 + 16761281 + rosybrown2 + 15578292 + rosybrown3 + 13408922 + rosybrown4 + 9136489 + royalblue + 4221409 + royalblue1 + 4748799 + royalblue2 + 4353773 + royalblue3 + 3825356 + royalblue4 + 2506891 + saddlebrown + 9127186 + salmon + 16416882 + salmon1 + 16747369 + salmon2 + 15565153 + salmon3 + 13397843 + salmon4 + 9128760 + sandybrown + 16032608 + seagreen + 3050327 + seagreen1 + 5504926 + seagreen2 + 5172628 + seagreen3 + 4377728 + seagreen4 + 3050327 + seashell + 16774637 + seashell1 + 16774637 + seashell2 + 15590622 + seashell3 + 13419710 + seashell4 + 9143937 + sienna + 10506797 + sienna1 + 16744774 + sienna2 + 15562817 + sienna3 + 13395768 + sienna4 + 9127461 + skyblue + 8834539 + skyblue1 + 8834559 + skyblue2 + 8241133 + skyblue3 + 7055052 + skyblue4 + 4878219 + slateblue + 6969804 + slateblue1 + 8548351 + slateblue2 + 7956205 + slateblue3 + 6904012 + slateblue4 + 4603019 + slategray + 7307407 + slategray1 + 13034239 + slategray2 + 12178413 + slategray3 + 10401228 + slategray4 + 7043979 + slategrey + 7307407 + snow + 16775930 + snow1 + 16775930 + snow2 + 15591656 + snow3 + 13420744 + snow4 + 9144713 + springgreen + 65406 + springgreen1 + 65406 + springgreen2 + 60789 + springgreen3 + 52326 + springgreen4 + 35653 + steelblue + 4555188 + steelblue1 + 6469887 + steelblue2 + 6073325 + steelblue3 + 5149900 + steelblue4 + 3564683 + tan + 13743243 + tan1 + 16753998 + tan2 + 15571273 + tan3 + 13403455 + tan4 + 9132330 + thistle + 14204632 + thistle1 + 16769535 + thistle2 + 15585773 + thistle3 + 13415628 + thistle4 + 9141131 + tomato + 16736838 + tomato1 + 16736838 + tomato2 + 15555649 + tomato3 + 13389368 + tomato4 + 9123365 + turquoise + 4251600 + turquoise1 + 62975 + turquoise2 + 58605 + turquoise3 + 50380 + turquoise4 + 34443 + violet + 9189320 + violetred + 13639823 + violetred1 + 16727445 + violetred2 + 15547019 + violetred3 + 13382264 + violetred4 + 9118034 + wheat + 16113331 + wheat1 + 16771001 + wheat2 + 15587502 + wheat3 + 13416853 + wheat4 + 9141606 + white + 16777215 + whitesmoke + 16119285 + yellow + 16511492 + yellow1 + 16776960 + yellow2 + 15592704 + yellow3 + 13421568 + yellow4 + 9145088 + yellowgreen + 10079282 + + diff --git a/Credits.rtf b/Credits.rtf new file mode 100644 index 0000000000..5823bbbce5 --- /dev/null +++ b/Credits.rtf @@ -0,0 +1,25 @@ +{\rtf1\mac\ansicpg10000\cocoartf824\cocoasubrtf410 +{\fonttbl\f0\fswiss\fcharset77 Helvetica-Bold;\f1\fswiss\fcharset77 Helvetica;\f2\fswiss\fcharset77 Helvetica-Oblique; +} +{\colortbl;\red255\green255\blue255;} +\paperw11900\paperh16840\margl1440\margr1440\vieww9360\viewh8400\viewkind0 +\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\ql\qnatural\pardirnatural + +\f0\b\fs24 \cf0 VIM - Vi IMproved +\f1\b0 \ +by: +\f2\i Bram Moolenaar +\f1\i0 \ +\ + +\f0\b MacVim GUI\ + +\f1\b0 by: +\f2\i Bj\'9arn Winckler +\f1\i0 \ +\ +Thank you to {\field{\*\fldinst{HYPERLINK "http://www.positivespinmedia.com"}}{\fldrslt Positive Spin Media}} for the PSMTabBarControl Framework.\ +\ +Toolbar icons borrowed from the {\field{\*\fldinst{HYPERLINK "http://www.everaldo.com/crystal/"}}{\fldrslt Crystal Project}}.\ +\ +Vim icons made by {\field{\*\fldinst{HYPERLINK "http://www.cs.princeton.edu/~mtwebb/vim_icon/vim_icons.html"}}{\fldrslt Matthew Webb}}.} \ No newline at end of file diff --git a/English.lproj/InfoPlist.strings b/English.lproj/InfoPlist.strings new file mode 100644 index 0000000000000000000000000000000000000000..f2e5194d14248b8b3ba9a52774bb638a0f6a624e GIT binary patch literal 194 zcmW-b!4APd6h+V4S2UK5AT}0afendRu&^##n$k8c68^|f;$-qN@6OzJ-^qM`42X$X zQ*k8WO3s^1J#@%h5!Hn literal 0 HcmV?d00001 diff --git a/English.lproj/MainMenu.nib/classes.nib b/English.lproj/MainMenu.nib/classes.nib new file mode 100644 index 0000000000..cc058adef0 --- /dev/null +++ b/English.lproj/MainMenu.nib/classes.nib @@ -0,0 +1,23 @@ +{ + IBClasses = ( + { + ACTIONS = {newVimWindow = id; }; + CLASS = AppController; + LANGUAGE = ObjC; + SUPERCLASS = NSObject; + }, + { + ACTIONS = {addNewTab = id; }; + CLASS = FirstResponder; + LANGUAGE = ObjC; + SUPERCLASS = NSObject; + }, + { + ACTIONS = {newVimWindow = id; }; + CLASS = MMAppController; + LANGUAGE = ObjC; + SUPERCLASS = NSObject; + } + ); + IBVersion = 1; +} \ No newline at end of file diff --git a/English.lproj/MainMenu.nib/info.nib b/English.lproj/MainMenu.nib/info.nib new file mode 100644 index 0000000000..3879585f32 --- /dev/null +++ b/English.lproj/MainMenu.nib/info.nib @@ -0,0 +1,21 @@ + + + + + IBDocumentLocation + 68 69 356 240 0 0 1024 746 + IBEditorPositions + + 29 + 130 475 458 44 0 0 1024 746 + + IBFramework Version + 446.1 + IBOpenObjects + + 29 + + IBSystem Version + 8R218 + + diff --git a/English.lproj/MainMenu.nib/keyedobjects.nib b/English.lproj/MainMenu.nib/keyedobjects.nib new file mode 100644 index 0000000000000000000000000000000000000000..f0b2eac405714621560847aace435767a35f75b9 GIT binary patch literal 7901 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 + + + + IBDocumentLocation + 12 50 356 240 0 0 1024 746 + IBFramework Version + 446.1 + IBLockedTabItems + + 10 + + IBOpenObjects + + 28 + + IBSystem Version + 8R218 + + diff --git a/English.lproj/VimWindow.nib/keyedobjects.nib b/English.lproj/VimWindow.nib/keyedobjects.nib new file mode 100644 index 0000000000000000000000000000000000000000..ff924b86caca5a11881e053d123e1d3dbc10f7ce GIT binary patch literal 5460 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 YvOVl~>@Vzjus@V`Ujxqd+%MbvA9G_tsQ>@~ literal 0 HcmV?d00001 diff --git a/Info.plist b/Info.plist new file mode 100644 index 0000000000..95dd126b70 --- /dev/null +++ b/Info.plist @@ -0,0 +1,550 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleDocumentTypes + + + CFBundleTypeExtensions + + vim + + CFBundleTypeIconFile + doc-bm + CFBundleTypeName + Vim Script File + CFBundleTypeRole + Editor + LSIsAppleDefaultForType + + + + CFBundleTypeExtensions + + txt + text + + CFBundleTypeIconFile + doc-bm-txt + CFBundleTypeMIMETypes + + text/plain + + CFBundleTypeName + Plain Text File + CFBundleTypeRole + Editor + LSIsAppleDefaultForType + + + + CFBundleTypeExtensions + + tex + + CFBundleTypeIconFile + doc-bm-tex + CFBundleTypeName + TeX File + CFBundleTypeRole + Editor + LSIsAppleDefaultForType + + + + CFBundleTypeExtensions + + h + + CFBundleTypeIconFile + doc-bm-h + CFBundleTypeName + C Header Source File + CFBundleTypeRole + Editor + LSIsAppleDefaultForType + + LSItemContentTypes + + public.c-header + + + + CFBundleTypeExtensions + + pch + + CFBundleTypeName + C Precompiled Header Source File + CFBundleTypeRole + Editor + LSIsAppleDefaultForType + + LSItemContentTypes + + public.precompiled-c-header + + + + CFBundleTypeExtensions + + hh + hp + hpp + hxx + h++ + + CFBundleTypeName + C++ Header Source File + CFBundleTypeRole + Editor + LSIsAppleDefaultForType + + + + CFBundleTypeExtensions + + pch++ + + CFBundleTypeName + C++ Precompiled Header Source File + CFBundleTypeRole + Editor + LSIsAppleDefaultForType + + LSItemContentTypes + + public.precompiled-c-plus-plus-header + + + + CFBundleTypeExtensions + + c + + CFBundleTypeIconFile + doc-bm-c + CFBundleTypeName + C Source File + CFBundleTypeRole + Editor + LSIsAppleDefaultForType + + LSItemContentTypes + + public.c-source + + + + CFBundleTypeExtensions + + m + + CFBundleTypeName + Objective-C Source File + CFBundleTypeRole + Editor + LSIsAppleDefaultForType + + LSItemContentTypes + + public.objective-c-source + + + + CFBundleTypeExtensions + + mm + + CFBundleTypeName + Objective-C++ Source File + CFBundleTypeRole + Editor + LSIsAppleDefaultForType + + LSItemContentTypes + + public.objective-c-plus-plus-source + + + + CFBundleTypeExtensions + + cc + cp + cpp + cxx + c++ + + CFBundleTypeName + C++ Source File + CFBundleTypeRole + Editor + LSIsAppleDefaultForType + + LSItemContentTypes + + public.c-plus-plus-source + + + + CFBundleTypeExtensions + + s + asm + + CFBundleTypeName + Assembly Source File + CFBundleTypeRole + Editor + LSIsAppleDefaultForType + + LSItemContentTypes + + public.assembler-source + + + + CFBundleTypeExtensions + + r + + CFBundleTypeName + Rez Source File + CFBundleTypeRole + Editor + LSIsAppleDefaultForType + + LSItemContentTypes + + public.rez-source + + + + CFBundleTypeExtensions + + java + jav + + CFBundleTypeIconFile + doc-bm-java + CFBundleTypeName + Java Source File + CFBundleTypeRole + Editor + LSIsAppleDefaultForType + + LSItemContentTypes + + com.sun.java-source + + + + CFBundleTypeExtensions + + l + lm + lmm + lpp + lxx + + CFBundleTypeName + Lex Source File + CFBundleTypeRole + Editor + LSIsAppleDefaultForType + + LSItemContentTypes + + public.lex-source + + + + CFBundleTypeExtensions + + y + ym + ymm + ypp + yxx + + CFBundleTypeName + Yacc Source File + CFBundleTypeRole + Editor + LSIsAppleDefaultForType + + LSItemContentTypes + + public.yacc-source + + + + CFBundleTypeExtensions + + defs + + CFBundleTypeName + Mig Definition File + CFBundleTypeRole + Editor + LSIsAppleDefaultForType + + + + CFBundleTypeExtensions + + exp + + CFBundleTypeName + Symbol Export File + CFBundleTypeRole + Editor + LSIsAppleDefaultForType + + LSItemContentTypes + + public.symbol-export + + + + CFBundleTypeExtensions + + f + for + f77 + f95 + + CFBundleTypeName + Fortran Source File + CFBundleTypeRole + Editor + LSIsAppleDefaultForType + + LSItemContentTypes + + public.fortran-source + + + + CFBundleTypeExtensions + + pas + + CFBundleTypeName + Pascal Source file + CFBundleTypeRole + Editor + LSIsAppleDefaultForType + + LSItemContentTypes + + public.pascal-source + + + + CFBundleTypeExtensions + + ada + adb + ads + + CFBundleTypeName + Ada Source File + CFBundleTypeRole + Editor + LSIsAppleDefaultForType + + LSItemContentTypes + + public.ada-source + + + + CFBundleTypeExtensions + + html + htm + + CFBundleTypeIconFile + doc-bm-html + CFBundleTypeMIMETypes + + text/html + + CFBundleTypeName + HTML Source File + CFBundleTypeRole + Editor + LSIsAppleDefaultForType + + LSItemContentTypes + + public.html + + + + CFBundleTypeExtensions + + xml + + CFBundleTypeIconFile + doc-bm-xml + CFBundleTypeMIMETypes + + text/xml + + CFBundleTypeName + XML Source File + CFBundleTypeRole + Editor + LSIsAppleDefaultForType + + LSItemContentTypes + + public.xml + + + + CFBundleTypeExtensions + + js + jscript + javascript + + CFBundleTypeMIMETypes + + text/javascript + + CFBundleTypeName + JavaScript Source File + CFBundleTypeRole + Editor + LSIsAppleDefaultForType + + LSItemContentTypes + + com.netscape.javascript-source + + + + CFBundleTypeExtensions + + sh + command + csh + pl + pm + py + rb + rbw + php + php3 + php4 + ph3 + ph4 + phtml + applescript + + CFBundleTypeIconFile + doc-bm-sh + CFBundleTypeMIMETypes + + text/x-perl-script + text/x-python-script + text/ruby-script + text/php + + CFBundleTypeName + Script File + CFBundleTypeRole + Editor + LSIsAppleDefaultForType + + LSItemContentTypes + + public.script + + + + CFBundleTypeExtensions + + class + + CFBundleTypeName + Java Class File + CFBundleTypeRole + Viewer + LSIsAppleDefaultForType + + LSItemContentTypes + + com.sun.java-class + + + + CFBundleTypeExtensions + + strings + + CFBundleTypeName + Strings File + CFBundleTypeRole + Editor + LSItemContentTypes + + public.strings-text + + + + CFBundleTypeExtensions + + plist + dict + + CFBundleTypeName + Propery List File + CFBundleTypeRole + Editor + LSIsAppleDefaultForType + + + + CFBundleTypeExtensions + + * + + CFBundleTypeName + Text File + CFBundleTypeOSTypes + + **** + + CFBundleTypeRole + Editor + + + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIconFile + vim_gloss + CFBundleIdentifier + org.vim.MacVim + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + APPL + CFBundleSignature + VIMM + CFBundleVersion + (first snapshot) + NSMainNibFile + MainMenu + NSPrincipalClass + NSApplication + + diff --git a/MMAppController.h b/MMAppController.h new file mode 100644 index 0000000000..5bcbf1ea48 --- /dev/null +++ b/MMAppController.h @@ -0,0 +1,25 @@ +/* vi:set ts=8 sts=4 sw=4 ft=objc: + * + * VIM - Vi IMproved by Bram Moolenaar + * MacVim GUI port by Bjorn Winckler + * + * Do ":help uganda" in Vim to read copying and usage conditions. + * Do ":help credits" in Vim to see a list of people who contributed. + * See README.txt for an overview of the Vim source code. + */ + +#import + + + +@interface MMAppController : NSObject { + NSPort *receivePort; + NSMutableArray *vimControllers; + unsigned terminateNowCount; + BOOL abortTermination; +} + +- (void)removeVimController:(id)controller; +- (IBAction)newVimWindow:(id)sender; + +@end diff --git a/MMAppController.m b/MMAppController.m new file mode 100644 index 0000000000..08c1e9c199 --- /dev/null +++ b/MMAppController.m @@ -0,0 +1,182 @@ +/* vi:set ts=8 sts=4 sw=4 ft=objc: + * + * VIM - Vi IMproved by Bram Moolenaar + * MacVim GUI port by Bjorn Winckler + * + * Do ":help uganda" in Vim to read copying and usage conditions. + * Do ":help credits" in Vim to see a list of people who contributed. + * See README.txt for an overview of the Vim source code. + */ + +#import "MMAppController.h" +#import "MMVimController.h" +#import "MacVim.h" + + + +@implementation MMAppController + +- (id)init +{ + if ((self = [super init])) { + vimControllers = [NSMutableArray new]; + + // Init named port for VimTasks to connect to + receivePort = [NSMachPort new]; + [receivePort setDelegate:self]; + + [[NSRunLoop currentRunLoop] addPort:receivePort + forMode:NSDefaultRunLoopMode]; + + // NOTE! If the name of the port changes here it must also be updated + // in MMBackend.m. + NSString *portName = [NSString stringWithFormat:@"%@-taskport", + [[NSBundle mainBundle] bundleIdentifier]]; + //NSLog(@"Starting mach bootstrap server: %@", portName); + if (![[NSMachBootstrapServer sharedInstance] registerPort:receivePort + name:portName]) { + NSLog(@"WARNING: Failed to start mach bootstrap server"); + } + } + + return self; +} + +- (void)dealloc +{ + //NSLog(@"MMAppController dealloc"); + + [receivePort release]; + [vimControllers release]; + + [super dealloc]; +} + +- (BOOL)applicationShouldOpenUntitledFile:(NSApplication *)sender +{ + // NOTE! This way it possible to start the app with the command-line + // argument '-nowindow yes' and no window will be opened by default. + return ![[NSUserDefaults standardUserDefaults] boolForKey:@"nowindow"]; +} + +- (BOOL)applicationOpenUntitledFile:(NSApplication *)sender +{ + //NSLog(@"%s NSapp=%@ theApp=%@", _cmd, NSApp, sender); + + [self newVimWindow:self]; + return YES; +} + +- (void)application:(NSApplication *)sender openFiles:(NSArray *)filenames +{ + NSMutableArray *args = [NSMutableArray arrayWithObjects:@"-g", @"-p", nil]; + [args addObjectsFromArray:filenames]; + + NSString *path = [[NSBundle mainBundle] + pathForAuxiliaryExecutable:@"Vim"]; + + [NSTask launchedTaskWithLaunchPath:path arguments:args]; + + [NSApp replyToOpenOrPrint:NSApplicationDelegateReplySuccess]; + // NSApplicationDelegateReplySuccess = 0, + // NSApplicationDelegateReplyCancel = 1, + // NSApplicationDelegateReplyFailure = 2 +} + +- (NSApplicationTerminateReply)applicationShouldTerminate: + (NSApplication *)sender +{ + int reply = NSTerminateNow; + + // HACK! Send message to all vim tasks asking if they have modified + // buffers, then hang around for a while waiting for responses to come + // back. If any task has at least one modified buffer an alert dialog is + // displayed telling the user that there are modified buffers. The user + // can then choose whether to quit anyway, or cancel the termination. + // (NSTerminateLater is not supported.) + terminateNowCount = 0; + abortTermination = NO; + + unsigned i, count = [vimControllers count]; + for (i = 0; i < count; ++i) { + MMVimController *controller = [vimControllers objectAtIndex:i]; + [NSPortMessage sendMessage:TaskShouldTerminateMsgID + withSendPort:[controller sendPort] + receivePort:receivePort + wait:NO]; + } + + NSDate *timeOutDate = [NSDate dateWithTimeIntervalSinceNow:15]; + while (terminateNowCount < count && !abortTermination && + NSOrderedDescending == [timeOutDate compare:[NSDate date]]) { + [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode + beforeDate:timeOutDate]; + } + + //NSLog(@"%s terminateNowCount=%d abortTermination=%s", _cmd, + // terminateNowCount, abortTermination ? "YES" : "NO"); + + if (abortTermination) { + NSAlert *alert = [[NSAlert alloc] init]; + [alert addButtonWithTitle:@"Quit"]; + [alert addButtonWithTitle:@"Cancel"]; + [alert setMessageText:@"Quit without saving?"]; + [alert setInformativeText:@"There are modified buffers, " + " if you quit now all changes will be lost. Quit anyway?"]; + [alert setAlertStyle:NSWarningAlertStyle]; + + if ([alert runModal] != NSAlertFirstButtonReturn) { + reply = NSTerminateCancel; + } + + [alert release]; + } else if (terminateNowCount < count) { + NSLog(@"WARNING: Not all tasks replied to TaskShouldTerminateMsgID," + " quitting anyway."); + } + + return reply; +} + +- (void)applicationWillTerminate:(NSNotification *)aNotification +{ + // NOTE! Is this a correct way of releasing the MMAppController? + [NSApp setDelegate:nil]; + [self autorelease]; +} + +- (void)handlePortMessage:(NSPortMessage *)portMessage +{ + unsigned msgid = [portMessage msgid]; + + if (msgid == CheckinMsgID) { + //NSLog(@"Received checkin message from VimTask."); + MMVimController *wc = [[MMVimController alloc] + initWithPort:[portMessage sendPort]]; + [vimControllers addObject:wc]; + [wc release]; + } else if (msgid == TerminateReplyYesMsgID) { + ++terminateNowCount; + } else if (msgid == TerminateReplyNoMsgID) { + abortTermination = YES; + } else { + NSLog(@"WARNING: Unknown message received (msgid=%d)", msgid); + } +} + +- (void)removeVimController:(id)controller +{ + [vimControllers removeObject:controller]; +} + +- (IBAction)newVimWindow:(id)sender +{ + NSMutableArray *args = [NSMutableArray arrayWithObject:@"-g"]; + NSString *path = [[NSBundle mainBundle] + pathForAuxiliaryExecutable:@"Vim"]; + + //NSLog(@"Launching a new VimTask..."); + [NSTask launchedTaskWithLaunchPath:path arguments:args]; +} + +@end diff --git a/MMBackend.h b/MMBackend.h new file mode 100644 index 0000000000..5f2aa7265d --- /dev/null +++ b/MMBackend.h @@ -0,0 +1,81 @@ +/* vi:set ts=8 sts=4 sw=4 ft=objc: + * + * VIM - Vi IMproved by Bram Moolenaar + * MacVim GUI port by Bjorn Winckler + * + * Do ":help uganda" in Vim to read copying and usage conditions. + * Do ":help credits" in Vim to see a list of people who contributed. + * See README.txt for an overview of the Vim source code. + */ + +#import + + + +@interface MMBackend : NSObject { + NSMutableArray *queue; + NSMutableData *drawData; + NSData *replyData; + NSPort *sendPort; + NSPort *receivePort; + NSDictionary *colorDict; + BOOL inputReceived; + BOOL receivedKillTaskMsg; + BOOL tabBarVisible; + int backgroundColor; + int foregroundColor; + int defaultBackgroundColor; + int defaultForegroundColor; +} + ++ (MMBackend *)sharedInstance; + +- (void)setBackgroundColor:(int)color; +- (void)setForegroundColor:(int)color; +- (void)setDefaultColorsBackground:(int)bg foreground:(int)fg; + +- (BOOL)checkin; +- (BOOL)openVimWindowWithRows:(int)rows columns:(int)cols; +- (void)clearAll; +- (void)clearBlockFromRow:(int)row1 column:(int)col1 + toRow:(int)row2 column:(int)col2; +- (void)deleteLinesFromRow:(int)row count:(int)count + scrollBottom:(int)bottom left:(int)left right:(int)right; +- (void)replaceString:(char*)s length:(int)len row:(int)row column:(int)col + flags:(int)flags; +- (void)insertLinesFromRow:(int)row count:(int)count + scrollBottom:(int)bottom left:(int)left right:(int)right; +- (void)flush; +- (void)flushQueue; +- (BOOL)waitForInput:(int)milliseconds; +- (void)exit; +- (void)selectTab:(int)index; +- (void)updateTabBar; +- (BOOL)tabBarVisible; +- (void)showTabBar:(BOOL)enable; +- (void)setRows:(int)rows columns:(int)cols; +- (void)setVimWindowTitle:(char *)title; +- (char *)browseForFileInDirectory:(char *)dir title:(char *)title + saving:(int)saving; +- (void)updateInsertionPoint; +- (void)addMenuWithTag:(int)tag parent:(int)parentTag name:(char *)name + atIndex:(int)index; +- (void)addMenuItemWithTag:(int)tag parent:(int)parentTag name:(char *)name + tip:(char *)tip icon:(char *)icon atIndex:(int)index; +- (void)removeMenuItemWithTag:(int)tag; +- (void)enableMenuItemWithTag:(int)tag state:(int)enabled; +- (void)showToolbar:(int)enable flags:(int)flags; +- (void)createScrollbarWithIdentifier:(long)ident type:(int)type; +- (void)destroyScrollbarWithIdentifier:(long)ident; +- (void)showScrollbarWithIdentifier:(long)ident state:(int)visible; +- (void)setScrollbarPosition:(int)pos length:(int)len identifier:(long)ident; +- (void)setScrollbarThumbValue:(long)val size:(long)size max:(long)max + identifier:(long)ident; +- (BOOL)setFontWithName:(char *)name; + +- (int)lookupColorWithKey:(NSString *)key; + +@end + + +// vim: set ft=objc: diff --git a/MMBackend.m b/MMBackend.m new file mode 100644 index 0000000000..50c809f39b --- /dev/null +++ b/MMBackend.m @@ -0,0 +1,1046 @@ +/* vi:set ts=8 sts=4 sw=4 ft=objc: + * + * VIM - Vi IMproved by Bram Moolenaar + * MacVim GUI port by Bjorn Winckler + * + * Do ":help uganda" in Vim to read copying and usage conditions. + * Do ":help credits" in Vim to see a list of people who contributed. + * See README.txt for an overview of the Vim source code. + */ + +#import "MMBackend.h" +#import "MacVim.h" +#import "vim.h" + + + +// TODO: Move to separate file. +static int eventModifierFlagsToVimModMask(int modifierFlags); +static int eventModifierFlagsToVimMouseModMask(int modifierFlags); +static int eventButtonNumberToVimMouseButton(int buttonNumber); + + +@interface MMBackend (Private) ++ (NSDictionary *)specialKeys; +- (void)handleKeyDown:(NSString *)key modifiers:(int)mods; +- (void)queueMessage:(int)msgid data:(NSData *)data; +@end + + + +@implementation MMBackend + ++ (MMBackend *)sharedInstance +{ + static MMBackend *singleton = nil; + return singleton ? singleton : (singleton = [MMBackend new]); +} + +- (id)init +{ + if ((self = [super init])) { + queue = [[NSMutableArray alloc] init]; + drawData = [[NSMutableData alloc] initWithCapacity:1024]; + NSString *path = [[NSBundle mainBundle] pathForResource:@"Colors" + ofType:@"plist"]; + colorDict = [[NSDictionary dictionaryWithContentsOfFile:path] retain]; + } + + return self; +} + +- (void)dealloc +{ + [queue release]; + [drawData release]; + [sendPort release]; + [receivePort release]; + [colorDict release]; + + [super dealloc]; +} + +- (void)setBackgroundColor:(int)color +{ + backgroundColor = color; +} + +- (void)setForegroundColor:(int)color +{ + foregroundColor = color; +} + +- (void)setDefaultColorsBackground:(int)bg foreground:(int)fg +{ + defaultBackgroundColor = bg; + defaultForegroundColor = fg; +} + +- (BOOL)checkin +{ + // NOTE! If the name of the port changes here it must also be updated in + // MMAppController.m. + NSString *portName = [NSString stringWithFormat:@"%@-taskport", + [[NSBundle mainBundle] bundleIdentifier]]; + + NSPort *port = [[[NSMachBootstrapServer sharedInstance] + portForName:portName host:nil] retain]; + if (!port) { +#if 0 + NSString *path = [[NSBundle mainBundle] bundlePath]; + if (![[NSWorkspace sharedWorkspace] launchApplication:path]) { + NSLog(@"WARNING: Failed to launch GUI with path %@", path); + return NO; + } +#else + // HACK! It would be preferable to launch the GUI using NSWorkspace, + // however I have not managed to figure out how to pass arguments using + // NSWorkspace. + // + // NOTE! Using NSTask to launch the GUI has the negative side-effect + // that the GUI won't be activated (or raised) so there is a hack in + // MMWindowController which always raises the app when a new window is + // opened. + NSMutableArray *args = [NSMutableArray arrayWithObjects:@"-nowindow", + @"yes", nil]; + NSString *path = [[NSBundle mainBundle] + pathForAuxiliaryExecutable:@"MacVim"]; + [NSTask launchedTaskWithLaunchPath:path arguments:args]; +#endif + + // HACK! The NSWorkspaceDidLaunchApplicationNotification does not work + // for tasks like this, so poll the mach bootstrap server until it + // returns a valid port. Also set a time-out date so that we don't get + // stuck doing this forever. + NSDate *timeOutDate = [NSDate dateWithTimeIntervalSinceNow:15]; + while (!port && + NSOrderedDescending == [timeOutDate compare:[NSDate date]]) { + [[NSRunLoop currentRunLoop] + runMode:NSDefaultRunLoopMode + beforeDate:[NSDate dateWithTimeIntervalSinceNow:1]]; + port = [[NSMachBootstrapServer sharedInstance] portForName:portName]; + } + + if (!port) { + NSLog(@"WARNING: Timed-out waiting for GUI to launch."); + return NO; + } + } + + receivePort = [NSMachPort new]; + [receivePort setDelegate:self]; + + [[NSRunLoop currentRunLoop] addPort:receivePort + forMode:NSDefaultRunLoopMode]; + + [NSPortMessage sendMessage:CheckinMsgID withSendPort:port + receivePort:receivePort wait:YES]; + + return YES; +} + +- (BOOL)openVimWindowWithRows:(int)rows columns:(int)cols +{ + if (!sendPort) { +#if 0 + // TODO: Wait until connected---maybe time out at some point? + // Note that if we return 'NO' Vim will be started in terminal mode + // (i.e. output goes to stdout). + NSLog(@"WARNING: Trying to open VimWindow but sendPort==nil;" + " waiting for connected message."); + + [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode + beforeDate:[NSDate distantFuture]]; + if (!sendPort) + return NO; +#else + // Wait until the sendPort has actually been set. + // + // TODO: Come up with a more elegant solution to this problem---this + // message should not be called before the sendPort has been + // initialized. + while (!sendPort) { + [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode + beforeDate:[NSDate distantFuture]]; + } +#endif + } + + NSMutableData *data = [NSMutableData data]; + + [data appendBytes:&rows length:sizeof(int)]; + [data appendBytes:&cols length:sizeof(int)]; + + [self queueMessage:OpenVimWindowMsgID data:data]; + + return YES; +} + +- (void)clearAll +{ + int type = ClearAllDrawType; + + // Any draw commands in queue are effectively obsolete since this clearAll + // will negate any effect they have, therefore we may as well clear the + // draw queue. + [drawData setLength:0]; + + [drawData appendBytes:&type length:sizeof(int)]; + [drawData appendBytes:&Rows length:sizeof(int)]; + [drawData appendBytes:&Columns length:sizeof(int)]; + + [drawData appendBytes:&defaultBackgroundColor length:sizeof(int)]; +} + +- (void)clearBlockFromRow:(int)row1 column:(int)col1 + toRow:(int)row2 column:(int)col2 +{ + int type = ClearBlockDrawType; + + [drawData appendBytes:&type length:sizeof(int)]; + [drawData appendBytes:&Rows length:sizeof(int)]; + [drawData appendBytes:&Columns length:sizeof(int)]; + + [drawData appendBytes:&defaultBackgroundColor length:sizeof(int)]; + [drawData appendBytes:&row1 length:sizeof(int)]; + [drawData appendBytes:&col1 length:sizeof(int)]; + [drawData appendBytes:&row2 length:sizeof(int)]; + [drawData appendBytes:&col2 length:sizeof(int)]; +} + +- (void)deleteLinesFromRow:(int)row count:(int)count + scrollBottom:(int)bottom left:(int)left right:(int)right +{ + int type = DeleteLinesDrawType; + + [drawData appendBytes:&type length:sizeof(int)]; + [drawData appendBytes:&Rows length:sizeof(int)]; + [drawData appendBytes:&Columns length:sizeof(int)]; + + [drawData appendBytes:&defaultBackgroundColor length:sizeof(int)]; + [drawData appendBytes:&row length:sizeof(int)]; + [drawData appendBytes:&count length:sizeof(int)]; + [drawData appendBytes:&bottom length:sizeof(int)]; + [drawData appendBytes:&left length:sizeof(int)]; + [drawData appendBytes:&right length:sizeof(int)]; +} + +- (void)replaceString:(char*)s length:(int)len row:(int)row column:(int)col + flags:(int)flags +{ + int type = ReplaceStringDrawType; + + [drawData appendBytes:&type length:sizeof(int)]; + [drawData appendBytes:&Rows length:sizeof(int)]; + [drawData appendBytes:&Columns length:sizeof(int)]; + + [drawData appendBytes:&backgroundColor length:sizeof(int)]; + [drawData appendBytes:&foregroundColor length:sizeof(int)]; + [drawData appendBytes:&row length:sizeof(int)]; + [drawData appendBytes:&col length:sizeof(int)]; + [drawData appendBytes:&flags length:sizeof(int)]; + [drawData appendBytes:&len length:sizeof(int)]; + [drawData appendBytes:s length:len]; +} + +- (void)insertLinesFromRow:(int)row count:(int)count + scrollBottom:(int)bottom left:(int)left right:(int)right +{ + int type = InsertLinesDrawType; + + [drawData appendBytes:&type length:sizeof(int)]; + [drawData appendBytes:&Rows length:sizeof(int)]; + [drawData appendBytes:&Columns length:sizeof(int)]; + + [drawData appendBytes:&defaultBackgroundColor length:sizeof(int)]; + [drawData appendBytes:&row length:sizeof(int)]; + [drawData appendBytes:&count length:sizeof(int)]; + [drawData appendBytes:&bottom length:sizeof(int)]; + [drawData appendBytes:&left length:sizeof(int)]; + [drawData appendBytes:&right length:sizeof(int)]; +} + +- (void)flush +{ + if ([drawData length] > 0) { + [self queueMessage:BatchDrawMsgID data:[drawData copy]]; + [drawData setLength:0]; + } +} + +- (void)flushQueue +{ + [self flush]; + + if ([drawData length] > 0 || [queue count] > 0) { + // TODO: Come up with a better way to handle the insertion point. + [self updateInsertionPoint]; + + [NSPortMessage sendMessage:FlushQueueMsgID withSendPort:sendPort + components:queue wait:YES]; + [queue removeAllObjects]; + } +} + +- (BOOL)waitForInput:(int)milliseconds +{ + if (![receivePort isValid]) { + // This should only happen if the GUI crashes. + NSLog(@"ERROR: The receive port is no longer valid, quitting..."); + getout(0); + } + + NSDate *date = milliseconds > 0 ? + [NSDate dateWithTimeIntervalSinceNow:.001*milliseconds] : + [NSDate distantFuture]; + + [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:date]; + + // I know of no way to figure out if the run loop exited because input was + // found or because of a time out, so I need to manually indicate when + // input was received in handlePortMessage and then reset it every time + // here. + BOOL yn = inputReceived; + inputReceived = NO; + + return yn; +} + +- (void)exit +{ + if (!receivedKillTaskMsg) { + [NSPortMessage sendMessage:TaskExitedMsgID withSendPort:sendPort + receivePort:receivePort wait:YES]; + } +} + +- (void)selectTab:(int)index +{ + //NSLog(@"%s%d", _cmd, index); + + index -= 1; + NSData *data = [NSData dataWithBytes:&index length:sizeof(int)]; + [self queueMessage:SelectTabMsgID data:data]; +} + +- (void)updateTabBar +{ + //NSLog(@"%s", _cmd); + + NSMutableData *data = [NSMutableData data]; + + int idx = tabpage_index(curtab) - 1; + [data appendBytes:&idx length:sizeof(int)]; + + tabpage_T *tp; + for (tp = first_tabpage; tp != NULL; tp = tp->tp_next) { + // This function puts the label of the tab in the global 'NameBuff'. + get_tabline_label(tp, FALSE); + int len = strlen((char*)NameBuff); + + // Count the number of windows in the tabpage. + //win_T *wp = tp->tp_firstwin; + //int wincount; + //for (wincount = 0; wp != NULL; wp = wp->w_next, ++wincount); + + //[data appendBytes:&wincount length:sizeof(int)]; + [data appendBytes:&len length:sizeof(int)]; + [data appendBytes:NameBuff length:len]; + } + + [self queueMessage:UpdateTabBarMsgID data:data]; +} + +- (BOOL)tabBarVisible +{ + return tabBarVisible; +} + +- (void)showTabBar:(BOOL)enable +{ + tabBarVisible = enable; + + int msgid = enable ? ShowTabBarMsgID : HideTabBarMsgID; + [self queueMessage:msgid data:nil]; +} + +- (void)setRows:(int)rows columns:(int)cols +{ + //NSLog(@"[VimTask] setRows:%d columns:%d", rows, cols); + + int dim[] = { rows, cols }; + NSData *data = [NSData dataWithBytes:&dim length:2*sizeof(int)]; + + [self queueMessage:SetTextDimensionsMsgID data:data]; +} + +- (void)setVimWindowTitle:(char *)title +{ + NSMutableData *data = [NSMutableData data]; + int len = strlen(title); + + [data appendBytes:&len length:sizeof(int)]; + [data appendBytes:title length:len]; + + [self queueMessage:SetVimWindowTitleMsgID data:data]; +} + +- (char *)browseForFileInDirectory:(char *)dir title:(char *)title + saving:(int)saving +{ + //NSLog(@"browseForFileInDirectory:%s title:%s saving:%d", dir, title, + // saving); + + NSMutableData *data = [NSMutableData data]; + + [data appendBytes:&saving length:sizeof(int)]; + + int len = dir ? strlen(dir) : 0; + [data appendBytes:&len length:sizeof(int)]; + if (len > 0) + [data appendBytes:dir length:len]; + + len = title ? strlen(title) : 0; + [data appendBytes:&len length:sizeof(int)]; + if (len > 0) + [data appendBytes:title length:len]; + + if (![NSPortMessage sendMessage:BrowseForFileMsgID withSendPort:sendPort + data:data wait:YES]) + return nil; + + // Wait until a reply is sent from MMVimController. + [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode + beforeDate:[NSDate distantFuture]]; + + // Something went wrong if replyData is nil. + if (!replyData) + return nil; + + const void *bytes = [replyData bytes]; + int ok = *((int*)bytes); bytes += sizeof(int); + len = *((int*)bytes); bytes += sizeof(int); + + char_u *s = NULL; + if (ok && len > 0) { + NSString *name = [[NSString alloc] initWithBytes:(void*)bytes + length:len encoding:NSUTF8StringEncoding]; + s = vim_strsave((char_u*)[name UTF8String]); + } + + [replyData release]; replyData = nil; + return (char*)s; +} + +- (void)updateInsertionPoint +{ + NSMutableData *data = [NSMutableData data]; + + int state = get_shape_idx(FALSE); + state = (state == SHAPE_IDX_I) || (state == SHAPE_IDX_CI); + + [data appendBytes:&defaultForegroundColor length:sizeof(int)]; + [data appendBytes:&gui.row length:sizeof(int)]; + [data appendBytes:&gui.col length:sizeof(int)]; + [data appendBytes:&state length:sizeof(int)]; + + [self queueMessage:UpdateInsertionPointMsgID data:data]; +} + +- (void)addMenuWithTag:(int)tag parent:(int)parentTag name:(char *)name + atIndex:(int)index +{ + //NSLog(@"addMenuWithTag:%d parent:%d name:%s atIndex:%d", tag, parentTag, + // name, index); + + int namelen = name ? strlen(name) : 0; + NSMutableData *data = [NSMutableData data]; + + [data appendBytes:&tag length:sizeof(int)]; + [data appendBytes:&parentTag length:sizeof(int)]; + [data appendBytes:&namelen length:sizeof(int)]; + if (namelen > 0) [data appendBytes:name length:namelen]; + [data appendBytes:&index length:sizeof(int)]; + + [self queueMessage:AddMenuMsgID data:data]; +} + +- (void)addMenuItemWithTag:(int)tag parent:(int)parentTag name:(char *)name + tip:(char *)tip icon:(char *)icon atIndex:(int)index +{ + //NSLog(@"addMenuItemWithTag:%d parent:%d name:%s tip:%s atIndex:%d", tag, + // parentTag, name, tip, index); + + int namelen = name ? strlen(name) : 0; + int tiplen = tip ? strlen(tip) : 0; + int iconlen = icon ? strlen(icon) : 0; + NSMutableData *data = [NSMutableData data]; + + [data appendBytes:&tag length:sizeof(int)]; + [data appendBytes:&parentTag length:sizeof(int)]; + [data appendBytes:&namelen length:sizeof(int)]; + if (namelen > 0) [data appendBytes:name length:namelen]; + [data appendBytes:&tiplen length:sizeof(int)]; + if (tiplen > 0) [data appendBytes:tip length:tiplen]; + [data appendBytes:&iconlen length:sizeof(int)]; + if (iconlen > 0) [data appendBytes:icon length:iconlen]; + [data appendBytes:&index length:sizeof(int)]; + + [self queueMessage:AddMenuItemMsgID data:data]; +} + +- (void)removeMenuItemWithTag:(int)tag +{ + NSMutableData *data = [NSMutableData data]; + [data appendBytes:&tag length:sizeof(int)]; + + [self queueMessage:RemoveMenuItemMsgID data:data]; +} + +- (void)enableMenuItemWithTag:(int)tag state:(int)enabled +{ + NSMutableData *data = [NSMutableData data]; + + [data appendBytes:&tag length:sizeof(int)]; + [data appendBytes:&enabled length:sizeof(int)]; + + [self queueMessage:EnableMenuItemMsgID data:data]; +} + +- (void)showToolbar:(int)enable flags:(int)flags +{ + NSMutableData *data = [NSMutableData data]; + + [data appendBytes:&enable length:sizeof(int)]; + [data appendBytes:&flags length:sizeof(int)]; + + [self queueMessage:ShowToolbarMsgID data:data]; +} + +- (void)createScrollbarWithIdentifier:(long)ident type:(int)type +{ + NSMutableData *data = [NSMutableData data]; + + [data appendBytes:&ident length:sizeof(long)]; + [data appendBytes:&type length:sizeof(int)]; + + [self queueMessage:CreateScrollbarMsgID data:data]; +} + +- (void)destroyScrollbarWithIdentifier:(long)ident +{ + NSMutableData *data = [NSMutableData data]; + [data appendBytes:&ident length:sizeof(long)]; + + [self queueMessage:DestroyScrollbarMsgID data:data]; +} + +- (void)showScrollbarWithIdentifier:(long)ident state:(int)visible +{ + NSMutableData *data = [NSMutableData data]; + + [data appendBytes:&ident length:sizeof(long)]; + [data appendBytes:&visible length:sizeof(int)]; + + [self queueMessage:ShowScrollbarMsgID data:data]; +} + +- (void)setScrollbarPosition:(int)pos length:(int)len identifier:(long)ident +{ + NSMutableData *data = [NSMutableData data]; + + [data appendBytes:&ident length:sizeof(long)]; + [data appendBytes:&pos length:sizeof(int)]; + [data appendBytes:&len length:sizeof(int)]; + + [self queueMessage:SetScrollbarPositionMsgID data:data]; +} + +- (void)setScrollbarThumbValue:(long)val size:(long)size max:(long)max + identifier:(long)ident +{ + float fval = max-size+1 > 0 ? (float)val/(max-size+1) : 0; + float prop = (float)size/(max+1); + if (fval < 0) fval = 0; + else if (fval > 1.0f) fval = 1.0f; + if (prop < 0) prop = 0; + else if (prop > 1.0f) prop = 1.0f; + + NSMutableData *data = [NSMutableData data]; + + [data appendBytes:&ident length:sizeof(long)]; + [data appendBytes:&fval length:sizeof(float)]; + [data appendBytes:&prop length:sizeof(float)]; + + [self queueMessage:SetScrollbarThumbMsgID data:data]; +} + +- (BOOL)setFontWithName:(char *)name +{ + NSString *fontName; + float size = 0.0f; + BOOL parseFailed = NO; + + if (name) { + fontName = [[[NSString alloc] initWithCString:name + encoding:NSUTF8StringEncoding] autorelease]; + NSArray *components = [fontName componentsSeparatedByString:@":"]; + if ([components count] == 2) { + NSString *sizeString = [components lastObject]; + if ([sizeString length] > 0 + && [sizeString characterAtIndex:0] == 'h') { + sizeString = [sizeString substringFromIndex:1]; + if ([sizeString length] > 0) { + size = [sizeString floatValue]; + fontName = [components objectAtIndex:0]; + } + } else { + parseFailed = YES; + } + } else if ([components count] > 2) { + parseFailed = YES; + } + } else { + fontName = [[NSFont userFixedPitchFontOfSize:0] displayName]; + } + + if (!parseFailed && [fontName length] > 0) { + if (size < 6 || size > 100) { + // Font size 0.0 tells NSFont to use the 'user default size'. + size = 0.0f; + } + + NSFont *font = [NSFont fontWithName:fontName size:size]; + if (font) { + //NSLog(@"Setting font '%@' of size %.2f", fontName, size); + NSMutableData *data = [NSMutableData data]; + int len = [fontName + lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; + + [data appendBytes:&size length:sizeof(float)]; + [data appendBytes:&len length:sizeof(int)]; + [data appendBytes:[fontName UTF8String] length:len]; + + [self queueMessage:SetFontMsgID data:data]; + return YES; + } + } + + NSLog(@"WARNING: Cannot set font with name '%@' of size %.2f", + fontName, size); + return NO; +} + +- (int)lookupColorWithKey:(NSString *)key +{ + if (!(key && [key length] > 0)) + return INVALCOLOR; + + // First of all try to lookup key in the color dictionary; note that all + // keys in this dictionary are lowercase with no whitespace. + + NSString *stripKey = [[[[key lowercaseString] + stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]] + componentsSeparatedByString:@" "] + componentsJoinedByString:@""]; + + if (stripKey && [stripKey length] > 0) { + id obj = [colorDict objectForKey:stripKey]; + if (obj) return [obj intValue]; + + // The key was not in the dictionary; is it perhaps of the form + // #rrggbb? + + if ([stripKey length] > 1 && [stripKey characterAtIndex:0] == '#') { + NSScanner *scanner = [NSScanner scannerWithString:stripKey]; + [scanner setScanLocation:1]; + unsigned hex = 0; + if ([scanner scanHexInt:&hex]) { + return (int)hex; + } + } + } + + NSLog(@"WARNING: No color with key %@ found.", stripKey); + return INVALCOLOR; +} + +- (void)handlePortMessage:(NSPortMessage *)portMessage +{ + unsigned msgid = [portMessage msgid]; + + if (ConnectedMsgID == msgid) { + sendPort = [[portMessage sendPort] retain]; + //NSLog(@"VimTask connected to MMVimController."); + } else if (KillTaskMsgID == msgid) { + //NSLog(@"VimTask received kill message; exiting now."); + // Set this flag here so that exit does not send TaskExitedMsgID back + // to MMVimController. + receivedKillTaskMsg = YES; + getout(0); + } else if (InsertTextMsgID == msgid) { + if (![[portMessage components] count]) return; + NSString *key = [[NSString alloc] + initWithData:[[portMessage components] objectAtIndex:0] + encoding:NSUTF8StringEncoding]; + //NSLog(@"insert text: %@ (hex=%x)", key, [key characterAtIndex:0]); + add_to_input_buf((char_u*)[key UTF8String], + [key lengthOfBytesUsingEncoding:NSUTF8StringEncoding]); + [key release]; + + inputReceived = YES; + } else if (KeyDownMsgID == msgid || CmdKeyMsgID == msgid) { + if (![[portMessage components] count]) return; + const void *bytes = [[[portMessage components] objectAtIndex:0] bytes]; + int mods = *((int*)bytes); bytes += sizeof(int); + int len = *((int*)bytes); bytes += sizeof(int); + NSString *key = [[NSString alloc] initWithBytes:bytes length:len + encoding:NSUTF8StringEncoding]; + mods = eventModifierFlagsToVimModMask(mods); + + [self handleKeyDown:key modifiers:mods]; + + [key release]; + inputReceived = YES; + } else if (SelectTabMsgID == msgid) { + if (![[portMessage components] count]) return; + const void *bytes = [[[portMessage components] objectAtIndex:0] bytes]; + int idx = *((int*)bytes) + 1; + //NSLog(@"Selecting tab %d", idx); + send_tabline_event(idx); + inputReceived = YES; + } else if (CloseTabMsgID == msgid) { + if (![[portMessage components] count]) return; + const void *bytes = [[[portMessage components] objectAtIndex:0] bytes]; + int idx = *((int*)bytes) + 1; + //NSLog(@"Closing tab %d", idx); + send_tabline_menu_event(idx, TABLINE_MENU_CLOSE); + inputReceived = YES; + } else if (AddNewTabMsgID == msgid) { + //NSLog(@"Adding new tab"); + send_tabline_menu_event(0, TABLINE_MENU_NEW); + inputReceived = YES; + } else if (DraggedTabMsgID == msgid) { + if (![[portMessage components] count]) return; + const void *bytes = [[[portMessage components] objectAtIndex:0] bytes]; + // NOTE! The destination index is 0 based, so do not add 1 to make it 1 + // based. + int idx = *((int*)bytes); + +#if 0 + tabpage_T *tp = find_tabpage(oldIdx); + if (tp) { + // HACK! tabpage_move(idx) moves 'curtab' to 'idx', but since it + // is also possible to drag tabs which are not selected we must + // first set 'curtab' to the tab that was actually dragged and then + // reset 'curtab' to what it used to be. + tabpage_T *oldcur = curtab; + curtab = tp; + tabpage_move(idx); + curtab = oldcur; + } +#else + tabpage_move(idx); +#endif + } else if (ScrollWheelMsgID == msgid) { + if (![[portMessage components] count]) return; + const void *bytes = [[[portMessage components] objectAtIndex:0] bytes]; + + int row = *((int*)bytes); bytes += sizeof(int); + int col = *((int*)bytes); bytes += sizeof(int); + int flags = *((int*)bytes); bytes += sizeof(int); + float dy = *((float*)bytes); bytes += sizeof(float); + + int button = MOUSE_5; + if (dy > 0) button = MOUSE_4; + + flags = eventModifierFlagsToVimMouseModMask(flags); + + gui_send_mouse_event(button, col, row, NO, flags); + inputReceived = YES; + } else if (MouseDownMsgID == msgid) { + if (![[portMessage components] count]) return; + const void *bytes = [[[portMessage components] objectAtIndex:0] bytes]; + + int row = *((int*)bytes); bytes += sizeof(int); + int col = *((int*)bytes); bytes += sizeof(int); + int button = *((int*)bytes); bytes += sizeof(int); + int flags = *((int*)bytes); bytes += sizeof(int); + int count = *((int*)bytes); bytes += sizeof(int); + + button = eventButtonNumberToVimMouseButton(button); + flags = eventModifierFlagsToVimMouseModMask(flags); + + gui_send_mouse_event(button, col, row, 0 != count, flags); + + inputReceived = YES; + } else if (MouseUpMsgID == msgid) { + if (![[portMessage components] count]) return; + const void *bytes = [[[portMessage components] objectAtIndex:0] bytes]; + + int row = *((int*)bytes); bytes += sizeof(int); + int col = *((int*)bytes); bytes += sizeof(int); + int flags = *((int*)bytes); bytes += sizeof(int); + + flags = eventModifierFlagsToVimMouseModMask(flags); + + gui_send_mouse_event(MOUSE_RELEASE, col, row, NO, flags); + inputReceived = YES; + } else if (MouseDraggedMsgID == msgid) { + if (![[portMessage components] count]) return; + const void *bytes = [[[portMessage components] objectAtIndex:0] bytes]; + + int row = *((int*)bytes); bytes += sizeof(int); + int col = *((int*)bytes); bytes += sizeof(int); + int flags = *((int*)bytes); bytes += sizeof(int); + + flags = eventModifierFlagsToVimMouseModMask(flags); + + gui_send_mouse_event(MOUSE_DRAG, col, row, NO, flags); + inputReceived = YES; + } else if (BrowseForFileReplyMsgID == msgid) { + if (![[portMessage components] count]) return; + [replyData release]; + replyData = [[[portMessage components] objectAtIndex:0] copy]; + } else if (SetTextDimensionsMsgID == msgid) { + if (![[portMessage components] count]) return; + const void *bytes = [[[portMessage components] objectAtIndex:0] bytes]; + int rows = *((int*)bytes); bytes += sizeof(int); + int cols = *((int*)bytes); bytes += sizeof(int); + + //NSLog(@"[VimTask] Resizing shell to %dx%d.", cols, rows); + gui_resize_shell(cols, rows); + } else if (ExecuteMenuMsgID == msgid) { + if (![[portMessage components] count]) return; + const void *bytes = [[[portMessage components] objectAtIndex:0] bytes]; + int tag = *((int*)bytes); bytes += sizeof(int); + + vimmenu_T *menu = (vimmenu_T*)tag; + // TODO! Make sure 'menu' is a valid menu pointer! + if (menu) { + gui_menu_cb(menu); + inputReceived = YES; + } + } else if (TaskShouldTerminateMsgID == msgid) { + int reply = TerminateReplyYesMsgID; + buf_T *buf; + for (buf = firstbuf; buf != NULL; buf = buf->b_next) { + if (bufIsChanged(buf)) { + reply = TerminateReplyNoMsgID; + break; + } + } + + //NSLog(@"TaskShouldTerminateMsgID = %s", + // reply == TerminateReplyYesMsgID ? "YES" : "NO"); + + [NSPortMessage sendMessage:reply withSendPort:[portMessage sendPort] + wait:YES]; + } else if (ScrollbarEventMsgID == msgid) { + if (![[portMessage components] count]) return; + const void *bytes = [[[portMessage components] objectAtIndex:0] bytes]; + long ident = *((long*)bytes); bytes += sizeof(long); + int hitPart = *((int*)bytes); bytes += sizeof(int); + float fval = *((float*)bytes); bytes += sizeof(float); + scrollbar_T *sb = gui_find_scrollbar(ident); + + if (sb) { + scrollbar_T *sb_info = sb->wp ? &sb->wp->w_scrollbars[0] : sb; + long value = sb_info->value; + long size = sb_info->size; + long max = sb_info->max; + BOOL isStillDragging = NO; + BOOL updateKnob = YES; + + switch (hitPart) { + case NSScrollerDecrementPage: + value -= (size > 2 ? size - 2 : 1); + break; + case NSScrollerIncrementPage: + value += (size > 2 ? size - 2 : 1); + break; + case NSScrollerDecrementLine: + --value; + break; + case NSScrollerIncrementLine: + ++value; + break; + case NSScrollerKnob: + isStillDragging = YES; + // fall through ... + case NSScrollerKnobSlot: + value = (long)(fval * (max - size + 1)); + // fall through ... + default: + updateKnob = NO; + break; + } + + //NSLog(@"value %d -> %d", sb_info->value, value); + gui_drag_scrollbar(sb, value, isStillDragging); + + if (updateKnob) { + // Dragging the knob or option+clicking automatically updates + // the knob position (on the actual NSScroller), so we only + // need to set the knob position in the other cases. + if (sb->wp) { + // Update both the left&right vertical scrollbars. + long identLeft = sb->wp->w_scrollbars[SBAR_LEFT].ident; + long identRight = sb->wp->w_scrollbars[SBAR_RIGHT].ident; + [self setScrollbarThumbValue:value size:size max:max + identifier:identLeft]; + [self setScrollbarThumbValue:value size:size max:max + identifier:identRight]; + } else { + // Update the horizontal scrollbar. + [self setScrollbarThumbValue:value size:size max:max + identifier:ident]; + } + } + + inputReceived = YES; + } + } else { + NSLog(@"WARNING: Unknown message received (msgid=%d)", msgid); + } +} + + +@end // MMBackend + + + +@implementation MMBackend (Private) + ++ (NSDictionary *)specialKeys +{ + static NSDictionary *specialKeys = nil; + + if (!specialKeys) { + NSBundle *mainBundle = [NSBundle mainBundle]; + NSString *path = [mainBundle pathForResource:@"SpecialKeys" + ofType:@"plist"]; + specialKeys = [[NSDictionary alloc] initWithContentsOfFile:path]; + } + + return specialKeys; +} + +- (void)handleKeyDown:(NSString *)key modifiers:(int)mods +{ + char_u special[3]; + char_u modChars[3]; + char_u *chars = 0; + int length = 0; + + // Special keys (arrow keys, function keys, etc.) are stored in a plist so + // that new keys can easily be added. + NSString *specialString = [[MMBackend specialKeys] + objectForKey:key]; + if (specialString && [specialString length] > 1) { + //NSLog(@"special key: %@", specialString); + int ikey = TO_SPECIAL([specialString characterAtIndex:0], + [specialString characterAtIndex:1]); + + ikey = simplify_key(ikey, &mods); + if (ikey == CSI) + ikey = K_CSI; + + special[0] = CSI; + special[1] = K_SECOND(ikey); + special[2] = K_THIRD(ikey); + + chars = special; + length = 3; + } else if ([key length] > 0) { + chars = (char_u*)[key UTF8String]; + length = [key lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; + unichar c = [key characterAtIndex:0]; + + //NSLog(@"non-special: %@ (hex=%x, mods=%d)", key, + // [key characterAtIndex:0], mods); + + // HACK! In most circumstances the Ctrl and Shift modifiers should be + // cleared since they are already added to the key by the AppKit. + // Unfortunately, the only way to deal with when to clear the modifiers + // or not seems to be to have hard-wired rules like this. + if ( !((' ' == c) || (0xa0 == c) || (mods & MOD_MASK_CMD)) ) { + mods &= ~MOD_MASK_SHIFT; + mods &= ~MOD_MASK_CTRL; + //NSLog(@"clear shift ctrl"); + } + + // HACK! All Option+key presses go via 'insert text' messages, except + // for . If the Alt flag is not cleared for it does + // not work to map to it. + if (0xa0 == c && !(mods & MOD_MASK_CMD)) { + //NSLog(@"clear alt"); + mods &= ~MOD_MASK_ALT; + } + } + + if (chars && length > 0) { + if (mods) { + //NSLog(@"adding mods: %d", mods); + modChars[0] = CSI; + modChars[1] = KS_MODIFIER; + modChars[2] = mods; + add_to_input_buf(modChars, 3); + } + + //NSLog(@"add to input buf: 0x%x", chars[0]); + add_to_input_buf(chars, length); + } +} + +- (void)queueMessage:(int)msgid data:(NSData *)data +{ + [queue addObject:[NSData dataWithBytes:&msgid length:sizeof(int)]]; + if (data) + [queue addObject:data]; + else + [queue addObject:[NSData data]]; +} + +@end // MMBackend (Private) + + + + +static int eventModifierFlagsToVimModMask(int modifierFlags) +{ + int modMask = 0; + + if (modifierFlags & NSShiftKeyMask) + modMask |= MOD_MASK_SHIFT; + if (modifierFlags & NSControlKeyMask) + modMask |= MOD_MASK_CTRL; + if (modifierFlags & NSAlternateKeyMask) + modMask |= MOD_MASK_ALT; + if (modifierFlags & NSCommandKeyMask) + modMask |= MOD_MASK_CMD; + + return modMask; +} + +static int eventModifierFlagsToVimMouseModMask(int modifierFlags) +{ + int modMask = 0; + + if (modifierFlags & NSShiftKeyMask) + modMask |= MOUSE_SHIFT; + if (modifierFlags & NSControlKeyMask) + modMask |= MOUSE_CTRL; + if (modifierFlags & NSAlternateKeyMask) + modMask |= MOUSE_ALT; + + return modMask; +} + +static int eventButtonNumberToVimMouseButton(int buttonNumber) +{ + static int mouseButton[] = { MOUSE_LEFT, MOUSE_RIGHT, MOUSE_MIDDLE, + MOUSE_X1, MOUSE_X2 }; + + return mouseButton[buttonNumber < 5 ? buttonNumber : 0]; +} diff --git a/MMTextStorage.h b/MMTextStorage.h new file mode 100644 index 0000000000..61034ccba1 --- /dev/null +++ b/MMTextStorage.h @@ -0,0 +1,60 @@ +/* vi:set ts=8 sts=4 sw=4 ft=objc: + * + * VIM - Vi IMproved by Bram Moolenaar + * MacVim GUI port by Bjorn Winckler + * + * Do ":help uganda" in Vim to read copying and usage conditions. + * Do ":help credits" in Vim to see a list of people who contributed. + * See README.txt for an overview of the Vim source code. + */ + +#import + + + +@interface MMTextStorage : NSTextStorage { + NSMutableAttributedString *attribString; + int maxRows, maxColumns; + // TODO! Rename to emptyRowString + NSAttributedString *emptyColumnString; + NSFont *font; + //NSMutableParagraphStyle *paragraphStyle; +} + +- (NSString *)string; +- (NSDictionary *)attributesAtIndex:(unsigned)index + effectiveRange:(NSRangePointer)aRange; +- (void)replaceCharactersInRange:(NSRange)aRange + withString:(NSString *)aString; +- (void)setAttributes:(NSDictionary *)attributes range:(NSRange)aRange; + +- (int)maxRows; +- (int)maxColumns; +- (void)getMaxRows:(int*)rows columns:(int*)cols; +- (void)setMaxRows:(int)rows columns:(int)cols; +- (void)replaceString:(NSString*)string atRow:(int)row column:(int)col + withFlags:(int)flags foregroundColor:(NSColor*)fg + backgroundColor:(NSColor*)bg; +- (void)deleteLinesFromRow:(int)row lineCount:(int)count + scrollBottom:(int)bottom left:(int)left right:(int)right + color:(NSColor *)color; +- (void)insertLinesAtRow:(int)row lineCount:(int)count + scrollBottom:(int)bottom left:(int)left right:(int)right + color:(NSColor *)color; +- (void)clearBlockFromRow:(int)row1 column:(int)col1 toRow:(int)row2 + column:(int)col2 color:(NSColor *)color; +- (void)clearAllWithColor:(NSColor *)color; +- (void)setFont:(NSFont*)newFont; +- (NSFont*)font; +- (float)widthOfEmptyColumn; +- (NSSize)size; +- (NSSize)calculateAverageFontSize; +- (NSRect)rectForRowsInRange:(NSRange)range; +- (NSRect)rectForColumnsInRange:(NSRange)range; +- (unsigned)offsetFromRow:(int)row column:(int)col; +- (BOOL)resizeToFitSize:(NSSize)size; +- (NSSize)fitToSize:(NSSize)size; + +@end + +/* vim: set filetype=objc: */ diff --git a/MMTextStorage.m b/MMTextStorage.m new file mode 100644 index 0000000000..4e5b4459c5 --- /dev/null +++ b/MMTextStorage.m @@ -0,0 +1,554 @@ +/* vi:set ts=8 sts=4 sw=4 ft=objc: + * + * VIM - Vi IMproved by Bram Moolenaar + * MacVim GUI port by Bjorn Winckler + * + * Do ":help uganda" in Vim to read copying and usage conditions. + * Do ":help credits" in Vim to see a list of people who contributed. + * See README.txt for an overview of the Vim source code. + */ + +#import "MMTextStorage.h" + +// If 0 DRAW_TRANSP flag will be ignored. Setting it to 1 causes the cursor +// background to be drawn in white. +#define HEED_DRAW_TRANSP 0 + +#define DRAW_TRANSP 0x01 /* draw with transparant bg */ +#define DRAW_BOLD 0x02 /* draw bold text */ +#define DRAW_UNDERL 0x04 /* draw underline text */ +#define DRAW_UNDERC 0x08 /* draw undercurl text */ +#define DRAW_ITALIC 0x10 /* draw italic text */ + + +//static float LINEHEIGHT = 30.0f; + + + +@interface MMTextStorage (Private) +- (NSSize)fitToSize:(NSSize)size rows:(int *)rows columns:(int *)columns; +@end + + + +@implementation MMTextStorage + +- (id)init +{ + if ((self = [super init])) { + attribString = [[NSMutableAttributedString alloc] initWithString:@""]; + // NOTE! It does not matter which font is set here, Vim will set its + // own font on startup anyway. + font = [[NSFont userFixedPitchFontOfSize:0] retain]; + +#if 0 + paragraphStyle = [[NSMutableParagraphStyle alloc] init]; + [paragraphStyle setMinimumLineHeight:LINEHEIGHT]; + [paragraphStyle setMaximumLineHeight:LINEHEIGHT]; + [paragraphStyle setLineSpacing:0]; +#endif + } + + return self; +} + +- (void)dealloc +{ + [emptyColumnString release]; + //[paragraphStyle release]; + [font release]; + [attribString release]; + [super dealloc]; +} + +- (NSString *)string +{ + //NSLog(@"%s : attribString=%@", _cmd, attribString); + return [attribString string]; +} + +- (NSDictionary *)attributesAtIndex:(unsigned)index + effectiveRange:(NSRangePointer)aRange +{ + //NSLog(@"%s", _cmd); + if (index>=[attribString length]) { + //NSLog(@"%sWARNING: index (%d) out of bounds", _cmd, index); + if (aRange) { + *aRange = NSMakeRange(NSNotFound, 0); + } + return [NSDictionary dictionary]; + } + + return [attribString attributesAtIndex:index effectiveRange:aRange]; +} + +- (void)replaceCharactersInRange:(NSRange)aRange + withString:(NSString *)aString +{ + //NSLog(@"replaceCharactersInRange:(%d,%d) withString:%@", aRange.location, + // aRange.length, aString); + NSLog(@"WARNING: calling %s on MMTextStorage is unsupported", _cmd); + //[attribString replaceCharactersInRange:aRange withString:aString]; +} + +- (void)setAttributes:(NSDictionary *)attributes range:(NSRange)aRange +{ + // NOTE! This method must be implemented since the text system calls it + // constantly to 'fix attributes', apply font substitution, etc. + [attribString setAttributes:attributes range:aRange]; +} + +- (int)maxRows +{ + return maxRows; +} + +- (int)maxColumns +{ + return maxColumns; +} + +- (void)getMaxRows:(int*)rows columns:(int*)cols +{ + if (rows) *rows = maxRows; + if (cols) *cols = maxColumns; +} + +- (void)setMaxRows:(int)rows columns:(int)cols +{ + // Do nothing if the dimensions are already right. + if (maxRows == rows && maxColumns == cols) + return; + + NSRange oldRange = NSMakeRange(0, maxRows*(maxColumns+1)); + + maxRows = rows; + maxColumns = cols; + //NSLog(@"setMaxRows:%d columns:%d", maxRows, maxColumns); + + NSString *fmt = [NSString stringWithFormat:@"%%%dc\%C", maxColumns, + NSLineSeparatorCharacter]; + NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys: + font, NSFontAttributeName, + nil]; + + [emptyColumnString release]; + emptyColumnString = [[NSAttributedString alloc] + initWithString:[NSString stringWithFormat:fmt, ' '] + attributes:dict]; + + [attribString release]; + attribString = [[NSMutableAttributedString alloc] init]; + int i; + for (i=0; i= maxRows || col < 0 || col >= maxColumns + || col+[string length] > maxColumns) { + //NSLog(@"[%s] WARNING : out of range, row=%d (%d) col=%d (%d) " + // "length=%d (%d)", _cmd, row, maxRows, col, maxColumns, + // [string length], [attribString length]); + return; + } + + if (!(fg && bg)) { + NSLog(@"[%s] WARNING: background or foreground color not specified", + _cmd); + return; + } + + NSRange range = NSMakeRange(col+row*(maxColumns+1), [string length]); + [attribString replaceCharactersInRange:range withString:string]; + + NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys: + font, NSFontAttributeName, + //paragraphStyle, NSParagraphStyleAttributeName, +#if !HEED_DRAW_TRANSP + bg, NSBackgroundColorAttributeName, +#endif + fg, NSForegroundColorAttributeName, nil]; + [attribString setAttributes:attributes range:range]; + +#if HEED_DRAW_TRANSP + if ( !(flags & DRAW_TRANSP) ) { + [attribString addAttribute:NSBackgroundColorAttributeName value:bg + range:range]; + } +#endif + + // TODO: cache bold font and apply in setAttributes:range: + if (flags & DRAW_BOLD) { + [attribString applyFontTraits:NSBoldFontMask range:range]; + } + + // TODO: cache italic font and apply in setAttributes:range: + if (flags & DRAW_ITALIC) { + [attribString applyFontTraits:NSItalicFontMask range:range]; + } + + if (flags & DRAW_UNDERL) { + NSNumber *value = [NSNumber numberWithInt:(NSUnderlineStyleSingle + | NSUnderlinePatternSolid)]; // | NSUnderlineByWordMask + [attribString addAttribute:NSUnderlineStyleAttributeName + value:value range:range]; + } + + // TODO: figure out how do draw proper undercurls + if (flags & DRAW_UNDERC) { + NSNumber *value = [NSNumber numberWithInt:(NSUnderlineStyleThick + | NSUnderlinePatternDot)]; // | NSUnderlineByWordMask + [attribString addAttribute:NSUnderlineStyleAttributeName + value:value range:range]; + } + +#if 0 + [attribString addAttribute:NSParagraphStyleAttributeName + value:paragraphStyle + range:NSMakeRange(0, [attribString length])]; +#endif + + [self edited:(NSTextStorageEditedCharacters|NSTextStorageEditedAttributes) + range:range changeInLength:0]; +} + +/* + * Delete 'count' lines from 'row' and insert 'count' empty lines at the bottom + * of the scroll region. + */ +- (void)deleteLinesFromRow:(int)row lineCount:(int)count + scrollBottom:(int)bottom left:(int)left right:(int)right + color:(NSColor *)color +{ + //NSLog(@"deleteLinesFromRow:%d lineCount:%d", row, count); + + if (row < 0 || row+count > maxRows) { + NSLog(@"[%s] WARNING : out of range, row=%d (%d) count=%d", _cmd, row, + maxRows, count); + return; + } + + int total = 1 + bottom - row; + int move = total - count; + int width = right - left + 1; + NSRange destRange = { row*(maxColumns+1) + left, width }; + NSRange srcRange = { (row+count)*(maxColumns+1) + left, width }; + int i; + + for (i = 0; i < move; ++i) { + NSAttributedString *srcString = [attribString + attributedSubstringFromRange:srcRange]; + [attribString replaceCharactersInRange:destRange + withAttributedString:srcString]; + [self edited:(NSTextStorageEditedCharacters + | NSTextStorageEditedAttributes) + range:destRange changeInLength:0]; + destRange.location += maxColumns+1; + srcRange.location += maxColumns+1; + } + + for (i = 0; i < count; ++i) { + NSDictionary *attribs = [NSDictionary dictionaryWithObjectsAndKeys: + font, NSFontAttributeName, + color, NSForegroundColorAttributeName, + color, NSBackgroundColorAttributeName, nil]; + [attribString setAttributes:attribs range:destRange]; + [self edited:NSTextStorageEditedAttributes range:destRange + changeInLength:0]; + destRange.location += maxColumns+1; + } +} + +/* + * Insert 'count' empty lines at 'row' and delete 'count' lines from the bottom + * of the scroll region. + */ +- (void)insertLinesAtRow:(int)row lineCount:(int)count + scrollBottom:(int)bottom left:(int)left right:(int)right + color:(NSColor *)color +{ + //NSLog(@"insertLinesAtRow:%d lineCount:%d", row, count); + + if (row < 0 || row+count > maxRows) { + NSLog(@"[%s] WARNING : out of range, row=%d (%d) count=%d", _cmd, row, + maxRows, count); + return; + } + + int total = 1 + bottom - row; + int move = total - count; + int width = right - left + 1; + NSRange destRange = { bottom*(maxColumns+1) + left, width }; + NSRange srcRange = { (row+move-1)*(maxColumns+1) + left, width }; + int i; + + for (i = 0; i < move; ++i) { + NSAttributedString *srcString = [attribString + attributedSubstringFromRange:srcRange]; + [attribString replaceCharactersInRange:destRange + withAttributedString:srcString]; + [self edited:(NSTextStorageEditedCharacters + | NSTextStorageEditedAttributes) + range:destRange changeInLength:0]; + destRange.location -= maxColumns+1; + srcRange.location -= maxColumns+1; + } + + for (i = 0; i < count; ++i) { + NSDictionary *attribs = [NSDictionary dictionaryWithObjectsAndKeys: + font, NSFontAttributeName, + color, NSForegroundColorAttributeName, + color, NSBackgroundColorAttributeName, nil]; + [attribString setAttributes:attribs range:destRange]; + [self edited:NSTextStorageEditedAttributes range:destRange + changeInLength:0]; + destRange.location -= maxColumns+1; + } +} + +- (void)clearBlockFromRow:(int)row1 column:(int)col1 toRow:(int)row2 + column:(int)col2 color:(NSColor *)color +{ + //NSLog(@"clearBlockFromRow:%d column:%d toRow:%d column:%d", row1, col1, + // row2, col2); + + if (row1 < 0 || row2 >= maxRows || col1 < 0 || col2 > maxColumns) { + NSLog(@"[%s] WARNING : out of range, row1=%d row2=%d (%d) col1=%d " + "col2=%d (%d)", _cmd, row1, row2, maxRows, col1, col2, + maxColumns); + return; + } + + NSDictionary *attribs = [NSDictionary dictionaryWithObjectsAndKeys: + font, NSFontAttributeName, + color, NSForegroundColorAttributeName, + color, NSBackgroundColorAttributeName, nil]; + + NSRange range = { row1*(maxColumns+1) + col1, col2-col1+1 }; + + int r; + for (r=row1; r<=row2; ++r) { + [attribString setAttributes:attribs range:range]; + [self edited:NSTextStorageEditedAttributes range:range + changeInLength:0]; + range.location += maxColumns+1; + } +} + +- (void)clearAllWithColor:(NSColor *)color +{ + NSRange range = { 0, [attribString length] }; + NSDictionary *attribs = [NSDictionary dictionaryWithObjectsAndKeys: + font, NSFontAttributeName, + color, NSForegroundColorAttributeName, + color, NSBackgroundColorAttributeName, nil]; + [attribString setAttributes:attribs range:range]; + [self edited:NSTextStorageEditedAttributes range:range changeInLength:0]; +} + +- (void)setFont:(NSFont*)newFont +{ +#if 0 + if (font != newFont) { + //NSLog(@"Changing font from %@ to %@", font, newFont); + [font release]; + font = [newFont retain]; + NSRange range = { 0, [attribString length] }; + [attribString addAttribute:NSFontAttributeName value:font + range:range]; + [self setDefaultFg:norm_pixel bg:gui.back_pixel]; + [self edited:NSTextStorageEditedAttributes range:range + changeInLength:0]; + } +#else + if (font != newFont) { + //NSLog(@"Setting font %@", newFont); + [font release]; + font = [newFont retain]; + // TODO! Change paragraph style to match line height of new font + } +#endif +} + +- (NSFont*)font +{ + return font; +} + +- (float)widthOfEmptyColumn +{ + return [font widthOfString:[emptyColumnString string]]; +} + +- (NSSize)size +{ + if (![[self layoutManagers] count]) return NSZeroSize; + NSLayoutManager *lm = [[self layoutManagers] objectAtIndex:0]; + + if (![[lm textContainers] count]) return NSZeroSize; + NSTextContainer *tc = [[lm textContainers] objectAtIndex:0]; + + NSRange range = [lm glyphRangeForTextContainer:tc]; + NSRect rect = [lm boundingRectForGlyphRange:range inTextContainer:tc]; + //[lm glyphRangeForTextContainer:tc]; + //NSRect rect = [lm usedRectForTextContainer:tc]; + + NSSize size = NSMakeSize([self widthOfEmptyColumn], rect.size.height); + //NSSize size = NSMakeSize([self widthOfEmptyColumn], maxRows*LINEHEIGHT); + //NSLog(@"size=(%.2f,%.2f) rows=%d cols=%d layoutManager size=(%.2f,%.2f)", + // size.width, size.height, maxRows, maxColumns, rect.size.width, + // rect.size.height); + + return size; +} + +- (NSSize)calculateAverageFontSize +{ + if (![[self layoutManagers] count]) return NSZeroSize; + + NSSize size; + NSLayoutManager *lm = [[self layoutManagers] objectAtIndex:0]; + size.height = [lm defaultLineHeightForFont:font]; + size.width = maxColumns > 0 ? [self widthOfEmptyColumn]/maxColumns : 0; + if (size.height < 1.0f) size.height = 1.0f; + if (size.width < 1.0f) size.width = 1.0f; + + return size; +} + +- (NSRect)rectForRowsInRange:(NSRange)range +{ + if (![[self layoutManagers] count]) return NSZeroRect; + + // TODO! Take range.location into account when computing height (in case + // the line height varies). + NSRect rect = { 0, 0, 0, 0 }; + NSLayoutManager *lm = [[self layoutManagers] objectAtIndex:0]; + float fontHeight = [lm defaultLineHeightForFont:font]; + + rect.origin.y = fontHeight * range.location; + rect.size.height = fontHeight * range.length; + + return rect; +} + +- (NSRect)rectForColumnsInRange:(NSRange)range +{ + NSRect rect = { 0, 0, 0, 0 }; + float fontWidth = maxColumns > 0 + ? [self widthOfEmptyColumn]/maxColumns : 0; + + rect.origin.x = fontWidth * range.location; + rect.size.width = fontWidth * range.length; + + return rect; +} + +- (unsigned)offsetFromRow:(int)row column:(int)col +{ + // Ensure the offset returned is valid. + // This code also works if maxRows and/or maxColumns is 0. + if (row >= maxRows) row = maxRows-1; + if (row < 0) row = 0; + if (col >= maxColumns) col = maxColumns-1; + if (col < 0) col = 0; + + return (unsigned)(col + row*(maxColumns+1)); +} + +- (BOOL)resizeToFitSize:(NSSize)size +{ + int rows = maxRows, cols = maxColumns; + + [self fitToSize:size rows:&rows columns:&cols]; + if (rows != maxRows || cols != maxColumns) { + [self setMaxRows:rows columns:cols]; + return YES; + } + + // Return NO only if dimensions did not change. + return NO; +} + +- (NSSize)fitToSize:(NSSize)size +{ + return [self fitToSize:size rows:NULL columns:NULL]; +} + +@end // MMTextStorage + + + + +@implementation MMTextStorage (Private) + +- (NSSize)fitToSize:(NSSize)size rows:(int *)rows columns:(int *)columns +{ + if (![[self layoutManagers] count]) return size; + NSLayoutManager *lm = [[self layoutManagers] objectAtIndex:0]; + + if (![[lm textContainers] count]) return size; + NSTextContainer *tc = [[lm textContainers] objectAtIndex:0]; + + NSSize curSize = [self size]; + NSSize fitSize = curSize; + int fitRows = maxRows; + int fitCols = maxColumns; + + if (size.height < curSize.height) { + // Remove lines until the height of the text storage fits inside + // 'size'. However, always make sure there are at least 3 lines in the + // text storage. (Why 3? It seem Vim never allows less than 3 lines.) + // + // TODO: Use binary search instead of the current linear one. + NSRange charRange = { 0, maxRows*(maxColumns+1) }; + int rowsToRemove; + for (rowsToRemove = 0; rowsToRemove < maxRows-3; ++rowsToRemove) { + NSRange glyphRange = [lm glyphRangeForCharacterRange:charRange + actualCharacterRange:nil]; + NSRect rect = [lm boundingRectForGlyphRange:glyphRange + inTextContainer:tc]; + + if (rect.size.height <= size.height) { + fitSize.height = rect.size.height; + break; + } + + charRange.length -= (maxColumns+1); + } + + fitRows -= rowsToRemove; + } else if (size.height > curSize.height) { + float fh = [lm defaultLineHeightForFont:font]; + if (fh < 1.0f) fh = 1.0f; + + fitRows = floor(size.height/fh); + fitSize.height = fh*fitRows; + } + + if (size.width != curSize.width) { + float fw = maxColumns > 0 ? [self widthOfEmptyColumn]/maxColumns : 0; + if (fw < 1.0f) fw = 1.0f; + + fitCols = floor(size.width/fw); + fitSize.width = fw*fitCols; + } + + if (rows) *rows = fitRows; + if (columns) *columns = fitCols; + + return fitSize; +} + +@end // MMTextStorage (Private) diff --git a/MMTextView.h b/MMTextView.h new file mode 100644 index 0000000000..04905f1d26 --- /dev/null +++ b/MMTextView.h @@ -0,0 +1,28 @@ +/* vi:set ts=8 sts=4 sw=4 ft=objc: + * + * VIM - Vi IMproved by Bram Moolenaar + * MacVim GUI port by Bjorn Winckler + * + * Do ":help uganda" in Vim to read copying and usage conditions. + * Do ":help credits" in Vim to see a list of people who contributed. + * See README.txt for an overview of the Vim source code. + */ + +#import + + +@interface MMTextView : NSTextView { + BOOL ownsTextStorage; + int tabpageIdx; + NSPort *sendPort; + BOOL shouldDrawInsertionPoint; +} + +- (id)initWithPort:(NSPort *)port frame:(NSRect)frame + textContainer:(NSTextContainer *)tc; +- (MMTextView *)initWithFrame:(NSRect)frame port:(NSPort *)port; +- (void)setShouldDrawInsertionPoint:(BOOL)enable; + +@end + +// vim: set ft=objc : diff --git a/MMTextView.m b/MMTextView.m new file mode 100644 index 0000000000..4c990489fa --- /dev/null +++ b/MMTextView.m @@ -0,0 +1,401 @@ +/* vi:set ts=8 sts=4 sw=4 ft=objc: + * + * VIM - Vi IMproved by Bram Moolenaar + * MacVim GUI port by Bjorn Winckler + * + * Do ":help uganda" in Vim to read copying and usage conditions. + * Do ":help credits" in Vim to see a list of people who contributed. + * See README.txt for an overview of the Vim source code. + */ + +#import "MMTextView.h" +#import "MMTextStorage.h" +#import "MacVim.h" +#import "MMWindowController.h" + + + +@interface MMTextView (Private) +- (BOOL)convertPoint:(NSPoint)point toRow:(int *)row column:(int *)column; +- (void)dispatchKeyEvent:(NSEvent *)event; +@end + + + +@implementation MMTextView + +- (id)initWithPort:(NSPort *)port frame:(NSRect)frame + textContainer:(NSTextContainer *)tc +{ + if ((self = [super initWithFrame:frame textContainer:tc])) { + sendPort = [port retain]; + } + + return self; +} + +- (MMTextView *)initWithFrame:(NSRect)frame port:(NSPort *)port +{ + MMTextStorage *ts = [[MMTextStorage alloc] init]; + NSLayoutManager *lm = [[NSLayoutManager alloc] init]; + NSTextContainer *tc = [[NSTextContainer alloc] initWithContainerSize: + NSMakeSize(1.0e7,1.0e7)]; + + [tc setWidthTracksTextView:NO]; + [tc setHeightTracksTextView:NO]; + [tc setLineFragmentPadding:0]; + + [ts addLayoutManager:lm]; + [lm addTextContainer:tc]; + + [tc release]; + [lm release]; + + // HACK! Where should i get these values from? + // TODO: get values from frame + [ts setMaxRows:24 columns:80]; + + if ((self = [super initWithFrame:frame textContainer:tc])) { + ownsTextStorage = YES; + //[self setRichText:NO]; + sendPort = [port retain]; + } else { + ownsTextStorage = NO; + [ts release]; + } + + return self; +} + + +- (void)dealloc +{ + // BUG! The reference count of the text view will never reach 0 unless + // release is explicitly called on the text storage; so this code is + // meaningless. + if (ownsTextStorage) { + [[self textContainer] setTextView:nil]; + [[self textStorage] release]; + ownsTextStorage = NO; + } + + [sendPort release]; + + [super dealloc]; +} + +- (void)setShouldDrawInsertionPoint:(BOOL)enable +{ + shouldDrawInsertionPoint = enable; +} + +- (BOOL)shouldDrawInsertionPoint +{ + return shouldDrawInsertionPoint; +} + +- (void)insertText:(id)string +{ + // NOTE! This method is called for normal key presses but also for + // Option-key presses --- even when Ctrl is held as well as Option. When + // Ctrl is held, the AppKit translates the character to a Ctrl+key stroke, + // so 'string' need not be a printable character! In this case it still + // works to pass 'string' on to Vim as a printable character (since + // modifiers are already included and should not be added to the input + // buffer using CSI, K_MODIFIER). + + //NSLog(@"%s%@ (%x)", _cmd, string, [string characterAtIndex:0]); + + NSEvent *event = [NSApp currentEvent]; + if ([event type] == NSKeyDown) { + unsigned mods = [event modifierFlags]; + unichar c = [[event charactersIgnoringModifiers] characterAtIndex:0]; + + if (mods & (NSShiftKeyMask|NSControlKeyMask|NSAlternateKeyMask) + && ' ' == c) { + // HACK! In order to be able to bind to etc. we have to + // watch for when space was pressed. + [self dispatchKeyEvent:event]; + return; + } + } + + [NSCursor setHiddenUntilMouseMoves:YES]; + + [NSPortMessage sendMessage:InsertTextMsgID withSendPort:sendPort + data:[string dataUsingEncoding:NSUTF8StringEncoding] + wait:NO]; +} + + +- (void)doCommandBySelector:(SEL)selector +{ + // By ignoring the selector we effectively disable the key binding + // mechanism of Cocoa. Hopefully this is what the user will expect + // (pressing Ctrl+P would otherwise result in moveUp: instead of previous + // match, etc.). + // + // We usually end up here if the user pressed Ctrl+key (but not + // Ctrl+Option+key). + + [self dispatchKeyEvent:[NSApp currentEvent]]; +} + +- (BOOL)performKeyEquivalent:(NSEvent *)event +{ + // Called for Cmd+key keystrokes, function keys, arrow keys, page + // up/down, home, end. + + if ([event type] != NSKeyDown) + return NO; + + // HACK! Let the main menu try to handle any key down event, before + // passing it on to vim, otherwise key equivalents for menus will + // effectively be disabled. + if ([[NSApp mainMenu] performKeyEquivalent:event]) + return YES; + + // HACK! KeyCode 50 represent the key which switches between windows + // within an application (like Cmd+Tab is used to switch between + // applications). Return NO here, else the window switching does not work. + // + // Will this hack work for all languages / keyboard layouts? + if ([event keyCode] == 50) + return NO; + + //NSLog(@"%s%@", _cmd, event); + + NSMutableData *data = [NSMutableData data]; + NSString *string = [event charactersIgnoringModifiers]; + int flags = [event modifierFlags]; + int len = [string lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; + + [data appendBytes:&flags length:sizeof(int)]; + [data appendBytes:&len length:sizeof(int)]; + [data appendBytes:[string UTF8String] length:len]; + + [NSPortMessage sendMessage:CmdKeyMsgID withSendPort:sendPort data:data + wait:NO]; + + return YES; +} + +- (void)setMarkedText:(id)text selectedRange:(NSRange)range +{ + // TODO: Figure out a way to handle marked text, at the moment the user + // has no way of knowing what has been added so far in a multi-stroke key. + // E.g. hitting Option-e and then e will result in an 'e' with acute, but + // nothing is displayed immediately after hitting Option-e. + + NSLog(@"setMarkedText:'%@' selectedRange:(%d,%d)", text, range.location, + range.length); +} + +#if 0 +- (IBAction)copy:(id)sender +{ +} + +- (IBAction)paste:(id)sender +{ +} +#endif + +- (void)scrollWheel:(NSEvent *)event +{ + if ([event deltaY] == 0) + return; + + int row, col; + NSPoint pt = [self convertPoint:[event locationInWindow] fromView:nil]; + if (![self convertPoint:pt toRow:&row column:&col]) + return; + + int flags = [event modifierFlags]; + float dy = [event deltaY]; + NSMutableData *data = [NSMutableData data]; + + [data appendBytes:&row length:sizeof(int)]; + [data appendBytes:&col length:sizeof(int)]; + [data appendBytes:&flags length:sizeof(int)]; + [data appendBytes:&dy length:sizeof(float)]; + + [NSPortMessage sendMessage:ScrollWheelMsgID withSendPort:sendPort + data:data wait:NO]; +} + +- (void)mouseDown:(NSEvent *)event +{ + int row, col; + NSPoint pt = [self convertPoint:[event locationInWindow] fromView:nil]; + if (![self convertPoint:pt toRow:&row column:&col]) + return; + + int button = [event buttonNumber]; + int flags = [event modifierFlags]; + int count = [event clickCount]; + NSMutableData *data = [NSMutableData data]; + + [data appendBytes:&row length:sizeof(int)]; + [data appendBytes:&col length:sizeof(int)]; + [data appendBytes:&button length:sizeof(int)]; + [data appendBytes:&flags length:sizeof(int)]; + [data appendBytes:&count length:sizeof(int)]; + + [NSPortMessage sendMessage:MouseDownMsgID withSendPort:sendPort + data:data wait:NO]; +} + +- (void)rightMouseDown:(NSEvent *)event +{ + [self mouseDown:event]; +} + +- (void)otherMouseDown:(NSEvent *)event +{ + [self mouseDown:event]; +} + +- (void)mouseUp:(NSEvent *)event +{ + int row, col; + NSPoint pt = [self convertPoint:[event locationInWindow] fromView:nil]; + if (![self convertPoint:pt toRow:&row column:&col]) + return; + + int flags = [event modifierFlags]; + NSMutableData *data = [NSMutableData data]; + + [data appendBytes:&row length:sizeof(int)]; + [data appendBytes:&col length:sizeof(int)]; + [data appendBytes:&flags length:sizeof(int)]; + + [NSPortMessage sendMessage:MouseUpMsgID withSendPort:sendPort + data:data wait:NO]; +} + +- (void)rightMouseUp:(NSEvent *)event +{ + [self mouseUp:event]; +} + +- (void)otherMouseUp:(NSEvent *)event +{ + [self mouseUp:event]; +} + +- (void)mouseDragged:(NSEvent *)event +{ + int row, col; + NSPoint pt = [self convertPoint:[event locationInWindow] fromView:nil]; + if (![self convertPoint:pt toRow:&row column:&col]) + return; + + int flags = [event modifierFlags]; + NSMutableData *data = [NSMutableData data]; + + [data appendBytes:&row length:sizeof(int)]; + [data appendBytes:&col length:sizeof(int)]; + [data appendBytes:&flags length:sizeof(int)]; + + [NSPortMessage sendMessage:MouseDraggedMsgID withSendPort:sendPort + data:data wait:NO]; +} + +- (void)rightMouseDragged:(NSEvent *)event +{ + [self mouseDragged:event]; +} + +- (void)otherMouseDragged:(NSEvent *)event +{ + [self mouseDragged:event]; +} + +#if 0 +- (void)menuForEvent:(NSEvent *)event +{ + // TODO: Enabling this causes a crash at the moment. Why? + // + // Called when user Ctrl-clicks in the view + [self mouseDown:event]; +} +#endif + +@end // MMTextView + + + + +@implementation MMTextView (Private) + +- (BOOL)convertPoint:(NSPoint)point toRow:(int *)row column:(int *)column +{ + NSLayoutManager *lm = [self layoutManager]; + NSTextContainer *tc = [self textContainer]; + MMTextStorage *ts = (MMTextStorage*)[self textStorage]; + + if (!(lm && tc && ts)) + return NO; + + unsigned glyphIdx = [lm glyphIndexForPoint:point inTextContainer:tc]; + unsigned charIdx = [lm characterIndexForGlyphAtIndex:glyphIdx]; + + int mod = [ts maxColumns] + 1; + + if (row) *row = (int)(charIdx / mod); + if (column) *column = (int)(charIdx % mod); + + return YES; +} + +- (void)dispatchKeyEvent:(NSEvent *)event +{ + // Only handle the command if it came from a keyDown event + if ([event type] != NSKeyDown) + return; + + //NSLog(@"%s%@", _cmd, event); + + NSString *chars = [event characters]; + NSString *imchars = [event charactersIgnoringModifiers]; + unichar c = [chars characterAtIndex:0]; + unichar imc = [imchars characterAtIndex:0]; + int len = 0; + const char *bytes = 0; + + if (' ' == imc && 0xa0 != c) { + // HACK! The AppKit turns into which is not standard + // Vim behaviour, so bypass this problem. (0xa0 is , which + // should be passed on as is.) + len = [imchars lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; + bytes = [imchars UTF8String]; + } else if (imc == c && '2' == c) { + // HACK! Translate Ctrl+2 to . + static char ctrl_at = 0; + len = 1; bytes = &ctrl_at; + } else if (imc == c && '6' == c) { + // HACK! Translate Ctrl+6 to . + static char ctrl_hat = 0x1e; + len = 1; bytes = &ctrl_hat; + } else { + len = [chars lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; + bytes = [chars UTF8String]; + } + + if (len > 0 && bytes) { + NSMutableData *data = [NSMutableData data]; + int flags = [event modifierFlags]; + + [data appendBytes:&flags length:sizeof(int)]; + [data appendBytes:&len length:sizeof(int)]; + [data appendBytes:bytes length:len]; + + [NSCursor setHiddenUntilMouseMoves:YES]; + + [NSPortMessage sendMessage:KeyDownMsgID withSendPort:sendPort data:data + wait:NO]; + } +} + +@end // MMTextView (Private) diff --git a/MMVimController.h b/MMVimController.h new file mode 100644 index 0000000000..19da37f264 --- /dev/null +++ b/MMVimController.h @@ -0,0 +1,34 @@ +/* vi:set ts=8 sts=4 sw=4 ft=objc: + * + * VIM - Vi IMproved by Bram Moolenaar + * MacVim GUI port by Bjorn Winckler + * + * Do ":help uganda" in Vim to read copying and usage conditions. + * Do ":help credits" in Vim to see a list of people who contributed. + * See README.txt for an overview of the Vim source code. + */ + +#import + +@class MMWindowController; + + + +@interface MMVimController : NSObject { + MMWindowController *windowController; + NSPort *sendPort; + NSPort *receivePort; + NSMutableArray *mainMenuItems; + BOOL shouldUpdateMainMenu; + //NSMutableArray *popupMenus; + NSToolbar *toolbar; + NSMutableDictionary *toolbarItemDict; +} + +- (id)initWithPort:(NSPort *)port; +- (void)windowWillClose:(NSNotification *)notification; +- (NSPort *)sendPort; + +@end + +// vim: set ft=objc: diff --git a/MMVimController.m b/MMVimController.m new file mode 100644 index 0000000000..cd7e44451c --- /dev/null +++ b/MMVimController.m @@ -0,0 +1,819 @@ +/* vi:set ts=8 sts=4 sw=4 ft=objc: + * + * VIM - Vi IMproved by Bram Moolenaar + * MacVim GUI port by Bjorn Winckler + * + * Do ":help uganda" in Vim to read copying and usage conditions. + * Do ":help credits" in Vim to see a list of people who contributed. + * See README.txt for an overview of the Vim source code. + */ + +#import "MMVimController.h" +#import "MMWindowController.h" +#import "MacVim.h" +#import "MMAppController.h" +#import "MMTextView.h" +#import "MMTextStorage.h" + + +//static NSString *AttentionToolbarItemID = @"Attention"; +static NSString *DefaultToolbarImageName = @"Attention"; + + +@interface MMVimController (Private) +- (void)handleMessage:(int)msgid data:(NSData *)data; +- (void)performBatchDrawWithData:(NSData *)data; +- (void)panelDidEnd:(NSSavePanel *)panel code:(int)code + context:(void *)context; +- (NSMenuItem *)menuItemForTag:(int)tag; +- (NSMenu *)menuForTag:(int)tag; +- (void)updateMainMenu; +- (NSToolbarItem *)toolbarItemForTag:(int)tag index:(int *)index; +- (IBAction)toolbarAction:(id)sender; +- (void)addToolbarItemToDictionaryWithTag:(int)tag label:(NSString *)title + toolTip:(NSString *)tip icon:(NSString *)icon; +@end + + + +// TODO: Move to separate file +@interface NSColor (MMProtocol) ++ (NSColor *)colorWithRgbInt:(int)rgb; +@end + + + +static NSMenuItem *findMenuItemWithTagInMenu(NSMenu *root, int tag) +{ + if (root) { + NSMenuItem *item = [root itemWithTag:tag]; + if (item) return item; + + NSArray *items = [root itemArray]; + unsigned i, count = [items count]; + for (i = 0; i < count; ++i) { + item = [items objectAtIndex:i]; + if ([item hasSubmenu]) { + item = findMenuItemWithTagInMenu([item submenu], tag); + if (item) return item; + } + } + } + + return nil; +} + + + +@implementation MMVimController + +- (id)initWithPort:(NSPort *)port +{ + if ((self = [super init])) { + windowController = [[MMWindowController alloc] initWithPort:port]; + + mainMenuItems = [[NSMutableArray alloc] init]; + + toolbarItemDict = [[NSMutableDictionary alloc] init]; + //[self addToolbarItemToDictionaryWithTag:0 label:@"Attention" + // toolTip:@"A toolbar item is missing" + // icon:@"Attention"]; + + [[NSNotificationCenter defaultCenter] + addObserver:self + selector:@selector(windowWillClose:) + name:NSWindowWillCloseNotification + object:[windowController window]]; + [[NSNotificationCenter defaultCenter] + addObserver:self + selector:@selector(windowDidBecomeMain:) + name:NSWindowDidBecomeMainNotification + object:[windowController window]]; + + sendPort = [port retain]; + + // Init receive port and send connected message to VimTask + receivePort = [NSMachPort new]; + [receivePort setDelegate:self]; + + // Add to the default run loop mode as well as the event tracking mode; + // the latter ensures that updates from the VimTask reaches + // MMVimController whilst the user resizes a window with the mouse. + [[NSRunLoop currentRunLoop] addPort:receivePort + forMode:NSDefaultRunLoopMode]; + [[NSRunLoop currentRunLoop] addPort:receivePort + forMode:NSEventTrackingRunLoopMode]; + + [NSPortMessage sendMessage:ConnectedMsgID withSendPort:sendPort + receivePort:receivePort wait:YES]; + } + + return self; +} + +- (void)dealloc +{ + if (sendPort) { + // Kill task immediately + [NSPortMessage sendMessage:KillTaskMsgID withSendPort:sendPort + receivePort:receivePort wait:NO]; + } + + [[NSNotificationCenter defaultCenter] removeObserver:self]; + + [toolbarItemDict release]; + [toolbar release]; + [mainMenuItems release]; + [windowController release]; + [sendPort release]; + [receivePort release]; + + [super dealloc]; +} + +- (NSPort *)sendPort +{ + return sendPort; +} + +- (void)handlePortMessage:(NSPortMessage *)portMessage +{ + NSArray *components = [portMessage components]; + unsigned msgid = [portMessage msgid]; + + //NSLog(@"%s%d", _cmd, msgid); + + if (FlushQueueMsgID == msgid) { + unsigned i, count = [components count]; + if (count % 2) { + NSLog(@"WARNING: Uneven number of components (%d) in flush queue " + "message; ignoring this message.", count); + return; + } + + for (i = 0; i < count; i += 2) { + NSData *value = [components objectAtIndex:i]; + NSData *data = [components objectAtIndex:i+1]; + + [self handleMessage:*((int*)[value bytes]) data:data]; + } + } else { + NSData *data = nil; + if ([components count] > 0) + data = [components objectAtIndex:0]; + + [self handleMessage:msgid data:data]; + } + + if (shouldUpdateMainMenu) + [self updateMainMenu]; +} + +- (void)windowWillClose:(NSNotification *)notification +{ + // NOTE! This causes the call to removeVimController: to be delayed. + [[NSApp delegate] + performSelectorOnMainThread:@selector(removeVimController:) + withObject:self waitUntilDone:NO]; +} + +- (void)windowDidBecomeMain:(NSNotification *)notification +{ + [self updateMainMenu]; +} + +- (NSToolbarItem *)toolbar:(NSToolbar *)theToolbar + itemForItemIdentifier:(NSString *)itemId + willBeInsertedIntoToolbar:(BOOL)flag +{ + //NSLog(@"%s", _cmd); + + NSToolbarItem *item = [toolbarItemDict objectForKey:itemId]; + if (!item) { + NSLog(@"WARNING: No toolbar item with id '%@'", itemId); + } + + return item; +} + +- (NSArray *)toolbarAllowedItemIdentifiers:(NSToolbar *)theToolbar +{ + //NSLog(@"%s", _cmd); + return nil; +} + +- (NSArray *)toolbarDefaultItemIdentifiers:(NSToolbar *)theToolbar +{ + //NSLog(@"%s", _cmd); + return nil; +} + +@end // MMVimController + + + +@implementation MMVimController (Private) + +- (void)handleMessage:(int)msgid data:(NSData *)data +{ + if (OpenVimWindowMsgID == msgid) { + const void *bytes = [data bytes]; + int rows = *((int*)bytes); bytes += sizeof(int); + int cols = *((int*)bytes); bytes += sizeof(int); + + //NSLog(@"Received open VimWindow (%dx%d) message from VimTask.", + // cols, rows); + + [windowController openWindowWithRows:rows columns:cols]; + } else if (TaskExitedMsgID == msgid) { + //NSLog(@"Received task exited message from VimTask; closing window."); + + // Release sendPort immediately to avoid dealloc trying to send a 'kill + // task' message to the task. + [sendPort release]; sendPort = nil; + // NOTE! This causes windowWillClose: to be called, which in turn asks + // the MMAppController to remove this MMVimController. + [windowController close]; + + // HACK! Make sure no menu updating is done, we're about to close. + shouldUpdateMainMenu = NO; + } else if (BatchDrawMsgID == msgid) { + //NSLog(@"Received batch draw message from VimTask."); + + [self performBatchDrawWithData:data]; + } else if (SelectTabMsgID == msgid) { + const void *bytes = [data bytes]; + int idx = *((int*)bytes); + //NSLog(@"Selecting tab with index %d", idx); + [windowController selectTabWithIndex:idx]; + } else if (UpdateTabBarMsgID == msgid) { + //NSLog(@"Updating tabs"); + [windowController updateTabsWithData:data]; + } else if (ShowTabBarMsgID == msgid) { + //NSLog(@"Showing tab bar"); + + // The tab bar has it's own baseline separator, so hide the one + // belonging to the toolbar whenever the tab bar is visible. + // BUG: The window auto shows the separator when clicking the show/hide + // toolbar button. + [toolbar setShowsBaselineSeparator:NO]; + + // HACK! Vim sends several draw commands etc. after the show message + // and these can mess up the display when showing the tab bar results + // in the window having to resize to fit the screen; delaying this + // message alleviates this problem. + [windowController performSelectorOnMainThread:@selector(showTabBar:) + withObject:self waitUntilDone:NO]; + //[windowController showTabBar:self]; + } else if (HideTabBarMsgID == msgid) { + //NSLog(@"Hiding tab bar"); + + // The tab bar has it's own baseline separator, so hide the one + // belonging to the toolbar whenever the tab bar is visible. + // BUG: The window auto shows the separator when clicking the show/hide + // toolbar button. + [toolbar setShowsBaselineSeparator:YES]; + + [windowController hideTabBar:self]; + } else if (SetTextDimensionsMsgID == msgid) { + const void *bytes = [data bytes]; + int rows = *((int*)bytes); bytes += sizeof(int); + int cols = *((int*)bytes); bytes += sizeof(int); + + [windowController setTextDimensionsWithRows:rows columns:cols]; + } else if (SetVimWindowTitleMsgID == msgid) { + const void *bytes = [data bytes]; + int len = *((int*)bytes); bytes += sizeof(int); + +#if 0 + // BUG! Using this call leads to ALL windows getting the same title + // and then the app crashes if you :q a window. + NSString *string = [[NSString alloc] + initWithBytesNoCopy:(void*)bytes + length:len + encoding:NSUTF8StringEncoding + freeWhenDone:NO]; +#else + NSString *string = [[NSString alloc] initWithBytes:(void*)bytes + length:len encoding:NSUTF8StringEncoding]; +#endif + + [[windowController window] setTitle:string]; + + [string release]; + } else if (BrowseForFileMsgID == msgid) { + const void *bytes = [data bytes]; + int save = *((int*)bytes); bytes += sizeof(int); + + int len = *((int*)bytes); bytes += sizeof(int); + NSString *dir = nil; + if (len > 0) { + dir = [[NSString alloc] initWithBytes:(void*)bytes + length:len + encoding:NSUTF8StringEncoding]; + bytes += len; + } + + len = *((int*)bytes); bytes += sizeof(int); + if (len > 0) { + NSString *title = [[NSString alloc] + initWithBytes:(void*)bytes length:len + encoding:NSUTF8StringEncoding]; + bytes += len; + + [windowController setStatusText:title]; + [title release]; + } + + if (save) { + [[NSSavePanel savePanel] beginSheetForDirectory:dir file:nil + modalForWindow:[windowController window] + modalDelegate:self + didEndSelector:@selector(panelDidEnd:code:context:) + contextInfo:NULL]; + } else { + NSOpenPanel *panel = [NSOpenPanel openPanel]; + [panel setAllowsMultipleSelection:NO]; + [panel beginSheetForDirectory:dir file:nil types:nil + modalForWindow:[windowController window] + modalDelegate:self + didEndSelector:@selector(panelDidEnd:code:context:) + contextInfo:NULL]; + } + + [dir release]; + } else if (UpdateInsertionPointMsgID == msgid) { + const void *bytes = [data bytes]; + int color = *((int*)bytes); bytes += sizeof(int); + int row = *((int*)bytes); bytes += sizeof(int); + int col = *((int*)bytes); bytes += sizeof(int); + int state = *((int*)bytes); bytes += sizeof(int); + + // TODO! Move to window controller. + MMTextView *textView = [windowController textView]; + if (textView) { + MMTextStorage *textStorage = (MMTextStorage*)[textView textStorage]; + unsigned off = [textStorage offsetFromRow:row column:col]; + + [textView setInsertionPointColor:[NSColor colorWithRgbInt:color]]; + [textView setSelectedRange:NSMakeRange(off, 0)]; + [textView setShouldDrawInsertionPoint:state]; + } + } else if (AddMenuMsgID == msgid) { + NSString *title = nil; + const void *bytes = [data bytes]; + int tag = *((int*)bytes); bytes += sizeof(int); + int parentTag = *((int*)bytes); bytes += sizeof(int); + int len = *((int*)bytes); bytes += sizeof(int); + if (len > 0) { + title = [[NSString alloc] initWithBytes:(void*)bytes length:len + encoding:NSUTF8StringEncoding]; + bytes += len; + } + int idx = *((int*)bytes); bytes += sizeof(int); + + if (MenuToolbarType == parentTag) { + if (!toolbar) { + NSString *ident = [NSString stringWithFormat:@"%d.%d", + (int)self, tag]; + //NSLog(@"Creating toolbar with identifier %@", ident); + toolbar = [[NSToolbar alloc] initWithIdentifier:ident]; + + [toolbar setDelegate:self]; + [toolbar setDisplayMode:NSToolbarDisplayModeIconOnly]; + [toolbar setSizeMode:NSToolbarSizeModeSmall]; + + [[windowController window] setToolbar:toolbar]; + } + } else if (MenuPopupType == parentTag) { + // TODO! + } else if (title) { + NSMenuItem *item = [[NSMenuItem alloc] init]; + NSMenu *menu = [[NSMenu alloc] initWithTitle:title]; + + [menu setAutoenablesItems:NO]; + [item setTag:tag]; + [item setTitle:title]; + [item setSubmenu:menu]; + + NSMenu *parent = [self menuForTag:parentTag]; + if (parent) { + if ([parent numberOfItems] <= idx) { + [parent addItem:item]; + } else { + [parent insertItem:item atIndex:idx]; + } + } else { + if ([mainMenuItems count] <= idx) { + [mainMenuItems addObject:item]; + } else { + [mainMenuItems insertObject:item atIndex:idx]; + } + + shouldUpdateMainMenu = YES; + } + + [item release]; + [menu release]; + } + + [title release]; + } else if (AddMenuItemMsgID == msgid) { + NSString *title = nil, *tip = nil, *icon = nil; + const void *bytes = [data bytes]; + int tag = *((int*)bytes); bytes += sizeof(int); + int parentTag = *((int*)bytes); bytes += sizeof(int); + int namelen = *((int*)bytes); bytes += sizeof(int); + if (namelen > 0) { + title = [[NSString alloc] initWithBytes:(void*)bytes length:namelen + encoding:NSUTF8StringEncoding]; + bytes += namelen; + } + int tiplen = *((int*)bytes); bytes += sizeof(int); + if (tiplen > 0) { + tip = [[NSString alloc] initWithBytes:(void*)bytes length:tiplen + encoding:NSUTF8StringEncoding]; + bytes += tiplen; + } + int iconlen = *((int*)bytes); bytes += sizeof(int); + if (iconlen > 0) { + icon = [[NSString alloc] initWithBytes:(void*)bytes length:iconlen + encoding:NSUTF8StringEncoding]; + bytes += iconlen; + } + int idx = *((int*)bytes); bytes += sizeof(int); + if (idx < 0) idx = 0; + + NSString *ident = [NSString stringWithFormat:@"%d.%d", + (int)self, parentTag]; + if (toolbar && [[toolbar identifier] isEqual:ident]) { + //NSLog(@"Toolbar add: title=%@ icon=%@ tip=%@", title, icon, tip); + [self addToolbarItemToDictionaryWithTag:tag label:title toolTip:tip + icon:icon]; + + int maxIdx = [[toolbar items] count]; + if (maxIdx < idx) idx = maxIdx; + + // If 'title' is nul, insert a separator. + if (!title) title = NSToolbarSeparatorItemIdentifier; + [toolbar insertItemWithItemIdentifier:title atIndex:idx]; + } else { + NSMenu *parent = [self menuForTag:parentTag]; + if (parent) { + NSMenuItem *item = nil; + if (title) { + item = [[[NSMenuItem alloc] init] autorelease]; + [item setTag:tag]; + [item setTitle:title]; + [item setAction:@selector(vimMenuItemAction:)]; + if (tip) [item setToolTip:tip]; + } else { + item = [NSMenuItem separatorItem]; + } + + if ([parent numberOfItems] <= idx) { + [parent addItem:item]; + } else { + [parent insertItem:item atIndex:idx]; + } + } + } + + [title release]; + [tip release]; + } else if (RemoveMenuItemMsgID == msgid) { + const void *bytes = [data bytes]; + int tag = *((int*)bytes); bytes += sizeof(int); + + // TODO: Search for tag in popup menus. + id item; + int idx; + if ((item = [self toolbarItemForTag:tag index:&idx])) { + [toolbar removeItemAtIndex:idx]; + } else if ((item = [self menuItemForTag:tag])) { + if ([item menu] == [NSApp mainMenu]) { + [mainMenuItems removeObject:item]; + } + [[item menu] removeItem:item]; + } + } else if (EnableMenuItemMsgID == msgid) { + const void *bytes = [data bytes]; + int tag = *((int*)bytes); bytes += sizeof(int); + int state = *((int*)bytes); bytes += sizeof(int); + + // TODO: Search for tag in popup menus. + id item = [self toolbarItemForTag:tag index:NULL]; + if (!item) + item = [self menuItemForTag:tag]; + + [item setEnabled:state]; + } else if (ShowToolbarMsgID == msgid) { + const void *bytes = [data bytes]; + int enable = *((int*)bytes); bytes += sizeof(int); + int flags = *((int*)bytes); bytes += sizeof(int); + + int mode = NSToolbarDisplayModeDefault; + if (flags & ToolbarLabelFlag) { + mode = flags & ToolbarIconFlag ? NSToolbarDisplayModeIconAndLabel + : NSToolbarDisplayModeLabelOnly; + } else if (flags & ToolbarIconFlag) { + mode = NSToolbarDisplayModeIconOnly; + } + + int size = flags & ToolbarSizeRegularFlag ? NSToolbarSizeModeRegular + : NSToolbarSizeModeSmall; + + [toolbar setSizeMode:size]; + [toolbar setDisplayMode:mode]; + [toolbar setVisible:enable]; + } else if (CreateScrollbarMsgID == msgid) { + const void *bytes = [data bytes]; + long ident = *((long*)bytes); bytes += sizeof(long); + int type = *((int*)bytes); bytes += sizeof(int); + + [windowController createScrollbarWithIdentifier:ident type:type]; + } else if (DestroyScrollbarMsgID == msgid) { + const void *bytes = [data bytes]; + long ident = *((long*)bytes); bytes += sizeof(long); + + [windowController destroyScrollbarWithIdentifier:ident]; + } else if (ShowScrollbarMsgID == msgid) { + const void *bytes = [data bytes]; + long ident = *((long*)bytes); bytes += sizeof(long); + int visible = *((int*)bytes); bytes += sizeof(int); + + [windowController showScrollbarWithIdentifier:ident state:visible]; + } else if (SetScrollbarPositionMsgID == msgid) { + const void *bytes = [data bytes]; + long ident = *((long*)bytes); bytes += sizeof(long); + int pos = *((int*)bytes); bytes += sizeof(int); + int len = *((int*)bytes); bytes += sizeof(int); + + [windowController setScrollbarPosition:pos length:len + identifier:ident]; + } else if (SetScrollbarThumbMsgID == msgid) { + const void *bytes = [data bytes]; + long ident = *((long*)bytes); bytes += sizeof(long); + float val = *((float*)bytes); bytes += sizeof(float); + float prop = *((float*)bytes); bytes += sizeof(float); + + [windowController setScrollbarThumbValue:val proportion:prop + identifier:ident]; + } else if (SetFontMsgID == msgid) { + const void *bytes = [data bytes]; + float size = *((float*)bytes); bytes += sizeof(float); + int len = *((int*)bytes); bytes += sizeof(int); + NSString *name = [[NSString alloc] + initWithBytes:(void*)bytes length:len + encoding:NSUTF8StringEncoding]; + NSFont *font = [NSFont fontWithName:name size:size]; + + if (font && [windowController textStorage]) { + [[windowController textStorage] setFont:font]; + } + + [name release]; + } else { + NSLog(@"WARNING: Unknown message received (msgid=%d)", msgid); + } +} + +- (void)performBatchDrawWithData:(NSData *)data +{ + // TODO! Move to window controller. + MMTextStorage *textStorage = [windowController textStorage]; + if (!textStorage) + return; + + const void *bytes = [data bytes]; + const void *end = bytes + [data length]; + + [textStorage beginEditing]; + + // TODO: + // 1. Sanity check input + // 2. Cache rgb -> NSColor lookups? + + while (bytes < end) { + int type = *((int*)bytes); bytes += sizeof(int); + int rows = *((int*)bytes); bytes += sizeof(int); + int cols = *((int*)bytes); bytes += sizeof(int); + + if (ClearAllDrawType != type) { + // All draw types except clear all rely on the text storage have + // the appropriate dimensions, so set it before attempting to + // modify the text storage. + [textStorage setMaxRows:rows columns:cols]; + } + + if (ClearAllDrawType == type) { + int color = *((int*)bytes); bytes += sizeof(int); + + [textStorage clearAllWithColor:[NSColor colorWithRgbInt:color]]; + } else if (ClearBlockDrawType == type) { + int color = *((int*)bytes); bytes += sizeof(int); + int row1 = *((int*)bytes); bytes += sizeof(int); + int col1 = *((int*)bytes); bytes += sizeof(int); + int row2 = *((int*)bytes); bytes += sizeof(int); + int col2 = *((int*)bytes); bytes += sizeof(int); + + [textStorage clearBlockFromRow:row1 column:col1 + toRow:row2 column:col2 + color:[NSColor colorWithRgbInt:color]]; + } else if (DeleteLinesDrawType == type) { + int color = *((int*)bytes); bytes += sizeof(int); + int row = *((int*)bytes); bytes += sizeof(int); + int count = *((int*)bytes); bytes += sizeof(int); + int bot = *((int*)bytes); bytes += sizeof(int); + int left = *((int*)bytes); bytes += sizeof(int); + int right = *((int*)bytes); bytes += sizeof(int); + + [textStorage deleteLinesFromRow:row lineCount:count + scrollBottom:bot left:left right:right + color:[NSColor colorWithRgbInt:color]]; + } else if (ReplaceStringDrawType == type) { + int bg = *((int*)bytes); bytes += sizeof(int); + int fg = *((int*)bytes); bytes += sizeof(int); + int row = *((int*)bytes); bytes += sizeof(int); + int col = *((int*)bytes); bytes += sizeof(int); + int flags = *((int*)bytes); bytes += sizeof(int); + int len = *((int*)bytes); bytes += sizeof(int); + NSString *string = [[NSString alloc] + initWithBytesNoCopy:(void*)bytes + length:len + encoding:NSUTF8StringEncoding + freeWhenDone:NO]; + bytes += len; + + [textStorage replaceString:string + atRow:row column:col + withFlags:flags + foregroundColor:[NSColor colorWithRgbInt:fg] + backgroundColor:[NSColor colorWithRgbInt:bg]]; + + [string release]; + } else if (InsertLinesDrawType == type) { + int color = *((int*)bytes); bytes += sizeof(int); + int row = *((int*)bytes); bytes += sizeof(int); + int count = *((int*)bytes); bytes += sizeof(int); + int bot = *((int*)bytes); bytes += sizeof(int); + int left = *((int*)bytes); bytes += sizeof(int); + int right = *((int*)bytes); bytes += sizeof(int); + + [textStorage insertLinesAtRow:row lineCount:count + scrollBottom:bot left:left right:right + color:[NSColor colorWithRgbInt:color]]; + } else { + NSLog(@"WARNING: Unknown draw type (type=%d)", type); + } + } + + [textStorage endEditing]; +} + +- (void)panelDidEnd:(NSSavePanel *)panel code:(int)code context:(void *)context +{ + NSMutableData *data = [NSMutableData data]; + int ok = (code == NSOKButton); + NSString *filename = [panel filename]; + int len = [filename lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; + + [data appendBytes:&ok length:sizeof(int)]; + [data appendBytes:&len length:sizeof(int)]; + if (len > 0) + [data appendBytes:[filename UTF8String] length:len]; + + if (![NSPortMessage sendMessage:BrowseForFileReplyMsgID + withSendPort:sendPort data:data wait:YES]) { + NSLog(@"WARNING: Failed to send browse for files reply back to " + "VimTask."); + } + + [windowController setStatusText:@""]; +} + +- (NSMenuItem *)menuItemForTag:(int)tag +{ + int i, count = [mainMenuItems count]; + for (i = 0; i < count; ++i) { + NSMenuItem *item = [mainMenuItems objectAtIndex:i]; + if ([item tag] == tag) return item; + item = findMenuItemWithTagInMenu([item submenu], tag); + if (item) return item; + } + + return nil; +} + +- (NSMenu *)menuForTag:(int)tag +{ + return [[self menuItemForTag:tag] submenu]; +} + +- (void)updateMainMenu +{ + shouldUpdateMainMenu = NO; + + // HACK! Add the vim menu named 'Window' as the submenu with index 5 of an + // already existing menu with the same name. The 'Window' menu is set up + // in Interface Builder. + NSMenu *mainMenu = [NSApp mainMenu]; + NSMenu *windowMenu = nil; + + // Remove all existing menus, except for 'Window'. + int i, count = [mainMenu numberOfItems]; + for (i = count-1; i > 0; --i) { + NSMenuItem *item = [mainMenu itemAtIndex:i]; + NSMenu *submenu = [item submenu]; + if ([[submenu title] isEqual:@"Window"]) { + windowMenu = submenu; + } else { + [mainMenu removeItem:item]; + } + } + + // Add menus from 'mainMenuItems' + count = [mainMenuItems count]; + for (i = 0; i < count; ++i) { + NSMenuItem *item = [mainMenuItems objectAtIndex:i]; + + if (windowMenu && [windowMenu numberOfItems] > 6 + && [[item title] isEqual:@"Window"]) { + // Item 5 of the Window menu is replaced with vim's Window menu. + [windowMenu removeItemAtIndex:5]; + [windowMenu insertItem:item atIndex:5]; + } else { + [mainMenu insertItem:item atIndex:i+1]; + } + } +} + +- (NSToolbarItem *)toolbarItemForTag:(int)tag index:(int *)index +{ + if (!toolbar) return nil; + + NSArray *items = [toolbar items]; + int i, count = [items count]; + for (i = 0; i < count; ++i) { + NSToolbarItem *item = [items objectAtIndex:i]; + if ([item tag] == tag) { + if (index) *index = i; + return item; + } + } + + return nil; +} + +- (IBAction)toolbarAction:(id)sender +{ + NSLog(@"%s%@", _cmd, sender); +} + +- (void)addToolbarItemToDictionaryWithTag:(int)tag label:(NSString *)title + toolTip:(NSString *)tip icon:(NSString *)icon +{ + // NOTE! 'title' is nul for separator item. Since this is already defined + // by Coca, we don't need to do anything here. + if (!title) return; + + NSToolbarItem *item = [[NSToolbarItem alloc] initWithItemIdentifier:title]; + [item setTag:tag]; + [item setLabel:title]; + [item setToolTip:tip]; + [item setAction:@selector(vimMenuItemAction:)]; + [item setAutovalidates:NO]; + + NSImage *img = [NSImage imageNamed:icon]; + if (!img) { + NSLog(@"WARNING: Could not find image with name '%@' to use as toolbar" + " image for identifier '%@';" + " using default toolbar icon '%@' instead.", + icon, title, DefaultToolbarImageName); + + img = [NSImage imageNamed:DefaultToolbarImageName]; + } + + [item setImage:img]; + + [toolbarItemDict setObject:item forKey:title]; + + [item release]; +} + +@end // MMVimController (Private) + + + +@implementation NSColor (MMProtocol) + ++ (NSColor *)colorWithRgbInt:(int)rgb +{ + float r = ((rgb>>16) & 0xff)/255.0f; + float g = ((rgb>>8) & 0xff)/255.0f; + float b = (rgb & 0xff)/255.0f; + + return [NSColor colorWithCalibratedRed:r green:g blue:b alpha:1.0f]; +} + +@end // NSColor (MMProtocol) diff --git a/MMWindowController.h b/MMWindowController.h new file mode 100644 index 0000000000..8afa6df892 --- /dev/null +++ b/MMWindowController.h @@ -0,0 +1,54 @@ +/* vi:set ts=8 sts=4 sw=4 ft=objc: + * + * VIM - Vi IMproved by Bram Moolenaar + * MacVim GUI port by Bjorn Winckler + * + * Do ":help uganda" in Vim to read copying and usage conditions. + * Do ":help credits" in Vim to see a list of people who contributed. + * See README.txt for an overview of the Vim source code. + */ + +#import + +@class PSMTabBarControl; +@class MMTextView; +@class MMTextStorage; + + +@interface MMWindowController : NSWindowController +{ + IBOutlet PSMTabBarControl *tabBarControl; + IBOutlet NSTabView *tabView; + IBOutlet NSTextField *statusTextField; + NSPort *sendPort; + BOOL vimTaskSelectedTab; + NSTimer *statusTimer; + MMTextView *textView; + MMTextStorage *textStorage; + NSMutableArray *scrollbars; + BOOL setupDone; +} + +- (id)initWithPort:(NSPort *)port; +- (MMTextView *)textView; +- (MMTextStorage *)textStorage; +- (void)openWindowWithRows:(int)rows columns:(int)cols; +- (void)updateTabsWithData:(NSData *)data; +- (void)selectTabWithIndex:(int)idx; +- (void)setTextDimensionsWithRows:(int)rows columns:(int)cols; +- (void)setStatusText:(NSString *)text; +- (void)flashStatusText:(NSString *)text; +- (void)createScrollbarWithIdentifier:(long)ident type:(int)type; +- (void)destroyScrollbarWithIdentifier:(long)ident; +- (void)showScrollbarWithIdentifier:(long)ident state:(BOOL)visible; +- (void)setScrollbarPosition:(int)pos length:(int)len identifier:(long)ident; +- (void)setScrollbarThumbValue:(float)val proportion:(float)prop + identifier:(long)ident; + +- (IBAction)addNewTab:(id)sender; +- (IBAction)showTabBar:(id)sender; +- (IBAction)hideTabBar:(id)sender; + +@end + +// vim: set ft=objc: diff --git a/MMWindowController.m b/MMWindowController.m new file mode 100644 index 0000000000..efaad4eadd --- /dev/null +++ b/MMWindowController.m @@ -0,0 +1,987 @@ +/* vi:set ts=8 sts=4 sw=4 ft=objc: + * + * VIM - Vi IMproved by Bram Moolenaar + * MacVim GUI port by Bjorn Winckler + * + * Do ":help uganda" in Vim to read copying and usage conditions. + * Do ":help credits" in Vim to see a list of people who contributed. + * See README.txt for an overview of the Vim source code. + */ + +#import "MMWindowController.h" +#import +#import "MMTextView.h" +#import "MMTextStorage.h" +#import "MacVim.h" + + +// Scroller type; these must match SBAR_* in gui.h +enum { + MMScrollerTypeLeft = 0, + MMScrollerTypeRight, + MMScrollerTypeBottom +}; + +// TODO! Implement hiding/showing of status line. +static float StatusLineHeight = 16.0f; +static BOOL statusLineIsVisible = YES; // NO is _not_ supported at the moment! + + +// TODO: Move! +@interface NSTabView (MMExtras) +- (void)removeAllTabViewItems; +@end + + +// TODO: Move! +@interface MMScroller : NSScroller { + long identifier; + int type; + NSRange range; +} +- (id)initWithIdentifier:(long)ident type:(int)type; +- (long)identifier; +- (int)type; +- (NSRange)range; +- (void)setRange:(NSRange)newRange; +@end + +@interface MMWindowController (Private) +- (NSSize)contentSizeForTextViewSize:(NSSize)textViewSize; +- (NSRect)textViewRectForContentSize:(NSSize)contentSize; +- (void)fitWindowToTextStorage; +- (NSRect)fitWindowToFrame:(NSRect)frame; +- (void)updateResizeIncrements; +- (NSTabViewItem *)addNewTabViewItem; +- (void)statusTimerFired:(NSTimer *)timer; +- (int)representedIndexOfTabViewItem:(NSTabViewItem *)tvi; +- (IBAction)vimMenuItemAction:(id)sender; +- (MMScroller *)scrollbarForIdentifier:(long)ident index:(unsigned *)idx; +- (BOOL)bottomScrollbarVisible; +- (BOOL)leftScrollbarVisible; +- (BOOL)rightScrollbarVisible; +- (void)placeScrollbars; +- (void)scroll:(id)sender; +- (void)fitWindowToScrollbars:(id)sender; +- (void)placeViews; +@end + + + +#if 0 +NSString *buildMenuItemDescriptor(NSMenu *menu, NSString *tail) +{ + return menu ? buildMenuItemDescriptor([menu supermenu], [[menu title] + stringByAppendingString:tail]) + : tail; +} + +NSMutableArray *buildMenuAddress(NSMenu *menu) +{ + NSMutableArray *addr; + if (menu) { + addr = buildMenuAddress([menu supermenu]); + [addr addObject:[menu title]]; + } else { + addr = [NSMutableArray array]; + } + + return addr; +} +#endif + + +@implementation MMWindowController + +- (id)initWithPort:(NSPort *)port +{ + if ((self = [super initWithWindowNibName:@"VimWindow"])) { + sendPort = [port retain]; + scrollbars = [[NSMutableArray alloc] init]; + textStorage = [[MMTextStorage alloc] init]; + } + + return self; +} + +- (void)dealloc +{ + // TODO: release tabBarControl and tabView? + + [tabBarControl setDelegate:nil]; + [[self window] setDelegate:nil]; + + [tabView removeAllTabViewItems]; + + [scrollbars release]; + [textView release]; + [textStorage release]; + [sendPort release]; + + [super dealloc]; +} + +- (void)windowDidLoad +{ + // Called after window nib file is loaded. + + [tabBarControl setHidden:YES]; + [tabBarControl setSizeCellsToFit:YES]; + [tabBarControl setAllowsDragBetweenWindows:NO]; + [tabBarControl setShowAddTabButton:YES]; + [[tabBarControl addTabButton] setTarget:self]; + [[tabBarControl addTabButton] setAction:@selector(addNewTab:)]; + + // HACK! remove any tabs present in the nib + [tabView removeAllTabViewItems]; +} + +- (void)createScrollbarWithIdentifier:(long)ident type:(int)type +{ + //NSLog(@"Create scroller %d of type %d", ident, type); + + MMScroller *scroller = [[MMScroller alloc] initWithIdentifier:ident + type:type]; + [scroller setTarget:self]; + [scroller setAction:@selector(scroll:)]; + + [[[self window] contentView] addSubview:scroller]; + [scrollbars addObject:scroller]; + [scroller release]; +} + +- (void)destroyScrollbarWithIdentifier:(long)ident +{ + //NSLog(@"Destroy scroller %d", ident); + + unsigned idx = 0; + MMScroller *scroller = [self scrollbarForIdentifier:ident index:&idx]; + if (scroller) { + [scroller removeFromSuperview]; + [scrollbars removeObjectAtIndex:idx]; + + if (![scroller isHidden]) { + // A visible scroller was removed, so the window must resize to + // fit. + // TODO! See comment in fitWindowToScrollbars:. + [self performSelectorOnMainThread:@selector(fitWindowToScrollbars:) + withObject:self waitUntilDone:NO]; + } + } +} + +- (void)showScrollbarWithIdentifier:(long)ident state:(BOOL)visible +{ + MMScroller *scroller = [self scrollbarForIdentifier:ident index:NULL]; + if (!scroller) return; + + BOOL wasVisible = ![scroller isHidden]; + //NSLog(@"%s scroller %d (was %svisible)", visible ? "Show" : "Hide", + // ident, wasVisible ? "" : "in"); + [scroller setHidden:!visible]; + + if (wasVisible != visible) { + // A scroller was hidden or shown, so the window must resize to fit. + //NSLog(@"%s scroller %d", visible ? "Show" : "Hide", ident); + // TODO! See comment in fitWindowToScrollbars:. + [self performSelectorOnMainThread:@selector(fitWindowToScrollbars:) + withObject:self waitUntilDone:NO]; + } +} + +- (void)setScrollbarPosition:(int)pos length:(int)len identifier:(long)ident +{ + MMScroller *scroller = [self scrollbarForIdentifier:ident index:NULL]; + NSRange range = NSMakeRange(pos, len); + if (!NSEqualRanges(range, [scroller range])) { + //NSLog(@"Set range %@ for scroller %d", + // NSStringFromRange(range), ident); + [scroller setRange:range]; + // TODO! See comment in fitWindowToScrollbars:. + [self placeScrollbars]; + } +} + +- (void)setScrollbarThumbValue:(float)val proportion:(float)prop + identifier:(long)ident +{ + MMScroller *scroller = [self scrollbarForIdentifier:ident index:NULL]; + //NSLog(@"Set thumb value %.2f proportion %.2f for scroller %d", + // val, prop, ident); + [scroller setFloatValue:val knobProportion:prop]; +} + +- (MMTextView *)textView +{ + return textView; +} + +- (MMTextStorage *)textStorage +{ + return textStorage; +} + +- (void)openWindowWithRows:(int)rows columns:(int)cols +{ +#if 0 + // Make sure window nib file is loaded. + [self window]; + + // Set up text system + textStorage = [[MMTextStorage alloc] init]; + NSLayoutManager *lm = [[NSLayoutManager alloc] init]; + NSTextContainer *tc = [[NSTextContainer alloc] initWithContainerSize: + NSMakeSize(1.0e7,1.0e7)]; + + [tc setWidthTracksTextView:NO]; + [tc setHeightTracksTextView:NO]; + [tc setLineFragmentPadding:0]; + + [textStorage setMaxRows:rows columns:cols]; + [textStorage addLayoutManager:lm]; + [lm addTextContainer:tc]; + //[[lm typesetter] setUsesFontLeading:NO]; + + textView = [[MMTextView alloc] initWithPort:sendPort frame:[tabView frame] + textContainer:tc]; + [[self window] makeFirstResponder:textView]; + + // Keep track of when the layout has changed. + [[textView layoutManager] setDelegate:self]; + + // The text storage retains the layout manager which in turn retains the + // text container. + [tc release]; + [lm release]; + + [self addNewTabViewItem]; +#else + // Setup a complete text system. + NSLayoutManager *lm = [[NSLayoutManager alloc] init]; + NSTextContainer *tc = [[NSTextContainer alloc] initWithContainerSize: + NSMakeSize(1.0e7,1.0e7)]; + + [tc setWidthTracksTextView:NO]; + [tc setHeightTracksTextView:NO]; + [tc setLineFragmentPadding:0]; + + [textStorage setMaxRows:rows columns:cols]; + [textStorage addLayoutManager:lm]; + [lm addTextContainer:tc]; + + textView = [[MMTextView alloc] initWithPort:sendPort frame:[tabView frame] + textContainer:tc]; + + [[self window] makeFirstResponder:textView]; + + // Keep track of when the layout has changed. + [[textView layoutManager] setDelegate:self]; + + // The text storage retains the layout manager which in turn retains the + // text container. + [tc release]; + [lm release]; + + [self addNewTabViewItem]; +#endif + + // NOTE! This flag is set once the entire text system is set up. + setupDone = YES; + + [self fitWindowToTextStorage]; + + // HACK! The GUI does not get activated if Vim is launched by MMBackend in + // checkin:. I have not been able to figure out any other way to get it to + // activate other than forcing it here. A better solution for launching + // the GUI would be good. + [NSApp activateIgnoringOtherApps:YES]; + + [[self window] makeKeyAndOrderFront:self]; + + [statusTextField setHidden:!statusLineIsVisible]; + [self flashStatusText:@"Welcome to MacVim!"]; +} + +- (void)updateTabsWithData:(NSData *)data +{ + const void *p = [data bytes]; + const void *end = p + [data length]; + int tabIdx = 0; + + // HACK! Current tab is first in the message. This way it is not + // necessary to guess which tab should be the selected one (this can be + // problematic for instance when new tabs are created). + int curtabIdx = *((int*)p); p += sizeof(int); + + NSArray *tabViewItems = [tabBarControl representedTabViewItems]; + + while (p < end) { + //int wincount = *((int*)p); p += sizeof(int); + int length = *((int*)p); p += sizeof(int); + + NSString *label = [[NSString alloc] + initWithBytesNoCopy:(void*)p + length:length + encoding:NSUTF8StringEncoding + freeWhenDone:NO]; + p += length; + + // Set the label of the tab; add a new tab when needed. + NSTabViewItem *tvi = [tabView numberOfTabViewItems] <= tabIdx + ? [self addNewTabViewItem] + : [tabViewItems objectAtIndex:tabIdx]; + + [tvi setLabel:label]; + + [label release]; + + ++tabIdx; + } + + // Remove unused tabs from the NSTabView. Note that when a tab is closed + // the NSTabView will automatically select another tab, but we want Vim to + // take care of which tab to select so set the vimTaskSelectedTab flag to + // prevent the tab selection message to be passed on to the VimTask. + vimTaskSelectedTab = YES; + int i, count = [tabView numberOfTabViewItems]; + for (i = count-1; i >= tabIdx; --i) { + id tvi = [tabViewItems objectAtIndex:i]; + //NSLog(@"Removing tab with index %d", i); + [tabView removeTabViewItem:tvi]; + } + vimTaskSelectedTab = NO; + + [self selectTabWithIndex:curtabIdx]; +} + +- (void)selectTabWithIndex:(int)idx +{ + //NSLog(@"%s%d", _cmd, idx); + + NSArray *tabViewItems = [tabBarControl representedTabViewItems]; + if (idx < 0 || idx >= [tabViewItems count]) { + NSLog(@"WARNING: No tab with index %d exists.", idx); + return; + } + + // Do not try to select a tab if already selected. + NSTabViewItem *tvi = [tabViewItems objectAtIndex:idx]; + if (tvi != [tabView selectedTabViewItem]) { + vimTaskSelectedTab = YES; + [tabView selectTabViewItem:tvi]; + vimTaskSelectedTab = NO; + } +} + +- (void)setTextDimensionsWithRows:(int)rows columns:(int)cols +{ + //NSLog(@"setTextDimensionsWithRows:%d columns:%d", rows, cols); + + // HACK! Dimensions are set by [MMVimController performBatchDrawWithData:]. + //[textStorage setMaxRows:rows columns:cols]; +} + +- (void)setStatusText:(NSString *)text +{ + if (text) + [statusTextField setStringValue:text]; + else + [statusTextField setStringValue:@""]; +} + +- (void)flashStatusText:(NSString *)text +{ + if (!statusLineIsVisible) return; + + [self setStatusText:text]; + + if (statusTimer) { + [statusTimer invalidate]; + [statusTimer release]; + } + + statusTimer = [[NSTimer scheduledTimerWithTimeInterval:3 + target:self + selector:@selector(statusTimerFired:) + userInfo:nil + repeats:NO] retain]; +} + +- (IBAction)addNewTab:(id)sender +{ + [NSPortMessage sendMessage:AddNewTabMsgID withSendPort:sendPort wait:NO]; +} + +- (IBAction)showTabBar:(id)sender +{ + [tabBarControl setHidden:NO]; + if (setupDone) + [self fitWindowToTextStorage]; +} + +- (IBAction)hideTabBar:(id)sender +{ + [tabBarControl setHidden:YES]; + if (setupDone) + [self fitWindowToTextStorage]; +} + + +// -- PSMTabBarControl delegate ---------------------------------------------- + + +- (void)tabView:(NSTabView *)theTabView didSelectTabViewItem: + (NSTabViewItem *)tabViewItem +{ + // HACK! There seem to be a bug in NSTextView which results in the first + // responder not being set to the view of the tab item so it is done + // manually here. + [[self window] makeFirstResponder:[tabViewItem view]]; + + // HACK! The selection message should not be propagated to the VimTask if + // the VimTask selected the tab (e.g. as opposed the user clicking the + // tab). The delegate method has no way of knowing who initiated the + // selection so a flag is set when the VimTask initiated the selection. + if (!vimTaskSelectedTab) { + // Propagate the selection message to the VimTask. + int idx = [self representedIndexOfTabViewItem:tabViewItem]; + NSData *data = [NSData dataWithBytes:&idx length:sizeof(int)]; + [NSPortMessage sendMessage:SelectTabMsgID withSendPort:sendPort + data:data wait:YES]; + } +} + +- (BOOL)tabView:(NSTabView *)theTabView shouldCloseTabViewItem: + (NSTabViewItem *)tabViewItem +{ + // HACK! This method is only called when the user clicks the close button + // on the tab. Instead of letting the tab bar close the tab, we return NO + // and pass a message on to Vim to let it handle the closing. + int idx = [self representedIndexOfTabViewItem:tabViewItem]; + //NSLog(@"Closing tab with index %d", idx); + NSData *data = [NSData dataWithBytes:&idx length:sizeof(int)]; + [NSPortMessage sendMessage:CloseTabMsgID withSendPort:sendPort + data:data wait:YES]; + + return NO; +} + +- (void)tabView:(NSTabView *)theTabView didDragTabViewItem: + (NSTabViewItem *)tabViewItem toIndex:(int)idx +{ + NSMutableData *data = [NSMutableData data]; + [data appendBytes:&idx length:sizeof(int)]; + + [NSPortMessage sendMessage:DraggedTabMsgID withSendPort:sendPort + data:data wait:YES]; +} + + +// -- NSLayoutManager delegate ----------------------------------------------- + + +- (void)layoutManager:(NSLayoutManager *)aLayoutManager + didCompleteLayoutForTextContainer:(NSTextContainer *)aTextContainer + atEnd:(BOOL)flag +{ + // HACK! Sometimes the text handling system will use fonts for some glyphs + // (e.g. digraphs) which are slightly higher than the font that the text + // storage uses (usually a fixed pitch font like Monaco). In this case the + // text might not fit in the window so the window is resized here to always + // be big enough to show all characters. This has the unpleasant visual + // side-effect of the window changing size when such glyphs are displayed. + +#if 0 + // HACK! The baseline separator keeps popping up, hide it again. This + // hack doesn't work. + if (tabBarControl) { + [[[self window] toolbar] setShowsBaselineSeparator: + [tabBarControl isHidden]]; + } +#endif + + if (flag && ![textView inLiveResize]) { + // Make sure the text storage exactly fills out the entire tab view, + // otherwise resize the window to fit the text storage. + // (This way the text storage size can change however/whenever it wants + // and the window will update to fit it.) + if (!NSEqualSizes([tabView frame].size, [textStorage size])) { + [self fitWindowToTextStorage]; + if (!NSEqualSizes([tabView frame].size, [textStorage size])) { + // NOTE! If the window is the same size after + // fitWindowToTextStorage, we place the views manually + // (normally windowDidResize: takes care of that) in case the + // text view changed size (which can happen e.g. after a ':set + // lines' command). + [self placeViews]; + } + [self updateResizeIncrements]; + } + } +} + + +// -- NSWindow delegate ------------------------------------------------------ + + +#if 0 +- (void)windowWillClose:(NSNotification *)notification +{ +} + +- (NSSize)windowWillResize:(NSWindow *)sender toSize:(NSSize)proposedFrameSize +{ + //NSLog(@"%s (%.2f,%.2f)", _cmd, proposedFrameSize.width, + // proposedFrameSize.height); + return proposedFrameSize; +} +#endif + +- (void)windowDidResize:(id)sender +{ + if (!setupDone) return; + [self placeViews]; +} + +- (NSRect)windowWillUseStandardFrame:(NSWindow *)win + defaultFrame:(NSRect)frame +{ + // HACK! For some reason 'frame' is not always constrained to fit on the + // screen (e.g. it may overlap the menu bar), so first constrain it to the + // screen; otherwise the new frame we compute may be too large and this + // will mess up the display after the window resizes. + frame = [win constrainFrameRect:frame toScreen:[win screen]]; + + // HACK! If the top of 'frame' is lower than the current window frame, + // increase 'frame' so that their tops align. Really, 'frame' should + // already have its top at least as high as the current window frame, but + // for some reason this is not always the case. + // (See fitWindowToTextStorage for a similar hack.) + NSRect cur = [win frame]; + if (NSMaxY(cur) > NSMaxY(frame)) { + frame.size.height = cur.origin.y - frame.origin.y + cur.size.height; + } + + frame = [self fitWindowToFrame:frame]; + + // Keep old width and horizontal position if the Command key is held down. + if ([[NSApp currentEvent] modifierFlags] & NSCommandKeyMask) { + NSRect currentFrame = [win frame]; + frame.size.width = currentFrame.size.width; + frame.origin.x = currentFrame.origin.x; + } + + return frame; +} + +@end // MMWindowController + + + +@implementation MMWindowController (Private) + +- (NSSize)contentSizeForTextViewSize:(NSSize)textViewSize +{ + NSSize size = textViewSize; + + if (![tabBarControl isHidden]) + size.height += [tabBarControl frame].size.height; + if (statusLineIsVisible) + size.height += StatusLineHeight; + + if ([self bottomScrollbarVisible]) + size.height += [NSScroller scrollerWidth]; + if ([self leftScrollbarVisible]) + size.width += [NSScroller scrollerWidth]; + if ([self rightScrollbarVisible]) + size.width += [NSScroller scrollerWidth]; + + return size; +} + +- (NSRect)textViewRectForContentSize:(NSSize)contentSize +{ + NSRect rect = { 0, 0, contentSize.width, contentSize.height }; + + if (![tabBarControl isHidden]) + rect.size.height -= [tabBarControl frame].size.height; + if (statusLineIsVisible) { + rect.size.height -= StatusLineHeight; + rect.origin.y += StatusLineHeight; + } + + if ([self bottomScrollbarVisible]) { + rect.size.height -= [NSScroller scrollerWidth]; + rect.origin.y += [NSScroller scrollerWidth]; + } + if ([self leftScrollbarVisible]) { + rect.size.width -= [NSScroller scrollerWidth]; + rect.origin.x += [NSScroller scrollerWidth]; + } + if ([self rightScrollbarVisible]) + rect.size.width -= [NSScroller scrollerWidth]; + + return rect; +} + +- (void)fitWindowToTextStorage +{ + if (!setupDone) return; + + NSWindow *win = [self window]; + NSRect frame = [win frame]; + NSRect contentRect = [win contentRectForFrameRect:frame]; + NSSize newSize = [self contentSizeForTextViewSize:[textStorage size]]; + + // Keep top-left corner of the window fixed when resizing. + contentRect.origin.y -= newSize.height - contentRect.size.height; + contentRect.size = newSize; + + frame = [win frameRectForContentRect:contentRect]; + NSRect maxFrame = [win constrainFrameRect:frame toScreen:[win screen]]; + + // HACK! Assuming the window frame cannot already be placed too high, + // adjust 'maxFrame' so that it at least as high up as the current frame. + // The reason for doing this is that constrainFrameRect:toScreen: does not + // always seem to utilize as much area as possible. + if (NSMaxY(frame) > NSMaxY(maxFrame)) { + maxFrame.size.height = frame.origin.y - maxFrame.origin.y + + frame.size.height; + } + + if (NSEqualRects(maxFrame, frame)) { + // The new window frame fits on the screen, so resize the window. + [win setFrame:frame display:YES]; + } else { + // The new window frame is too big to fit on the screen, so fit the + // text storage to the biggest frame which will fit on the screen. + //NSLog(@"Proposed window frame does not fit on the screen!"); + + [win setFrame:[self fitWindowToFrame:maxFrame] display:YES]; + } +} + +- (NSRect)fitWindowToFrame:(NSRect)frame +{ + if (!setupDone) return frame; + + NSWindow *win = [self window]; + NSRect contentRect = [win contentRectForFrameRect:frame]; + NSRect textViewRect = [self textViewRectForContentSize:contentRect.size]; + NSSize fitSize = [textStorage fitToSize:textViewRect.size]; + NSSize newSize = [self contentSizeForTextViewSize:fitSize]; + + // Keep top-left corner of 'frame' fixed. + contentRect.origin.y -= newSize.height - contentRect.size.height; + contentRect.size = newSize; + + return [win frameRectForContentRect:contentRect]; +} + +- (void)updateResizeIncrements +{ + if (!setupDone) return; + + NSSize size = [textStorage calculateAverageFontSize]; + [[self window] setContentResizeIncrements:size]; +} + +- (NSTabViewItem *)addNewTabViewItem +{ + // NOTE! A newly created tab is not by selected by default; the VimTask + // decides which tab should be selected at all times. However, the AppKit + // will automatically select the first tab added to a tab view. + + NSTabViewItem *tvi = [[NSTabViewItem alloc] initWithIdentifier:nil]; + [tvi setView:textView]; + + // BUG! This call seems to have no effect; see comment in + // tabView:didSelectTabViewItem:. + [tvi setInitialFirstResponder:textView]; + + [tabView addTabViewItem:tvi]; + [tvi release]; + + return tvi; +} + +- (void)statusTimerFired:(NSTimer *)timer +{ + [self setStatusText:@""]; + [statusTimer release]; + statusTimer = nil; +} + +- (int)representedIndexOfTabViewItem:(NSTabViewItem *)tvi +{ + NSArray *tabViewItems = [tabBarControl representedTabViewItems]; + return [tabViewItems indexOfObject:tvi]; +} + +- (IBAction)vimMenuItemAction:(id)sender +{ + int tag = [sender tag]; + + NSMutableData *data = [NSMutableData data]; + [data appendBytes:&tag length:sizeof(int)]; + + [NSPortMessage sendMessage:ExecuteMenuMsgID withSendPort:sendPort + data:data wait:NO]; +} + +- (MMScroller *)scrollbarForIdentifier:(long)ident index:(unsigned *)idx +{ + unsigned i, count = [scrollbars count]; + for (i = 0; i < count; ++i) { + MMScroller *scroller = [scrollbars objectAtIndex:i]; + if ([scroller identifier] == ident) { + if (idx) *idx = i; + return scroller; + } + } + + return nil; +} + +- (BOOL)bottomScrollbarVisible +{ + unsigned i, count = [scrollbars count]; + for (i = 0; i < count; ++i) { + MMScroller *scroller = [scrollbars objectAtIndex:i]; + if ([scroller type] == MMScrollerTypeBottom && ![scroller isHidden]) + return YES; + } + + return NO; +} + +- (BOOL)leftScrollbarVisible +{ + unsigned i, count = [scrollbars count]; + for (i = 0; i < count; ++i) { + MMScroller *scroller = [scrollbars objectAtIndex:i]; + if ([scroller type] == MMScrollerTypeLeft && ![scroller isHidden]) + return YES; + } + + return NO; +} + +- (BOOL)rightScrollbarVisible +{ + unsigned i, count = [scrollbars count]; + for (i = 0; i < count; ++i) { + MMScroller *scroller = [scrollbars objectAtIndex:i]; + if ([scroller type] == MMScrollerTypeRight && ![scroller isHidden]) + return YES; + } + + return NO; +} + +- (void)placeScrollbars +{ + if (!setupDone) return; + + NSRect tabViewFrame = [tabView frame]; + NSView *contentView = [[self window] contentView]; + BOOL lsbVisible = [self leftScrollbarVisible]; + + // HACK! Find the lowest left&right vertical scrollbars. This hack + // continues further down. + unsigned lowestLeftSbIdx = (unsigned)-1; + unsigned lowestRightSbIdx = (unsigned)-1; + unsigned rowMaxLeft = 0, rowMaxRight = 0; + unsigned i, count = [scrollbars count]; + for (i = 0; i < count; ++i) { + MMScroller *scroller = [scrollbars objectAtIndex:i]; + if (![scroller isHidden]) { + NSRange range = [scroller range]; + if ([scroller type] == MMScrollerTypeLeft + && range.location >= rowMaxLeft) { + rowMaxLeft = range.location; + lowestLeftSbIdx = i; + } else if ([scroller type] == MMScrollerTypeRight + && range.location >= rowMaxRight) { + rowMaxRight = range.location; + lowestRightSbIdx = i; + } + } + } + + // Place the scrollbars. + for (i = 0; i < count; ++i) { + MMScroller *scroller = [scrollbars objectAtIndex:i]; + if ([scroller isHidden]) + continue; + + NSRect rect; + if ([scroller type] == MMScrollerTypeBottom) { + rect = [textStorage rectForColumnsInRange:[scroller range]]; + rect.size.height = [NSScroller scrollerWidth]; + if (statusLineIsVisible) + rect.origin.y += StatusLineHeight; + if (lsbVisible) + rect.origin.x += [NSScroller scrollerWidth]; + } else { + rect = [textStorage rectForRowsInRange:[scroller range]]; + // Adjust for the fact that text layout is flipped. + rect.origin.y = NSMaxY(tabViewFrame) - rect.origin.y + - rect.size.height; + rect.size.width = [NSScroller scrollerWidth]; + if ([scroller type] == MMScrollerTypeRight) + rect.origin.x = NSMaxX(tabViewFrame); + + // HACK! Make sure the lowest vertical scrollbar covers the text + // view all the way to the bottom. This is done because Vim only + // makes the scrollbar cover the (vim-)window it is associated with + // and this means there is always an empty gap in the scrollbar + // region next to the command line. + // TODO! Find a nicer way to do this. + if (i == lowestLeftSbIdx || i == lowestRightSbIdx) { + float h = rect.origin.y + rect.size.height + - tabViewFrame.origin.y; + if (rect.size.height < h) { + rect.origin.y = tabViewFrame.origin.y; + rect.size.height = h; + } + } + } + + //NSLog(@"set scroller #%d frame = %@", i, NSStringFromRect(rect)); + NSRect oldRect = [scroller frame]; + if (!NSEqualRects(oldRect, rect)) { + [scroller setFrame:rect]; + // Clear behind the old scroller frame, or parts of the old + // scroller might still be visible after setFrame:. + [contentView setNeedsDisplayInRect:oldRect]; + [scroller setNeedsDisplay:YES]; + } + } +} + +- (void)scroll:(id)sender +{ + NSMutableData *data = [NSMutableData data]; + long ident = [(MMScroller*)sender identifier]; + int hitPart = [sender hitPart]; + float value = [sender floatValue]; + + [data appendBytes:&ident length:sizeof(long)]; + [data appendBytes:&hitPart length:sizeof(int)]; + [data appendBytes:&value length:sizeof(float)]; + + [NSPortMessage sendMessage:ScrollbarEventMsgID withSendPort:sendPort + data:data wait:YES]; +} + +- (void)fitWindowToScrollbars:(id)sender +{ + // TODO! Make sure this only gets called once per update (e.g. in case + // several scrollbars were hidden). Could do this by setting a flag and + // then checking for this flag at appropriate places and then calling this + // method. + [self fitWindowToTextStorage]; + [self placeScrollbars]; +} + +- (void)placeViews +{ + if (!setupDone) return; + + // NOTE! It is assumed that the window has been resized so that it will + // exactly fit the text storage (possibly after resizing it). If this is + // not the case the display might be messed up. + NSWindow *win = [self window]; + NSRect contentRect = [win contentRectForFrameRect:[win frame]]; + NSRect textViewRect = [self textViewRectForContentSize:contentRect.size]; + if ([textStorage resizeToFitSize:textViewRect.size]) { + // Text storage dimensions changed, notify the VimTask. + int dim[2]; + [textStorage getMaxRows:&dim[0] columns:&dim[1]]; + //NSLog(@"Notify Vim that text storage dimensions changed to %dx%d", + // dim[0], dim[1]); + NSData *data = [NSData dataWithBytes:dim length:2*sizeof(int)]; + [NSPortMessage sendMessage:SetTextDimensionsMsgID + withSendPort:sendPort data:data wait:YES]; + } + + [tabView setFrame:textViewRect]; + + // HACK! I manually place the tab bar here instead of setting the sizing + // options in Interface Builder because I couldn't get the automatic sizing + // to work. + if (![tabBarControl isHidden]) { + NSRect tabBarRect = { + 0, NSMaxY(textViewRect), + contentRect.size.width, [tabBarControl frame].size.height }; + + [tabBarControl setFrame:tabBarRect]; + } + + [self placeScrollbars]; +} + +@end // MMWindowController (Private) + + + +@implementation NSTabView (MMExtras) + +- (void)removeAllTabViewItems +{ + NSArray *existingItems = [self tabViewItems]; + NSEnumerator *e = [existingItems objectEnumerator]; + NSTabViewItem *item; + while (item = [e nextObject]){ + [self removeTabViewItem:item]; + } +} + +@end // NSTabView (MMExtras) + + + + +@implementation MMScroller + +- (id)initWithIdentifier:(long)ident type:(int)theType +{ + // HACK! NSScroller creates a horizontal scroller if it is init'ed with a + // frame whose with exceeds its height; so create a bogus rect and pass it + // to initWithFrame. + NSRect frame = theType == MMScrollerTypeBottom + ? NSMakeRect(0, 0, 1, 0) + : NSMakeRect(0, 0, 0, 1); + + if ((self = [super initWithFrame:frame])) { + identifier = ident; + type = theType; + [self setHidden:YES]; + [self setEnabled:YES]; + } + + return self; +} + +- (long)identifier +{ + return identifier; +} + +- (int)type +{ + return type; +} + +- (NSRange)range +{ + return range; +} + +- (void)setRange:(NSRange)newRange +{ + range = newRange; +} + +@end // MMScroller diff --git a/MacVim.h b/MacVim.h new file mode 100644 index 0000000000..cd28046690 --- /dev/null +++ b/MacVim.h @@ -0,0 +1,102 @@ +/* vi:set ts=8 sts=4 sw=4 ft=objc: + * + * VIM - Vi IMproved by Bram Moolenaar + * MacVim GUI port by Bjorn Winckler + * + * Do ":help uganda" in Vim to read copying and usage conditions. + * Do ":help credits" in Vim to see a list of people who contributed. + * See README.txt for an overview of the Vim source code. + */ + +#import + + +enum { + CheckinMsgID = 1, + ConnectedMsgID, + KillTaskMsgID, + TaskExitedMsgID, + OpenVimWindowMsgID, + InsertTextMsgID, + KeyDownMsgID, + CmdKeyMsgID, + BatchDrawMsgID, + SelectTabMsgID, + CloseTabMsgID, + AddNewTabMsgID, + DraggedTabMsgID, + UpdateTabBarMsgID, + ShowTabBarMsgID, + HideTabBarMsgID, + SetTextDimensionsMsgID, + SetVimWindowTitleMsgID, + ScrollWheelMsgID, + MouseDownMsgID, + MouseUpMsgID, + MouseDraggedMsgID, + BrowseForFileMsgID, + BrowseForFileReplyMsgID, + FlushQueueMsgID, + UpdateInsertionPointMsgID, + AddMenuMsgID, + AddMenuItemMsgID, + RemoveMenuItemMsgID, + EnableMenuItemMsgID, + ExecuteMenuMsgID, + ShowToolbarMsgID, + TaskShouldTerminateMsgID, + TerminateReplyYesMsgID, + TerminateReplyNoMsgID, + CreateScrollbarMsgID, + DestroyScrollbarMsgID, + ShowScrollbarMsgID, + SetScrollbarPositionMsgID, + SetScrollbarThumbMsgID, + ScrollbarEventMsgID, + SetFontMsgID, +}; + + +enum { + ClearAllDrawType = 1, + ClearBlockDrawType, + DeleteLinesDrawType, + ReplaceStringDrawType, + InsertLinesDrawType +}; + + +// NOTE! These values must be close to zero, or the 'add menu' message might +// fail to distinguish type from tag. +enum { + MenuMenubarType = 0, + MenuPopupType, + MenuToolbarType +}; + + +enum { + ToolbarLabelFlag = 1, + ToolbarIconFlag = 2, + ToolbarSizeRegularFlag = 4 +}; + + +@interface NSPortMessage (MacVim) + ++ (BOOL)sendMessage:(int)msgid withSendPort:(NSPort *)sendPort + receivePort:(NSPort *)receivePort components:(NSArray *)components + wait:(BOOL)wait; ++ (BOOL)sendMessage:(int)msgid withSendPort:(NSPort *)sendPort + receivePort:(NSPort *)receivePort data:(NSData *)data wait:(BOOL)wait; ++ (BOOL)sendMessage:(int)msgid withSendPort:(NSPort *)sendPort + receivePort:(NSPort *)receivePort wait:(BOOL)wait; ++ (BOOL)sendMessage:(int)msgid withSendPort:(NSPort *)sendPort + components:(NSArray *)components wait:(BOOL)wait; ++ (BOOL)sendMessage:(int)msgid withSendPort:(NSPort *)sendPort + data:(NSData *)data wait:(BOOL)wait; ++ (BOOL)sendMessage:(int)msgid withSendPort:(NSPort *)sendPort wait:(BOOL)wait; + +@end + +// vim: set ft=objc: diff --git a/MacVim.m b/MacVim.m new file mode 100644 index 0000000000..3727ea60bc --- /dev/null +++ b/MacVim.m @@ -0,0 +1,86 @@ +/* vi:set ts=8 sts=4 sw=4 ft=objc: + * + * VIM - Vi IMproved by Bram Moolenaar + * MacVim GUI port by Bjorn Winckler + * + * Do ":help uganda" in Vim to read copying and usage conditions. + * Do ":help credits" in Vim to see a list of people who contributed. + * See README.txt for an overview of the Vim source code. + */ + +#import "MacVim.h" + + +@implementation NSPortMessage (MacVim) + ++ (BOOL)sendMessage:(int)msgid withSendPort:(NSPort *)sendPort + receivePort:(NSPort *)receivePort components:(NSArray *)components + wait:(BOOL)wait +{ + NSPortMessage *msg = [[NSPortMessage alloc] + initWithSendPort:sendPort + receivePort:receivePort + components:components]; + [msg setMsgid:msgid]; + + // HACK! How long should this wait before time out? + NSDate *date = wait ? [NSDate dateWithTimeIntervalSinceNow:1] + : [NSDate date]; + BOOL ok = [msg sendBeforeDate:date]; + + [msg release]; + + return ok; +} + ++ (BOOL)sendMessage:(int)msgid withSendPort:(NSPort *)sendPort + receivePort:(NSPort *)receivePort data:(NSData *)data wait:(BOOL)wait +{ + return [NSPortMessage sendMessage:msgid + withSendPort:sendPort + receivePort:receivePort + components:[NSArray arrayWithObject:data] + wait:wait]; +} + ++ (BOOL)sendMessage:(int)msgid withSendPort:(NSPort *)sendPort + receivePort:(NSPort *)receivePort wait:(BOOL)wait +{ + return [NSPortMessage sendMessage:msgid + withSendPort:sendPort + receivePort:receivePort + components:nil + wait:wait]; +} + ++ (BOOL)sendMessage:(int)msgid withSendPort:(NSPort *)sendPort + components:(NSArray *)components wait:(BOOL)wait +{ + return [NSPortMessage sendMessage:msgid + withSendPort:sendPort + receivePort:nil + components:components + wait:wait]; +} + ++ (BOOL)sendMessage:(int)msgid withSendPort:(NSPort *)sendPort + data:(NSData *)data wait:(BOOL)wait +{ + return [NSPortMessage sendMessage:msgid + withSendPort:sendPort + receivePort:nil + components:[NSArray arrayWithObject:data] + wait:wait]; +} + ++ (BOOL)sendMessage:(int)msgid withSendPort:(NSPort *)sendPort wait:(BOOL)wait +{ + return [NSPortMessage sendMessage:msgid + withSendPort:sendPort + receivePort:nil + components:nil + wait:wait]; +} + + +@end diff --git a/MacVim.xcodeproj/project.pbxproj b/MacVim.xcodeproj/project.pbxproj new file mode 100644 index 0000000000..84316bbd38 --- /dev/null +++ b/MacVim.xcodeproj/project.pbxproj @@ -0,0 +1,651 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 42; + objects = { + +/* Begin PBXBuildFile section */ + 1D0E051C0BA5F83800B6049E /* Colors.plist in Resources */ = {isa = PBXBuildFile; fileRef = 1D0E051B0BA5F83800B6049E /* Colors.plist */; }; + 1D1474970C56703C0038FA2B /* MacVim.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 1D1474950C56703C0038FA2B /* MacVim.h */; }; + 1D1474980C56703C0038FA2B /* MacVim.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D1474960C56703C0038FA2B /* MacVim.m */; }; + 1D14749F0C5673AE0038FA2B /* MMAppController.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 1D14749D0C5673AE0038FA2B /* MMAppController.h */; }; + 1D1474A00C5673AE0038FA2B /* MMAppController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D14749E0C5673AE0038FA2B /* MMAppController.m */; }; + 1D1474A90C5677450038FA2B /* MMTextStorage.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 1D1474A70C5677450038FA2B /* MMTextStorage.h */; }; + 1D1474AA0C5677450038FA2B /* MMTextStorage.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D1474A80C5677450038FA2B /* MMTextStorage.m */; }; + 1D1474AF0C5678370038FA2B /* MMTextView.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 1D1474AD0C5678370038FA2B /* MMTextView.h */; }; + 1D1474B00C5678370038FA2B /* MMTextView.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D1474AE0C5678370038FA2B /* MMTextView.m */; }; + 1D1474B50C56796D0038FA2B /* MMVimController.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 1D1474B30C56796D0038FA2B /* MMVimController.h */; }; + 1D1474B60C56796D0038FA2B /* MMVimController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D1474B40C56796D0038FA2B /* MMVimController.m */; }; + 1D1474BB0C567A910038FA2B /* MMWindowController.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 1D1474B90C567A910038FA2B /* MMWindowController.h */; }; + 1D1474BC0C567A910038FA2B /* MMWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D1474BA0C567A910038FA2B /* MMWindowController.m */; }; + 1D16B9EB0BA33E1E00A69B33 /* VimWindow.nib in Resources */ = {isa = PBXBuildFile; fileRef = 1D16B9E90BA33E1E00A69B33 /* VimWindow.nib */; }; + 1D493D580C5247BF00AB718C /* Vim in CopyFiles */ = {isa = PBXBuildFile; fileRef = 1D493D570C5247BF00AB718C /* Vim */; }; + 1D493DBA0C52534300AB718C /* PSMTabBarControl.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 1D493DB90C52533B00AB718C /* PSMTabBarControl.framework */; }; + 1D71ACB40BC702AB002F2B60 /* doc-bm-c.icns in Resources */ = {isa = PBXBuildFile; fileRef = 1D71ACA90BC702AB002F2B60 /* doc-bm-c.icns */; }; + 1D71ACB50BC702AC002F2B60 /* doc-bm-h.icns in Resources */ = {isa = PBXBuildFile; fileRef = 1D71ACAA0BC702AB002F2B60 /* doc-bm-h.icns */; }; + 1D71ACB60BC702AC002F2B60 /* doc-bm-html.icns in Resources */ = {isa = PBXBuildFile; fileRef = 1D71ACAB0BC702AB002F2B60 /* doc-bm-html.icns */; }; + 1D71ACB70BC702AC002F2B60 /* doc-bm-java.icns in Resources */ = {isa = PBXBuildFile; fileRef = 1D71ACAC0BC702AB002F2B60 /* doc-bm-java.icns */; }; + 1D71ACB80BC702AC002F2B60 /* doc-bm-php.icns in Resources */ = {isa = PBXBuildFile; fileRef = 1D71ACAD0BC702AB002F2B60 /* doc-bm-php.icns */; }; + 1D71ACB90BC702AC002F2B60 /* doc-bm-pl.icns in Resources */ = {isa = PBXBuildFile; fileRef = 1D71ACAE0BC702AB002F2B60 /* doc-bm-pl.icns */; }; + 1D71ACBA0BC702AC002F2B60 /* doc-bm-sh.icns in Resources */ = {isa = PBXBuildFile; fileRef = 1D71ACAF0BC702AB002F2B60 /* doc-bm-sh.icns */; }; + 1D71ACBB0BC702AC002F2B60 /* doc-bm-tex.icns in Resources */ = {isa = PBXBuildFile; fileRef = 1D71ACB00BC702AB002F2B60 /* doc-bm-tex.icns */; }; + 1D71ACBC0BC702AC002F2B60 /* doc-bm-txt.icns in Resources */ = {isa = PBXBuildFile; fileRef = 1D71ACB10BC702AB002F2B60 /* doc-bm-txt.icns */; }; + 1D71ACBD0BC702AC002F2B60 /* doc-bm-xml.icns in Resources */ = {isa = PBXBuildFile; fileRef = 1D71ACB20BC702AB002F2B60 /* doc-bm-xml.icns */; }; + 1D71ACBE0BC702AC002F2B60 /* doc-bm.icns in Resources */ = {isa = PBXBuildFile; fileRef = 1D71ACB30BC702AB002F2B60 /* doc-bm.icns */; }; + 1DD04DEC0C529C5E006CDC2B /* Credits.rtf in Resources */ = {isa = PBXBuildFile; fileRef = 1DD04DEB0C529C5E006CDC2B /* Credits.rtf */; }; + 1DD703B90BA9D15D008679E9 /* vim_gloss.icns in Resources */ = {isa = PBXBuildFile; fileRef = 1DD703B80BA9D15D008679E9 /* vim_gloss.icns */; }; + 1DD704310BA9F9C2008679E9 /* SpecialKeys.plist in Resources */ = {isa = PBXBuildFile; fileRef = 1DD704300BA9F9C2008679E9 /* SpecialKeys.plist */; }; + 1DEE0D9F0C4E150B008E82B2 /* Attention.png in Resources */ = {isa = PBXBuildFile; fileRef = 1DEE0D8A0C4E150B008E82B2 /* Attention.png */; }; + 1DEE0DA00C4E150B008E82B2 /* Copy.png in Resources */ = {isa = PBXBuildFile; fileRef = 1DEE0D8B0C4E150B008E82B2 /* Copy.png */; }; + 1DEE0DA10C4E150B008E82B2 /* Cut.png in Resources */ = {isa = PBXBuildFile; fileRef = 1DEE0D8C0C4E150B008E82B2 /* Cut.png */; }; + 1DEE0DA20C4E150B008E82B2 /* FindHelp.png in Resources */ = {isa = PBXBuildFile; fileRef = 1DEE0D8D0C4E150B008E82B2 /* FindHelp.png */; }; + 1DEE0DA30C4E150B008E82B2 /* FindNext.png in Resources */ = {isa = PBXBuildFile; fileRef = 1DEE0D8E0C4E150B008E82B2 /* FindNext.png */; }; + 1DEE0DA40C4E150B008E82B2 /* FindPrev.png in Resources */ = {isa = PBXBuildFile; fileRef = 1DEE0D8F0C4E150B008E82B2 /* FindPrev.png */; }; + 1DEE0DA50C4E150B008E82B2 /* Help.png in Resources */ = {isa = PBXBuildFile; fileRef = 1DEE0D900C4E150B008E82B2 /* Help.png */; }; + 1DEE0DA60C4E150B008E82B2 /* LoadSesn.png in Resources */ = {isa = PBXBuildFile; fileRef = 1DEE0D910C4E150B008E82B2 /* LoadSesn.png */; }; + 1DEE0DA70C4E150B008E82B2 /* Make.png in Resources */ = {isa = PBXBuildFile; fileRef = 1DEE0D920C4E150B008E82B2 /* Make.png */; }; + 1DEE0DA80C4E150B008E82B2 /* Open.png in Resources */ = {isa = PBXBuildFile; fileRef = 1DEE0D930C4E150B008E82B2 /* Open.png */; }; + 1DEE0DA90C4E150B008E82B2 /* Paste.png in Resources */ = {isa = PBXBuildFile; fileRef = 1DEE0D940C4E150B008E82B2 /* Paste.png */; }; + 1DEE0DAA0C4E150B008E82B2 /* Print.png in Resources */ = {isa = PBXBuildFile; fileRef = 1DEE0D950C4E150B008E82B2 /* Print.png */; }; + 1DEE0DAB0C4E150B008E82B2 /* Redo.png in Resources */ = {isa = PBXBuildFile; fileRef = 1DEE0D960C4E150B008E82B2 /* Redo.png */; }; + 1DEE0DAC0C4E150B008E82B2 /* Replace.png in Resources */ = {isa = PBXBuildFile; fileRef = 1DEE0D970C4E150B008E82B2 /* Replace.png */; }; + 1DEE0DAD0C4E150B008E82B2 /* RunCtags.png in Resources */ = {isa = PBXBuildFile; fileRef = 1DEE0D980C4E150B008E82B2 /* RunCtags.png */; }; + 1DEE0DAE0C4E150B008E82B2 /* RunScript.png in Resources */ = {isa = PBXBuildFile; fileRef = 1DEE0D990C4E150B008E82B2 /* RunScript.png */; }; + 1DEE0DAF0C4E150B008E82B2 /* Save.png in Resources */ = {isa = PBXBuildFile; fileRef = 1DEE0D9A0C4E150B008E82B2 /* Save.png */; }; + 1DEE0DB00C4E150B008E82B2 /* SaveAll.png in Resources */ = {isa = PBXBuildFile; fileRef = 1DEE0D9B0C4E150B008E82B2 /* SaveAll.png */; }; + 1DEE0DB10C4E150B008E82B2 /* SaveSesn.png in Resources */ = {isa = PBXBuildFile; fileRef = 1DEE0D9C0C4E150B008E82B2 /* SaveSesn.png */; }; + 1DEE0DB20C4E150B008E82B2 /* TagJump.png in Resources */ = {isa = PBXBuildFile; fileRef = 1DEE0D9D0C4E150B008E82B2 /* TagJump.png */; }; + 1DEE0DB30C4E150B008E82B2 /* Undo.png in Resources */ = {isa = PBXBuildFile; fileRef = 1DEE0D9E0C4E150B008E82B2 /* Undo.png */; }; + 1DFE25A50C527BC4003000F7 /* PSMTabBarControl.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D493DB90C52533B00AB718C /* PSMTabBarControl.framework */; }; + 8D11072A0486CEB800E47090 /* MainMenu.nib in Resources */ = {isa = PBXBuildFile; fileRef = 29B97318FDCFA39411CA2CEA /* MainMenu.nib */; }; + 8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */; }; + 8D11072D0486CEB800E47090 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; settings = {ATTRIBUTES = (); }; }; + 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 1D493DB80C52533B00AB718C /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 1D493DB30C52533B00AB718C /* PSMTabBarControl.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 53DF68FD067E5B5A0090B5B0; + remoteInfo = PSMTabBarControlFramework; + }; + 1D493DCC0C5254A400AB718C /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 1D493DB30C52533B00AB718C /* PSMTabBarControl.xcodeproj */; + proxyType = 1; + remoteGlobalIDString = 53DF68FC067E5B5A0090B5B0; + remoteInfo = PSMTabBarControlFramework; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 1D0DCAD80BA3604D00B6CCFA /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 6; + files = ( + 1D493D580C5247BF00AB718C /* Vim in CopyFiles */, + 1D1474970C56703C0038FA2B /* MacVim.h in CopyFiles */, + 1D14749F0C5673AE0038FA2B /* MMAppController.h in CopyFiles */, + 1D1474A90C5677450038FA2B /* MMTextStorage.h in CopyFiles */, + 1D1474AF0C5678370038FA2B /* MMTextView.h in CopyFiles */, + 1D1474B50C56796D0038FA2B /* MMVimController.h in CopyFiles */, + 1D1474BB0C567A910038FA2B /* MMWindowController.h in CopyFiles */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 1D9EB2840C366D7B0074B739 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 1D493DBA0C52534300AB718C /* PSMTabBarControl.framework in CopyFiles */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 089C165DFE840E0CC02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = ""; }; + 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = ""; }; + 13E42FB307B3F0F600E4EEF1 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = /System/Library/Frameworks/CoreData.framework; sourceTree = ""; }; + 1D0E051B0BA5F83800B6049E /* Colors.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = Colors.plist; sourceTree = ""; }; + 1D1474950C56703C0038FA2B /* MacVim.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = MacVim.h; sourceTree = ""; }; + 1D1474960C56703C0038FA2B /* MacVim.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = MacVim.m; sourceTree = ""; }; + 1D14749D0C5673AE0038FA2B /* MMAppController.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = MMAppController.h; sourceTree = ""; }; + 1D14749E0C5673AE0038FA2B /* MMAppController.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = MMAppController.m; sourceTree = ""; }; + 1D1474A70C5677450038FA2B /* MMTextStorage.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = MMTextStorage.h; sourceTree = ""; }; + 1D1474A80C5677450038FA2B /* MMTextStorage.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = MMTextStorage.m; sourceTree = ""; }; + 1D1474AD0C5678370038FA2B /* MMTextView.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = MMTextView.h; sourceTree = ""; }; + 1D1474AE0C5678370038FA2B /* MMTextView.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = MMTextView.m; sourceTree = ""; }; + 1D1474B30C56796D0038FA2B /* MMVimController.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = MMVimController.h; sourceTree = ""; }; + 1D1474B40C56796D0038FA2B /* MMVimController.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = MMVimController.m; sourceTree = ""; }; + 1D1474B90C567A910038FA2B /* MMWindowController.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = MMWindowController.h; sourceTree = ""; }; + 1D1474BA0C567A910038FA2B /* MMWindowController.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = MMWindowController.m; sourceTree = ""; }; + 1D16B9EA0BA33E1E00A69B33 /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = English.lproj/VimWindow.nib; sourceTree = ""; }; + 1D493D570C5247BF00AB718C /* Vim */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.executable"; name = Vim; path = ../Vim; sourceTree = SOURCE_ROOT; }; + 1D493DB30C52533B00AB718C /* PSMTabBarControl.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = PSMTabBarControl.xcodeproj; path = PSMTabBarControl/PSMTabBarControl.xcodeproj; sourceTree = ""; }; + 1D71ACA90BC702AB002F2B60 /* doc-bm-c.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = "doc-bm-c.icns"; sourceTree = ""; }; + 1D71ACAA0BC702AB002F2B60 /* doc-bm-h.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = "doc-bm-h.icns"; sourceTree = ""; }; + 1D71ACAB0BC702AB002F2B60 /* doc-bm-html.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = "doc-bm-html.icns"; sourceTree = ""; }; + 1D71ACAC0BC702AB002F2B60 /* doc-bm-java.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = "doc-bm-java.icns"; sourceTree = ""; }; + 1D71ACAD0BC702AB002F2B60 /* doc-bm-php.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = "doc-bm-php.icns"; sourceTree = ""; }; + 1D71ACAE0BC702AB002F2B60 /* doc-bm-pl.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = "doc-bm-pl.icns"; sourceTree = ""; }; + 1D71ACAF0BC702AB002F2B60 /* doc-bm-sh.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = "doc-bm-sh.icns"; sourceTree = ""; }; + 1D71ACB00BC702AB002F2B60 /* doc-bm-tex.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = "doc-bm-tex.icns"; sourceTree = ""; }; + 1D71ACB10BC702AB002F2B60 /* doc-bm-txt.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = "doc-bm-txt.icns"; sourceTree = ""; }; + 1D71ACB20BC702AB002F2B60 /* doc-bm-xml.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = "doc-bm-xml.icns"; sourceTree = ""; }; + 1D71ACB30BC702AB002F2B60 /* doc-bm.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = "doc-bm.icns"; sourceTree = ""; }; + 1DD04DEB0C529C5E006CDC2B /* Credits.rtf */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; path = Credits.rtf; sourceTree = ""; }; + 1DD703B80BA9D15D008679E9 /* vim_gloss.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = vim_gloss.icns; sourceTree = ""; }; + 1DD704300BA9F9C2008679E9 /* SpecialKeys.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = SpecialKeys.plist; sourceTree = ""; }; + 1DEE0D8A0C4E150B008E82B2 /* Attention.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Attention.png; path = Toolbar/Attention.png; sourceTree = ""; }; + 1DEE0D8B0C4E150B008E82B2 /* Copy.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Copy.png; path = Toolbar/Copy.png; sourceTree = ""; }; + 1DEE0D8C0C4E150B008E82B2 /* Cut.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Cut.png; path = Toolbar/Cut.png; sourceTree = ""; }; + 1DEE0D8D0C4E150B008E82B2 /* FindHelp.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = FindHelp.png; path = Toolbar/FindHelp.png; sourceTree = ""; }; + 1DEE0D8E0C4E150B008E82B2 /* FindNext.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = FindNext.png; path = Toolbar/FindNext.png; sourceTree = ""; }; + 1DEE0D8F0C4E150B008E82B2 /* FindPrev.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = FindPrev.png; path = Toolbar/FindPrev.png; sourceTree = ""; }; + 1DEE0D900C4E150B008E82B2 /* Help.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Help.png; path = Toolbar/Help.png; sourceTree = ""; }; + 1DEE0D910C4E150B008E82B2 /* LoadSesn.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = LoadSesn.png; path = Toolbar/LoadSesn.png; sourceTree = ""; }; + 1DEE0D920C4E150B008E82B2 /* Make.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Make.png; path = Toolbar/Make.png; sourceTree = ""; }; + 1DEE0D930C4E150B008E82B2 /* Open.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Open.png; path = Toolbar/Open.png; sourceTree = ""; }; + 1DEE0D940C4E150B008E82B2 /* Paste.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Paste.png; path = Toolbar/Paste.png; sourceTree = ""; }; + 1DEE0D950C4E150B008E82B2 /* Print.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Print.png; path = Toolbar/Print.png; sourceTree = ""; }; + 1DEE0D960C4E150B008E82B2 /* Redo.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Redo.png; path = Toolbar/Redo.png; sourceTree = ""; }; + 1DEE0D970C4E150B008E82B2 /* Replace.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Replace.png; path = Toolbar/Replace.png; sourceTree = ""; }; + 1DEE0D980C4E150B008E82B2 /* RunCtags.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = RunCtags.png; path = Toolbar/RunCtags.png; sourceTree = ""; }; + 1DEE0D990C4E150B008E82B2 /* RunScript.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = RunScript.png; path = Toolbar/RunScript.png; sourceTree = ""; }; + 1DEE0D9A0C4E150B008E82B2 /* Save.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Save.png; path = Toolbar/Save.png; sourceTree = ""; }; + 1DEE0D9B0C4E150B008E82B2 /* SaveAll.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = SaveAll.png; path = Toolbar/SaveAll.png; sourceTree = ""; }; + 1DEE0D9C0C4E150B008E82B2 /* SaveSesn.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = SaveSesn.png; path = Toolbar/SaveSesn.png; sourceTree = ""; }; + 1DEE0D9D0C4E150B008E82B2 /* TagJump.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = TagJump.png; path = Toolbar/TagJump.png; sourceTree = ""; }; + 1DEE0D9E0C4E150B008E82B2 /* Undo.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Undo.png; path = Toolbar/Undo.png; sourceTree = ""; }; + 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + 29B97319FDCFA39411CA2CEA /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = English.lproj/MainMenu.nib; sourceTree = ""; }; + 29B97324FDCFA39411CA2CEA /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = ""; }; + 29B97325FDCFA39411CA2CEA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = ""; }; + 32CA4F630368D1EE00C91783 /* MacVim_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MacVim_Prefix.pch; sourceTree = ""; }; + 8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; + 8D1107320486CEB800E47090 /* MacVim.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = MacVim.app; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 8D11072E0486CEB800E47090 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 1DFE25A50C527BC4003000F7 /* PSMTabBarControl.framework in Frameworks */, + 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 080E96DDFE201D6D7F000001 /* MacVim Source */ = { + isa = PBXGroup; + children = ( + 1D1474B90C567A910038FA2B /* MMWindowController.h */, + 1D1474BA0C567A910038FA2B /* MMWindowController.m */, + 1D1474B30C56796D0038FA2B /* MMVimController.h */, + 1D1474B40C56796D0038FA2B /* MMVimController.m */, + 1D1474AD0C5678370038FA2B /* MMTextView.h */, + 1D1474AE0C5678370038FA2B /* MMTextView.m */, + 1D1474A70C5677450038FA2B /* MMTextStorage.h */, + 1D1474A80C5677450038FA2B /* MMTextStorage.m */, + 1D14749D0C5673AE0038FA2B /* MMAppController.h */, + 1D14749E0C5673AE0038FA2B /* MMAppController.m */, + 1D1474950C56703C0038FA2B /* MacVim.h */, + 1D1474960C56703C0038FA2B /* MacVim.m */, + 32CA4F630368D1EE00C91783 /* MacVim_Prefix.pch */, + 29B97316FDCFA39411CA2CEA /* main.m */, + ); + name = "MacVim Source"; + sourceTree = ""; + }; + 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */ = { + isa = PBXGroup; + children = ( + 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */, + ); + name = "Linked Frameworks"; + sourceTree = ""; + }; + 1058C7A2FEA54F0111CA2CBB /* Other Frameworks */ = { + isa = PBXGroup; + children = ( + 29B97324FDCFA39411CA2CEA /* AppKit.framework */, + 13E42FB307B3F0F600E4EEF1 /* CoreData.framework */, + 29B97325FDCFA39411CA2CEA /* Foundation.framework */, + ); + name = "Other Frameworks"; + sourceTree = ""; + }; + 19C28FACFE9D520D11CA2CBB /* Products */ = { + isa = PBXGroup; + children = ( + 8D1107320486CEB800E47090 /* MacVim.app */, + ); + name = Products; + sourceTree = ""; + }; + 1D493D640C52482B00AB718C /* Executables */ = { + isa = PBXGroup; + children = ( + 1D493D570C5247BF00AB718C /* Vim */, + ); + name = Executables; + sourceTree = ""; + }; + 1D493DB40C52533B00AB718C /* Products */ = { + isa = PBXGroup; + children = ( + 1D493DB90C52533B00AB718C /* PSMTabBarControl.framework */, + ); + name = Products; + sourceTree = ""; + }; + 1DCE78490C460C6C006305A6 /* Icons */ = { + isa = PBXGroup; + children = ( + 1D71ACA90BC702AB002F2B60 /* doc-bm-c.icns */, + 1D71ACAA0BC702AB002F2B60 /* doc-bm-h.icns */, + 1D71ACAB0BC702AB002F2B60 /* doc-bm-html.icns */, + 1D71ACAC0BC702AB002F2B60 /* doc-bm-java.icns */, + 1D71ACAD0BC702AB002F2B60 /* doc-bm-php.icns */, + 1D71ACAE0BC702AB002F2B60 /* doc-bm-pl.icns */, + 1D71ACAF0BC702AB002F2B60 /* doc-bm-sh.icns */, + 1D71ACB00BC702AB002F2B60 /* doc-bm-tex.icns */, + 1D71ACB10BC702AB002F2B60 /* doc-bm-txt.icns */, + 1D71ACB20BC702AB002F2B60 /* doc-bm-xml.icns */, + 1D71ACB30BC702AB002F2B60 /* doc-bm.icns */, + 1DD703B80BA9D15D008679E9 /* vim_gloss.icns */, + ); + name = Icons; + sourceTree = ""; + }; + 1DE9726C0C48050600F96A9F /* Toolbar */ = { + isa = PBXGroup; + children = ( + 1DEE0D8A0C4E150B008E82B2 /* Attention.png */, + 1DEE0D8B0C4E150B008E82B2 /* Copy.png */, + 1DEE0D8C0C4E150B008E82B2 /* Cut.png */, + 1DEE0D8D0C4E150B008E82B2 /* FindHelp.png */, + 1DEE0D8E0C4E150B008E82B2 /* FindNext.png */, + 1DEE0D8F0C4E150B008E82B2 /* FindPrev.png */, + 1DEE0D900C4E150B008E82B2 /* Help.png */, + 1DEE0D910C4E150B008E82B2 /* LoadSesn.png */, + 1DEE0D920C4E150B008E82B2 /* Make.png */, + 1DEE0D930C4E150B008E82B2 /* Open.png */, + 1DEE0D940C4E150B008E82B2 /* Paste.png */, + 1DEE0D950C4E150B008E82B2 /* Print.png */, + 1DEE0D960C4E150B008E82B2 /* Redo.png */, + 1DEE0D970C4E150B008E82B2 /* Replace.png */, + 1DEE0D980C4E150B008E82B2 /* RunCtags.png */, + 1DEE0D990C4E150B008E82B2 /* RunScript.png */, + 1DEE0D9A0C4E150B008E82B2 /* Save.png */, + 1DEE0D9B0C4E150B008E82B2 /* SaveAll.png */, + 1DEE0D9C0C4E150B008E82B2 /* SaveSesn.png */, + 1DEE0D9D0C4E150B008E82B2 /* TagJump.png */, + 1DEE0D9E0C4E150B008E82B2 /* Undo.png */, + ); + name = Toolbar; + sourceTree = ""; + }; + 29B97314FDCFA39411CA2CEA /* MacVim */ = { + isa = PBXGroup; + children = ( + 1D493D640C52482B00AB718C /* Executables */, + 080E96DDFE201D6D7F000001 /* MacVim Source */, + 29B97317FDCFA39411CA2CEA /* Resources */, + 29B97323FDCFA39411CA2CEA /* Frameworks */, + 19C28FACFE9D520D11CA2CBB /* Products */, + ); + name = MacVim; + sourceTree = ""; + }; + 29B97317FDCFA39411CA2CEA /* Resources */ = { + isa = PBXGroup; + children = ( + 1DD04DEB0C529C5E006CDC2B /* Credits.rtf */, + 1DE9726C0C48050600F96A9F /* Toolbar */, + 1DCE78490C460C6C006305A6 /* Icons */, + 1DD704300BA9F9C2008679E9 /* SpecialKeys.plist */, + 1D0E051B0BA5F83800B6049E /* Colors.plist */, + 8D1107310486CEB800E47090 /* Info.plist */, + 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */, + 29B97318FDCFA39411CA2CEA /* MainMenu.nib */, + 1D16B9E90BA33E1E00A69B33 /* VimWindow.nib */, + ); + name = Resources; + sourceTree = ""; + }; + 29B97323FDCFA39411CA2CEA /* Frameworks */ = { + isa = PBXGroup; + children = ( + 1D493DB30C52533B00AB718C /* PSMTabBarControl.xcodeproj */, + 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */, + 1058C7A2FEA54F0111CA2CBB /* Other Frameworks */, + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 8D1107260486CEB800E47090 /* MacVim */ = { + isa = PBXNativeTarget; + buildConfigurationList = C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "MacVim" */; + buildPhases = ( + 8D1107290486CEB800E47090 /* Resources */, + 8D11072C0486CEB800E47090 /* Sources */, + 8D11072E0486CEB800E47090 /* Frameworks */, + 1D0DCAD80BA3604D00B6CCFA /* CopyFiles */, + 1D9EB2840C366D7B0074B739 /* CopyFiles */, + 1D670CC60C493AEC00E9771C /* ShellScript */, + ); + buildRules = ( + ); + dependencies = ( + 1D493DCD0C5254A400AB718C /* PBXTargetDependency */, + ); + name = MacVim; + productInstallPath = "$(HOME)/Applications"; + productName = MacVim; + productReference = 8D1107320486CEB800E47090 /* MacVim.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 29B97313FDCFA39411CA2CEA /* Project object */ = { + isa = PBXProject; + buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "MacVim" */; + hasScannedForEncodings = 1; + mainGroup = 29B97314FDCFA39411CA2CEA /* MacVim */; + projectDirPath = ""; + projectReferences = ( + { + ProductGroup = 1D493DB40C52533B00AB718C /* Products */; + ProjectRef = 1D493DB30C52533B00AB718C /* PSMTabBarControl.xcodeproj */; + }, + ); + targets = ( + 8D1107260486CEB800E47090 /* MacVim */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXReferenceProxy section */ + 1D493DB90C52533B00AB718C /* PSMTabBarControl.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = PSMTabBarControl.framework; + remoteRef = 1D493DB80C52533B00AB718C /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; +/* End PBXReferenceProxy section */ + +/* Begin PBXResourcesBuildPhase section */ + 8D1107290486CEB800E47090 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 8D11072A0486CEB800E47090 /* MainMenu.nib in Resources */, + 8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */, + 1D16B9EB0BA33E1E00A69B33 /* VimWindow.nib in Resources */, + 1D0E051C0BA5F83800B6049E /* Colors.plist in Resources */, + 1DD703B90BA9D15D008679E9 /* vim_gloss.icns in Resources */, + 1DD704310BA9F9C2008679E9 /* SpecialKeys.plist in Resources */, + 1D71ACB40BC702AB002F2B60 /* doc-bm-c.icns in Resources */, + 1D71ACB50BC702AC002F2B60 /* doc-bm-h.icns in Resources */, + 1D71ACB60BC702AC002F2B60 /* doc-bm-html.icns in Resources */, + 1D71ACB70BC702AC002F2B60 /* doc-bm-java.icns in Resources */, + 1D71ACB80BC702AC002F2B60 /* doc-bm-php.icns in Resources */, + 1D71ACB90BC702AC002F2B60 /* doc-bm-pl.icns in Resources */, + 1D71ACBA0BC702AC002F2B60 /* doc-bm-sh.icns in Resources */, + 1D71ACBB0BC702AC002F2B60 /* doc-bm-tex.icns in Resources */, + 1D71ACBC0BC702AC002F2B60 /* doc-bm-txt.icns in Resources */, + 1D71ACBD0BC702AC002F2B60 /* doc-bm-xml.icns in Resources */, + 1D71ACBE0BC702AC002F2B60 /* doc-bm.icns in Resources */, + 1DEE0D9F0C4E150B008E82B2 /* Attention.png in Resources */, + 1DEE0DA00C4E150B008E82B2 /* Copy.png in Resources */, + 1DEE0DA10C4E150B008E82B2 /* Cut.png in Resources */, + 1DEE0DA20C4E150B008E82B2 /* FindHelp.png in Resources */, + 1DEE0DA30C4E150B008E82B2 /* FindNext.png in Resources */, + 1DEE0DA40C4E150B008E82B2 /* FindPrev.png in Resources */, + 1DEE0DA50C4E150B008E82B2 /* Help.png in Resources */, + 1DEE0DA60C4E150B008E82B2 /* LoadSesn.png in Resources */, + 1DEE0DA70C4E150B008E82B2 /* Make.png in Resources */, + 1DEE0DA80C4E150B008E82B2 /* Open.png in Resources */, + 1DEE0DA90C4E150B008E82B2 /* Paste.png in Resources */, + 1DEE0DAA0C4E150B008E82B2 /* Print.png in Resources */, + 1DEE0DAB0C4E150B008E82B2 /* Redo.png in Resources */, + 1DEE0DAC0C4E150B008E82B2 /* Replace.png in Resources */, + 1DEE0DAD0C4E150B008E82B2 /* RunCtags.png in Resources */, + 1DEE0DAE0C4E150B008E82B2 /* RunScript.png in Resources */, + 1DEE0DAF0C4E150B008E82B2 /* Save.png in Resources */, + 1DEE0DB00C4E150B008E82B2 /* SaveAll.png in Resources */, + 1DEE0DB10C4E150B008E82B2 /* SaveSesn.png in Resources */, + 1DEE0DB20C4E150B008E82B2 /* TagJump.png in Resources */, + 1DEE0DB30C4E150B008E82B2 /* Undo.png in Resources */, + 1DD04DEC0C529C5E006CDC2B /* Credits.rtf in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 1D670CC60C493AEC00E9771C /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 12; + files = ( + ); + inputPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "mkdir $TARGET_BUILD_DIR/MacVim.app/Contents/Resources/vim\ncp -R ../../runtime/ $TARGET_BUILD_DIR/MacVim.app/Contents/Resources/vim/runtime/"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 8D11072C0486CEB800E47090 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 8D11072D0486CEB800E47090 /* main.m in Sources */, + 1D1474980C56703C0038FA2B /* MacVim.m in Sources */, + 1D1474A00C5673AE0038FA2B /* MMAppController.m in Sources */, + 1D1474AA0C5677450038FA2B /* MMTextStorage.m in Sources */, + 1D1474B00C5678370038FA2B /* MMTextView.m in Sources */, + 1D1474B60C56796D0038FA2B /* MMVimController.m in Sources */, + 1D1474BC0C567A910038FA2B /* MMWindowController.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 1D493DCD0C5254A400AB718C /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = PSMTabBarControlFramework; + targetProxy = 1D493DCC0C5254A400AB718C /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + 089C165DFE840E0CC02AAC07 /* English */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; + 1D16B9E90BA33E1E00A69B33 /* VimWindow.nib */ = { + isa = PBXVariantGroup; + children = ( + 1D16B9EA0BA33E1E00A69B33 /* English */, + ); + name = VimWindow.nib; + sourceTree = ""; + }; + 29B97318FDCFA39411CA2CEA /* MainMenu.nib */ = { + isa = PBXVariantGroup; + children = ( + 29B97319FDCFA39411CA2CEA /* English */, + ); + name = MainMenu.nib; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 1DF7D93A0BC05175006CF13F /* My Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = ( + ppc, + i386, + ); + COPY_PHASE_STRIP = NO; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(FRAMEWORK_SEARCH_PATHS_QUOTED_1)", + "$(FRAMEWORK_SEARCH_PATHS_QUOTED_2)", + "$(FRAMEWORK_SEARCH_PATHS_QUOTED_3)", + ); + FRAMEWORK_SEARCH_PATHS_QUOTED_1 = "\"$(SRCROOT)/../../../../Library/Frameworks\""; + GCC_DYNAMIC_NO_PIC = NO; + GCC_GENERATE_DEBUGGING_SYMBOLS = YES; + GCC_MODEL_TUNING = G5; + GCC_OPTIMIZATION_LEVEL = 0; + HEADER_SEARCH_PATHS = PSMTabBarControl/source/; + INFOPLIST_FILE = Info.plist; + INSTALL_PATH = "$(HOME)/Applications"; + PRODUCT_NAME = MacVim; + WRAPPER_EXTENSION = app; + }; + name = "My Release"; + }; + 1DF7D93B0BC05175006CF13F /* My Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + PREBINDING = NO; + SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk; + }; + name = "My Release"; + }; + C01FCF4B08A954540054247B /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = ( + ppc, + i386, + ); + COPY_PHASE_STRIP = NO; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(FRAMEWORK_SEARCH_PATHS_QUOTED_1)", + "$(FRAMEWORK_SEARCH_PATHS_QUOTED_2)", + "$(FRAMEWORK_SEARCH_PATHS_QUOTED_3)", + ); + FRAMEWORK_SEARCH_PATHS_QUOTED_1 = "\"$(SRCROOT)/../../../../Library/Frameworks\""; + GCC_DYNAMIC_NO_PIC = NO; + GCC_ENABLE_FIX_AND_CONTINUE = YES; + GCC_MODEL_TUNING = G5; + GCC_OPTIMIZATION_LEVEL = 0; + HEADER_SEARCH_PATHS = PSMTabBarControl/source/; + INFOPLIST_FILE = Info.plist; + INSTALL_PATH = "$(HOME)/Applications"; + PRODUCT_NAME = MacVim; + WRAPPER_EXTENSION = app; + ZERO_LINK = YES; + }; + name = Debug; + }; + C01FCF4C08A954540054247B /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = ( + ppc, + i386, + ); + COPY_PHASE_STRIP = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(FRAMEWORK_SEARCH_PATHS_QUOTED_1)", + "$(FRAMEWORK_SEARCH_PATHS_QUOTED_2)", + "$(FRAMEWORK_SEARCH_PATHS_QUOTED_3)", + ); + FRAMEWORK_SEARCH_PATHS_QUOTED_1 = "\"$(SRCROOT)/../../../../Library/Frameworks\""; + GCC_DYNAMIC_NO_PIC = YES; + GCC_GENERATE_DEBUGGING_SYMBOLS = NO; + GCC_MODEL_TUNING = G5; + GCC_OPTIMIZATION_LEVEL = s; + HEADER_SEARCH_PATHS = PSMTabBarControl/source/; + INFOPLIST_FILE = Info.plist; + INSTALL_PATH = "$(HOME)/Applications"; + PRODUCT_NAME = MacVim; + WRAPPER_EXTENSION = app; + }; + name = Release; + }; + C01FCF4F08A954540054247B /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + PREBINDING = NO; + SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk; + }; + name = Debug; + }; + C01FCF5008A954540054247B /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + PREBINDING = NO; + SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "MacVim" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C01FCF4B08A954540054247B /* Debug */, + C01FCF4C08A954540054247B /* Release */, + 1DF7D93A0BC05175006CF13F /* My Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + C01FCF4E08A954540054247B /* Build configuration list for PBXProject "MacVim" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C01FCF4F08A954540054247B /* Debug */, + C01FCF5008A954540054247B /* Release */, + 1DF7D93B0BC05175006CF13F /* My Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 29B97313FDCFA39411CA2CEA /* Project object */; +} diff --git a/MacVim.xcodeproj/winckler.mode1 b/MacVim.xcodeproj/winckler.mode1 new file mode 100644 index 0000000000..d8b9ba9ed1 --- /dev/null +++ b/MacVim.xcodeproj/winckler.mode1 @@ -0,0 +1,1348 @@ + + + + + ActivePerspectiveName + Project + AllowedModules + + + BundleLoadPath + + MaxInstances + n + Module + PBXSmartGroupTreeModule + Name + Groups and Files Outline View + + + BundleLoadPath + + MaxInstances + n + Module + PBXNavigatorGroup + Name + Editor + + + BundleLoadPath + + MaxInstances + n + Module + XCTaskListModule + Name + Task List + + + BundleLoadPath + + MaxInstances + n + Module + XCDetailModule + Name + File and Smart Group Detail Viewer + + + BundleLoadPath + + MaxInstances + 1 + Module + PBXBuildResultsModule + Name + Detailed Build Results Viewer + + + BundleLoadPath + + MaxInstances + 1 + Module + PBXProjectFindModule + Name + Project Batch Find Tool + + + BundleLoadPath + + MaxInstances + n + Module + PBXRunSessionModule + Name + Run Log + + + BundleLoadPath + + MaxInstances + n + Module + PBXBookmarksModule + Name + Bookmarks Tool + + + BundleLoadPath + + MaxInstances + n + Module + PBXClassBrowserModule + Name + Class Browser + + + BundleLoadPath + + MaxInstances + n + Module + PBXCVSModule + Name + Source Code Control Tool + + + BundleLoadPath + + MaxInstances + n + Module + PBXDebugBreakpointsModule + Name + Debug Breakpoints Tool + + + BundleLoadPath + + MaxInstances + n + Module + XCDockableInspector + Name + Inspector + + + BundleLoadPath + + MaxInstances + n + Module + PBXOpenQuicklyModule + Name + Open Quickly Tool + + + BundleLoadPath + + MaxInstances + 1 + Module + PBXDebugSessionModule + Name + Debugger + + + BundleLoadPath + + MaxInstances + 1 + Module + PBXDebugCLIModule + Name + Debug Console + + + Description + DefaultDescriptionKey + DockingSystemVisible + + Extension + mode1 + FavBarConfig + + PBXProjectModuleGUID + 1D16B9DC0BA33BB000A69B33 + XCBarModuleItemNames + + XCBarModuleItems + + + FirstTimeWindowDisplayed + + Identifier + com.apple.perspectives.project.mode1 + MajorVersion + 31 + MinorVersion + 1 + Name + Default + Notifications + + OpenEditors + + PerspectiveWidths + + -1 + -1 + + Perspectives + + + ChosenToolbarItems + + active-target-popup + active-buildstyle-popup + action + NSToolbarFlexibleSpaceItem + buildOrClean + build-and-runOrDebug + com.apple.ide.PBXToolbarStopButton + get-info + toggle-editor + NSToolbarFlexibleSpaceItem + com.apple.pbx.toolbar.searchfield + + ControllerClassBaseName + + IconName + WindowOfProjectWithEditor + Identifier + perspective.project + IsVertical + + Layout + + + BecomeActive + + ContentConfiguration + + PBXBottomSmartGroupGIDs + + 1C37FBAC04509CD000000102 + 1C37FAAC04509CD000000102 + 1C08E77C0454961000C914BD + 1C37FABC05509CD000000102 + 1C37FABC05539CD112110102 + E2644B35053B69B200211256 + 1C37FABC04509CD000100104 + 1CC0EA4004350EF90044410B + 1CC0EA4004350EF90041110B + + PBXProjectModuleGUID + 1CE0B1FE06471DED0097A5F4 + PBXProjectModuleLabel + Files + PBXProjectStructureProvided + yes + PBXSmartGroupTreeModuleColumnData + + PBXSmartGroupTreeModuleColumnWidthsKey + + 186 + + PBXSmartGroupTreeModuleColumnsKey_v4 + + MainColumn + + + PBXSmartGroupTreeModuleOutlineStateKey_v7 + + PBXSmartGroupTreeModuleOutlineStateExpansionKey + + 29B97314FDCFA39411CA2CEA + 1C37FBAC04509CD000000102 + 1C37FABC05509CD000000102 + + PBXSmartGroupTreeModuleOutlineStateSelectionKey + + + 0 + + + PBXSmartGroupTreeModuleOutlineStateVisibleRectKey + {{0, 0}, {186, 338}} + + PBXTopSmartGroupGIDs + + XCIncludePerspectivesSwitch + + XCSharingToken + com.apple.Xcode.GFSharingToken + + GeometryConfiguration + + Frame + {{0, 0}, {203, 356}} + GroupTreeTableConfiguration + + MainColumn + 186 + + RubberWindowFrame + 168 349 690 397 0 0 1024 746 + + Module + PBXSmartGroupTreeModule + Proportion + 203pt + + + Dock + + + ContentConfiguration + + PBXProjectModuleGUID + 1CE0B20306471E060097A5F4 + PBXProjectModuleLabel + MyNewFile14.java + PBXSplitModuleInNavigatorKey + + Split0 + + PBXProjectModuleGUID + 1CE0B20406471E060097A5F4 + PBXProjectModuleLabel + MyNewFile14.java + + SplitCount + 1 + + StatusBarVisibility + + + GeometryConfiguration + + Frame + {{0, 0}, {482, 0}} + RubberWindowFrame + 168 349 690 397 0 0 1024 746 + + Module + PBXNavigatorGroup + Proportion + 0pt + + + ContentConfiguration + + PBXProjectModuleGUID + 1CE0B20506471E060097A5F4 + PBXProjectModuleLabel + Detail + + GeometryConfiguration + + Frame + {{0, 5}, {482, 351}} + RubberWindowFrame + 168 349 690 397 0 0 1024 746 + + Module + XCDetailModule + Proportion + 351pt + + + Proportion + 482pt + + + Name + Project + ServiceClasses + + XCModuleDock + PBXSmartGroupTreeModule + XCModuleDock + PBXNavigatorGroup + XCDetailModule + + TableOfContents + + 1DDE37030C572B47007FB583 + 1CE0B1FE06471DED0097A5F4 + 1DDE37040C572B47007FB583 + 1CE0B20306471E060097A5F4 + 1CE0B20506471E060097A5F4 + + ToolbarConfiguration + xcode.toolbar.config.default + + + ControllerClassBaseName + + IconName + WindowOfProject + Identifier + perspective.morph + IsVertical + 0 + Layout + + + BecomeActive + 1 + ContentConfiguration + + PBXBottomSmartGroupGIDs + + 1C37FBAC04509CD000000102 + 1C37FAAC04509CD000000102 + 1C08E77C0454961000C914BD + 1C37FABC05509CD000000102 + 1C37FABC05539CD112110102 + E2644B35053B69B200211256 + 1C37FABC04509CD000100104 + 1CC0EA4004350EF90044410B + 1CC0EA4004350EF90041110B + + PBXProjectModuleGUID + 11E0B1FE06471DED0097A5F4 + PBXProjectModuleLabel + Files + PBXProjectStructureProvided + yes + PBXSmartGroupTreeModuleColumnData + + PBXSmartGroupTreeModuleColumnWidthsKey + + 186 + + PBXSmartGroupTreeModuleColumnsKey_v4 + + MainColumn + + + PBXSmartGroupTreeModuleOutlineStateKey_v7 + + PBXSmartGroupTreeModuleOutlineStateExpansionKey + + 29B97314FDCFA39411CA2CEA + 1C37FABC05509CD000000102 + + PBXSmartGroupTreeModuleOutlineStateSelectionKey + + + 0 + + + PBXSmartGroupTreeModuleOutlineStateVisibleRectKey + {{0, 0}, {186, 337}} + + PBXTopSmartGroupGIDs + + XCIncludePerspectivesSwitch + 1 + XCSharingToken + com.apple.Xcode.GFSharingToken + + GeometryConfiguration + + Frame + {{0, 0}, {203, 355}} + GroupTreeTableConfiguration + + MainColumn + 186 + + RubberWindowFrame + 373 269 690 397 0 0 1440 878 + + Module + PBXSmartGroupTreeModule + Proportion + 100% + + + Name + Morph + PreferredWidth + 300 + ServiceClasses + + XCModuleDock + PBXSmartGroupTreeModule + + TableOfContents + + 11E0B1FE06471DED0097A5F4 + + ToolbarConfiguration + xcode.toolbar.config.default.short + + + PerspectivesBarVisible + + ShelfIsVisible + + SourceDescription + file at '/System/Library/PrivateFrameworks/DevToolsInterface.framework/Versions/A/Resources/XCPerspectivesSpecificationMode1.xcperspec' + StatusbarIsVisible + + TimeStamp + 0.0 + ToolbarDisplayMode + 1 + ToolbarIsVisible + + ToolbarSizeMode + 1 + Type + Perspectives + UpdateMessage + The Default Workspace in this version of Xcode now includes support to hide and show the detail view (what has been referred to as the "Metro-Morph" feature). You must discard your current Default Workspace settings and update to the latest Default Workspace in order to gain this feature. Do you wish to update to the latest Workspace defaults for project '%@'? + WindowJustification + 5 + WindowOrderList + + 1D16B9EF0BA33E3800A69B33 + 1C0AD2B3069F1EA900FABCE6 + /Users/winckler/Projects/vim70/src/MacVim/MacVim.xcodeproj + + WindowString + 168 349 690 397 0 0 1024 746 + WindowTools + + + FirstTimeWindowDisplayed + + Identifier + windowTool.build + IsVertical + + Layout + + + Dock + + + ContentConfiguration + + PBXProjectModuleGUID + 1CD0528F0623707200166675 + PBXProjectModuleLabel + + StatusBarVisibility + + + GeometryConfiguration + + Frame + {{0, 0}, {836, 194}} + RubberWindowFrame + 188 225 836 476 0 0 1024 746 + + Module + PBXNavigatorGroup + Proportion + 194pt + + + ContentConfiguration + + PBXProjectModuleGUID + XCMainBuildResultsModuleGUID + PBXProjectModuleLabel + Build + XCBuildResultsTrigger_Collapse + 1021 + XCBuildResultsTrigger_Open + 1011 + + GeometryConfiguration + + Frame + {{0, 199}, {836, 236}} + RubberWindowFrame + 188 225 836 476 0 0 1024 746 + + Module + PBXBuildResultsModule + Proportion + 236pt + + + Proportion + 435pt + + + Name + Build Results + ServiceClasses + + PBXBuildResultsModule + + StatusbarIsVisible + + TableOfContents + + 1D16B9EF0BA33E3800A69B33 + 1DDE37050C572B47007FB583 + 1CD0528F0623707200166675 + XCMainBuildResultsModuleGUID + + ToolbarConfiguration + xcode.toolbar.config.build + WindowString + 188 225 836 476 0 0 1024 746 + WindowToolGUID + 1D16B9EF0BA33E3800A69B33 + WindowToolIsVisible + + + + FirstTimeWindowDisplayed + + Identifier + windowTool.debugger + IsVertical + + Layout + + + Dock + + + ContentConfiguration + + Debugger + + HorizontalSplitView + + _collapsingFrameDimension + 0.0 + _indexOfCollapsedView + 0 + _percentageOfCollapsedView + 0.0 + isCollapsed + yes + sizes + + {{0, 0}, {411, 339}} + {{411, 0}, {613, 339}} + + + VerticalSplitView + + _collapsingFrameDimension + 0.0 + _indexOfCollapsedView + 0 + _percentageOfCollapsedView + 0.0 + isCollapsed + yes + sizes + + {{0, 0}, {1024, 339}} + {{0, 339}, {1024, 306}} + + + + LauncherConfigVersion + 8 + PBXProjectModuleGUID + 1C162984064C10D400B95A72 + PBXProjectModuleLabel + Debug - GLUTExamples (Underwater) + + GeometryConfiguration + + DebugConsoleDrawerSize + {100, 120} + DebugConsoleVisible + None + DebugConsoleWindowFrame + {{200, 200}, {500, 300}} + DebugSTDIOWindowFrame + {{200, 200}, {500, 300}} + Frame + {{0, 0}, {1024, 645}} + RubberWindowFrame + 0 60 1024 686 0 0 1024 746 + + Module + PBXDebugSessionModule + Proportion + 645pt + + + Proportion + 645pt + + + Name + Debugger + ServiceClasses + + PBXDebugSessionModule + + StatusbarIsVisible + + TableOfContents + + 1CD10A99069EF8BA00B06720 + 1D14746A0C566C890038FA2B + 1C162984064C10D400B95A72 + 1D14746B0C566C890038FA2B + 1D14746C0C566C890038FA2B + 1D14746D0C566C890038FA2B + 1D14746E0C566C890038FA2B + 1D14746F0C566C890038FA2B + 1D1474700C566C890038FA2B + + ToolbarConfiguration + xcode.toolbar.config.debug + WindowString + 0 60 1024 686 0 0 1024 746 + WindowToolGUID + 1CD10A99069EF8BA00B06720 + WindowToolIsVisible + + + + Identifier + windowTool.find + Layout + + + Dock + + + Dock + + + ContentConfiguration + + PBXProjectModuleGUID + 1CDD528C0622207200134675 + PBXProjectModuleLabel + <No Editor> + PBXSplitModuleInNavigatorKey + + Split0 + + PBXProjectModuleGUID + 1CD0528D0623707200166675 + + SplitCount + 1 + + StatusBarVisibility + 1 + + GeometryConfiguration + + Frame + {{0, 0}, {781, 167}} + RubberWindowFrame + 62 385 781 470 0 0 1440 878 + + Module + PBXNavigatorGroup + Proportion + 781pt + + + Proportion + 50% + + + BecomeActive + 1 + ContentConfiguration + + PBXProjectModuleGUID + 1CD0528E0623707200166675 + PBXProjectModuleLabel + Project Find + + GeometryConfiguration + + Frame + {{8, 0}, {773, 254}} + RubberWindowFrame + 62 385 781 470 0 0 1440 878 + + Module + PBXProjectFindModule + Proportion + 50% + + + Proportion + 428pt + + + Name + Project Find + ServiceClasses + + PBXProjectFindModule + + StatusbarIsVisible + 1 + TableOfContents + + 1C530D57069F1CE1000CFCEE + 1C530D58069F1CE1000CFCEE + 1C530D59069F1CE1000CFCEE + 1CDD528C0622207200134675 + 1C530D5A069F1CE1000CFCEE + 1CE0B1FE06471DED0097A5F4 + 1CD0528E0623707200166675 + + WindowString + 62 385 781 470 0 0 1440 878 + WindowToolGUID + 1C530D57069F1CE1000CFCEE + WindowToolIsVisible + 0 + + + Identifier + MENUSEPARATOR + + + FirstTimeWindowDisplayed + + Identifier + windowTool.debuggerConsole + IsVertical + + Layout + + + Dock + + + ContentConfiguration + + PBXProjectModuleGUID + 1C78EAAC065D492600B07095 + PBXProjectModuleLabel + Debugger Console + + GeometryConfiguration + + Frame + {{0, 0}, {836, 380}} + RubberWindowFrame + 118 143 836 421 0 0 1024 746 + + Module + PBXDebugCLIModule + Proportion + 380pt + + + Proportion + 380pt + + + Name + Debugger Console + ServiceClasses + + PBXDebugCLIModule + + StatusbarIsVisible + + TableOfContents + + 1DE444730BA4445100C4C77A + 1D1474710C566C890038FA2B + 1C78EAAC065D492600B07095 + + WindowString + 118 143 836 421 0 0 1024 746 + WindowToolGUID + 1DE444730BA4445100C4C77A + WindowToolIsVisible + + + + FirstTimeWindowDisplayed + + Identifier + windowTool.run + IsVertical + + Layout + + + Dock + + + ContentConfiguration + + LauncherConfigVersion + 3 + PBXProjectModuleGUID + 1CD0528B0623707200166675 + PBXProjectModuleLabel + Run + Runner + + HorizontalSplitView + + _collapsingFrameDimension + 0.0 + _indexOfCollapsedView + 0 + _percentageOfCollapsedView + 0.0 + isCollapsed + yes + sizes + + {{0, 0}, {493, 167}} + {{0, 176}, {493, 267}} + + + VerticalSplitView + + _collapsingFrameDimension + 0.0 + _indexOfCollapsedView + 0 + _percentageOfCollapsedView + 0.0 + isCollapsed + yes + sizes + + {{0, 0}, {405, 443}} + {{414, 0}, {514, 443}} + + + + + GeometryConfiguration + + Frame + {{0, 0}, {897, 256}} + RubberWindowFrame + 1 65 897 297 0 0 1024 746 + + Module + PBXRunSessionModule + Proportion + 256pt + + + Proportion + 256pt + + + Name + Run Log + ServiceClasses + + PBXRunSessionModule + + StatusbarIsVisible + + TableOfContents + + 1C0AD2B3069F1EA900FABCE6 + 1DDE36F90C572B25007FB583 + 1CD0528B0623707200166675 + 1DDE36FA0C572B25007FB583 + + ToolbarConfiguration + xcode.toolbar.config.run + WindowString + 1 65 897 297 0 0 1024 746 + WindowToolGUID + 1C0AD2B3069F1EA900FABCE6 + WindowToolIsVisible + + + + Identifier + windowTool.scm + Layout + + + Dock + + + ContentConfiguration + + PBXProjectModuleGUID + 1C78EAB2065D492600B07095 + PBXProjectModuleLabel + <No Editor> + PBXSplitModuleInNavigatorKey + + Split0 + + PBXProjectModuleGUID + 1C78EAB3065D492600B07095 + + SplitCount + 1 + + StatusBarVisibility + 1 + + GeometryConfiguration + + Frame + {{0, 0}, {452, 0}} + RubberWindowFrame + 743 379 452 308 0 0 1280 1002 + + Module + PBXNavigatorGroup + Proportion + 0pt + + + BecomeActive + 1 + ContentConfiguration + + PBXProjectModuleGUID + 1CD052920623707200166675 + PBXProjectModuleLabel + SCM + + GeometryConfiguration + + ConsoleFrame + {{0, 259}, {452, 0}} + Frame + {{0, 7}, {452, 259}} + RubberWindowFrame + 743 379 452 308 0 0 1280 1002 + TableConfiguration + + Status + 30 + FileName + 199 + Path + 197.09500122070312 + + TableFrame + {{0, 0}, {452, 250}} + + Module + PBXCVSModule + Proportion + 262pt + + + Proportion + 266pt + + + Name + SCM + ServiceClasses + + PBXCVSModule + + StatusbarIsVisible + 1 + TableOfContents + + 1C78EAB4065D492600B07095 + 1C78EAB5065D492600B07095 + 1C78EAB2065D492600B07095 + 1CD052920623707200166675 + + ToolbarConfiguration + xcode.toolbar.config.scm + WindowString + 743 379 452 308 0 0 1280 1002 + + + FirstTimeWindowDisplayed + + Identifier + windowTool.breakpoints + IsVertical + + Layout + + + Dock + + + ContentConfiguration + + PBXBottomSmartGroupGIDs + + 1C77FABC04509CD000000102 + + PBXProjectModuleGUID + 1CE0B1FE06471DED0097A5F4 + PBXProjectModuleLabel + Files + PBXProjectStructureProvided + no + PBXSmartGroupTreeModuleColumnData + + PBXSmartGroupTreeModuleColumnWidthsKey + + 168 + + PBXSmartGroupTreeModuleColumnsKey_v4 + + MainColumn + + + PBXSmartGroupTreeModuleOutlineStateKey_v7 + + PBXSmartGroupTreeModuleOutlineStateExpansionKey + + 1C77FABC04509CD000000102 + + PBXSmartGroupTreeModuleOutlineStateSelectionKey + + + 0 + + + PBXSmartGroupTreeModuleOutlineStateVisibleRectKey + {{0, 0}, {168, 350}} + + PBXTopSmartGroupGIDs + + XCIncludePerspectivesSwitch + + + GeometryConfiguration + + Frame + {{0, 0}, {185, 368}} + GroupTreeTableConfiguration + + MainColumn + 168 + + RubberWindowFrame + 61 303 744 409 0 0 1024 746 + + Module + PBXSmartGroupTreeModule + Proportion + 185pt + + + BecomeActive + + ContentConfiguration + + PBXProjectModuleGUID + 1CA1AED706398EBD00589147 + PBXProjectModuleLabel + Detail + + GeometryConfiguration + + Frame + {{190, 0}, {554, 368}} + RubberWindowFrame + 61 303 744 409 0 0 1024 746 + + Module + XCDetailModule + Proportion + 554pt + + + Proportion + 368pt + + + MajorVersion + 2 + MinorVersion + 0 + Name + Breakpoints + ServiceClasses + + PBXSmartGroupTreeModule + XCDetailModule + + StatusbarIsVisible + + TableOfContents + + 1DDA69300C55296D00F5D112 + 1DDA69310C55296D00F5D112 + 1CE0B1FE06471DED0097A5F4 + 1CA1AED706398EBD00589147 + + ToolbarConfiguration + xcode.toolbar.config.breakpoints + WindowString + 61 303 744 409 0 0 1024 746 + WindowToolGUID + 1DDA69300C55296D00F5D112 + WindowToolIsVisible + + + + Identifier + windowTool.debugAnimator + Layout + + + Dock + + + Module + PBXNavigatorGroup + Proportion + 100% + + + Proportion + 100% + + + Name + Debug Visualizer + ServiceClasses + + PBXNavigatorGroup + + StatusbarIsVisible + 1 + ToolbarConfiguration + xcode.toolbar.config.debugAnimator + WindowString + 100 100 700 500 0 0 1280 1002 + + + Identifier + windowTool.bookmarks + Layout + + + Dock + + + Module + PBXBookmarksModule + Proportion + 100% + + + Proportion + 100% + + + Name + Bookmarks + ServiceClasses + + PBXBookmarksModule + + StatusbarIsVisible + 0 + WindowString + 538 42 401 187 0 0 1280 1002 + + + Identifier + windowTool.classBrowser + Layout + + + Dock + + + BecomeActive + 1 + ContentConfiguration + + OptionsSetName + Hierarchy, all classes + PBXProjectModuleGUID + 1CA6456E063B45B4001379D8 + PBXProjectModuleLabel + Class Browser - NSObject + + GeometryConfiguration + + ClassesFrame + {{0, 0}, {374, 96}} + ClassesTreeTableConfiguration + + PBXClassNameColumnIdentifier + 208 + PBXClassBookColumnIdentifier + 22 + + Frame + {{0, 0}, {630, 331}} + MembersFrame + {{0, 105}, {374, 395}} + MembersTreeTableConfiguration + + PBXMemberTypeIconColumnIdentifier + 22 + PBXMemberNameColumnIdentifier + 216 + PBXMemberTypeColumnIdentifier + 97 + PBXMemberBookColumnIdentifier + 22 + + PBXModuleWindowStatusBarHidden2 + 1 + RubberWindowFrame + 385 179 630 352 0 0 1440 878 + + Module + PBXClassBrowserModule + Proportion + 332pt + + + Proportion + 332pt + + + Name + Class Browser + ServiceClasses + + PBXClassBrowserModule + + StatusbarIsVisible + 0 + TableOfContents + + 1C0AD2AF069F1E9B00FABCE6 + 1C0AD2B0069F1E9B00FABCE6 + 1CA6456E063B45B4001379D8 + + ToolbarConfiguration + xcode.toolbar.config.classbrowser + WindowString + 385 179 630 352 0 0 1440 878 + WindowToolGUID + 1C0AD2AF069F1E9B00FABCE6 + WindowToolIsVisible + 0 + + + + diff --git a/MacVim.xcodeproj/winckler.pbxuser b/MacVim.xcodeproj/winckler.pbxuser new file mode 100644 index 0000000000..04c3529812 --- /dev/null +++ b/MacVim.xcodeproj/winckler.pbxuser @@ -0,0 +1,247 @@ +// !$*UTF8*$! +{ + 089C165DFE840E0CC02AAC07 /* English */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {784, 608}}"; + sepNavSelRange = "{88, 0}"; + sepNavVisRect = "{{0, 0}, {784, 608}}"; + sepNavWindowFrame = "{{15, 4}, {823, 737}}"; + }; + }; + 1D0DC9EB0BA34B3D00B6CCFA /* VimWindowController.m */ = { + isa = PBXFileReference; + fileEncoding = 30; + lastKnownFileType = sourcecode.c.objc; + name = VimWindowController.m; + path = /Users/winckler/Projects/vim70/src/MacVim/VimWindowController.m; + sourceTree = ""; + }; + 1D16B9CF0BA33BAE00A69B33 /* MacVim */ = { + isa = PBXExecutable; + activeArgIndex = 2147483647; + activeArgIndices = ( + NO, + ); + argumentStrings = ( + "-nowindow 1", + ); + autoAttachOnCrash = 1; + configStateDict = { + }; + customDataFormattersEnabled = 1; + debuggerPlugin = GDBDebugging; + disassemblyDisplayState = 0; + dylibVariantSuffix = ""; + enableDebugStr = 1; + environmentEntries = ( + ); + executableSystemSymbolLevel = 0; + executableUserSymbolLevel = 0; + libgmallocEnabled = 0; + name = MacVim; + savedGlobals = { + }; + sourceDirectories = ( + ); + variableFormatDictionary = { + }; + }; + 1D16B9DD0BA33BB000A69B33 /* Source Control */ = { + isa = PBXSourceControlManager; + fallbackIsa = XCSourceControlManager; + isSCMEnabled = 0; + scmConfiguration = { + }; + scmType = ""; + }; + 1D16B9DE0BA33BB000A69B33 /* Code sense */ = { + isa = PBXCodeSenseManager; + indexTemplatePath = ""; + }; + 1D9B9FEF0BB34E7700F878F2 /* [NSException raise] */ = { + isa = PBXSymbolicBreakpoint; + actions = ( + ); + breakpointStyle = 1; + continueAfterActions = 0; + delayBeforeContinue = 0; + hitCount = 1; + location = Foundation; + modificationTime = 206990469.69439; + state = 1; + symbolName = "[NSException raise]"; + }; + 1DD704300BA9F9C2008679E9 /* SpecialKeys.plist */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {797, 1008}}"; + sepNavSelRange = "{0, 0}"; + sepNavVisRect = "{{0, 192}, {567, 595}}"; + sepNavWindowFrame = "{{15, 17}, {606, 724}}"; + }; + }; + 1DDA694B0C552B2B00F5D112 /* VimWindowController.m:539 */ = { + isa = PBXFileBreakpoint; + actions = ( + ); + breakpointStyle = 0; + continueAfterActions = 0; + delayBeforeContinue = 0; + fileReference = 1D0DC9EB0BA34B3D00B6CCFA /* VimWindowController.m */; + functionName = "-windowDidResize:"; + hitCount = 1; + lineNumber = 539; + location = VimWindowController.ob; + modificationTime = 206990476.954509; + state = 1; + }; + 1DE445650BA493EC00C4C77A /* XCBreakpointsBucket */ = { + isa = XCBreakpointsBucket; + name = "Project Breakpoints"; + objects = ( + 1D9B9FEF0BB34E7700F878F2 /* [NSException raise] */, + 1DDA694B0C552B2B00F5D112 /* VimWindowController.m:539 */, + ); + }; + 29B97313FDCFA39411CA2CEA /* Project object */ = { + activeBuildConfigurationName = Release; + activeExecutable = 1D16B9CF0BA33BAE00A69B33 /* MacVim */; + activeTarget = 8D1107260486CEB800E47090 /* MacVim */; + addToTargets = ( + 8D1107260486CEB800E47090 /* MacVim */, + ); + breakpoints = ( + 1D9B9FEF0BB34E7700F878F2 /* [NSException raise] */, + 1DDA694B0C552B2B00F5D112 /* VimWindowController.m:539 */, + ); + breakpointsGroup = 1DE445650BA493EC00C4C77A /* XCBreakpointsBucket */; + codeSenseManager = 1D16B9DE0BA33BB000A69B33 /* Code sense */; + executables = ( + 1D16B9CF0BA33BAE00A69B33 /* MacVim */, + ); + perUserDictionary = { + "PBXConfiguration.PBXBreakpointsDataSource.v1:1CA1AED706398EBD00589147" = { + PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; + PBXFileTableDataSourceColumnSortingKey = PBXBreakpointsDataSource_BreakpointID; + PBXFileTableDataSourceColumnWidthsKey = ( + 20, + 20, + 210, + 20, + 110, + 109, + 20, + ); + PBXFileTableDataSourceColumnsKey = ( + PBXBreakpointsDataSource_ActionID, + PBXBreakpointsDataSource_TypeID, + PBXBreakpointsDataSource_BreakpointID, + PBXBreakpointsDataSource_UseID, + PBXBreakpointsDataSource_LocationID, + PBXBreakpointsDataSource_ConditionID, + PBXBreakpointsDataSource_ContinueID, + ); + }; + PBXConfiguration.PBXFileTableDataSource3.PBXExecutablesDataSource = { + PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; + PBXFileTableDataSourceColumnSortingKey = PBXExecutablesDataSource_NameID; + PBXFileTableDataSourceColumnWidthsKey = ( + 22, + 300, + 130, + ); + PBXFileTableDataSourceColumnsKey = ( + PBXExecutablesDataSource_ActiveFlagID, + PBXExecutablesDataSource_NameID, + PBXExecutablesDataSource_CommentsID, + ); + }; + PBXConfiguration.PBXFileTableDataSource3.PBXFileTableDataSource = { + PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; + PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID; + PBXFileTableDataSourceColumnWidthsKey = ( + 20, + 243, + 20, + 48, + 43, + 43, + 20, + ); + PBXFileTableDataSourceColumnsKey = ( + PBXFileDataSource_FiletypeID, + PBXFileDataSource_Filename_ColumnID, + PBXFileDataSource_Built_ColumnID, + PBXFileDataSource_ObjectSize_ColumnID, + PBXFileDataSource_Errors_ColumnID, + PBXFileDataSource_Warnings_ColumnID, + PBXFileDataSource_Target_ColumnID, + ); + }; + PBXConfiguration.PBXFileTableDataSource3.PBXSymbolsDataSource = { + PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; + PBXFileTableDataSourceColumnSortingKey = PBXSymbolsDataSource_SymbolNameID; + PBXFileTableDataSourceColumnWidthsKey = ( + 16, + 200, + 50, + 183, + ); + PBXFileTableDataSourceColumnsKey = ( + PBXSymbolsDataSource_SymbolTypeIconID, + PBXSymbolsDataSource_SymbolNameID, + PBXSymbolsDataSource_SymbolTypeID, + PBXSymbolsDataSource_ReferenceNameID, + ); + }; + PBXConfiguration.PBXTargetDataSource.PBXTargetDataSource = { + PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; + PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID; + PBXFileTableDataSourceColumnWidthsKey = ( + 20, + 200, + 63, + 20, + 48, + 43, + 43, + ); + PBXFileTableDataSourceColumnsKey = ( + PBXFileDataSource_FiletypeID, + PBXFileDataSource_Filename_ColumnID, + PBXTargetDataSource_PrimaryAttribute, + PBXFileDataSource_Built_ColumnID, + PBXFileDataSource_ObjectSize_ColumnID, + PBXFileDataSource_Errors_ColumnID, + PBXFileDataSource_Warnings_ColumnID, + ); + }; + PBXPerProjectTemplateStateSaveDate = 207039262; + PBXWorkspaceStateSaveDate = 207039262; + }; + sourceControlManager = 1D16B9DD0BA33BB000A69B33 /* Source Control */; + userBuildSettings = { + }; + }; + 29B97316FDCFA39411CA2CEA /* main.m */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {784, 608}}"; + sepNavSelRange = "{0, 0}"; + sepNavVisRect = "{{0, 0}, {784, 608}}"; + sepNavWindowFrame = "{{15, 4}, {823, 737}}"; + }; + }; + 8D1107260486CEB800E47090 /* MacVim */ = { + activeExec = 0; + executables = ( + 1D16B9CF0BA33BAE00A69B33 /* MacVim */, + ); + }; + 8D1107310486CEB800E47090 /* Info.plist */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {797, 8816}}"; + sepNavSelRange = "{0, 0}"; + sepNavVisRect = "{{0, 174}, {784, 608}}"; + sepNavWindowFrame = "{{15, 4}, {823, 737}}"; + }; + }; +} diff --git a/MacVim_Prefix.pch b/MacVim_Prefix.pch new file mode 100644 index 0000000000..4b3f87e96d --- /dev/null +++ b/MacVim_Prefix.pch @@ -0,0 +1,7 @@ +// +// Prefix header for all source files of the 'MacVim' target in the 'MacVim' project +// + +#ifdef __OBJC__ + #import +#endif diff --git a/PSMTabBarControl/English.lproj/InfoPlist.strings b/PSMTabBarControl/English.lproj/InfoPlist.strings new file mode 100644 index 0000000000000000000000000000000000000000..0bf04f0d2c2a0a3273e92116975021ec5e2b6f6b GIT binary patch literal 208 zcmW-b%?`m(5Ju0sPtjO5f=H~y%7z3Ho}jcv&^B#Jcq1=~(`GU=-~63>zdwdVgsdny z5_99io0P=f(_B&8Dag&CIWsP;GWCG6+plTtUfq6mTanB_+puTBgS*_Eo%2|3%)zUa sxrEY-O8$v+$C%0K@iA_lwl6n&`;Smosm@hv>qH&Xw;D6jCf-d6{`3tbT>t<8 literal 0 HcmV?d00001 diff --git a/PSMTabBarControl/English.lproj/MainMenu.nib/classes.nib b/PSMTabBarControl/English.lproj/MainMenu.nib/classes.nib new file mode 100644 index 0000000000..2e3f46075b --- /dev/null +++ b/PSMTabBarControl/English.lproj/MainMenu.nib/classes.nib @@ -0,0 +1,24 @@ +{ + IBClasses = ( + { + ACTIONS = {newWindow = id; }; + CLASS = AppController; + LANGUAGE = ObjC; + SUPERCLASS = NSObject; + }, + {CLASS = FakeModel; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, + { + ACTIONS = {addNewTab = id; closeTab = id; }; + CLASS = FirstResponder; + LANGUAGE = ObjC; + SUPERCLASS = NSObject; + }, + { + CLASS = PSMTabBarControl; + LANGUAGE = ObjC; + OUTLETS = {delegate = id; partnerView = id; style = id; tabView = NSTabView; }; + SUPERCLASS = NSControl; + } + ); + IBVersion = 1; +} \ No newline at end of file diff --git a/PSMTabBarControl/English.lproj/MainMenu.nib/info.nib b/PSMTabBarControl/English.lproj/MainMenu.nib/info.nib new file mode 100644 index 0000000000..c7f7c64d43 --- /dev/null +++ b/PSMTabBarControl/English.lproj/MainMenu.nib/info.nib @@ -0,0 +1,21 @@ + + + + + IBDocumentLocation + 135 107 356 240 0 0 1680 1028 + IBEditorPositions + + 29 + 130 357 371 44 0 0 1680 1028 + + IBFramework Version + 443.0 + IBOpenObjects + + 29 + + IBSystem Version + 8H14 + + diff --git a/PSMTabBarControl/English.lproj/MainMenu.nib/keyedobjects.nib b/PSMTabBarControl/English.lproj/MainMenu.nib/keyedobjects.nib new file mode 100644 index 0000000000000000000000000000000000000000..348142185703c0cdbdd5313a4e0fad5e742f3a77 GIT binary patch literal 11566 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 Yn$|~Ta<_Zk z+rxmWHbd8|N>P7V_6T2&#C4m5j8m}c78TWX19j`xtyN1%NJvOjR?$T$NJ04{NJ!B4 zX7}tnpU(#VVEN|z-n{qb&6}C4tg+4{X)I-#R86po4{cw_w(VedB)son&q*4!_N$i4 z$bW6SsypH$WMI&xbf#05k#ND*A$vmzrJK7WU1>}0iPMN>YI?6vD!uO^+xPjp?np;6 z8P}q!r5U<2;MhKG4+mv6D5;(fTQtEoyfuWAY;++;{yk(@YN1ew*yl$ozaG;p$92J* zs>3wZGsLz7U|W6;WoifQHwLqI9jL-#l!n?hkdKU19@S%p10TM#&N;G$kaItJ^5h8_ z0E1h)BW_HGY05~OQQA7hfe2Q^3ALA^2*U#>JNsz#)r4xk>No@TJN#W30WpqrX{Tu{ zVyPB|AxIVcb)+k!a`MB}oBVju&pibdNl*VVpo0W-R+ zvPUx&Xl+I=bxq#d;%o0nKik*x)71oJT`75`lznx5*=LJoikecsZKRbWu(L}-$(I>y zJSb4dt;z$M9xGvvEk_BPPEsI3KSsD9WdX$U(VZx9)3;pwE`Jm9m2P_4t=8TW#fFuN zI;l8h(o>p|PRVq5#LV}##;Fv8Ciu725T_+IcacP zM~{)VlvT{;8`_F(mK$AXCoGu`Lc&i_lj>2L$}jI1%0=&b^t7g{BGf#kf!(#DKM#8< zPlKQdrhoHyyCZo}rq_{O_34A!`jQr-P<;J`hYxnPzO^I6EnXwF2dzG8xOI^zcH^Sq+J zoC3Eedg8?_FAuB7oGsvO^a5O+DL4E1kvu7%pC*}~sxD2}653h!=u4FI3w?40mB$Su zQL+yCM(y&}FB8|+XZGQx3+oO$*Z~vzOCY7FJ<}s44=8qALaO+g-kPFgnMe$QXKpiM&{lR@p}6uhu9*>=Npv&HHc9Ik+xIJ~uuPZf`S+2KL7 z3=S;7$dUsS#WXN_4Uoclz^9wVB(OCPNRfBLV7wMP&$B7zV80G)$?pTFV)ye9OAF2n zc5WBj0VL4ICyPO#`v9rj4SyWo0G~zki~~^U9dKp`AGLDGf zgjbaZOe0X8l1~IM>Y-zjmWDIS112R9g~yNw%p$NEbMj)Erc#BW&EZfmich}$&D;~s z4?sveEu*(LPI2WlJq`C%Ns?D`XvH3L3YmeJeB*e~PK0W`^}{2;!*3wI&BO8HDt+-@ z9`4%ST%U4leah|iDR+>vBT99si=`WNSU;wvGfx=(^rvLFIT1`btn#(;3II) zmxH$5AWQpT+JYBeVPzk?IE-7S3e(anU(8sz)reK=wBJ3Kya|Fh!6r2pgKGkw`Lf3A z5v+>hML=TC;6Uc6y&859;H(_r;==G!A?7`ZA=FmhS+F)|^Vd&M*(?~6Dilj1BRe;4=Kf$A_aFSc(J z6O4=s!pN{#VB{?rc#V;Nib+N;h+TehpAjZ*Gx94K_$l-46`wNl3o*vXn*f|+WKQ@a zVxEz|2~?4UGI+TxaBu;uDaF$Bc0C14d@W6eGV88AdLO zlZ^aM%rWw3@vUdYEk?#fQl#3@ET5G^OgPDcKgVZQbZ8H9bbCA_cGh#KkvQ%%r* I1AjsJKZ!>(DgXcg literal 0 HcmV?d00001 diff --git a/PSMTabBarControl/English.lproj/PSMTabBarControlInspector.nib/classes.nib b/PSMTabBarControl/English.lproj/PSMTabBarControlInspector.nib/classes.nib new file mode 100644 index 0000000000..659b73a0ee --- /dev/null +++ b/PSMTabBarControl/English.lproj/PSMTabBarControlInspector.nib/classes.nib @@ -0,0 +1,22 @@ +{ + IBClasses = ( + {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, + { + CLASS = PSMTabBarControlInspector; + LANGUAGE = ObjC; + OUTLETS = { + "_allowsDragBetweenWindows" = NSButton; + "_canCloseOnlyTab" = NSButton; + "_cellMaxWidth" = NSTextField; + "_cellMinWidth" = NSTextField; + "_cellOptimumWidth" = NSTextField; + "_hideForSingleTab" = NSButton; + "_showAddTab" = NSButton; + "_sizeToFit" = NSButton; + "_stylePopUp" = NSPopUpButton; + }; + SUPERCLASS = IBInspector; + } + ); + IBVersion = 1; +} \ No newline at end of file diff --git a/PSMTabBarControl/English.lproj/PSMTabBarControlInspector.nib/info.nib b/PSMTabBarControl/English.lproj/PSMTabBarControlInspector.nib/info.nib new file mode 100644 index 0000000000..bf503dd361 --- /dev/null +++ b/PSMTabBarControl/English.lproj/PSMTabBarControlInspector.nib/info.nib @@ -0,0 +1,16 @@ + + + + + IBDocumentLocation + 83 72 356 240 0 0 1680 1028 + IBFramework Version + 446.1 + IBOpenObjects + + 3 + + IBSystem Version + 8I127 + + diff --git a/PSMTabBarControl/English.lproj/PSMTabBarControlInspector.nib/keyedobjects.nib b/PSMTabBarControl/English.lproj/PSMTabBarControlInspector.nib/keyedobjects.nib new file mode 100644 index 0000000000000000000000000000000000000000..2def97d1d3f7e1448ff52459ec96cb2efc22143f GIT binary patch literal 11273 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 F{(of|s~G?Q literal 0 HcmV?d00001 diff --git a/PSMTabBarControl/English.lproj/PSMTabBarControlInspector.nib/objects.nib b/PSMTabBarControl/English.lproj/PSMTabBarControlInspector.nib/objects.nib new file mode 100644 index 0000000000000000000000000000000000000000..9a89923a6cbc9b46f7d82325448b413fbb1551fe GIT binary patch literal 4291 zcmb7HeN0=|6~E6m1_zTtXtU8KnYU%@^3{fJ*IB_e97 z2c&9A%e1JV)Y)*vAB|m7>$6a+&E8bUWA?r+9)zm}6eL7COOnCf}}i$Qz?+y{KAR|<#GI>6toB{cBgn4fxGmHya3N|(DW z&|a&9=}n?^<#JN%RpXr1qT^#;>gnth1dBi4C2yTM|Iq`>a)KU`F)fEXsT?l^t|$+_ zj?w^X<2SqSTE=nG0-?8VahIg4!-U)hoBT0- zAR#wcbj;a1`dR$&?l!=WKBxpA+~E$G94COnKk-YD7nEF+Ho)C|>&*T;<1RXvr#i=j zU<&vM@L1qYp~18eZdEjPLF;+7r>R%hHPs*=@d$TU1IS&Q%9-5+o zR7z1W3d4r*&dWmDpAN5$f^iVgxg^S^E(WRju8GOH4fb*t8lGS9oP>Nu5;$X!`cNLB ze;(e}rgzCn%;S^=3FXb)&(IGu)3gd0A`z~&K>^O;VPE4Ly`nXmCe?(bf3~)^MoiFC z4S~e#2^0XWHz~>c25n%5XpVG?mt_oHG!yhTcgfO~ZZUbqvP}B1{R!;AVccm|`sH{` z7j+rJxTd`aFAiPnrY0uJA0U{yT~laD`KzkZsmSqSV;-7+{UFB*MT#?)waU7fC}b1N z0yaoKC9I@RLH14)2p{@EQD9UWW+M12oM;5%w+=cxS6n{SyV$(LQBaZ zO-&4hpt4zif)E!l$7g2oK)yEZzCPOF9L$ODu6D8~Kfg*zG^#xmTe=u#Ir zsiZ{@2f&_z4Qo6ltf@Vx#N|+@mJFq!peN+KIUY1;w%DA%mDck+gS^d=zrCT$TS`}~ zOX~|Y#^WLA7oiT0ibMCJuDMdWu7j6z)f>9Qy!%{{q3>m~1%)X5dL5LZx~fbT(}eWWMQ1#`z@4#_b^(D#hq&21>$!7FL7djfw)Ic7Pt5LV<7I>e-~HL z)}t%kz1;;OA3s^7c9?p_}{WpP}%ldqlu z>=15A{5{sf5>5~sH>oHqrQ*m5S4A1BSOOLQe1f!to22tR&b)u`U!w=CMEoN?@dV-H^%h5_wS>Q+^7Gr-eEdonKfvqVaCc2ZZPG z807sF!h1iJnJ>Uy3Ao`1#V!0@FG8EK2Qc|wQ{s9T*X52Do8e@=d?+YU=0**2k0<-R zjbyJV0qWVtL_+IJh2lx^a;QVr`(#-S^(kr`h+J_6f((=fi5Or=+rIvr8OZ@1v6r&; zgK2x@hCS!lpHADWD|U9?Udh_tti7DYZU&9wHLm8O+})FaMqvp59)upH;6&-RMo9oC zUNwY|-C;2u?uYmo9u90wuGl%Cor|iRz_#SWrf1zS1?od7V3z+K!{-}=D*_pKhy}b9 z%f1iff>FS-9|K`WkzMuh0b3Sfqi{&H>_;V8!JZk|DAYX(YZ#OYu%b-Mo(1{_ULXts zA=siMk44(XC`JUe;Ff z5GS{%@Qs3pgX`WQw7a@p64hp$uG(O@f>M{;L*r}OyI|O9(ULJf>TGOs2<<7DPGC6M zAY+(UwM#If!|32vOzw#xp0MtQ*k8DT=xX>zuALWdBF1g)DX8@qwHB!KT-F>0>sE*X zo?@Hs;K)Rv_@;*Na9z8|EA3e*v`ucEbu&7}Uvr$7;H_Qx&T$q#%w9jmmiDkfBU^rk zUHArTIm#}6lbw8?t%lg*m)Q*u>-ZLHs%I~hvDvS(Y#lp(fUSIy4GHYTK^F9~ABEYu zV{CFSbH2_F_}J+e*wj<(#r-Va!oGK!MNhDqudsz@*{4lxd+2dVo?rZG)OY8?{*eeaJ;Sj6e$L7D_L>z*1ZFQunS(7xeB`J2x JeHy+5{09nX=-U7Q literal 0 HcmV?d00001 diff --git a/PSMTabBarControl/English.lproj/PSMTabBarControlPalette.nib/classes.nib b/PSMTabBarControl/English.lproj/PSMTabBarControlPalette.nib/classes.nib new file mode 100644 index 0000000000..4752228596 --- /dev/null +++ b/PSMTabBarControl/English.lproj/PSMTabBarControlPalette.nib/classes.nib @@ -0,0 +1,28 @@ +{ + IBClasses = ( + {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, + {CLASS = PSMAquaTabStyle; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, + {CLASS = PSMMetalTabStyle; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, + {CLASS = PSMOverflowPopUpButton; LANGUAGE = ObjC; SUPERCLASS = NSPopUpButton; }, + { + CLASS = PSMProgressIndicator; + LANGUAGE = ObjC; + SUPERCLASS = NSProgressIndicator; + }, + {CLASS = PSMRolloverButton; LANGUAGE = ObjC; SUPERCLASS = NSButton; }, + {CLASS = PSMTabBarCell; LANGUAGE = ObjC; SUPERCLASS = NSActionCell; }, + { + CLASS = PSMTabBarControl; + LANGUAGE = ObjC; + OUTLETS = {delegate = id; partnerView = id; style = id; tabView = NSTabView; }; + SUPERCLASS = NSControl; + }, + { + CLASS = PSMTabBarControlPalette; + LANGUAGE = ObjC; + OUTLETS = {repImage = NSImageView; }; + SUPERCLASS = IBPalette; + } + ); + IBVersion = 1; +} \ No newline at end of file diff --git a/PSMTabBarControl/English.lproj/PSMTabBarControlPalette.nib/info.nib b/PSMTabBarControl/English.lproj/PSMTabBarControlPalette.nib/info.nib new file mode 100644 index 0000000000..866500bb2a --- /dev/null +++ b/PSMTabBarControl/English.lproj/PSMTabBarControlPalette.nib/info.nib @@ -0,0 +1,16 @@ + + + + + IBDocumentLocation + 83 142 356 240 0 0 1680 1028 + IBFramework Version + 443.0 + IBOpenObjects + + 2 + + IBSystem Version + 8H14 + + diff --git a/PSMTabBarControl/English.lproj/PSMTabBarControlPalette.nib/keyedobjects.nib b/PSMTabBarControl/English.lproj/PSMTabBarControlPalette.nib/keyedobjects.nib new file mode 100644 index 0000000000000000000000000000000000000000..635e6d8d17cd5a5f4c2f78e7a739806307fce3a3 GIT binary patch literal 3036 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 + + + + IBDocumentLocation + 35 49 356 240 0 0 1024 746 + IBEditorPositions + + 18 + 271 466 481 64 0 0 1024 746 + 20 + 400 254 224 482 0 0 1024 746 + + IBFramework Version + 446.1 + IBOpenObjects + + 18 + 20 + 5 + + IBSystem Version + 8J135 + + diff --git a/PSMTabBarControl/English.lproj/Window.nib/keyedobjects.nib b/PSMTabBarControl/English.lproj/Window.nib/keyedobjects.nib new file mode 100644 index 0000000000000000000000000000000000000000..d5228b233882ff5ea4828d5254ad3e3cb0e3f163 GIT binary patch literal 16340 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 Th=N0j + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + PSMTabBarControl + CFBundleIconFile + + CFBundleIdentifier + com.positivespinmedia.PSMTabBarControl + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + BNDL + CFBundleSignature + PSM1 + CFBundleVersion + 1.1 + + diff --git a/PSMTabBarControl/PSMTabBarControl.ibclassdescription b/PSMTabBarControl/PSMTabBarControl.ibclassdescription new file mode 100755 index 0000000000..89959b3847 --- /dev/null +++ b/PSMTabBarControl/PSMTabBarControl.ibclassdescription @@ -0,0 +1,7 @@ +{ + PSMTabBarControl = { + SuperClass = NSControl; + Attributes = { + }; + }; +} \ No newline at end of file diff --git a/PSMTabBarControl/PSMTabBarControl.xcodeproj/johnp.mode1 b/PSMTabBarControl/PSMTabBarControl.xcodeproj/johnp.mode1 new file mode 100644 index 0000000000..636da21a11 --- /dev/null +++ b/PSMTabBarControl/PSMTabBarControl.xcodeproj/johnp.mode1 @@ -0,0 +1,1551 @@ + + + + + ActivePerspectiveName + Project + AllowedModules + + + BundleLoadPath + + MaxInstances + n + Module + PBXSmartGroupTreeModule + Name + Groups and Files Outline View + + + BundleLoadPath + + MaxInstances + n + Module + PBXNavigatorGroup + Name + Editor + + + BundleLoadPath + + MaxInstances + n + Module + XCTaskListModule + Name + Task List + + + BundleLoadPath + + MaxInstances + n + Module + XCDetailModule + Name + File and Smart Group Detail Viewer + + + BundleLoadPath + + MaxInstances + 1 + Module + PBXBuildResultsModule + Name + Detailed Build Results Viewer + + + BundleLoadPath + + MaxInstances + 1 + Module + PBXProjectFindModule + Name + Project Batch Find Tool + + + BundleLoadPath + + MaxInstances + n + Module + PBXRunSessionModule + Name + Run Log + + + BundleLoadPath + + MaxInstances + n + Module + PBXBookmarksModule + Name + Bookmarks Tool + + + BundleLoadPath + + MaxInstances + n + Module + PBXClassBrowserModule + Name + Class Browser + + + BundleLoadPath + + MaxInstances + n + Module + PBXCVSModule + Name + Source Code Control Tool + + + BundleLoadPath + + MaxInstances + n + Module + PBXDebugBreakpointsModule + Name + Debug Breakpoints Tool + + + BundleLoadPath + + MaxInstances + n + Module + XCDockableInspector + Name + Inspector + + + BundleLoadPath + + MaxInstances + n + Module + PBXOpenQuicklyModule + Name + Open Quickly Tool + + + BundleLoadPath + + MaxInstances + 1 + Module + PBXDebugSessionModule + Name + Debugger + + + BundleLoadPath + + MaxInstances + 1 + Module + PBXDebugCLIModule + Name + Debug Console + + + Description + DefaultDescriptionKey + DockingSystemVisible + + Extension + mode1 + FavBarConfig + + PBXProjectModuleGUID + A251BE6C0959A0E60058BC7F + XCBarModuleItemNames + + XCBarModuleItems + + + FirstTimeWindowDisplayed + + Identifier + com.apple.perspectives.project.mode1 + MajorVersion + 31 + MinorVersion + 1 + Name + Default + Notifications + + + XCObserverAutoDisconnectKey + + XCObserverDefintionKey + + PBXStatusErrorsKey + 0 + + XCObserverFactoryKey + XCPerspectivesSpecificationIdentifier + XCObserverGUIDKey + XCObserverProjectIdentifier + XCObserverNotificationKey + PBXStatusBuildStateMessageNotification + XCObserverTargetKey + XCMainBuildResultsModuleGUID + XCObserverTriggerKey + awakenModuleWithObserver: + XCObserverValidationKey + + PBXStatusErrorsKey + 2 + + + + OpenEditors + + PerspectiveWidths + + -1 + -1 + + Perspectives + + + ChosenToolbarItems + + active-target-popup + action + NSToolbarFlexibleSpaceItem + buildOrClean + build-and-runOrDebug + com.apple.ide.PBXToolbarStopButton + get-info + toggle-editor + servicesModuleclasses + NSToolbarFlexibleSpaceItem + com.apple.pbx.toolbar.searchfield + + ControllerClassBaseName + + IconName + WindowOfProjectWithEditor + Identifier + perspective.project + IsVertical + + Layout + + + ContentConfiguration + + PBXBottomSmartGroupGIDs + + 1C37FBAC04509CD000000102 + 1C37FAAC04509CD000000102 + 1C08E77C0454961000C914BD + 1C37FABC05509CD000000102 + 1C37FABC05539CD112110102 + E2644B35053B69B200211256 + 1C37FABC04509CD000100104 + 1CC0EA4004350EF90044410B + 1CC0EA4004350EF90041110B + + PBXProjectModuleGUID + 1CE0B1FE06471DED0097A5F4 + PBXProjectModuleLabel + Files + PBXProjectStructureProvided + yes + PBXSmartGroupTreeModuleColumnData + + PBXSmartGroupTreeModuleColumnWidthsKey + + 220 + + PBXSmartGroupTreeModuleColumnsKey_v4 + + MainColumn + + + PBXSmartGroupTreeModuleOutlineStateKey_v7 + + PBXSmartGroupTreeModuleOutlineStateExpansionKey + + 0259C574FE90428111CA0C5A + 1C37FBAC04509CD000000102 + + PBXSmartGroupTreeModuleOutlineStateSelectionKey + + + 1 + 0 + + + PBXSmartGroupTreeModuleOutlineStateVisibleRectKey + {{0, 0}, {220, 819}} + + PBXTopSmartGroupGIDs + + XCIncludePerspectivesSwitch + + XCSharingToken + com.apple.Xcode.GFSharingToken + + GeometryConfiguration + + Frame + {{0, 0}, {237, 837}} + GroupTreeTableConfiguration + + MainColumn + 220 + + RubberWindowFrame + 11 142 905 878 0 0 1680 1028 + + Module + PBXSmartGroupTreeModule + Proportion + 237pt + + + Dock + + + BecomeActive + + ContentConfiguration + + PBXProjectModuleGUID + 1CE0B20306471E060097A5F4 + PBXProjectModuleLabel + ReadMe.rtfd + PBXSplitModuleInNavigatorKey + + Split0 + + PBXProjectModuleGUID + 1CE0B20406471E060097A5F4 + PBXProjectModuleLabel + ReadMe.rtfd + _historyCapacity + 0 + bookmark + A246FB000A2BD6C2005BDF7B + history + + A251BEF10959BC6E0058BC7F + A2F519DB09AA627E00056B6F + A234001B09B2B346001A1B18 + A234006C09B2C55E001A1B18 + A234006D09B2C55E001A1B18 + A2CD7C5709B7738800FBAAAE + A2CD7C8D09B7B55E00FBAAAE + A2BEC7EB09C1F01F00B8B4B6 + A22BAD0209C200AB0004449D + A22BAD2609C203D80004449D + A240E76509C2211500F755E1 + A240E76609C2211500F755E1 + A2ED871409C28FBD006BD5FC + A2179E3B09CA11BE00E40445 + A208348A09CA185D00837C29 + A2A7121E09E5C48C00D0089B + A2CF618009F4099F00A0F9A8 + A2A2B9D909F448F9002BE730 + A2E8401109F48B62000217C4 + A2704C0F09F56903000002CC + A2F0DF4F09F6D68300AA839C + A209E26A09F7E9FE0060532B + A209E28609F83C1E0060532B + A20A6FC109FB23FA0018A4B5 + A20A6FC209FB23FA0018A4B5 + A20A6FC309FB23FA0018A4B5 + A20A6FC409FB23FA0018A4B5 + A27F6A870A1B9AD100AE7009 + A21370F30A1C2CC400673584 + A264DC290A1E83A9001A9027 + A27E46770A28B49E007BA395 + A27E46780A28B49E007BA395 + A27E46C80A28C05D007BA395 + A27E46C90A28C05D007BA395 + A27E475B0A28EBEE007BA395 + A27E47E40A28F7FB007BA395 + A27E47E50A28F7FB007BA395 + A27E47E60A28F7FB007BA395 + A27E47E70A28F7FB007BA395 + A27E47E80A28F7FB007BA395 + A27E47E90A28F7FB007BA395 + A27E47EA0A28F7FB007BA395 + A27E47EB0A28F7FB007BA395 + A27E47EC0A28F7FB007BA395 + A27E47ED0A28F7FB007BA395 + A27E47EE0A28F7FB007BA395 + A27E47EF0A28F7FB007BA395 + A27E47F00A28F7FB007BA395 + A27E47F10A28F7FB007BA395 + A27E47F20A28F7FB007BA395 + A27E47F30A28F7FB007BA395 + A27E47F40A28F7FB007BA395 + A27E47F50A28F7FB007BA395 + A27E47F60A28F7FB007BA395 + A27E47F70A28F7FB007BA395 + A27E47F80A28F7FB007BA395 + A27E47F90A28F7FB007BA395 + A27E47FA0A28F7FB007BA395 + A27E47FB0A28F7FB007BA395 + A27E47FC0A28F7FB007BA395 + A27E47FD0A28F7FB007BA395 + A27E47FE0A28F7FB007BA395 + A2D98B1D0A2B47700064C6F8 + A2D98B1E0A2B47700064C6F8 + A2D98B1F0A2B47700064C6F8 + A2D98B200A2B47700064C6F8 + A2D98B210A2B47700064C6F8 + A2F0AA9E0A2B977F00BEF297 + A246FAF70A2BD6C2005BDF7B + A246FAF80A2BD6C2005BDF7B + A246FAF90A2BD6C2005BDF7B + A246FAFA0A2BD6C2005BDF7B + + prevStack + + A251BE660959A0E60058BC7F + A251BE670959A0E60058BC7F + A251BEF80959BC6E0058BC7F + A251BEFC0959BC6E0058BC7F + A251BEFD0959BC6E0058BC7F + A251BEFE0959BC6E0058BC7F + A251BF000959BC6E0058BC7F + A251BF020959BC6E0058BC7F + A251BF040959BC6E0058BC7F + A251BF050959BC6E0058BC7F + A251BF060959BC6E0058BC7F + A251BF070959BC6E0058BC7F + A251BF0A0959BC6E0058BC7F + A251BF0B0959BC6E0058BC7F + A251BF270959BD670058BC7F + A20822E70959F4CE00C5F5A4 + A20822E80959F4CE00C5F5A4 + A20822EA0959F4CE00C5F5A4 + A208236A095A58C700C5F5A4 + A2082371095A58C700C5F5A4 + A2082398095A630900C5F5A4 + A20823A1095A630900C5F5A4 + A20823A2095A630900C5F5A4 + A20823A3095A630900C5F5A4 + A21F8C430963122D00B04C56 + A21F8C440963122D00B04C56 + A2D32F4609A6441B00EC8662 + A2D32F4909A6441B00EC8662 + A2D32F4A09A6441B00EC8662 + A2D32F5109A6441B00EC8662 + A2D32F5209A6441B00EC8662 + A2D3313F09A67ED000EC8662 + A269364309A7BC8D0006911E + A268E7C609A9792000E082AA + A268E7C709A9792000E082AA + A268EA9709A9876A00E082AA + A268EAA009A9876A00E082AA + A268EAAA09A9876A00E082AA + A2F519E509AA627E00056B6F + A2072A5709ABDC4400304BCB + A2072A5A09ABDC4400304BCB + A2072A5B09ABDC4400304BCB + A234FFFF09B2AF46001A1B18 + A234001E09B2B346001A1B18 + A2758F9B09B4BB1C006E31C3 + A2758F9C09B4BB1C006E31C3 + A22BAD0609C200AB0004449D + A22BAD2A09C203D80004449D + A240E76D09C2211500F755E1 + A2CF618409F4099F00A0F9A8 + A2A2B9E309F448F9002BE730 + A209E26F09F7E9FE0060532B + A209E27009F7E9FE0060532B + A209E28C09F83C1E0060532B + A27E475F0A28EBEE007BA395 + A27E47610A28EBEE007BA395 + A27E47660A28EBEE007BA395 + A27E47670A28EBEE007BA395 + A27E47680A28EBEE007BA395 + A27E47690A28EBEE007BA395 + A27E476A0A28EBEE007BA395 + A27E47740A28EBEE007BA395 + A27E48050A28F7FC007BA395 + A27E48060A28F7FC007BA395 + A27E480E0A28F7FC007BA395 + A27E48100A28F7FC007BA395 + A27E48110A28F7FC007BA395 + A2D98B240A2B47700064C6F8 + A2D98B250A2B47700064C6F8 + A2D98B260A2B47700064C6F8 + A2D98B270A2B47700064C6F8 + A2D98B410A2B55140064C6F8 + A246FAFB0A2BD6C2005BDF7B + A246FAFC0A2BD6C2005BDF7B + A246FAFD0A2BD6C2005BDF7B + A246FAFE0A2BD6C2005BDF7B + A246FAFF0A2BD6C2005BDF7B + + + SplitCount + 1 + + StatusBarVisibility + + + GeometryConfiguration + + Frame + {{0, 0}, {663, 623}} + RubberWindowFrame + 11 142 905 878 0 0 1680 1028 + + Module + PBXNavigatorGroup + Proportion + 623pt + + + ContentConfiguration + + PBXProjectModuleGUID + 1CE0B20506471E060097A5F4 + PBXProjectModuleLabel + Detail + + GeometryConfiguration + + Frame + {{0, 628}, {663, 209}} + RubberWindowFrame + 11 142 905 878 0 0 1680 1028 + + Module + XCDetailModule + Proportion + 209pt + + + Proportion + 663pt + + + Name + Project + ServiceClasses + + XCModuleDock + PBXSmartGroupTreeModule + XCModuleDock + PBXNavigatorGroup + XCDetailModule + + TableOfContents + + A246FB010A2BD6C2005BDF7B + 1CE0B1FE06471DED0097A5F4 + A246FB020A2BD6C2005BDF7B + 1CE0B20306471E060097A5F4 + 1CE0B20506471E060097A5F4 + + ToolbarConfiguration + xcode.toolbar.config.default + + + ControllerClassBaseName + + IconName + WindowOfProject + Identifier + perspective.morph + IsVertical + 0 + Layout + + + BecomeActive + 1 + ContentConfiguration + + PBXBottomSmartGroupGIDs + + 1C37FBAC04509CD000000102 + 1C37FAAC04509CD000000102 + 1C08E77C0454961000C914BD + 1C37FABC05509CD000000102 + 1C37FABC05539CD112110102 + E2644B35053B69B200211256 + 1C37FABC04509CD000100104 + 1CC0EA4004350EF90044410B + 1CC0EA4004350EF90041110B + + PBXProjectModuleGUID + 11E0B1FE06471DED0097A5F4 + PBXProjectModuleLabel + Files + PBXProjectStructureProvided + yes + PBXSmartGroupTreeModuleColumnData + + PBXSmartGroupTreeModuleColumnWidthsKey + + 186 + + PBXSmartGroupTreeModuleColumnsKey_v4 + + MainColumn + + + PBXSmartGroupTreeModuleOutlineStateKey_v7 + + PBXSmartGroupTreeModuleOutlineStateExpansionKey + + 29B97314FDCFA39411CA2CEA + 1C37FABC05509CD000000102 + + PBXSmartGroupTreeModuleOutlineStateSelectionKey + + + 0 + + + PBXSmartGroupTreeModuleOutlineStateVisibleRectKey + {{0, 0}, {186, 337}} + + PBXTopSmartGroupGIDs + + XCIncludePerspectivesSwitch + 1 + XCSharingToken + com.apple.Xcode.GFSharingToken + + GeometryConfiguration + + Frame + {{0, 0}, {203, 355}} + GroupTreeTableConfiguration + + MainColumn + 186 + + RubberWindowFrame + 373 269 690 397 0 0 1440 878 + + Module + PBXSmartGroupTreeModule + Proportion + 100% + + + Name + Morph + PreferredWidth + 300 + ServiceClasses + + XCModuleDock + PBXSmartGroupTreeModule + + TableOfContents + + 11E0B1FE06471DED0097A5F4 + + ToolbarConfiguration + xcode.toolbar.config.default.short + + + PerspectivesBarVisible + + ShelfIsVisible + + SourceDescription + file at '/System/Library/PrivateFrameworks/DevToolsInterface.framework/Versions/A/Resources/XCPerspectivesSpecificationMode1.xcperspec' + StatusbarIsVisible + + TimeStamp + 170645186.180722 + ToolbarDisplayMode + 1 + ToolbarIsVisible + + ToolbarSizeMode + 1 + Type + Perspectives + UpdateMessage + The Default Workspace in this version of Xcode now includes support to hide and show the detail view (what has been referred to as the "Metro-Morph" feature). You must discard your current Default Workspace settings and update to the latest Default Workspace in order to gain this feature. Do you wish to update to the latest Workspace defaults for project '%@'? + WindowJustification + 5 + WindowOrderList + + A251BF0F0959BC6E0058BC7F + /Users/johnp/Positive Spin Media/shareware apps/PSMTabBarControl/PSMTabBarControl.xcodeproj + + WindowString + 11 142 905 878 0 0 1680 1028 + WindowTools + + + FirstTimeWindowDisplayed + + Identifier + windowTool.build + IsVertical + + Layout + + + Dock + + + ContentConfiguration + + PBXProjectModuleGUID + 1CD0528F0623707200166675 + PBXProjectModuleLabel + + StatusBarVisibility + + + GeometryConfiguration + + Frame + {{0, 0}, {893, 219}} + RubberWindowFrame + 741 379 893 501 0 0 1680 1028 + + Module + PBXNavigatorGroup + Proportion + 219pt + + + ContentConfiguration + + PBXProjectModuleGUID + XCMainBuildResultsModuleGUID + PBXProjectModuleLabel + Build + XCBuildResultsTrigger_Collapse + 1021 + XCBuildResultsTrigger_Open + 1012 + + GeometryConfiguration + + Frame + {{0, 224}, {893, 236}} + RubberWindowFrame + 741 379 893 501 0 0 1680 1028 + + Module + PBXBuildResultsModule + Proportion + 236pt + + + Proportion + 460pt + + + Name + Build Results + ServiceClasses + + PBXBuildResultsModule + + StatusbarIsVisible + + TableOfContents + + A251BF0F0959BC6E0058BC7F + A246FB030A2BD6C2005BDF7B + 1CD0528F0623707200166675 + XCMainBuildResultsModuleGUID + + ToolbarConfiguration + xcode.toolbar.config.build + WindowString + 741 379 893 501 0 0 1680 1028 + WindowToolGUID + A251BF0F0959BC6E0058BC7F + WindowToolIsVisible + + + + FirstTimeWindowDisplayed + + Identifier + windowTool.debugger + IsVertical + + Layout + + + Dock + + + ContentConfiguration + + Debugger + + HorizontalSplitView + + _collapsingFrameDimension + 0.0 + _indexOfCollapsedView + 0 + _percentageOfCollapsedView + 0.0 + isCollapsed + yes + sizes + + {{0, 0}, {246, 154}} + {{0, 154}, {246, 231}} + + + VerticalSplitView + + _collapsingFrameDimension + 0.0 + _indexOfCollapsedView + 0 + _percentageOfCollapsedView + 0.0 + isCollapsed + yes + sizes + + {{0, 0}, {246, 385}} + {{246, 0}, {576, 385}} + + + + LauncherConfigVersion + 8 + PBXProjectModuleGUID + 1C162984064C10D400B95A72 + PBXProjectModuleLabel + Debug - GLUTExamples (Underwater) + + GeometryConfiguration + + DebugConsoleDrawerSize + {100, 120} + DebugConsoleVisible + None + DebugConsoleWindowFrame + {{200, 200}, {500, 300}} + DebugSTDIOWindowFrame + {{200, 200}, {500, 300}} + Frame + {{0, 0}, {822, 385}} + RubberWindowFrame + 810 406 822 426 0 0 1680 1028 + + Module + PBXDebugSessionModule + Proportion + 385pt + + + Proportion + 385pt + + + Name + Debugger + ServiceClasses + + PBXDebugSessionModule + + StatusbarIsVisible + + TableOfContents + + 1CD10A99069EF8BA00B06720 + A2704C0609F55E1A000002CC + 1C162984064C10D400B95A72 + A2704C0709F55E1A000002CC + A2704C0809F55E1A000002CC + A2704C0909F55E1A000002CC + A2704C0A09F55E1A000002CC + A2704C0B09F55E1A000002CC + A2704C0C09F55E1A000002CC + + ToolbarConfiguration + xcode.toolbar.config.debug + WindowString + 810 406 822 426 0 0 1680 1028 + WindowToolGUID + 1CD10A99069EF8BA00B06720 + WindowToolIsVisible + + + + FirstTimeWindowDisplayed + + Identifier + windowTool.find + IsVertical + + Layout + + + Dock + + + Dock + + + ContentConfiguration + + PBXProjectModuleGUID + 1CDD528C0622207200134675 + PBXProjectModuleLabel + <No Editor> + StatusBarVisibility + + + GeometryConfiguration + + Frame + {{0, 0}, {791, 418}} + RubberWindowFrame + 710 297 791 676 0 0 1680 1028 + + Module + PBXNavigatorGroup + Proportion + 791pt + + + Proportion + 418pt + + + ContentConfiguration + + PBXProjectModuleGUID + 1CD0528E0623707200166675 + PBXProjectModuleLabel + Project Find + + GeometryConfiguration + + Frame + {{0, 423}, {791, 212}} + RubberWindowFrame + 710 297 791 676 0 0 1680 1028 + + Module + PBXProjectFindModule + Proportion + 212pt + + + Proportion + 635pt + + + Name + Project Find + ServiceClasses + + PBXProjectFindModule + + StatusbarIsVisible + + TableOfContents + + 1C530D57069F1CE1000CFCEE + A27E46850A28BCB6007BA395 + A27E46860A28BCB6007BA395 + 1CDD528C0622207200134675 + 1CD0528E0623707200166675 + + WindowString + 710 297 791 676 0 0 1680 1028 + WindowToolGUID + 1C530D57069F1CE1000CFCEE + WindowToolIsVisible + + + + Identifier + MENUSEPARATOR + + + FirstTimeWindowDisplayed + + Identifier + windowTool.debuggerConsole + IsVertical + + Layout + + + Dock + + + ContentConfiguration + + PBXProjectModuleGUID + 1C78EAAC065D492600B07095 + PBXProjectModuleLabel + Debugger Console + + GeometryConfiguration + + Frame + {{0, 0}, {440, 358}} + RubberWindowFrame + 42 583 440 400 0 0 1680 1028 + + Module + PBXDebugCLIModule + Proportion + 358pt + + + Proportion + 359pt + + + Name + Debugger Console + ServiceClasses + + PBXDebugCLIModule + + StatusbarIsVisible + + TableOfContents + + A257696C0961A49900DDAD2A + A2704C0D09F55E1A000002CC + 1C78EAAC065D492600B07095 + + WindowString + 42 583 440 400 0 0 1680 1028 + WindowToolGUID + A257696C0961A49900DDAD2A + WindowToolIsVisible + + + + FirstTimeWindowDisplayed + + Identifier + windowTool.run + IsVertical + + Layout + + + Dock + + + ContentConfiguration + + LauncherConfigVersion + 3 + PBXProjectModuleGUID + 1CD0528B0623707200166675 + PBXProjectModuleLabel + Run + Runner + + HorizontalSplitView + + _collapsingFrameDimension + 0.0 + _indexOfCollapsedView + 0 + _percentageOfCollapsedView + 0.0 + isCollapsed + yes + sizes + + {{0, 0}, {367, 168}} + {{0, 173}, {367, 270}} + + + VerticalSplitView + + _collapsingFrameDimension + 0.0 + _indexOfCollapsedView + 0 + _percentageOfCollapsedView + 0.0 + isCollapsed + yes + sizes + + {{0, 0}, {406, 443}} + {{411, 0}, {517, 443}} + + + + + GeometryConfiguration + + Frame + {{0, 0}, {459, 159}} + RubberWindowFrame + 898 148 459 200 0 0 1680 1028 + + Module + PBXRunSessionModule + Proportion + 159pt + + + Proportion + 159pt + + + Name + Run Log + ServiceClasses + + PBXRunSessionModule + + StatusbarIsVisible + + TableOfContents + + 1C0AD2B3069F1EA900FABCE6 + A2F0AA9B0A2B977D00BEF297 + 1CD0528B0623707200166675 + A2F0AA9C0A2B977D00BEF297 + + ToolbarConfiguration + xcode.toolbar.config.run + WindowString + 898 148 459 200 0 0 1680 1028 + WindowToolGUID + 1C0AD2B3069F1EA900FABCE6 + WindowToolIsVisible + + + + Identifier + windowTool.scm + Layout + + + Dock + + + ContentConfiguration + + PBXProjectModuleGUID + 1C78EAB2065D492600B07095 + PBXProjectModuleLabel + <No Editor> + PBXSplitModuleInNavigatorKey + + Split0 + + PBXProjectModuleGUID + 1C78EAB3065D492600B07095 + + SplitCount + 1 + + StatusBarVisibility + 1 + + GeometryConfiguration + + Frame + {{0, 0}, {452, 0}} + RubberWindowFrame + 743 379 452 308 0 0 1280 1002 + + Module + PBXNavigatorGroup + Proportion + 0pt + + + BecomeActive + 1 + ContentConfiguration + + PBXProjectModuleGUID + 1CD052920623707200166675 + PBXProjectModuleLabel + SCM + + GeometryConfiguration + + ConsoleFrame + {{0, 259}, {452, 0}} + Frame + {{0, 7}, {452, 259}} + RubberWindowFrame + 743 379 452 308 0 0 1280 1002 + TableConfiguration + + Status + 30 + FileName + 199 + Path + 197.09500122070312 + + TableFrame + {{0, 0}, {452, 250}} + + Module + PBXCVSModule + Proportion + 262pt + + + Proportion + 266pt + + + Name + SCM + ServiceClasses + + PBXCVSModule + + StatusbarIsVisible + 1 + TableOfContents + + 1C78EAB4065D492600B07095 + 1C78EAB5065D492600B07095 + 1C78EAB2065D492600B07095 + 1CD052920623707200166675 + + ToolbarConfiguration + xcode.toolbar.config.scm + WindowString + 743 379 452 308 0 0 1280 1002 + + + FirstTimeWindowDisplayed + + Identifier + windowTool.breakpoints + IsVertical + + Layout + + + Dock + + + BecomeActive + + ContentConfiguration + + PBXBottomSmartGroupGIDs + + 1C77FABC04509CD000000102 + + PBXProjectModuleGUID + 1CE0B1FE06471DED0097A5F4 + PBXProjectModuleLabel + Files + PBXProjectStructureProvided + no + PBXSmartGroupTreeModuleColumnData + + PBXSmartGroupTreeModuleColumnWidthsKey + + 168 + + PBXSmartGroupTreeModuleColumnsKey_v4 + + MainColumn + + + PBXSmartGroupTreeModuleOutlineStateKey_v7 + + PBXSmartGroupTreeModuleOutlineStateExpansionKey + + 1C77FABC04509CD000000102 + + PBXSmartGroupTreeModuleOutlineStateSelectionKey + + + 0 + + + PBXSmartGroupTreeModuleOutlineStateVisibleRectKey + {{0, 0}, {168, 350}} + + PBXTopSmartGroupGIDs + + XCIncludePerspectivesSwitch + + + GeometryConfiguration + + Frame + {{0, 0}, {185, 368}} + GroupTreeTableConfiguration + + MainColumn + 168 + + RubberWindowFrame + 42 573 744 409 0 0 1680 1028 + + Module + PBXSmartGroupTreeModule + Proportion + 185pt + + + ContentConfiguration + + PBXProjectModuleGUID + 1CA1AED706398EBD00589147 + PBXProjectModuleLabel + Detail + + GeometryConfiguration + + Frame + {{190, 0}, {554, 368}} + RubberWindowFrame + 42 573 744 409 0 0 1680 1028 + + Module + XCDetailModule + Proportion + 554pt + + + Proportion + 368pt + + + MajorVersion + 2 + MinorVersion + 0 + Name + Breakpoints + ServiceClasses + + PBXSmartGroupTreeModule + XCDetailModule + + StatusbarIsVisible + + TableOfContents + + A2467AD609B260B500A9F728 + A2467AD709B260B500A9F728 + 1CE0B1FE06471DED0097A5F4 + 1CA1AED706398EBD00589147 + + ToolbarConfiguration + xcode.toolbar.config.breakpoints + WindowString + 42 573 744 409 0 0 1680 1028 + WindowToolGUID + A2467AD609B260B500A9F728 + WindowToolIsVisible + + + + FirstTimeWindowDisplayed + + Identifier + windowTool.debugAnimator + IsVertical + + Layout + + + Dock + + + ContentConfiguration + + PBXProjectModuleGUID + A2F51A6709AA776500056B6F + PBXProjectModuleLabel + PSMTabBarControl.m_1.xcclassmodel + StatusBarVisibility + + + GeometryConfiguration + + Frame + {{0, 0}, {700, 459}} + RubberWindowFrame + 816 148 700 500 0 0 1680 1028 + + Module + PBXNavigatorGroup + Proportion + 459pt + + + Proportion + 459pt + + + Name + Debug Visualizer + ServiceClasses + + PBXNavigatorGroup + + StatusbarIsVisible + + TableOfContents + + A2F51A8D09AA776500056B6F + A2F51A8E09AA776500056B6F + A2F51A6709AA776500056B6F + + ToolbarConfiguration + xcode.toolbar.config.debugAnimator + WindowString + 816 148 700 500 0 0 1680 1028 + WindowToolGUID + A2F51A8D09AA776500056B6F + WindowToolIsVisible + + + + Identifier + windowTool.bookmarks + Layout + + + Dock + + + Module + PBXBookmarksModule + Proportion + 100% + + + Proportion + 100% + + + Name + Bookmarks + ServiceClasses + + PBXBookmarksModule + + StatusbarIsVisible + 0 + WindowString + 538 42 401 187 0 0 1280 1002 + + + FirstTimeWindowDisplayed + + Identifier + windowTool.classBrowser + IsVertical + + Layout + + + Dock + + + ContentConfiguration + + OptionsSetName + Flat, all classes + PBXProjectModuleGUID + 1CA6456E063B45B4001379D8 + PBXProjectModuleLabel + Class Browser - NSTextFieldCell + + GeometryConfiguration + + ClassesFrame + {{0, 0}, {655, 321}} + ClassesTreeTableConfiguration + + PBXClassNameColumnIdentifier + 208 + PBXClassBookColumnIdentifier + 22 + + Frame + {{0, 0}, {907, 807}} + MembersFrame + {{0, 326}, {655, 481}} + MembersTreeTableConfiguration + + PBXMemberTypeIconColumnIdentifier + 22 + PBXMemberNameColumnIdentifier + 216 + PBXMemberTypeColumnIdentifier + 378 + PBXMemberBookColumnIdentifier + 22 + + RubberWindowFrame + 704 190 907 827 0 0 1680 1028 + + Module + PBXClassBrowserModule + Proportion + 807pt + + + Proportion + 807pt + + + Name + Class Browser + ServiceClasses + + PBXClassBrowserModule + + StatusbarIsVisible + + TableOfContents + + 1C0AD2AF069F1E9B00FABCE6 + A27E47260A28E1D0007BA395 + 1CA6456E063B45B4001379D8 + + ToolbarConfiguration + xcode.toolbar.config.classbrowser + WindowString + 704 190 907 827 0 0 1680 1028 + WindowToolGUID + 1C0AD2AF069F1E9B00FABCE6 + WindowToolIsVisible + + + + + diff --git a/PSMTabBarControl/PSMTabBarControl.xcodeproj/johnp.pbxuser b/PSMTabBarControl/PSMTabBarControl.xcodeproj/johnp.pbxuser new file mode 100644 index 0000000000..4710912397 --- /dev/null +++ b/PSMTabBarControl/PSMTabBarControl.xcodeproj/johnp.pbxuser @@ -0,0 +1,1920 @@ +// !$*UTF8*$! +{ + 0259C573FE90428111CA0C5A /* Project object */ = { + activeBuildConfigurationName = Release; + activeExecutable = A251BEA10959BB5B0058BC7F /* TabBarControlDemo */; + activeTarget = 53DF6901067E5B8E0090B5B0 /* All */; + addToTargets = ( + ); + breakpoints = ( + A25769760961A59400DDAD2A /* -[_NSZombie methodSignatureForSelector:] */, + A2F51A5709AA767B00056B6F /* -[NSException raise] */, + ); + breakpointsGroup = A25769750961A58A00DDAD2A /* XCBreakpointsBucket */; + codeSenseManager = A251BE5509599FBA0058BC7F /* Code sense */; + executables = ( + A251BEA10959BB5B0058BC7F /* TabBarControlDemo */, + ); + perUserDictionary = { + "PBXConfiguration.PBXBreakpointsDataSource.v1:1CA1AED706398EBD00589147" = { + PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; + PBXFileTableDataSourceColumnSortingKey = PBXBreakpointsDataSource_BreakpointID; + PBXFileTableDataSourceColumnWidthsKey = ( + 20, + 20, + 210, + 20, + 110, + 109, + 20, + ); + PBXFileTableDataSourceColumnsKey = ( + PBXBreakpointsDataSource_ActionID, + PBXBreakpointsDataSource_TypeID, + PBXBreakpointsDataSource_BreakpointID, + PBXBreakpointsDataSource_UseID, + PBXBreakpointsDataSource_LocationID, + PBXBreakpointsDataSource_ConditionID, + PBXBreakpointsDataSource_ContinueID, + ); + }; + PBXConfiguration.PBXFileTableDataSource3.PBXErrorsWarningsDataSource = { + PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; + PBXFileTableDataSourceColumnSortingKey = PBXErrorsWarningsDataSource_LocationID; + PBXFileTableDataSourceColumnWidthsKey = ( + 20, + 300, + 200, + ); + PBXFileTableDataSourceColumnsKey = ( + PBXErrorsWarningsDataSource_TypeID, + PBXErrorsWarningsDataSource_MessageID, + PBXErrorsWarningsDataSource_LocationID, + ); + }; + PBXConfiguration.PBXFileTableDataSource3.PBXExecutablesDataSource = { + PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; + PBXFileTableDataSourceColumnSortingKey = PBXExecutablesDataSource_NameID; + PBXFileTableDataSourceColumnWidthsKey = ( + 22, + 300, + 331, + ); + PBXFileTableDataSourceColumnsKey = ( + PBXExecutablesDataSource_ActiveFlagID, + PBXExecutablesDataSource_NameID, + PBXExecutablesDataSource_CommentsID, + ); + }; + PBXConfiguration.PBXFileTableDataSource3.PBXFileTableDataSource = { + PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; + PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID; + PBXFileTableDataSourceColumnWidthsKey = ( + 20, + 424, + 20, + 48, + 43, + 43, + 20, + ); + PBXFileTableDataSourceColumnsKey = ( + PBXFileDataSource_FiletypeID, + PBXFileDataSource_Filename_ColumnID, + PBXFileDataSource_Built_ColumnID, + PBXFileDataSource_ObjectSize_ColumnID, + PBXFileDataSource_Errors_ColumnID, + PBXFileDataSource_Warnings_ColumnID, + PBXFileDataSource_Target_ColumnID, + ); + }; + PBXConfiguration.PBXTargetDataSource.PBXTargetDataSource = { + PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; + PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID; + PBXFileTableDataSourceColumnWidthsKey = ( + 20, + 200, + 218, + 20, + 48, + 43, + 43, + ); + PBXFileTableDataSourceColumnsKey = ( + PBXFileDataSource_FiletypeID, + PBXFileDataSource_Filename_ColumnID, + PBXTargetDataSource_PrimaryAttribute, + PBXFileDataSource_Built_ColumnID, + PBXFileDataSource_ObjectSize_ColumnID, + PBXFileDataSource_Errors_ColumnID, + PBXFileDataSource_Warnings_ColumnID, + ); + }; + PBXPerProjectTemplateStateSaveDate = 170644414; + PBXWorkspaceStateSaveDate = 170644414; + }; + perUserProjectItems = { + A2072A5709ABDC4400304BCB = A2072A5709ABDC4400304BCB /* PBXTextBookmark */; + A2072A5A09ABDC4400304BCB = A2072A5A09ABDC4400304BCB /* PBXBookmark */; + A2072A5B09ABDC4400304BCB = A2072A5B09ABDC4400304BCB /* PBXBookmark */; + A20822E70959F4CE00C5F5A4 = A20822E70959F4CE00C5F5A4 /* PBXTextBookmark */; + A20822E80959F4CE00C5F5A4 = A20822E80959F4CE00C5F5A4 /* PBXTextBookmark */; + A20822EA0959F4CE00C5F5A4 = A20822EA0959F4CE00C5F5A4 /* PBXTextBookmark */; + A208236A095A58C700C5F5A4 = A208236A095A58C700C5F5A4 /* PBXTextBookmark */; + A2082371095A58C700C5F5A4 = A2082371095A58C700C5F5A4 /* PBXTextBookmark */; + A2082398095A630900C5F5A4 = A2082398095A630900C5F5A4 /* PBXTextBookmark */; + A20823A1095A630900C5F5A4 = A20823A1095A630900C5F5A4 /* PBXTextBookmark */; + A20823A2095A630900C5F5A4 = A20823A2095A630900C5F5A4 /* PBXBookmark */; + A20823A3095A630900C5F5A4 = A20823A3095A630900C5F5A4 /* PBXBookmark */; + A208348A09CA185D00837C29 = A208348A09CA185D00837C29 /* PBXTextBookmark */; + A209E26A09F7E9FE0060532B = A209E26A09F7E9FE0060532B /* PBXTextBookmark */; + A209E26F09F7E9FE0060532B = A209E26F09F7E9FE0060532B /* PBXTextBookmark */; + A209E27009F7E9FE0060532B = A209E27009F7E9FE0060532B /* PBXTextBookmark */; + A209E28609F83C1E0060532B = A209E28609F83C1E0060532B /* PBXTextBookmark */; + A209E28C09F83C1E0060532B = A209E28C09F83C1E0060532B /* PBXTextBookmark */; + A20A6FC109FB23FA0018A4B5 = A20A6FC109FB23FA0018A4B5 /* PBXTextBookmark */; + A20A6FC209FB23FA0018A4B5 = A20A6FC209FB23FA0018A4B5 /* PBXTextBookmark */; + A20A6FC309FB23FA0018A4B5 = A20A6FC309FB23FA0018A4B5 /* PBXTextBookmark */; + A20A6FC409FB23FA0018A4B5 = A20A6FC409FB23FA0018A4B5 /* PBXTextBookmark */; + A21370F30A1C2CC400673584 = A21370F30A1C2CC400673584 /* PBXTextBookmark */; + A2179E3B09CA11BE00E40445 = A2179E3B09CA11BE00E40445 /* PBXTextBookmark */; + A21F8C430963122D00B04C56 = A21F8C430963122D00B04C56 /* PBXBookmark */; + A21F8C440963122D00B04C56 = A21F8C440963122D00B04C56 /* PBXBookmark */; + A22BAD0209C200AB0004449D = A22BAD0209C200AB0004449D /* PBXTextBookmark */; + A22BAD0609C200AB0004449D = A22BAD0609C200AB0004449D /* PBXTextBookmark */; + A22BAD2609C203D80004449D = A22BAD2609C203D80004449D /* PBXTextBookmark */; + A22BAD2A09C203D80004449D = A22BAD2A09C203D80004449D /* PBXTextBookmark */; + A234001B09B2B346001A1B18 = A234001B09B2B346001A1B18 /* PBXTextBookmark */; + A234001E09B2B346001A1B18 = A234001E09B2B346001A1B18 /* PBXBookmark */; + A234006C09B2C55E001A1B18 = A234006C09B2C55E001A1B18 /* PBXTextBookmark */; + A234006D09B2C55E001A1B18 = A234006D09B2C55E001A1B18 /* PBXTextBookmark */; + A234FFFF09B2AF46001A1B18 = A234FFFF09B2AF46001A1B18 /* PBXBookmark */; + A240E76509C2211500F755E1 = A240E76509C2211500F755E1 /* PBXTextBookmark */; + A240E76609C2211500F755E1 = A240E76609C2211500F755E1 /* PBXTextBookmark */; + A240E76D09C2211500F755E1 = A240E76D09C2211500F755E1 /* PBXTextBookmark */; + A246FAF70A2BD6C2005BDF7B /* PBXTextBookmark */ = A246FAF70A2BD6C2005BDF7B /* PBXTextBookmark */; + A246FAF80A2BD6C2005BDF7B /* PBXTextBookmark */ = A246FAF80A2BD6C2005BDF7B /* PBXTextBookmark */; + A246FAF90A2BD6C2005BDF7B /* PBXTextBookmark */ = A246FAF90A2BD6C2005BDF7B /* PBXTextBookmark */; + A246FAFA0A2BD6C2005BDF7B /* PBXTextBookmark */ = A246FAFA0A2BD6C2005BDF7B /* PBXTextBookmark */; + A246FAFB0A2BD6C2005BDF7B /* PBXTextBookmark */ = A246FAFB0A2BD6C2005BDF7B /* PBXTextBookmark */; + A246FAFC0A2BD6C2005BDF7B /* PBXTextBookmark */ = A246FAFC0A2BD6C2005BDF7B /* PBXTextBookmark */; + A246FAFD0A2BD6C2005BDF7B /* PBXTextBookmark */ = A246FAFD0A2BD6C2005BDF7B /* PBXTextBookmark */; + A246FAFE0A2BD6C2005BDF7B /* PBXTextBookmark */ = A246FAFE0A2BD6C2005BDF7B /* PBXTextBookmark */; + A246FAFF0A2BD6C2005BDF7B /* PBXTextBookmark */ = A246FAFF0A2BD6C2005BDF7B /* PBXTextBookmark */; + A246FB000A2BD6C2005BDF7B /* PBXTextBookmark */ = A246FB000A2BD6C2005BDF7B /* PBXTextBookmark */; + A24DF7F10A2B9F64004D2710 = A24DF7F10A2B9F64004D2710 /* PBXTextBookmark */; + A251BE660959A0E60058BC7F = A251BE660959A0E60058BC7F /* PBXTextBookmark */; + A251BE670959A0E60058BC7F = A251BE670959A0E60058BC7F /* PBXTextBookmark */; + A251BEF10959BC6E0058BC7F = A251BEF10959BC6E0058BC7F /* PBXTextBookmark */; + A251BEF80959BC6E0058BC7F = A251BEF80959BC6E0058BC7F /* PBXTextBookmark */; + A251BEFC0959BC6E0058BC7F = A251BEFC0959BC6E0058BC7F /* PBXTextBookmark */; + A251BEFD0959BC6E0058BC7F = A251BEFD0959BC6E0058BC7F /* PBXTextBookmark */; + A251BEFE0959BC6E0058BC7F = A251BEFE0959BC6E0058BC7F /* PBXTextBookmark */; + A251BF000959BC6E0058BC7F = A251BF000959BC6E0058BC7F /* PBXTextBookmark */; + A251BF020959BC6E0058BC7F = A251BF020959BC6E0058BC7F /* PBXTextBookmark */; + A251BF040959BC6E0058BC7F = A251BF040959BC6E0058BC7F /* PBXTextBookmark */; + A251BF050959BC6E0058BC7F = A251BF050959BC6E0058BC7F /* PBXTextBookmark */; + A251BF060959BC6E0058BC7F = A251BF060959BC6E0058BC7F /* PBXTextBookmark */; + A251BF070959BC6E0058BC7F = A251BF070959BC6E0058BC7F /* PBXBookmark */; + A251BF0A0959BC6E0058BC7F = A251BF0A0959BC6E0058BC7F /* PBXBookmark */; + A251BF0B0959BC6E0058BC7F = A251BF0B0959BC6E0058BC7F /* PBXBookmark */; + A251BF270959BD670058BC7F = A251BF270959BD670058BC7F /* PBXBookmark */; + A264DC290A1E83A9001A9027 = A264DC290A1E83A9001A9027 /* PBXTextBookmark */; + A268E7C609A9792000E082AA = A268E7C609A9792000E082AA /* PBXBookmark */; + A268E7C709A9792000E082AA = A268E7C709A9792000E082AA /* PBXBookmark */; + A268EA9709A9876A00E082AA = A268EA9709A9876A00E082AA /* PBXTextBookmark */; + A268EAA009A9876A00E082AA = A268EAA009A9876A00E082AA /* PBXTextBookmark */; + A268EAAA09A9876A00E082AA = A268EAAA09A9876A00E082AA /* PBXBookmark */; + A269364309A7BC8D0006911E = A269364309A7BC8D0006911E /* PBXTextBookmark */; + A2704C0F09F56903000002CC = A2704C0F09F56903000002CC /* PBXTextBookmark */; + A2758F9B09B4BB1C006E31C3 = A2758F9B09B4BB1C006E31C3 /* PBXTextBookmark */; + A2758F9C09B4BB1C006E31C3 = A2758F9C09B4BB1C006E31C3 /* PBXTextBookmark */; + A27E46770A28B49E007BA395 = A27E46770A28B49E007BA395 /* PBXTextBookmark */; + A27E46780A28B49E007BA395 = A27E46780A28B49E007BA395 /* PBXTextBookmark */; + A27E46C80A28C05D007BA395 = A27E46C80A28C05D007BA395 /* PBXTextBookmark */; + A27E46C90A28C05D007BA395 = A27E46C90A28C05D007BA395 /* PBXTextBookmark */; + A27E475B0A28EBEE007BA395 = A27E475B0A28EBEE007BA395 /* PBXTextBookmark */; + A27E475F0A28EBEE007BA395 = A27E475F0A28EBEE007BA395 /* PBXBookmark */; + A27E47610A28EBEE007BA395 = A27E47610A28EBEE007BA395 /* PBXBookmark */; + A27E47660A28EBEE007BA395 = A27E47660A28EBEE007BA395 /* PBXTextBookmark */; + A27E47670A28EBEE007BA395 = A27E47670A28EBEE007BA395 /* PBXBookmark */; + A27E47680A28EBEE007BA395 = A27E47680A28EBEE007BA395 /* PBXBookmark */; + A27E47690A28EBEE007BA395 = A27E47690A28EBEE007BA395 /* PBXBookmark */; + A27E476A0A28EBEE007BA395 = A27E476A0A28EBEE007BA395 /* PBXBookmark */; + A27E47740A28EBEE007BA395 = A27E47740A28EBEE007BA395 /* PBXBookmark */; + A27E47E40A28F7FB007BA395 = A27E47E40A28F7FB007BA395 /* PBXBookmark */; + A27E47E50A28F7FB007BA395 = A27E47E50A28F7FB007BA395 /* PBXBookmark */; + A27E47E60A28F7FB007BA395 = A27E47E60A28F7FB007BA395 /* PBXBookmark */; + A27E47E70A28F7FB007BA395 = A27E47E70A28F7FB007BA395 /* PBXBookmark */; + A27E47E80A28F7FB007BA395 = A27E47E80A28F7FB007BA395 /* PBXBookmark */; + A27E47E90A28F7FB007BA395 = A27E47E90A28F7FB007BA395 /* PBXBookmark */; + A27E47EA0A28F7FB007BA395 = A27E47EA0A28F7FB007BA395 /* PBXBookmark */; + A27E47EB0A28F7FB007BA395 = A27E47EB0A28F7FB007BA395 /* PBXBookmark */; + A27E47EC0A28F7FB007BA395 = A27E47EC0A28F7FB007BA395 /* PBXBookmark */; + A27E47ED0A28F7FB007BA395 = A27E47ED0A28F7FB007BA395 /* PBXBookmark */; + A27E47EE0A28F7FB007BA395 = A27E47EE0A28F7FB007BA395 /* PBXBookmark */; + A27E47EF0A28F7FB007BA395 = A27E47EF0A28F7FB007BA395 /* PBXBookmark */; + A27E47F00A28F7FB007BA395 = A27E47F00A28F7FB007BA395 /* PBXBookmark */; + A27E47F10A28F7FB007BA395 = A27E47F10A28F7FB007BA395 /* PBXBookmark */; + A27E47F20A28F7FB007BA395 = A27E47F20A28F7FB007BA395 /* PBXBookmark */; + A27E47F30A28F7FB007BA395 = A27E47F30A28F7FB007BA395 /* PBXBookmark */; + A27E47F40A28F7FB007BA395 = A27E47F40A28F7FB007BA395 /* PBXBookmark */; + A27E47F50A28F7FB007BA395 = A27E47F50A28F7FB007BA395 /* PBXBookmark */; + A27E47F60A28F7FB007BA395 = A27E47F60A28F7FB007BA395 /* PBXBookmark */; + A27E47F70A28F7FB007BA395 = A27E47F70A28F7FB007BA395 /* PBXBookmark */; + A27E47F80A28F7FB007BA395 = A27E47F80A28F7FB007BA395 /* PBXBookmark */; + A27E47F90A28F7FB007BA395 = A27E47F90A28F7FB007BA395 /* PBXBookmark */; + A27E47FA0A28F7FB007BA395 = A27E47FA0A28F7FB007BA395 /* PBXBookmark */; + A27E47FB0A28F7FB007BA395 = A27E47FB0A28F7FB007BA395 /* PBXBookmark */; + A27E47FC0A28F7FB007BA395 = A27E47FC0A28F7FB007BA395 /* PBXBookmark */; + A27E47FD0A28F7FB007BA395 = A27E47FD0A28F7FB007BA395 /* PBXBookmark */; + A27E47FE0A28F7FB007BA395 = A27E47FE0A28F7FB007BA395 /* PBXBookmark */; + A27E48050A28F7FC007BA395 = A27E48050A28F7FC007BA395 /* PBXBookmark */; + A27E48060A28F7FC007BA395 = A27E48060A28F7FC007BA395 /* PBXBookmark */; + A27E480E0A28F7FC007BA395 = A27E480E0A28F7FC007BA395 /* PBXBookmark */; + A27E48100A28F7FC007BA395 = A27E48100A28F7FC007BA395 /* PBXBookmark */; + A27E48110A28F7FC007BA395 = A27E48110A28F7FC007BA395 /* PBXBookmark */; + A27F6A870A1B9AD100AE7009 = A27F6A870A1B9AD100AE7009 /* PBXTextBookmark */; + A2A2B9D909F448F9002BE730 = A2A2B9D909F448F9002BE730 /* PBXTextBookmark */; + A2A2B9E309F448F9002BE730 = A2A2B9E309F448F9002BE730 /* PBXTextBookmark */; + A2A7121E09E5C48C00D0089B = A2A7121E09E5C48C00D0089B /* PBXTextBookmark */; + A2BEC7EB09C1F01F00B8B4B6 = A2BEC7EB09C1F01F00B8B4B6 /* PBXTextBookmark */; + A2CD7C5709B7738800FBAAAE = A2CD7C5709B7738800FBAAAE /* PBXTextBookmark */; + A2CD7C8D09B7B55E00FBAAAE = A2CD7C8D09B7B55E00FBAAAE /* PBXTextBookmark */; + A2CF618009F4099F00A0F9A8 = A2CF618009F4099F00A0F9A8 /* PBXTextBookmark */; + A2CF618409F4099F00A0F9A8 = A2CF618409F4099F00A0F9A8 /* PBXTextBookmark */; + A2D32F4609A6441B00EC8662 = A2D32F4609A6441B00EC8662 /* PBXTextBookmark */; + A2D32F4909A6441B00EC8662 = A2D32F4909A6441B00EC8662 /* PBXTextBookmark */; + A2D32F4A09A6441B00EC8662 = A2D32F4A09A6441B00EC8662 /* PBXTextBookmark */; + A2D32F5109A6441B00EC8662 = A2D32F5109A6441B00EC8662 /* PBXTextBookmark */; + A2D32F5209A6441B00EC8662 = A2D32F5209A6441B00EC8662 /* PBXTextBookmark */; + A2D3313F09A67ED000EC8662 = A2D3313F09A67ED000EC8662 /* PBXBookmark */; + A2D98B1D0A2B47700064C6F8 = A2D98B1D0A2B47700064C6F8 /* PBXBookmark */; + A2D98B1E0A2B47700064C6F8 = A2D98B1E0A2B47700064C6F8 /* PBXTextBookmark */; + A2D98B1F0A2B47700064C6F8 = A2D98B1F0A2B47700064C6F8 /* PBXTextBookmark */; + A2D98B200A2B47700064C6F8 = A2D98B200A2B47700064C6F8 /* PBXTextBookmark */; + A2D98B210A2B47700064C6F8 = A2D98B210A2B47700064C6F8 /* PBXTextBookmark */; + A2D98B240A2B47700064C6F8 = A2D98B240A2B47700064C6F8 /* PBXTextBookmark */; + A2D98B250A2B47700064C6F8 = A2D98B250A2B47700064C6F8 /* PBXTextBookmark */; + A2D98B260A2B47700064C6F8 = A2D98B260A2B47700064C6F8 /* PBXTextBookmark */; + A2D98B270A2B47700064C6F8 = A2D98B270A2B47700064C6F8 /* PBXTextBookmark */; + A2D98B3E0A2B55140064C6F8 = A2D98B3E0A2B55140064C6F8 /* PBXTextBookmark */; + A2D98B410A2B55140064C6F8 = A2D98B410A2B55140064C6F8 /* PBXTextBookmark */; + A2E8401109F48B62000217C4 = A2E8401109F48B62000217C4 /* PBXTextBookmark */; + A2ED871409C28FBD006BD5FC = A2ED871409C28FBD006BD5FC /* PBXTextBookmark */; + A2F0AA9D0A2B977F00BEF297 = A2F0AA9D0A2B977F00BEF297 /* PBXTextBookmark */; + A2F0AA9E0A2B977F00BEF297 = A2F0AA9E0A2B977F00BEF297 /* PBXTextBookmark */; + A2F0AA9F0A2B977F00BEF297 = A2F0AA9F0A2B977F00BEF297 /* PBXTextBookmark */; + A2F0AAA70A2B977F00BEF297 = A2F0AAA70A2B977F00BEF297 /* PBXTextBookmark */; + A2F0DF4F09F6D68300AA839C = A2F0DF4F09F6D68300AA839C /* PBXTextBookmark */; + A2F519DB09AA627E00056B6F = A2F519DB09AA627E00056B6F /* PBXTextBookmark */; + A2F519E509AA627E00056B6F = A2F519E509AA627E00056B6F /* PBXTextBookmark */; + }; + sourceControlManager = A251BE5409599FBA0058BC7F /* Source Control */; + userBuildSettings = { + }; + }; + 0259C576FE90428111CA0C5A /* PSMTabBarControl.m */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {590, 20090}}"; + sepNavSelRange = "{1654, 0}"; + sepNavVisRect = "{{0, 588}, {590, 607}}"; + }; + }; + 0259C577FE90428111CA0C5A /* PSMTabBarControlInspector.m */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {616, 1400}}"; + sepNavSelRange = "{2617, 0}"; + sepNavVisRect = "{{0, 794}, {616, 606}}"; + }; + }; + 0259C578FE90428111CA0C5A /* PSMTabBarControlPalette.m */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {681, 504}}"; + sepNavSelRange = "{242, 25}"; + sepNavVisRect = "{{0, 0}, {681, 494}}"; + }; + }; + 0259C57AFE90428111CA0C5A /* PSMTabBarControl.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {616, 1736}}"; + sepNavSelRange = "{3408, 23}"; + sepNavVisRect = "{{0, 1106}, {616, 606}}"; + sepNavWindowFrame = "{{981, 259}, {699, 732}}"; + }; + }; + 0259C57BFE90428111CA0C5A /* PSMTabBarControlInspector.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {616, 606}}"; + sepNavSelRange = "{693, 0}"; + sepNavVisRect = "{{0, 0}, {616, 606}}"; + }; + }; + 0259C57CFE90428111CA0C5A /* PSMTabBarControlPalette.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {681, 402}}"; + sepNavSelRange = "{356, 0}"; + sepNavVisRect = "{{0, 0}, {681, 402}}"; + }; + }; + 0259C583FE90428111CA0C5A /* palette.table */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {558, 748}}"; + sepNavSelRange = "{232, 0}"; + sepNavVisRect = "{{0, 0}, {558, 748}}"; + sepNavWindowFrame = "{{15, 431}, {689, 592}}"; + }; + }; + 32DBCF980370C29C00C91783 /* PSMTabBarControl_Prefix.pch */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {635, 748}}"; + sepNavSelRange = "{0, 0}"; + sepNavVisRect = "{{0, 0}, {635, 748}}"; + }; + }; + 53DF68FC067E5B5A0090B5B0 /* PSMTabBarControlFramework */ = { + activeExec = 0; + }; + 53DF68FE067E5B5A0090B5B0 /* PSMTabBarControlFramework-Info.plist */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {681, 402}}"; + sepNavSelRange = "{619, 0}"; + sepNavVisRect = "{{0, 0}, {681, 402}}"; + }; + }; + 53DF6901067E5B8E0090B5B0 /* All */ = { + activeExec = 0; + }; + 8D1AC9600486D14A00FE50C9 /* PSMTabBarControl */ = { + activeExec = 0; + }; + 8D1AC9730486D14A00FE50C9 /* Info.plist */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {681, 402}}"; + sepNavSelRange = "{717, 0}"; + sepNavVisRect = "{{0, 0}, {681, 402}}"; + }; + }; + 8D1AC97B0486D23100FE50C9 /* English */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {681, 402}}"; + sepNavSelRange = "{0, 0}"; + sepNavVisRect = "{{0, 0}, {681, 402}}"; + }; + }; + A2072A5709ABDC4400304BCB /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A251BE8B0959A1EA0058BC7F /* FakeModel.h */; + name = "FakeModel.h: icon"; + rLen = 51; + rLoc = 520; + rType = 0; + vrLen = 532; + vrLoc = 0; + }; + A2072A5A09ABDC4400304BCB /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = A2072A2409ABD88600304BCB /* Folder.tif */; + }; + A2072A5B09ABDC4400304BCB /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = A2072A2509ABD88600304BCB /* Globe.tiff */; + }; + A20822E70959F4CE00C5F5A4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 54D33B2806778E3300C9C163 /* PSMTabBarControl.ibclassdescription */; + name = "PSMTabBarControl.ibclassdescription: 3"; + rLen = 0; + rLoc = 48; + rType = 0; + vrLen = 77; + vrLoc = 0; + }; + A20822E80959F4CE00C5F5A4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 0259C57BFE90428111CA0C5A /* PSMTabBarControlInspector.h */; + name = "PSMTabBarControlInspector.h: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 272; + vrLoc = 0; + }; + A20822EA0959F4CE00C5F5A4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 0259C57CFE90428111CA0C5A /* PSMTabBarControlPalette.h */; + name = "PSMTabBarControlPalette.h: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 399; + vrLoc = 0; + }; + A208236A095A58C700C5F5A4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 0259C578FE90428111CA0C5A /* PSMTabBarControlPalette.m */; + name = "PSMTabBarControlPalette.m: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 615; + vrLoc = 0; + }; + A2082371095A58C700C5F5A4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 0259C577FE90428111CA0C5A /* PSMTabBarControlInspector.m */; + name = "PSMTabBarControlInspector.m: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 532; + vrLoc = 0; + }; + A2082398095A630900C5F5A4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 0259C583FE90428111CA0C5A /* palette.table */; + name = "palette.table: 29"; + rLen = 0; + rLoc = 1168; + rType = 0; + vrLen = 1109; + vrLoc = 0; + }; + A20823A1095A630900C5F5A4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 32DBCF980370C29C00C91783 /* PSMTabBarControl_Prefix.pch */; + name = "PSMTabBarControl_Prefix.pch: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 213; + vrLoc = 0; + }; + A20823A2095A630900C5F5A4 /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = A20822EF0959F6AA00C5F5A4 /* TabControlRep.tif */; + }; + A20823A3095A630900C5F5A4 /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = A20822F00959F6AA00C5F5A4 /* TabIcon.tif */; + }; + A2082A8D09EAEB33009AC8BE /* PSMTabDragAssistant.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {590, 1232}}"; + sepNavSelRange = "{603, 0}"; + sepNavVisRect = "{{0, 161}, {590, 336}}"; + }; + }; + A2082A8E09EAEB33009AC8BE /* PSMTabDragAssistant.m */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {647, 6104}}"; + sepNavSelRange = "{12266, 0}"; + sepNavVisRect = "{{0, 5376}, {647, 336}}"; + }; + }; + A208348A09CA185D00837C29 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A251BE820959A1B90058BC7F /* PSMOverflowPopUpButton.m */; + name = "PSMOverflowPopUpButton.m: 79"; + rLen = 0; + rLoc = 2437; + rType = 0; + vrLen = 1018; + vrLoc = 1757; + }; + A209E26A09F7E9FE0060532B /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A2D32EE709A6399300EC8662 /* PSMAquaTabStyle.m */; + name = "- (void)encodeWithCoder:(NSCoder *)aCoder"; + rLen = 42; + rLoc = 16767; + rType = 0; + vrLen = 2285; + vrLoc = 16053; + }; + A209E26F09F7E9FE0060532B /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A2082A8D09EAEB33009AC8BE /* PSMTabDragAssistant.h */; + name = "- (PSMTabBarCell *)distributePlaceholdersInTabBar:(PSMTabBarControl *)control withDraggedCell:(PSMTabBarCell *)cell;"; + rLen = 106; + rLoc = 2336; + rType = 0; + vrLen = 1705; + vrLoc = 1150; + }; + A209E27009F7E9FE0060532B /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A2082A8E09EAEB33009AC8BE /* PSMTabDragAssistant.m */; + name = "{"; + rLen = 2; + rLoc = 10115; + rType = 0; + vrLen = 2111; + vrLoc = 9314; + }; + A209E28609F83C1E0060532B /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A2A711BD09E5BF0500D0089B /* WindowController.h */; + name = "WindowController.h: tabView:shouldCloseTabViewItem:"; + rLen = 267; + rLoc = 1327; + rType = 0; + vrLen = 1765; + vrLoc = 203; + }; + A209E28C09F83C1E0060532B /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A2A711BD09E5BF0500D0089B /* WindowController.h */; + name = "WindowController.h: tabView:shouldCloseTabViewItem:"; + rLen = 267; + rLoc = 1327; + rType = 0; + vrLen = 1765; + vrLoc = 203; + }; + A20A6FC109FB23FA0018A4B5 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A2D32EFE09A63D7A00EC8662 /* PSMMetalTabStyle.h */; + name = "PSMMetalTabStyle.h: encodeWithCoder:"; + rLen = 83; + rLoc = 561; + rType = 0; + vrLen = 645; + vrLoc = 0; + }; + A20A6FC209FB23FA0018A4B5 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A268EA5F09A9831800E082AA /* PSMRolloverButton.h */; + name = "PSMRolloverButton.h: 11"; + rLen = 441; + rLoc = 178; + rType = 0; + vrLen = 536; + vrLoc = 88; + }; + A20A6FC309FB23FA0018A4B5 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A251BE810959A1B90058BC7F /* PSMOverflowPopUpButton.h */; + name = "PSMOverflowPopUpButton.h: 1"; + rLen = 159; + rLoc = 0; + rType = 0; + vrLen = 477; + vrLoc = 0; + }; + A20A6FC409FB23FA0018A4B5 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A2129BAF09AEB58F00724E6C /* PSMProgressIndicator.h */; + name = "PSMProgressIndicator.h: 10"; + rLen = 0; + rLoc = 211; + rType = 0; + vrLen = 345; + vrLoc = 0; + }; + A2129BAF09AEB58F00724E6C /* PSMProgressIndicator.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {647, 336}}"; + sepNavSelRange = "{211, 0}"; + sepNavVisRect = "{{0, 0}, {647, 336}}"; + }; + }; + A2129BB009AEB58F00724E6C /* PSMProgressIndicator.m */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {529, 368}}"; + sepNavSelRange = "{362, 0}"; + sepNavVisRect = "{{0, 0}, {529, 368}}"; + }; + }; + A21370F30A1C2CC400673584 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A2D32EDA09A634C900EC8662 /* PSMTabStyle.h */; + name = "PSMTabStyle.h: 48"; + rLen = 78; + rLoc = 1539; + rType = 0; + vrLen = 1532; + vrLoc = 85; + }; + A2179E3B09CA11BE00E40445 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 0259C578FE90428111CA0C5A /* PSMTabBarControlPalette.m */; + name = "- (void)finishInstantiate"; + rLen = 25; + rLoc = 242; + rType = 0; + vrLen = 733; + vrLoc = 0; + }; + A21F8C430963122D00B04C56 /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = A251BE900959A23A0058BC7F /* overflowImage.tiff */; + }; + A21F8C440963122D00B04C56 /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = A251BE910959A23A0058BC7F /* overflowImagePressed.tif */; + }; + A22BAD0209C200AB0004449D /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A22BAD0309C200AB0004449D /* IBInspector.h */; + name = "(null): 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 885; + vrLoc = 0; + }; + A22BAD0309C200AB0004449D /* IBInspector.h */ = { + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + name = IBInspector.h; + path = /Developer/SDKs/MacOSX10.4u.sdk/System/Library/Frameworks/InterfaceBuilder.framework/Versions/A/Headers/IBInspector.h; + sourceTree = ""; + }; + A22BAD0609C200AB0004449D /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A22BAD0709C200AB0004449D /* IBInspector.h */; + name = "(null): 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 885; + vrLoc = 0; + }; + A22BAD0709C200AB0004449D /* IBInspector.h */ = { + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + name = IBInspector.h; + path = /Developer/SDKs/MacOSX10.4u.sdk/System/Library/Frameworks/InterfaceBuilder.framework/Versions/A/Headers/IBInspector.h; + sourceTree = ""; + }; + A22BAD2609C203D80004449D /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A22BAD2709C203D80004449D /* IBViewProtocol.h */; + name = "(null): 23"; + rLen = 141; + rLoc = 911; + rType = 0; + vrLen = 1223; + vrLoc = 231; + }; + A22BAD2709C203D80004449D /* IBViewProtocol.h */ = { + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + name = IBViewProtocol.h; + path = /Developer/SDKs/MacOSX10.4u.sdk/System/Library/Frameworks/InterfaceBuilder.framework/Versions/A/Headers/IBViewProtocol.h; + sourceTree = ""; + }; + A22BAD2A09C203D80004449D /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A22BAD2B09C203D80004449D /* IBViewProtocol.h */; + name = "(null): 23"; + rLen = 141; + rLoc = 911; + rType = 0; + vrLen = 1223; + vrLoc = 231; + }; + A22BAD2B09C203D80004449D /* IBViewProtocol.h */ = { + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + name = IBViewProtocol.h; + path = /Developer/SDKs/MacOSX10.4u.sdk/System/Library/Frameworks/InterfaceBuilder.framework/Versions/A/Headers/IBViewProtocol.h; + sourceTree = ""; + }; + A234001B09B2B346001A1B18 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 32DBCF980370C29C00C91783 /* PSMTabBarControl_Prefix.pch */; + name = "PSMTabBarControl_Prefix.pch: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 213; + vrLoc = 0; + }; + A234001E09B2B346001A1B18 /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = A2C0D99309AF870000ED379C /* pi.png */; + }; + A234006C09B2C55E001A1B18 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 0259C583FE90428111CA0C5A /* palette.table */; + name = "palette.table: 6"; + rLen = 0; + rLoc = 232; + rType = 0; + vrLen = 1312; + vrLoc = 0; + }; + A234006D09B2C55E001A1B18 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 54D33B2806778E3300C9C163 /* PSMTabBarControl.ibclassdescription */; + name = "PSMTabBarControl.ibclassdescription: 3"; + rLen = 0; + rLoc = 48; + rType = 0; + vrLen = 77; + vrLoc = 0; + }; + A234FFFF09B2AF46001A1B18 /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = A2D3317B09A68B7500EC8662 /* AquaTabsDownNonKey.png */; + }; + A240E76509C2211500F755E1 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A251BEA20959BB5B0058BC7F /* TabBarControlDemo-Info.plist */; + name = "TabBarControlDemo-Info.plist: 18"; + rLen = 0; + rLoc = 607; + rType = 0; + vrLen = 748; + vrLoc = 0; + }; + A240E76609C2211500F755E1 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 53DF68FE067E5B5A0090B5B0 /* PSMTabBarControlFramework-Info.plist */; + name = "PSMTabBarControlFramework-Info.plist: 18"; + rLen = 0; + rLoc = 619; + rType = 0; + vrLen = 710; + vrLoc = 0; + }; + A240E76D09C2211500F755E1 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A251BEA20959BB5B0058BC7F /* TabBarControlDemo-Info.plist */; + name = "TabBarControlDemo-Info.plist: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 748; + vrLoc = 0; + }; + A246FAF70A2BD6C2005BDF7B /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 0259C57AFE90428111CA0C5A /* PSMTabBarControl.h */; + name = representedTabViewItems; + rLen = 23; + rLoc = 3408; + rType = 0; + vrLen = 1337; + vrLoc = 2496; + }; + A246FAF80A2BD6C2005BDF7B /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 0259C577FE90428111CA0C5A /* PSMTabBarControlInspector.m */; + name = "PSMTabBarControlInspector.m: 75"; + rLen = 0; + rLoc = 2617; + rType = 0; + vrLen = 1624; + vrLoc = 1794; + }; + A246FAF90A2BD6C2005BDF7B /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 0259C57BFE90428111CA0C5A /* PSMTabBarControlInspector.h */; + name = "PSMTabBarControlInspector.h: _allowsDragBetweenWindows"; + rLen = 0; + rLoc = 693; + rType = 0; + vrLen = 720; + vrLoc = 0; + }; + A246FAFA0A2BD6C2005BDF7B /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A251BE9B0959A2530058BC7F /* ReadMe.rtfd */; + name = "ReadMe.rtfd: 14"; + rLen = 0; + rLoc = 936; + rType = 0; + vrLen = 2325; + vrLoc = 1416; + }; + A246FAFB0A2BD6C2005BDF7B /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A251BE9B0959A2530058BC7F /* ReadMe.rtfd */; + name = "ReadMe.rtfd: 14"; + rLen = 0; + rLoc = 936; + rType = 0; + vrLen = 2325; + vrLoc = 1416; + }; + A246FAFC0A2BD6C2005BDF7B /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 0259C577FE90428111CA0C5A /* PSMTabBarControlInspector.m */; + name = "[_allowDragBetweenWindows setState:[[self object] allowDragBetweenWindows]];"; + rLen = 83; + rLoc = 3295; + rType = 0; + vrLen = 1176; + vrLoc = 0; + }; + A246FAFD0A2BD6C2005BDF7B /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 0259C57AFE90428111CA0C5A /* PSMTabBarControl.h */; + name = representedTabViewItems; + rLen = 23; + rLoc = 3408; + rType = 0; + vrLen = 1337; + vrLoc = 2496; + }; + A246FAFE0A2BD6C2005BDF7B /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 0259C577FE90428111CA0C5A /* PSMTabBarControlInspector.m */; + name = "PSMTabBarControlInspector.m: 75"; + rLen = 0; + rLoc = 2617; + rType = 0; + vrLen = 1624; + vrLoc = 1794; + }; + A246FAFF0A2BD6C2005BDF7B /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 0259C57BFE90428111CA0C5A /* PSMTabBarControlInspector.h */; + name = "PSMTabBarControlInspector.h: _allowsDragBetweenWindows"; + rLen = 0; + rLoc = 693; + rType = 0; + vrLen = 720; + vrLoc = 0; + }; + A246FB000A2BD6C2005BDF7B /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A251BE9B0959A2530058BC7F /* ReadMe.rtfd */; + name = "ReadMe.rtfd: 71"; + rLen = 0; + rLoc = 8293; + rType = 0; + vrLen = 1928; + vrLoc = 0; + }; + A24DF7F10A2B9F64004D2710 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A251BE9B0959A2530058BC7F /* ReadMe.rtfd */; + name = "ReadMe.rtfd: 82"; + rLen = 0; + rLoc = 9026; + rType = 0; + vrLen = 2005; + vrLoc = 0; + }; + A251BE5409599FBA0058BC7F /* Source Control */ = { + isa = PBXSourceControlManager; + fallbackIsa = XCSourceControlManager; + isSCMEnabled = 0; + scmConfiguration = { + }; + scmType = ""; + }; + A251BE5509599FBA0058BC7F /* Code sense */ = { + isa = PBXCodeSenseManager; + indexTemplatePath = ""; + }; + A251BE660959A0E60058BC7F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 53DF68FE067E5B5A0090B5B0 /* PSMTabBarControlFramework-Info.plist */; + name = "PSMTabBarControlFramework-Info.plist: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 710; + vrLoc = 0; + }; + A251BE670959A0E60058BC7F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 8D1AC9730486D14A00FE50C9 /* Info.plist */; + name = "Info.plist: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 740; + vrLoc = 0; + }; + A251BE810959A1B90058BC7F /* PSMOverflowPopUpButton.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {647, 336}}"; + sepNavSelRange = "{0, 159}"; + sepNavVisRect = "{{0, 0}, {647, 336}}"; + }; + }; + A251BE820959A1B90058BC7F /* PSMOverflowPopUpButton.m */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {681, 1330}}"; + sepNavSelRange = "{2437, 0}"; + sepNavVisRect = "{{0, 824}, {681, 494}}"; + }; + }; + A251BE830959A1B90058BC7F /* PSMTabBarCell.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {590, 1456}}"; + sepNavSelRange = "{317, 0}"; + sepNavVisRect = "{{0, 178}, {590, 336}}"; + sepNavWindowFrame = "{{983, 278}, {699, 732}}"; + }; + }; + A251BE840959A1B90058BC7F /* PSMTabBarCell.m */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {590, 5656}}"; + sepNavSelRange = "{8864, 24}"; + sepNavVisRect = "{{0, 5233}, {590, 336}}"; + }; + }; + A251BE890959A1EA0058BC7F /* AppController.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {827, 727}}"; + sepNavSelRange = "{176, 0}"; + sepNavVisRect = "{{0, 0}, {827, 727}}"; + }; + }; + A251BE8A0959A1EA0058BC7F /* AppController.m */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {647, 694}}"; + sepNavSelRange = "{401, 0}"; + sepNavVisRect = "{{0, 0}, {647, 694}}"; + }; + }; + A251BE8B0959A1EA0058BC7F /* FakeModel.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {681, 755}}"; + sepNavSelRange = "{572, 65}"; + sepNavVisRect = "{{0, 0}, {681, 755}}"; + }; + }; + A251BE8C0959A1EA0058BC7F /* FakeModel.m */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {681, 1092}}"; + sepNavSelRange = "{349, 63}"; + sepNavVisRect = "{{0, 112}, {681, 755}}"; + }; + }; + A251BE8D0959A1EA0058BC7F /* main.m */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {595, 368}}"; + sepNavSelRange = "{201, 0}"; + sepNavVisRect = "{{0, 0}, {595, 368}}"; + }; + }; + A251BE9B0959A2530058BC7F /* ReadMe.rtfd */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {616, 3271}}"; + sepNavSelRange = "{8293, 0}"; + sepNavVisRect = "{{0, 0}, {616, 606}}"; + }; + }; + A251BE9F0959BB5B0058BC7F /* TabBarControlDemo */ = { + activeExec = 0; + executables = ( + A251BEA10959BB5B0058BC7F /* TabBarControlDemo */, + ); + }; + A251BEA10959BB5B0058BC7F /* TabBarControlDemo */ = { + isa = PBXExecutable; + activeArgIndex = 2147483647; + activeArgIndices = ( + ); + argumentStrings = ( + ); + autoAttachOnCrash = 1; + configStateDict = { + }; + customDataFormattersEnabled = 1; + debuggerPlugin = GDBDebugging; + disassemblyDisplayState = 0; + dylibVariantSuffix = ""; + enableDebugStr = 1; + environmentEntries = ( + { + active = YES; + name = NSZombieEnabled; + value = YES; + }, + ); + executableSystemSymbolLevel = 0; + executableUserSymbolLevel = 0; + libgmallocEnabled = 0; + name = TabBarControlDemo; + savedGlobals = { + }; + sourceDirectories = ( + ); + }; + A251BEA20959BB5B0058BC7F /* TabBarControlDemo-Info.plist */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {681, 402}}"; + sepNavSelRange = "{607, 0}"; + sepNavVisRect = "{{0, 0}, {681, 402}}"; + }; + }; + A251BEF10959BC6E0058BC7F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A251BE8D0959A1EA0058BC7F /* main.m */; + name = "main.m: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 262; + vrLoc = 0; + }; + A251BEF80959BC6E0058BC7F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 8D1AC97B0486D23100FE50C9 /* English */; + name = "English: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 103; + vrLoc = 0; + }; + A251BEFC0959BC6E0058BC7F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A251BE9B0959A2530058BC7F /* ReadMe.rtfd */; + name = "ReadMe.rtfd: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 1487; + vrLoc = 0; + }; + A251BEFD0959BC6E0058BC7F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A251BE810959A1B90058BC7F /* PSMOverflowPopUpButton.h */; + name = "PSMOverflowPopUpButton.h: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 241; + vrLoc = 0; + }; + A251BEFE0959BC6E0058BC7F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A251BE820959A1B90058BC7F /* PSMOverflowPopUpButton.m */; + name = "PSMOverflowPopUpButton.m: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 876; + vrLoc = 0; + }; + A251BF000959BC6E0058BC7F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A251BE830959A1B90058BC7F /* PSMTabBarCell.h */; + name = "PSMTabBarCell.h: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 1044; + vrLoc = 0; + }; + A251BF020959BC6E0058BC7F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A251BE840959A1B90058BC7F /* PSMTabBarCell.m */; + name = "PSMTabBarCell.m: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 1109; + vrLoc = 0; + }; + A251BF040959BC6E0058BC7F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A251BE8A0959A1EA0058BC7F /* AppController.m */; + name = "AppController.m: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 430; + vrLoc = 0; + }; + A251BF050959BC6E0058BC7F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A251BE8C0959A1EA0058BC7F /* FakeModel.m */; + name = "FakeModel.m: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 563; + vrLoc = 0; + }; + A251BF060959BC6E0058BC7F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A251BE8D0959A1EA0058BC7F /* main.m */; + name = "main.m: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 262; + vrLoc = 0; + }; + A251BF070959BC6E0058BC7F /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = A251BE8F0959A23A0058BC7F /* 32x32cancel.png */; + }; + A251BF0A0959BC6E0058BC7F /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = A251BE920959A23A0058BC7F /* TabClose_Front_Pressed.tif */; + }; + A251BF0B0959BC6E0058BC7F /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = A251BE930959A23A0058BC7F /* TabClose_Front_Rollover.tif */; + }; + A251BF270959BD670058BC7F /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = A251BE940959A23A0058BC7F /* TabClose_Front.tif */; + }; + A25769750961A58A00DDAD2A /* XCBreakpointsBucket */ = { + isa = XCBreakpointsBucket; + name = "Project Breakpoints"; + objects = ( + A25769760961A59400DDAD2A /* -[_NSZombie methodSignatureForSelector:] */, + A2F51A5709AA767B00056B6F /* -[NSException raise] */, + ); + }; + A25769760961A59400DDAD2A /* -[_NSZombie methodSignatureForSelector:] */ = { + isa = PBXSymbolicBreakpoint; + actions = ( + ); + breakpointStyle = 0; + continueAfterActions = 0; + delayBeforeContinue = 0; + hitCount = 1; + modificationTime = 167074336.702008; + state = 1; + symbolName = "-[_NSZombie methodSignatureForSelector:]"; + }; + A264DC290A1E83A9001A9027 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A2D32EFF09A63D7A00EC8662 /* PSMMetalTabStyle.m */; + name = "PSMMetalTabStyle.m: 352"; + rLen = 96; + rLoc = 11166; + rType = 0; + vrLen = 1794; + vrLoc = 10828; + }; + A268E7C609A9792000E082AA /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = A2D3317A09A68B7500EC8662 /* AquaTabsDownGraphite.png */; + }; + A268E7C709A9792000E082AA /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = A2D32EF509A63BF700EC8662 /* AquaTabsSeparator.png */; + }; + A268EA5F09A9831800E082AA /* PSMRolloverButton.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {647, 406}}"; + sepNavSelRange = "{178, 441}"; + sepNavVisRect = "{{0, 70}, {647, 336}}"; + }; + }; + A268EA6009A9831800E082AA /* PSMRolloverButton.m */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {647, 1484}}"; + sepNavSelRange = "{1492, 0}"; + sepNavVisRect = "{{0, 333}, {647, 694}}"; + }; + }; + A268EA9709A9876A00E082AA /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A268EA5F09A9831800E082AA /* PSMRolloverButton.h */; + name = "PSMRolloverButton.h: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 496; + vrLoc = 0; + }; + A268EAA009A9876A00E082AA /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A268EA6009A9831800E082AA /* PSMRolloverButton.m */; + name = "PSMRolloverButton.m: 2"; + rLen = 0; + rLoc = 31; + rType = 0; + vrLen = 962; + vrLoc = 0; + }; + A268EAAA09A9876A00E082AA /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = A268E7F809A9822900E082AA /* AquaTabNew.png */; + }; + A269364309A7BC8D0006911E /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A251BE890959A1EA0058BC7F /* AppController.h */; + name = "AppController.h: drawer"; + rLen = 0; + rLoc = 220; + rType = 0; + vrLen = 832; + vrLoc = 0; + }; + A2704C0F09F56903000002CC /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A251BE8A0959A1EA0058BC7F /* AppController.m */; + name = "AppController.m: 20"; + rLen = 0; + rLoc = 401; + rType = 0; + vrLen = 650; + vrLoc = 0; + }; + A2758F9B09B4BB1C006E31C3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A2129BAF09AEB58F00724E6C /* PSMProgressIndicator.h */; + name = "PSMProgressIndicator.h: 12"; + rLen = 0; + rLoc = 267; + rType = 0; + vrLen = 250; + vrLoc = 0; + }; + A2758F9C09B4BB1C006E31C3 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A2129BB009AEB58F00724E6C /* PSMProgressIndicator.m */; + name = "[(PSMTabBarControl *)[self superview] update];"; + rLen = 51; + rLoc = 362; + rType = 0; + vrLen = 421; + vrLoc = 0; + }; + A27E46770A28B49E007BA395 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A2082A8E09EAEB33009AC8BE /* PSMTabDragAssistant.m */; + name = "PSMTabDragAssistant.m: 386"; + rLen = 0; + rLoc = 12266; + rType = 0; + vrLen = 1227; + vrLoc = 11663; + }; + A27E46780A28B49E007BA395 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A2082A8D09EAEB33009AC8BE /* PSMTabDragAssistant.h */; + name = "PSMTabDragAssistant.h: _destinationTabBar"; + rLen = 0; + rLoc = 603; + rType = 0; + vrLen = 746; + vrLoc = 334; + }; + A27E46C80A28C05D007BA395 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A251BE830959A1B90058BC7F /* PSMTabBarCell.h */; + name = "PSMTabBarCell.h: 21"; + rLen = 0; + rLoc = 469; + rType = 0; + vrLen = 842; + vrLoc = 425; + }; + A27E46C90A28C05D007BA395 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A251BE840959A1B90058BC7F /* PSMTabBarCell.m */; + name = "NSLog(@\"decoding cell\");"; + rLen = 24; + rLoc = 8864; + rType = 0; + vrLen = 1375; + vrLoc = 8588; + }; + A27E475B0A28EBEE007BA395 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 8D1AC97B0486D23100FE50C9 /* English */; + name = "English: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 103; + vrLoc = 0; + }; + A27E475F0A28EBEE007BA395 /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = A269361009A778770006911E /* 32x32_log.tiff */; + }; + A27E47610A28EBEE007BA395 /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = A2D32EF209A63BF700EC8662 /* AquaTabClose_Front.tif */; + }; + A27E47660A28EBEE007BA395 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 0259C576FE90428111CA0C5A /* PSMTabBarControl.m */; + name = "PSMTabBarControl.m: 1214"; + rLen = 0; + rLoc = 42889; + rType = 0; + vrLen = 1340; + vrLoc = 41507; + }; + A27E47670A28EBEE007BA395 /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = A2072B5C09AC1FA500304BCB /* Warning.png */; + }; + A27E47680A28EBEE007BA395 /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = A268E7FD09A9822900E082AA /* TabNewMetalRollover.png */; + }; + A27E47690A28EBEE007BA395 /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = A268E7FC09A9822900E082AA /* TabNewMetalPressed.png */; + }; + A27E476A0A28EBEE007BA395 /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = A268E7FB09A9822900E082AA /* TabNewMetal.png */; + }; + A27E47740A28EBEE007BA395 /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = A2D32EF609A63BF700EC8662 /* AquaTabsSeparatorDown.png */; + }; + A27E47E40A28F7FB007BA395 /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = A2C0D99309AF870000ED379C /* pi.png */; + }; + A27E47E50A28F7FB007BA395 /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = A2072B5C09AC1FA500304BCB /* Warning.png */; + }; + A27E47E60A28F7FB007BA395 /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = A2072A2409ABD88600304BCB /* Folder.tif */; + }; + A27E47E70A28F7FB007BA395 /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = A2072A2509ABD88600304BCB /* Globe.tiff */; + }; + A27E47E80A28F7FB007BA395 /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = A268E7F809A9822900E082AA /* AquaTabNew.png */; + }; + A27E47E90A28F7FB007BA395 /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = A268E7F909A9822900E082AA /* AquaTabNewPressed.png */; + }; + A27E47EA0A28F7FB007BA395 /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = A268E7FA09A9822900E082AA /* AquaTabNewRollover.png */; + }; + A27E47EB0A28F7FB007BA395 /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = A268E7FB09A9822900E082AA /* TabNewMetal.png */; + }; + A27E47EC0A28F7FB007BA395 /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = A268E7FC09A9822900E082AA /* TabNewMetalPressed.png */; + }; + A27E47ED0A28F7FB007BA395 /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = A268E7FD09A9822900E082AA /* TabNewMetalRollover.png */; + }; + A27E47EE0A28F7FB007BA395 /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = A269361009A778770006911E /* 32x32_log.tiff */; + }; + A27E47EF0A28F7FB007BA395 /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = A2D3317A09A68B7500EC8662 /* AquaTabsDownGraphite.png */; + }; + A27E47F00A28F7FB007BA395 /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = A2D3317B09A68B7500EC8662 /* AquaTabsDownNonKey.png */; + }; + A27E47F10A28F7FB007BA395 /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = A2D32EF009A63BF700EC8662 /* AquaTabClose_Front_Pressed.tif */; + }; + A27E47F20A28F7FB007BA395 /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = A2D32EF109A63BF700EC8662 /* AquaTabClose_Front_Rollover.tif */; + }; + A27E47F30A28F7FB007BA395 /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = A2D32EF209A63BF700EC8662 /* AquaTabClose_Front.tif */; + }; + A27E47F40A28F7FB007BA395 /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = A2D32EF309A63BF700EC8662 /* AquaTabsBackground.png */; + }; + A27E47F50A28F7FB007BA395 /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = A2D32EF409A63BF700EC8662 /* AquaTabsDown.png */; + }; + A27E47F60A28F7FB007BA395 /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = A2D32EF509A63BF700EC8662 /* AquaTabsSeparator.png */; + }; + A27E47F70A28F7FB007BA395 /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = A2D32EF609A63BF700EC8662 /* AquaTabsSeparatorDown.png */; + }; + A27E47F80A28F7FB007BA395 /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = A251BE8F0959A23A0058BC7F /* 32x32cancel.png */; + }; + A27E47F90A28F7FB007BA395 /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = A251BE900959A23A0058BC7F /* overflowImage.tiff */; + }; + A27E47FA0A28F7FB007BA395 /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = A251BE910959A23A0058BC7F /* overflowImagePressed.tif */; + }; + A27E47FB0A28F7FB007BA395 /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = A251BE920959A23A0058BC7F /* TabClose_Front_Pressed.tif */; + }; + A27E47FC0A28F7FB007BA395 /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = A251BE930959A23A0058BC7F /* TabClose_Front_Rollover.tif */; + }; + A27E47FD0A28F7FB007BA395 /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = A251BE940959A23A0058BC7F /* TabClose_Front.tif */; + }; + A27E47FE0A28F7FB007BA395 /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = A20822EF0959F6AA00C5F5A4 /* TabControlRep.tif */; + }; + A27E48050A28F7FC007BA395 /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = A268E7F909A9822900E082AA /* AquaTabNewPressed.png */; + }; + A27E48060A28F7FC007BA395 /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = A268E7FA09A9822900E082AA /* AquaTabNewRollover.png */; + }; + A27E480E0A28F7FC007BA395 /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = A2D32EF109A63BF700EC8662 /* AquaTabClose_Front_Rollover.tif */; + }; + A27E48100A28F7FC007BA395 /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = A2D32EF309A63BF700EC8662 /* AquaTabsBackground.png */; + }; + A27E48110A28F7FC007BA395 /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = A2D32EF409A63BF700EC8662 /* AquaTabsDown.png */; + }; + A27F6A870A1B9AD100AE7009 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A2D32EE609A6399300EC8662 /* PSMAquaTabStyle.h */; + name = "PSMAquaTabStyle.h: initWithCoder:"; + rLen = 0; + rLoc = 837; + rType = 0; + vrLen = 843; + vrLoc = 0; + }; + A2A2B9D909F448F9002BE730 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A2A2B9DA09F448F9002BE730 /* ESFloater.h */; + name = "(null): 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 668; + vrLoc = 0; + }; + A2A2B9DA09F448F9002BE730 /* ESFloater.h */ = { + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + name = ESFloater.h; + path = "/Users/johnp/Positive Spin Media/shareware apps/possibilities:code/CustomTabs/ESFloater.h"; + sourceTree = ""; + }; + A2A2B9E309F448F9002BE730 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A2A2B9E409F448F9002BE730 /* ESFloater.h */; + name = "(null): 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 668; + vrLoc = 0; + }; + A2A2B9E409F448F9002BE730 /* ESFloater.h */ = { + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + name = ESFloater.h; + path = "/Users/johnp/Positive Spin Media/shareware apps/possibilities:code/CustomTabs/ESFloater.h"; + sourceTree = ""; + }; + A2A711BD09E5BF0500D0089B /* WindowController.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {647, 840}}"; + sepNavSelRange = "{1327, 267}"; + sepNavVisRect = "{{0, 146}, {647, 694}}"; + }; + }; + A2A711BE09E5BF0500D0089B /* WindowController.m */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {744, 4004}}"; + sepNavSelRange = "{6878, 5}"; + sepNavVisRect = "{{0, 2915}, {744, 401}}"; + }; + }; + A2A7121E09E5C48C00D0089B /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A251BE890959A1EA0058BC7F /* AppController.h */; + name = "AppController.h: 9"; + rLen = 0; + rLoc = 176; + rType = 0; + vrLen = 264; + vrLoc = 0; + }; + A2BEC7EB09C1F01F00B8B4B6 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 0259C57CFE90428111CA0C5A /* PSMTabBarControlPalette.h */; + name = "PSMTabBarControlPalette.h: _customControl"; + rLen = 0; + rLoc = 356; + rType = 0; + vrLen = 483; + vrLoc = 0; + }; + A2CD7C5709B7738800FBAAAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A251BE8B0959A1EA0058BC7F /* FakeModel.h */; + name = "FakeModel.h: iconName"; + rLen = 65; + rLoc = 572; + rType = 0; + vrLen = 735; + vrLoc = 0; + }; + A2CD7C8D09B7B55E00FBAAAE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A251BE8C0959A1EA0058BC7F /* FakeModel.m */; + name = "controller = [[NSObjectController alloc] initWithContent:self];"; + rLen = 63; + rLoc = 349; + rType = 0; + vrLen = 752; + vrLoc = 146; + }; + A2CF618009F4099F00A0F9A8 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A2CF618109F4099F00A0F9A8 /* EXCustomTabDragging.m */; + name = "(null): 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 1247; + vrLoc = 0; + }; + A2CF618109F4099F00A0F9A8 /* EXCustomTabDragging.m */ = { + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.objc; + name = EXCustomTabDragging.m; + path = "/Users/johnp/Positive Spin Media/shareware apps/possibilities:code/CustomTabs/EXCustomTabDragging.m"; + sourceTree = ""; + }; + A2CF618409F4099F00A0F9A8 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A2CF618509F4099F00A0F9A8 /* EXCustomTabDragging.m */; + name = "(null): 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 1247; + vrLoc = 0; + }; + A2CF618509F4099F00A0F9A8 /* EXCustomTabDragging.m */ = { + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.objc; + name = EXCustomTabDragging.m; + path = "/Users/johnp/Positive Spin Media/shareware apps/possibilities:code/CustomTabs/EXCustomTabDragging.m"; + sourceTree = ""; + }; + A2D32EDA09A634C900EC8662 /* PSMTabStyle.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {647, 770}}"; + sepNavSelRange = "{1539, 78}"; + sepNavVisRect = "{{0, 76}, {647, 694}}"; + }; + }; + A2D32EE609A6399300EC8662 /* PSMAquaTabStyle.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {647, 694}}"; + sepNavSelRange = "{837, 0}"; + sepNavVisRect = "{{0, 0}, {647, 694}}"; + }; + }; + A2D32EE709A6399300EC8662 /* PSMAquaTabStyle.m */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {647, 7672}}"; + sepNavSelRange = "{16767, 42}"; + sepNavVisRect = "{{0, 6730}, {647, 694}}"; + }; + }; + A2D32EFE09A63D7A00EC8662 /* PSMMetalTabStyle.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {647, 378}}"; + sepNavSelRange = "{561, 83}"; + sepNavVisRect = "{{0, 0}, {647, 336}}"; + }; + }; + A2D32EFF09A63D7A00EC8662 /* PSMMetalTabStyle.m */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {647, 7686}}"; + sepNavSelRange = "{11166, 96}"; + sepNavVisRect = "{{0, 4956}, {647, 694}}"; + }; + }; + A2D32F4609A6441B00EC8662 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A2D32EDA09A634C900EC8662 /* PSMTabStyle.h */; + name = "PSMTabStyle.h: 17"; + rLen = 0; + rLoc = 907; + rType = 0; + vrLen = 1106; + vrLoc = 0; + }; + A2D32F4909A6441B00EC8662 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A2D32EE609A6399300EC8662 /* PSMAquaTabStyle.h */; + name = "PSMAquaTabStyle.h: 25"; + rLen = 0; + rLoc = 837; + rType = 0; + vrLen = 644; + vrLoc = 0; + }; + A2D32F4A09A6441B00EC8662 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A2D32EE709A6399300EC8662 /* PSMAquaTabStyle.m */; + name = "PSMAquaTabStyle.m: 320"; + rLen = 0; + rLoc = 19140; + rType = 0; + vrLen = 1484; + vrLoc = 0; + }; + A2D32F5109A6441B00EC8662 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A2D32EFE09A63D7A00EC8662 /* PSMMetalTabStyle.h */; + name = "PSMMetalTabStyle.h: 20"; + rLen = 0; + rLoc = 645; + rType = 0; + vrLen = 521; + vrLoc = 0; + }; + A2D32F5209A6441B00EC8662 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A2D32EFF09A63D7A00EC8662 /* PSMMetalTabStyle.m */; + name = "PSMMetalTabStyle.m: 26"; + rLen = 0; + rLoc = 1707; + rType = 0; + vrLen = 1411; + vrLoc = 0; + }; + A2D3313F09A67ED000EC8662 /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = A2D32EF009A63BF700EC8662 /* AquaTabClose_Front_Pressed.tif */; + }; + A2D98B070A2B432C0064C6F8 /* PSMUnifiedTabStyle.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {590, 607}}"; + sepNavSelRange = "{495, 0}"; + sepNavVisRect = "{{0, 0}, {590, 607}}"; + }; + }; + A2D98B080A2B432C0064C6F8 /* PSMUnifiedTabStyle.m */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {590, 8078}}"; + sepNavSelRange = "{0, 0}"; + sepNavVisRect = "{{0, 215}, {590, 607}}"; + }; + }; + A2D98B0F0A2B43FA0064C6F8 /* NSBezierPath_AMShading.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {590, 607}}"; + sepNavSelRange = "{0, 0}"; + sepNavVisRect = "{{0, 0}, {590, 607}}"; + }; + }; + A2D98B1D0A2B47700064C6F8 /* PBXBookmark */ = { + isa = PBXBookmark; + fRef = A20822F00959F6AA00C5F5A4 /* TabIcon.tif */; + }; + A2D98B1E0A2B47700064C6F8 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A2D98B070A2B432C0064C6F8 /* PSMUnifiedTabStyle.h */; + name = "PSMUnifiedTabStyle.h: leftMargin"; + rLen = 0; + rLoc = 495; + rType = 0; + vrLen = 573; + vrLoc = 0; + }; + A2D98B1F0A2B47700064C6F8 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A2D98B080A2B432C0064C6F8 /* PSMUnifiedTabStyle.m */; + name = "PSMUnifiedTabStyle.m: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 1409; + vrLoc = 365; + }; + A2D98B200A2B47700064C6F8 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A2D98B0F0A2B43FA0064C6F8 /* NSBezierPath_AMShading.h */; + name = "NSBezierPath_AMShading.h: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 634; + vrLoc = 0; + }; + A2D98B210A2B47700064C6F8 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A2D98B100A2B43FA0064C6F8 /* NSBezierPath_AMShading.m */; + name = "NSBezierPath_AMShading.m: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 1116; + vrLoc = 0; + }; + A2D98B240A2B47700064C6F8 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A2D98B070A2B432C0064C6F8 /* PSMUnifiedTabStyle.h */; + name = "PSMUnifiedTabStyle.h: leftMargin"; + rLen = 0; + rLoc = 495; + rType = 0; + vrLen = 573; + vrLoc = 0; + }; + A2D98B250A2B47700064C6F8 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A2D98B080A2B432C0064C6F8 /* PSMUnifiedTabStyle.m */; + name = "PSMUnifiedTabStyle.m: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 1409; + vrLoc = 365; + }; + A2D98B260A2B47700064C6F8 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A2D98B0F0A2B43FA0064C6F8 /* NSBezierPath_AMShading.h */; + name = "NSBezierPath_AMShading.h: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 634; + vrLoc = 0; + }; + A2D98B270A2B47700064C6F8 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A2D98B100A2B43FA0064C6F8 /* NSBezierPath_AMShading.m */; + name = "NSBezierPath_AMShading.m: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 1116; + vrLoc = 0; + }; + A2D98B3E0A2B55140064C6F8 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 0259C57BFE90428111CA0C5A /* PSMTabBarControlInspector.h */; + name = "PSMTabBarControlInspector.h: _allowDragBetweenWindows"; + rLen = 0; + rLoc = 712; + rType = 0; + vrLen = 719; + vrLoc = 0; + }; + A2D98B410A2B55140064C6F8 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 0259C57AFE90428111CA0C5A /* PSMTabBarControl.h */; + name = setAllowsDragBetweenWindows; + rLen = 27; + rLoc = 3070; + rType = 0; + vrLen = 1170; + vrLoc = 2219; + }; + A2E8401109F48B62000217C4 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A2129BB009AEB58F00724E6C /* PSMProgressIndicator.m */; + name = "PSMProgressIndicator.m: 10"; + rLen = 0; + rLoc = 192; + rType = 0; + vrLen = 421; + vrLoc = 0; + }; + A2ED871409C28FBD006BD5FC /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 8D1AC9730486D14A00FE50C9 /* Info.plist */; + name = "Info.plist: 22"; + rLen = 0; + rLoc = 717; + rType = 0; + vrLen = 744; + vrLoc = 0; + }; + A2F0AA9D0A2B977F00BEF297 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 0259C577FE90428111CA0C5A /* PSMTabBarControlInspector.m */; + name = "PSMTabBarControlInspector.m: 94"; + rLen = 0; + rLoc = 3374; + rType = 0; + vrLen = 1176; + vrLoc = 0; + }; + A2F0AA9E0A2B977F00BEF297 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 0259C576FE90428111CA0C5A /* PSMTabBarControl.m */; + name = "PSMTabBarControl.m: 58"; + rLen = 0; + rLoc = 1654; + rType = 0; + vrLen = 1392; + vrLoc = 968; + }; + A2F0AA9F0A2B977F00BEF297 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 0259C57AFE90428111CA0C5A /* PSMTabBarControl.h */; + name = representedTabViewItems; + rLen = 23; + rLoc = 3408; + rType = 0; + vrLen = 1337; + vrLoc = 2496; + }; + A2F0AAA70A2B977F00BEF297 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A251BE9B0959A2530058BC7F /* ReadMe.rtfd */; + name = "ReadMe.rtfd: 82"; + rLen = 0; + rLoc = 9026; + rType = 0; + vrLen = 2005; + vrLoc = 0; + }; + A2F0DF4F09F6D68300AA839C /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A268EA6009A9831800E082AA /* PSMRolloverButton.m */; + name = "PSMRolloverButton.m: 72"; + rLen = 0; + rLoc = 1690; + rType = 0; + vrLen = 1678; + vrLoc = 918; + }; + A2F519DB09AA627E00056B6F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A2F519DC09AA627E00056B6F /* NSToolbar.h */; + name = "(null): 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 1465; + vrLoc = 0; + }; + A2F519DC09AA627E00056B6F /* NSToolbar.h */ = { + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + name = NSToolbar.h; + path = /Developer/SDKs/MacOSX10.3.9.sdk/System/Library/Frameworks/AppKit.framework/Versions/C/Headers/NSToolbar.h; + sourceTree = ""; + }; + A2F519E509AA627E00056B6F /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = A2F519E609AA627E00056B6F /* NSToolbar.h */; + name = "(null): 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 1465; + vrLoc = 0; + }; + A2F519E609AA627E00056B6F /* NSToolbar.h */ = { + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.h; + name = NSToolbar.h; + path = /Developer/SDKs/MacOSX10.3.9.sdk/System/Library/Frameworks/AppKit.framework/Versions/C/Headers/NSToolbar.h; + sourceTree = ""; + }; + A2F51A5709AA767B00056B6F /* -[NSException raise] */ = { + isa = PBXSymbolicBreakpoint; + actions = ( + ); + breakpointStyle = 0; + continueAfterActions = 0; + delayBeforeContinue = 0; + hitCount = 1; + modificationTime = 167074336.702084; + state = 1; + symbolName = "-[NSException raise]"; + }; +} diff --git a/PSMTabBarControl/PSMTabBarControl.xcodeproj/project.pbxproj b/PSMTabBarControl/PSMTabBarControl.xcodeproj/project.pbxproj new file mode 100644 index 0000000000..78cf6b6d03 --- /dev/null +++ b/PSMTabBarControl/PSMTabBarControl.xcodeproj/project.pbxproj @@ -0,0 +1,677 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 42; + objects = { + +/* Begin PBXAggregateTarget section */ + 53DF6901067E5B8E0090B5B0 /* All */ = { + isa = PBXAggregateTarget; + buildConfigurationList = C056398708A954F8003078D8 /* Build configuration list for PBXAggregateTarget "All" */; + buildPhases = ( + ); + dependencies = ( + 53DF6905067E5B930090B5B0 /* PBXTargetDependency */, + ); + name = All; + productName = All; + }; +/* End PBXAggregateTarget section */ + +/* Begin PBXBuildFile section */ + 13F8B89007B43554008AE28D /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DD92D38A0106425D02CA0E72 /* Cocoa.framework */; }; + 546DEAF1067F63070098DCC4 /* PSMTabBarControl.m in Sources */ = {isa = PBXBuildFile; fileRef = 0259C576FE90428111CA0C5A /* PSMTabBarControl.m */; }; + 546DEAF2067F630E0098DCC4 /* PSMTabBarControl.h in Headers */ = {isa = PBXBuildFile; fileRef = 0259C57AFE90428111CA0C5A /* PSMTabBarControl.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A2082A9009EAEB34009AC8BE /* PSMTabDragAssistant.h in Headers */ = {isa = PBXBuildFile; fileRef = A2082A8D09EAEB33009AC8BE /* PSMTabDragAssistant.h */; }; + A2082A9109EAEB34009AC8BE /* PSMTabDragAssistant.m in Sources */ = {isa = PBXBuildFile; fileRef = A2082A8E09EAEB33009AC8BE /* PSMTabDragAssistant.m */; }; + A2129BB209AEB58F00724E6C /* PSMProgressIndicator.h in Headers */ = {isa = PBXBuildFile; fileRef = A2129BAF09AEB58F00724E6C /* PSMProgressIndicator.h */; }; + A2129BB309AEB58F00724E6C /* PSMProgressIndicator.m in Sources */ = {isa = PBXBuildFile; fileRef = A2129BB009AEB58F00724E6C /* PSMProgressIndicator.m */; }; + A251BE850959A1B90058BC7F /* PSMOverflowPopUpButton.h in Headers */ = {isa = PBXBuildFile; fileRef = A251BE810959A1B90058BC7F /* PSMOverflowPopUpButton.h */; }; + A251BE860959A1B90058BC7F /* PSMOverflowPopUpButton.m in Sources */ = {isa = PBXBuildFile; fileRef = A251BE820959A1B90058BC7F /* PSMOverflowPopUpButton.m */; }; + A251BE870959A1B90058BC7F /* PSMTabBarCell.h in Headers */ = {isa = PBXBuildFile; fileRef = A251BE830959A1B90058BC7F /* PSMTabBarCell.h */; }; + A251BE880959A1B90058BC7F /* PSMTabBarCell.m in Sources */ = {isa = PBXBuildFile; fileRef = A251BE840959A1B90058BC7F /* PSMTabBarCell.m */; }; + A251BE960959A23A0058BC7F /* overflowImage.tiff in Resources */ = {isa = PBXBuildFile; fileRef = A251BE900959A23A0058BC7F /* overflowImage.tiff */; }; + A251BE970959A23A0058BC7F /* overflowImagePressed.tif in Resources */ = {isa = PBXBuildFile; fileRef = A251BE910959A23A0058BC7F /* overflowImagePressed.tif */; }; + A251BE980959A23A0058BC7F /* TabClose_Front_Pressed.tif in Resources */ = {isa = PBXBuildFile; fileRef = A251BE920959A23A0058BC7F /* TabClose_Front_Pressed.tif */; }; + A251BE990959A23A0058BC7F /* TabClose_Front_Rollover.tif in Resources */ = {isa = PBXBuildFile; fileRef = A251BE930959A23A0058BC7F /* TabClose_Front_Rollover.tif */; }; + A251BE9A0959A23A0058BC7F /* TabClose_Front.tif in Resources */ = {isa = PBXBuildFile; fileRef = A251BE940959A23A0058BC7F /* TabClose_Front.tif */; }; + A268E80409A9822A00E082AA /* AquaTabNew.png in Resources */ = {isa = PBXBuildFile; fileRef = A268E7F809A9822900E082AA /* AquaTabNew.png */; }; + A268E80509A9822A00E082AA /* AquaTabNewPressed.png in Resources */ = {isa = PBXBuildFile; fileRef = A268E7F909A9822900E082AA /* AquaTabNewPressed.png */; }; + A268E80609A9822A00E082AA /* AquaTabNewRollover.png in Resources */ = {isa = PBXBuildFile; fileRef = A268E7FA09A9822900E082AA /* AquaTabNewRollover.png */; }; + A268E80709A9822A00E082AA /* TabNewMetal.png in Resources */ = {isa = PBXBuildFile; fileRef = A268E7FB09A9822900E082AA /* TabNewMetal.png */; }; + A268E80809A9822A00E082AA /* TabNewMetalPressed.png in Resources */ = {isa = PBXBuildFile; fileRef = A268E7FC09A9822900E082AA /* TabNewMetalPressed.png */; }; + A268E80909A9822A00E082AA /* TabNewMetalRollover.png in Resources */ = {isa = PBXBuildFile; fileRef = A268E7FD09A9822900E082AA /* TabNewMetalRollover.png */; }; + A268EA6209A9831800E082AA /* PSMRolloverButton.h in Headers */ = {isa = PBXBuildFile; fileRef = A268EA5F09A9831800E082AA /* PSMRolloverButton.h */; }; + A268EA6309A9831800E082AA /* PSMRolloverButton.m in Sources */ = {isa = PBXBuildFile; fileRef = A268EA6009A9831800E082AA /* PSMRolloverButton.m */; }; + A27E47850A28EE76007BA395 /* TabIcon.tif in Resources */ = {isa = PBXBuildFile; fileRef = A20822F00959F6AA00C5F5A4 /* TabIcon.tif */; }; + A27E47880A28EE7C007BA395 /* TabControlRep.tif in Resources */ = {isa = PBXBuildFile; fileRef = A20822EF0959F6AA00C5F5A4 /* TabControlRep.tif */; }; + A2C0D99509AF870000ED379C /* pi.png in Resources */ = {isa = PBXBuildFile; fileRef = A2C0D99309AF870000ED379C /* pi.png */; }; + A2D32EDC09A634C900EC8662 /* PSMTabStyle.h in Headers */ = {isa = PBXBuildFile; fileRef = A2D32EDA09A634C900EC8662 /* PSMTabStyle.h */; }; + A2D32EE809A6399300EC8662 /* PSMAquaTabStyle.h in Headers */ = {isa = PBXBuildFile; fileRef = A2D32EE609A6399300EC8662 /* PSMAquaTabStyle.h */; }; + A2D32EE909A6399300EC8662 /* PSMAquaTabStyle.m in Sources */ = {isa = PBXBuildFile; fileRef = A2D32EE709A6399300EC8662 /* PSMAquaTabStyle.m */; }; + A2D32EF709A63BF700EC8662 /* AquaTabClose_Front_Pressed.tif in Resources */ = {isa = PBXBuildFile; fileRef = A2D32EF009A63BF700EC8662 /* AquaTabClose_Front_Pressed.tif */; }; + A2D32EF809A63BF700EC8662 /* AquaTabClose_Front_Rollover.tif in Resources */ = {isa = PBXBuildFile; fileRef = A2D32EF109A63BF700EC8662 /* AquaTabClose_Front_Rollover.tif */; }; + A2D32EF909A63BF700EC8662 /* AquaTabClose_Front.tif in Resources */ = {isa = PBXBuildFile; fileRef = A2D32EF209A63BF700EC8662 /* AquaTabClose_Front.tif */; }; + A2D32EFA09A63BF700EC8662 /* AquaTabsBackground.png in Resources */ = {isa = PBXBuildFile; fileRef = A2D32EF309A63BF700EC8662 /* AquaTabsBackground.png */; }; + A2D32EFB09A63BF700EC8662 /* AquaTabsDown.png in Resources */ = {isa = PBXBuildFile; fileRef = A2D32EF409A63BF700EC8662 /* AquaTabsDown.png */; }; + A2D32EFC09A63BF700EC8662 /* AquaTabsSeparator.png in Resources */ = {isa = PBXBuildFile; fileRef = A2D32EF509A63BF700EC8662 /* AquaTabsSeparator.png */; }; + A2D32EFD09A63BF700EC8662 /* AquaTabsSeparatorDown.png in Resources */ = {isa = PBXBuildFile; fileRef = A2D32EF609A63BF700EC8662 /* AquaTabsSeparatorDown.png */; }; + A2D32F0009A63D7A00EC8662 /* PSMMetalTabStyle.h in Headers */ = {isa = PBXBuildFile; fileRef = A2D32EFE09A63D7A00EC8662 /* PSMMetalTabStyle.h */; }; + A2D32F0109A63D7A00EC8662 /* PSMMetalTabStyle.m in Sources */ = {isa = PBXBuildFile; fileRef = A2D32EFF09A63D7A00EC8662 /* PSMMetalTabStyle.m */; }; + A2D3317C09A68B7500EC8662 /* AquaTabsDownGraphite.png in Resources */ = {isa = PBXBuildFile; fileRef = A2D3317A09A68B7500EC8662 /* AquaTabsDownGraphite.png */; }; + A2D3317D09A68B7500EC8662 /* AquaTabsDownNonKey.png in Resources */ = {isa = PBXBuildFile; fileRef = A2D3317B09A68B7500EC8662 /* AquaTabsDownNonKey.png */; }; + A2D98B0A0A2B432C0064C6F8 /* PSMUnifiedTabStyle.h in Headers */ = {isa = PBXBuildFile; fileRef = A2D98B070A2B432C0064C6F8 /* PSMUnifiedTabStyle.h */; }; + A2D98B0B0A2B432C0064C6F8 /* PSMUnifiedTabStyle.m in Sources */ = {isa = PBXBuildFile; fileRef = A2D98B080A2B432C0064C6F8 /* PSMUnifiedTabStyle.m */; }; + A2D98B120A2B43FA0064C6F8 /* NSBezierPath_AMShading.h in Headers */ = {isa = PBXBuildFile; fileRef = A2D98B0F0A2B43FA0064C6F8 /* NSBezierPath_AMShading.h */; }; + A2D98B130A2B43FA0064C6F8 /* NSBezierPath_AMShading.m in Sources */ = {isa = PBXBuildFile; fileRef = A2D98B100A2B43FA0064C6F8 /* NSBezierPath_AMShading.m */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 53DF6904067E5B930090B5B0 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0259C573FE90428111CA0C5A /* Project object */; + proxyType = 1; + remoteGlobalIDString = 53DF68FC067E5B5A0090B5B0; + remoteInfo = PSMTabBarControlFramework; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 0259C576FE90428111CA0C5A /* PSMTabBarControl.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; name = PSMTabBarControl.m; path = source/PSMTabBarControl.m; sourceTree = ""; }; + 0259C577FE90428111CA0C5A /* PSMTabBarControlInspector.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; name = PSMTabBarControlInspector.m; path = source/PSMTabBarControlInspector.m; sourceTree = ""; }; + 0259C578FE90428111CA0C5A /* PSMTabBarControlPalette.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; name = PSMTabBarControlPalette.m; path = source/PSMTabBarControlPalette.m; sourceTree = ""; }; + 0259C57AFE90428111CA0C5A /* PSMTabBarControl.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = PSMTabBarControl.h; path = source/PSMTabBarControl.h; sourceTree = ""; }; + 0259C57BFE90428111CA0C5A /* PSMTabBarControlInspector.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = PSMTabBarControlInspector.h; path = source/PSMTabBarControlInspector.h; sourceTree = ""; }; + 0259C57CFE90428111CA0C5A /* PSMTabBarControlPalette.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = PSMTabBarControlPalette.h; path = source/PSMTabBarControlPalette.h; sourceTree = ""; }; + 0259C57FFE90428111CA0C5A /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = English.lproj/PSMTabBarControlInspector.nib; sourceTree = ""; }; + 0259C581FE90428111CA0C5A /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = English.lproj/PSMTabBarControlPalette.nib; sourceTree = ""; }; + 0259C583FE90428111CA0C5A /* palette.table */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = palette.table; sourceTree = ""; }; + 13EB9DBD07DE0F1E00EB933A /* InterfaceBuilder.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = InterfaceBuilder.framework; path = /System/Library/Frameworks/InterfaceBuilder.framework; sourceTree = ""; }; + 13F8B88807B434F6008AE28D /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = ""; }; + 13F8B88A07B434F6008AE28D /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = ""; }; + 32DBCF980370C29C00C91783 /* PSMTabBarControl_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PSMTabBarControl_Prefix.pch; path = source/PSMTabBarControl_Prefix.pch; sourceTree = ""; }; + 53DF68FD067E5B5A0090B5B0 /* PSMTabBarControl.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = PSMTabBarControl.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 53DF68FE067E5B5A0090B5B0 /* PSMTabBarControlFramework-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = "PSMTabBarControlFramework-Info.plist"; sourceTree = ""; }; + 54D33B2806778E3300C9C163 /* PSMTabBarControl.ibclassdescription */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = PSMTabBarControl.ibclassdescription; sourceTree = ""; }; + 8D1AC9730486D14A00FE50C9 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; + 8D1AC97B0486D23100FE50C9 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = ""; }; + A2072A2409ABD88600304BCB /* Folder.tif */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = Folder.tif; path = images/Folder.tif; sourceTree = ""; }; + A2072A2509ABD88600304BCB /* Globe.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = Globe.tiff; path = images/Globe.tiff; sourceTree = ""; }; + A2072B5C09AC1FA500304BCB /* Warning.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Warning.png; path = images/Warning.png; sourceTree = ""; }; + A20822EF0959F6AA00C5F5A4 /* TabControlRep.tif */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = TabControlRep.tif; path = images/TabControlRep.tif; sourceTree = ""; }; + A20822F00959F6AA00C5F5A4 /* TabIcon.tif */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = TabIcon.tif; path = images/TabIcon.tif; sourceTree = ""; }; + A2082A8D09EAEB33009AC8BE /* PSMTabDragAssistant.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PSMTabDragAssistant.h; path = source/PSMTabDragAssistant.h; sourceTree = ""; }; + A2082A8E09EAEB33009AC8BE /* PSMTabDragAssistant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = PSMTabDragAssistant.m; path = source/PSMTabDragAssistant.m; sourceTree = ""; wrapsLines = 0; }; + A2129BAF09AEB58F00724E6C /* PSMProgressIndicator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PSMProgressIndicator.h; path = source/PSMProgressIndicator.h; sourceTree = ""; }; + A2129BB009AEB58F00724E6C /* PSMProgressIndicator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = PSMProgressIndicator.m; path = source/PSMProgressIndicator.m; sourceTree = ""; }; + A246FB040A2BD6F9005BDF7B /* PSMTabBarControlDoc.html */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.html.documentation; name = PSMTabBarControlDoc.html; path = documentation/PSMTabBarControlDoc.html; sourceTree = ""; }; + A251BE810959A1B90058BC7F /* PSMOverflowPopUpButton.h */ = {isa = PBXFileReference; explicitFileType = sourcecode.c.h; fileEncoding = 30; name = PSMOverflowPopUpButton.h; path = source/PSMOverflowPopUpButton.h; sourceTree = ""; }; + A251BE820959A1B90058BC7F /* PSMOverflowPopUpButton.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; name = PSMOverflowPopUpButton.m; path = source/PSMOverflowPopUpButton.m; sourceTree = ""; }; + A251BE830959A1B90058BC7F /* PSMTabBarCell.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = PSMTabBarCell.h; path = source/PSMTabBarCell.h; sourceTree = ""; }; + A251BE840959A1B90058BC7F /* PSMTabBarCell.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; name = PSMTabBarCell.m; path = source/PSMTabBarCell.m; sourceTree = ""; }; + A251BE890959A1EA0058BC7F /* AppController.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = AppController.h; path = source/AppController.h; sourceTree = ""; }; + A251BE8A0959A1EA0058BC7F /* AppController.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; name = AppController.m; path = source/AppController.m; sourceTree = ""; }; + A251BE8B0959A1EA0058BC7F /* FakeModel.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = FakeModel.h; path = source/FakeModel.h; sourceTree = ""; }; + A251BE8C0959A1EA0058BC7F /* FakeModel.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; name = FakeModel.m; path = source/FakeModel.m; sourceTree = ""; }; + A251BE8D0959A1EA0058BC7F /* main.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; name = main.m; path = source/main.m; sourceTree = ""; }; + A251BE8F0959A23A0058BC7F /* 32x32cancel.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = 32x32cancel.png; path = images/32x32cancel.png; sourceTree = ""; }; + A251BE900959A23A0058BC7F /* overflowImage.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = overflowImage.tiff; path = images/overflowImage.tiff; sourceTree = ""; }; + A251BE910959A23A0058BC7F /* overflowImagePressed.tif */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = overflowImagePressed.tif; path = images/overflowImagePressed.tif; sourceTree = ""; }; + A251BE920959A23A0058BC7F /* TabClose_Front_Pressed.tif */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = TabClose_Front_Pressed.tif; path = images/TabClose_Front_Pressed.tif; sourceTree = ""; }; + A251BE930959A23A0058BC7F /* TabClose_Front_Rollover.tif */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = TabClose_Front_Rollover.tif; path = images/TabClose_Front_Rollover.tif; sourceTree = ""; }; + A251BE940959A23A0058BC7F /* TabClose_Front.tif */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = TabClose_Front.tif; path = images/TabClose_Front.tif; sourceTree = ""; }; + A251BE9B0959A2530058BC7F /* ReadMe.rtfd */ = {isa = PBXFileReference; lastKnownFileType = wrapper.rtfd; path = ReadMe.rtfd; sourceTree = ""; }; + A251BEA20959BB5B0058BC7F /* TabBarControlDemo-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = "TabBarControlDemo-Info.plist"; sourceTree = ""; }; + A251BEC30959BC0E0058BC7F /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = English.lproj/MainMenu.nib; sourceTree = ""; }; + A268E7F809A9822900E082AA /* AquaTabNew.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = AquaTabNew.png; path = images/AquaTabNew.png; sourceTree = ""; }; + A268E7F909A9822900E082AA /* AquaTabNewPressed.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = AquaTabNewPressed.png; path = images/AquaTabNewPressed.png; sourceTree = ""; }; + A268E7FA09A9822900E082AA /* AquaTabNewRollover.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = AquaTabNewRollover.png; path = images/AquaTabNewRollover.png; sourceTree = ""; }; + A268E7FB09A9822900E082AA /* TabNewMetal.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = TabNewMetal.png; path = images/TabNewMetal.png; sourceTree = ""; }; + A268E7FC09A9822900E082AA /* TabNewMetalPressed.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = TabNewMetalPressed.png; path = images/TabNewMetalPressed.png; sourceTree = ""; }; + A268E7FD09A9822900E082AA /* TabNewMetalRollover.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = TabNewMetalRollover.png; path = images/TabNewMetalRollover.png; sourceTree = ""; }; + A268EA5F09A9831800E082AA /* PSMRolloverButton.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = PSMRolloverButton.h; path = source/PSMRolloverButton.h; sourceTree = ""; }; + A268EA6009A9831800E082AA /* PSMRolloverButton.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; name = PSMRolloverButton.m; path = source/PSMRolloverButton.m; sourceTree = ""; }; + A269361009A778770006911E /* 32x32_log.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = 32x32_log.tiff; path = images/32x32_log.tiff; sourceTree = ""; }; + A2A711BA09E5AE1E00D0089B /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = English.lproj/Window.nib; sourceTree = ""; }; + A2A711BD09E5BF0500D0089B /* WindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WindowController.h; path = source/WindowController.h; sourceTree = ""; }; + A2A711BE09E5BF0500D0089B /* WindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = WindowController.m; path = source/WindowController.m; sourceTree = ""; }; + A2C0D99309AF870000ED379C /* pi.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = pi.png; path = images/pi.png; sourceTree = ""; }; + A2D32EDA09A634C900EC8662 /* PSMTabStyle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PSMTabStyle.h; path = source/PSMTabStyle.h; sourceTree = ""; }; + A2D32EE609A6399300EC8662 /* PSMAquaTabStyle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PSMAquaTabStyle.h; path = source/PSMAquaTabStyle.h; sourceTree = ""; }; + A2D32EE709A6399300EC8662 /* PSMAquaTabStyle.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = PSMAquaTabStyle.m; path = source/PSMAquaTabStyle.m; sourceTree = ""; }; + A2D32EF009A63BF700EC8662 /* AquaTabClose_Front_Pressed.tif */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = AquaTabClose_Front_Pressed.tif; path = images/AquaTabClose_Front_Pressed.tif; sourceTree = ""; }; + A2D32EF109A63BF700EC8662 /* AquaTabClose_Front_Rollover.tif */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = AquaTabClose_Front_Rollover.tif; path = images/AquaTabClose_Front_Rollover.tif; sourceTree = ""; }; + A2D32EF209A63BF700EC8662 /* AquaTabClose_Front.tif */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = AquaTabClose_Front.tif; path = images/AquaTabClose_Front.tif; sourceTree = ""; }; + A2D32EF309A63BF700EC8662 /* AquaTabsBackground.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = AquaTabsBackground.png; path = images/AquaTabsBackground.png; sourceTree = ""; }; + A2D32EF409A63BF700EC8662 /* AquaTabsDown.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = AquaTabsDown.png; path = images/AquaTabsDown.png; sourceTree = ""; }; + A2D32EF509A63BF700EC8662 /* AquaTabsSeparator.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = AquaTabsSeparator.png; path = images/AquaTabsSeparator.png; sourceTree = ""; }; + A2D32EF609A63BF700EC8662 /* AquaTabsSeparatorDown.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = AquaTabsSeparatorDown.png; path = images/AquaTabsSeparatorDown.png; sourceTree = ""; }; + A2D32EFE09A63D7A00EC8662 /* PSMMetalTabStyle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PSMMetalTabStyle.h; path = source/PSMMetalTabStyle.h; sourceTree = ""; }; + A2D32EFF09A63D7A00EC8662 /* PSMMetalTabStyle.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = PSMMetalTabStyle.m; path = source/PSMMetalTabStyle.m; sourceTree = ""; }; + A2D3317A09A68B7500EC8662 /* AquaTabsDownGraphite.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = AquaTabsDownGraphite.png; path = images/AquaTabsDownGraphite.png; sourceTree = ""; }; + A2D3317B09A68B7500EC8662 /* AquaTabsDownNonKey.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = AquaTabsDownNonKey.png; path = images/AquaTabsDownNonKey.png; sourceTree = ""; }; + A2D98B070A2B432C0064C6F8 /* PSMUnifiedTabStyle.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = PSMUnifiedTabStyle.h; path = source/PSMUnifiedTabStyle.h; sourceTree = ""; }; + A2D98B080A2B432C0064C6F8 /* PSMUnifiedTabStyle.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; name = PSMUnifiedTabStyle.m; path = source/PSMUnifiedTabStyle.m; sourceTree = ""; }; + A2D98B0F0A2B43FA0064C6F8 /* NSBezierPath_AMShading.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = NSBezierPath_AMShading.h; path = source/NSBezierPath_AMShading.h; sourceTree = ""; }; + A2D98B100A2B43FA0064C6F8 /* NSBezierPath_AMShading.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; name = NSBezierPath_AMShading.m; path = source/NSBezierPath_AMShading.m; sourceTree = ""; }; + DD92D38A0106425D02CA0E72 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 53DF68FB067E5B5A0090B5B0 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 13F8B89007B43554008AE28D /* Cocoa.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 0259C574FE90428111CA0C5A /* PSMTabBarControl */ = { + isa = PBXGroup; + children = ( + A251BE9B0959A2530058BC7F /* ReadMe.rtfd */, + A246FADE0A2BD446005BDF7B /* Documentation */, + 32DBCF9E0370C38000C91783 /* Palette */, + 54D33B2C06778E4400C9C163 /* Framework */, + A251BE590959A0550058BC7F /* Demo App */, + 0259C582FE90428111CA0C5A /* Resources */, + 1ED78706FE9D4A0611CA0C5A /* Products */, + 2E58F364FFB232C311CA0CBA /* Frameworks */, + ); + name = PSMTabBarControl; + sourceTree = ""; + }; + 0259C582FE90428111CA0C5A /* Resources */ = { + isa = PBXGroup; + children = ( + A251BEC20959BC0E0058BC7F /* MainMenu.nib */, + A251BE8E0959A21A0058BC7F /* Images */, + 8D1AC9730486D14A00FE50C9 /* Info.plist */, + 53DF68FE067E5B5A0090B5B0 /* PSMTabBarControlFramework-Info.plist */, + A251BEA20959BB5B0058BC7F /* TabBarControlDemo-Info.plist */, + 8D1AC97F0486D23B00FE50C9 /* InfoPlist.strings */, + A2A711B909E5AE1E00D0089B /* Window.nib */, + ); + name = Resources; + sourceTree = ""; + }; + 131E8FE8067F80F40006E0CE /* Resources */ = { + isa = PBXGroup; + children = ( + A20822EF0959F6AA00C5F5A4 /* TabControlRep.tif */, + A20822F00959F6AA00C5F5A4 /* TabIcon.tif */, + 0259C57EFE90428111CA0C5A /* PSMTabBarControlInspector.nib */, + 0259C580FE90428111CA0C5A /* PSMTabBarControlPalette.nib */, + ); + name = Resources; + sourceTree = ""; + }; + 13F8B6FD07B43410008AE28D /* Linked Frameworks */ = { + isa = PBXGroup; + children = ( + 13EB9DBD07DE0F1E00EB933A /* InterfaceBuilder.framework */, + DD92D38A0106425D02CA0E72 /* Cocoa.framework */, + ); + name = "Linked Frameworks"; + sourceTree = ""; + }; + 13F8B70407B43425008AE28D /* Other Frameworks */ = { + isa = PBXGroup; + children = ( + 13F8B88807B434F6008AE28D /* AppKit.framework */, + 13F8B88A07B434F6008AE28D /* Foundation.framework */, + ); + name = "Other Frameworks"; + sourceTree = ""; + }; + 1ED78706FE9D4A0611CA0C5A /* Products */ = { + isa = PBXGroup; + children = ( + 53DF68FD067E5B5A0090B5B0 /* PSMTabBarControl.framework */, + ); + name = Products; + sourceTree = ""; + }; + 2E58F364FFB232C311CA0CBA /* Frameworks */ = { + isa = PBXGroup; + children = ( + 13F8B6FD07B43410008AE28D /* Linked Frameworks */, + 13F8B70407B43425008AE28D /* Other Frameworks */, + ); + name = Frameworks; + sourceTree = ""; + }; + 32DBCF9E0370C38000C91783 /* Palette */ = { + isa = PBXGroup; + children = ( + 54D33B2406778DD400C9C163 /* Undo Support */, + 54D33B2506778DF000C9C163 /* Classes */, + 32DBCF9F0370C38200C91783 /* Other Sources */, + 131E8FE8067F80F40006E0CE /* Resources */, + 0259C583FE90428111CA0C5A /* palette.table */, + ); + name = Palette; + sourceTree = ""; + }; + 32DBCF9F0370C38200C91783 /* Other Sources */ = { + isa = PBXGroup; + children = ( + 32DBCF980370C29C00C91783 /* PSMTabBarControl_Prefix.pch */, + ); + name = "Other Sources"; + sourceTree = ""; + }; + 54D33B2406778DD400C9C163 /* Undo Support */ = { + isa = PBXGroup; + children = ( + 54D33B2806778E3300C9C163 /* PSMTabBarControl.ibclassdescription */, + ); + name = "Undo Support"; + sourceTree = ""; + }; + 54D33B2506778DF000C9C163 /* Classes */ = { + isa = PBXGroup; + children = ( + 0259C57BFE90428111CA0C5A /* PSMTabBarControlInspector.h */, + 0259C577FE90428111CA0C5A /* PSMTabBarControlInspector.m */, + 0259C57CFE90428111CA0C5A /* PSMTabBarControlPalette.h */, + 0259C578FE90428111CA0C5A /* PSMTabBarControlPalette.m */, + ); + name = Classes; + sourceTree = ""; + }; + 54D33B2C06778E4400C9C163 /* Framework */ = { + isa = PBXGroup; + children = ( + 0259C57AFE90428111CA0C5A /* PSMTabBarControl.h */, + 0259C576FE90428111CA0C5A /* PSMTabBarControl.m */, + A251BE830959A1B90058BC7F /* PSMTabBarCell.h */, + A251BE840959A1B90058BC7F /* PSMTabBarCell.m */, + A2D32EDA09A634C900EC8662 /* PSMTabStyle.h */, + A2D32EE609A6399300EC8662 /* PSMAquaTabStyle.h */, + A2D32EE709A6399300EC8662 /* PSMAquaTabStyle.m */, + A2D32EFE09A63D7A00EC8662 /* PSMMetalTabStyle.h */, + A2D32EFF09A63D7A00EC8662 /* PSMMetalTabStyle.m */, + A2D98B070A2B432C0064C6F8 /* PSMUnifiedTabStyle.h */, + A2D98B080A2B432C0064C6F8 /* PSMUnifiedTabStyle.m */, + A268EA5F09A9831800E082AA /* PSMRolloverButton.h */, + A268EA6009A9831800E082AA /* PSMRolloverButton.m */, + A251BE810959A1B90058BC7F /* PSMOverflowPopUpButton.h */, + A251BE820959A1B90058BC7F /* PSMOverflowPopUpButton.m */, + A2129BAF09AEB58F00724E6C /* PSMProgressIndicator.h */, + A2129BB009AEB58F00724E6C /* PSMProgressIndicator.m */, + A2082A8D09EAEB33009AC8BE /* PSMTabDragAssistant.h */, + A2082A8E09EAEB33009AC8BE /* PSMTabDragAssistant.m */, + A2D98B0F0A2B43FA0064C6F8 /* NSBezierPath_AMShading.h */, + A2D98B100A2B43FA0064C6F8 /* NSBezierPath_AMShading.m */, + ); + name = Framework; + sourceTree = ""; + }; + A246FADE0A2BD446005BDF7B /* Documentation */ = { + isa = PBXGroup; + children = ( + A246FB040A2BD6F9005BDF7B /* PSMTabBarControlDoc.html */, + ); + name = Documentation; + sourceTree = ""; + }; + A251BE590959A0550058BC7F /* Demo App */ = { + isa = PBXGroup; + children = ( + A251BE890959A1EA0058BC7F /* AppController.h */, + A251BE8A0959A1EA0058BC7F /* AppController.m */, + A2A711BD09E5BF0500D0089B /* WindowController.h */, + A2A711BE09E5BF0500D0089B /* WindowController.m */, + A251BE8B0959A1EA0058BC7F /* FakeModel.h */, + A251BE8C0959A1EA0058BC7F /* FakeModel.m */, + A251BE8D0959A1EA0058BC7F /* main.m */, + ); + name = "Demo App"; + sourceTree = ""; + }; + A251BE8E0959A21A0058BC7F /* Images */ = { + isa = PBXGroup; + children = ( + A2C0D99309AF870000ED379C /* pi.png */, + A2072B5C09AC1FA500304BCB /* Warning.png */, + A2072A2409ABD88600304BCB /* Folder.tif */, + A2072A2509ABD88600304BCB /* Globe.tiff */, + A268E7F809A9822900E082AA /* AquaTabNew.png */, + A268E7F909A9822900E082AA /* AquaTabNewPressed.png */, + A268E7FA09A9822900E082AA /* AquaTabNewRollover.png */, + A268E7FB09A9822900E082AA /* TabNewMetal.png */, + A268E7FC09A9822900E082AA /* TabNewMetalPressed.png */, + A268E7FD09A9822900E082AA /* TabNewMetalRollover.png */, + A269361009A778770006911E /* 32x32_log.tiff */, + A2D3317A09A68B7500EC8662 /* AquaTabsDownGraphite.png */, + A2D3317B09A68B7500EC8662 /* AquaTabsDownNonKey.png */, + A2D32EF009A63BF700EC8662 /* AquaTabClose_Front_Pressed.tif */, + A2D32EF109A63BF700EC8662 /* AquaTabClose_Front_Rollover.tif */, + A2D32EF209A63BF700EC8662 /* AquaTabClose_Front.tif */, + A2D32EF309A63BF700EC8662 /* AquaTabsBackground.png */, + A2D32EF409A63BF700EC8662 /* AquaTabsDown.png */, + A2D32EF509A63BF700EC8662 /* AquaTabsSeparator.png */, + A2D32EF609A63BF700EC8662 /* AquaTabsSeparatorDown.png */, + A251BE8F0959A23A0058BC7F /* 32x32cancel.png */, + A251BE900959A23A0058BC7F /* overflowImage.tiff */, + A251BE910959A23A0058BC7F /* overflowImagePressed.tif */, + A251BE920959A23A0058BC7F /* TabClose_Front_Pressed.tif */, + A251BE930959A23A0058BC7F /* TabClose_Front_Rollover.tif */, + A251BE940959A23A0058BC7F /* TabClose_Front.tif */, + ); + name = Images; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 53DF68F8067E5B5A0090B5B0 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 546DEAF2067F630E0098DCC4 /* PSMTabBarControl.h in Headers */, + A251BE850959A1B90058BC7F /* PSMOverflowPopUpButton.h in Headers */, + A251BE870959A1B90058BC7F /* PSMTabBarCell.h in Headers */, + A2D32EDC09A634C900EC8662 /* PSMTabStyle.h in Headers */, + A2D32EE809A6399300EC8662 /* PSMAquaTabStyle.h in Headers */, + A2D32F0009A63D7A00EC8662 /* PSMMetalTabStyle.h in Headers */, + A268EA6209A9831800E082AA /* PSMRolloverButton.h in Headers */, + A2129BB209AEB58F00724E6C /* PSMProgressIndicator.h in Headers */, + A2082A9009EAEB34009AC8BE /* PSMTabDragAssistant.h in Headers */, + A2D98B0A0A2B432C0064C6F8 /* PSMUnifiedTabStyle.h in Headers */, + A2D98B120A2B43FA0064C6F8 /* NSBezierPath_AMShading.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 53DF68FC067E5B5A0090B5B0 /* PSMTabBarControlFramework */ = { + isa = PBXNativeTarget; + buildConfigurationList = C056397F08A954F8003078D8 /* Build configuration list for PBXNativeTarget "PSMTabBarControlFramework" */; + buildPhases = ( + 53DF68F8067E5B5A0090B5B0 /* Headers */, + 53DF68F9067E5B5A0090B5B0 /* Resources */, + 53DF68FA067E5B5A0090B5B0 /* Sources */, + 53DF68FB067E5B5A0090B5B0 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = PSMTabBarControlFramework; + productName = PSMTabBarControlFramework; + productReference = 53DF68FD067E5B5A0090B5B0 /* PSMTabBarControl.framework */; + productType = "com.apple.product-type.framework"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 0259C573FE90428111CA0C5A /* Project object */ = { + isa = PBXProject; + buildConfigurationList = C056398B08A954F8003078D8 /* Build configuration list for PBXProject "PSMTabBarControl" */; + hasScannedForEncodings = 1; + mainGroup = 0259C574FE90428111CA0C5A /* PSMTabBarControl */; + projectDirPath = ""; + targets = ( + 53DF68FC067E5B5A0090B5B0 /* PSMTabBarControlFramework */, + 53DF6901067E5B8E0090B5B0 /* All */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 53DF68F9067E5B5A0090B5B0 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + A251BE960959A23A0058BC7F /* overflowImage.tiff in Resources */, + A251BE970959A23A0058BC7F /* overflowImagePressed.tif in Resources */, + A251BE980959A23A0058BC7F /* TabClose_Front_Pressed.tif in Resources */, + A251BE990959A23A0058BC7F /* TabClose_Front_Rollover.tif in Resources */, + A251BE9A0959A23A0058BC7F /* TabClose_Front.tif in Resources */, + A2D32EF709A63BF700EC8662 /* AquaTabClose_Front_Pressed.tif in Resources */, + A2D32EF809A63BF700EC8662 /* AquaTabClose_Front_Rollover.tif in Resources */, + A2D32EF909A63BF700EC8662 /* AquaTabClose_Front.tif in Resources */, + A2D32EFA09A63BF700EC8662 /* AquaTabsBackground.png in Resources */, + A2D32EFB09A63BF700EC8662 /* AquaTabsDown.png in Resources */, + A2D32EFC09A63BF700EC8662 /* AquaTabsSeparator.png in Resources */, + A2D32EFD09A63BF700EC8662 /* AquaTabsSeparatorDown.png in Resources */, + A2D3317C09A68B7500EC8662 /* AquaTabsDownGraphite.png in Resources */, + A2D3317D09A68B7500EC8662 /* AquaTabsDownNonKey.png in Resources */, + A268E80409A9822A00E082AA /* AquaTabNew.png in Resources */, + A268E80509A9822A00E082AA /* AquaTabNewPressed.png in Resources */, + A268E80609A9822A00E082AA /* AquaTabNewRollover.png in Resources */, + A268E80709A9822A00E082AA /* TabNewMetal.png in Resources */, + A268E80809A9822A00E082AA /* TabNewMetalPressed.png in Resources */, + A268E80909A9822A00E082AA /* TabNewMetalRollover.png in Resources */, + A2C0D99509AF870000ED379C /* pi.png in Resources */, + A27E47850A28EE76007BA395 /* TabIcon.tif in Resources */, + A27E47880A28EE7C007BA395 /* TabControlRep.tif in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 53DF68FA067E5B5A0090B5B0 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 546DEAF1067F63070098DCC4 /* PSMTabBarControl.m in Sources */, + A251BE860959A1B90058BC7F /* PSMOverflowPopUpButton.m in Sources */, + A251BE880959A1B90058BC7F /* PSMTabBarCell.m in Sources */, + A2D32EE909A6399300EC8662 /* PSMAquaTabStyle.m in Sources */, + A2D32F0109A63D7A00EC8662 /* PSMMetalTabStyle.m in Sources */, + A268EA6309A9831800E082AA /* PSMRolloverButton.m in Sources */, + A2129BB309AEB58F00724E6C /* PSMProgressIndicator.m in Sources */, + A2082A9109EAEB34009AC8BE /* PSMTabDragAssistant.m in Sources */, + A2D98B0B0A2B432C0064C6F8 /* PSMUnifiedTabStyle.m in Sources */, + A2D98B130A2B43FA0064C6F8 /* NSBezierPath_AMShading.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 53DF6905067E5B930090B5B0 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 53DF68FC067E5B5A0090B5B0 /* PSMTabBarControlFramework */; + targetProxy = 53DF6904067E5B930090B5B0 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 0259C57EFE90428111CA0C5A /* PSMTabBarControlInspector.nib */ = { + isa = PBXVariantGroup; + children = ( + 0259C57FFE90428111CA0C5A /* English */, + ); + name = PSMTabBarControlInspector.nib; + sourceTree = ""; + }; + 0259C580FE90428111CA0C5A /* PSMTabBarControlPalette.nib */ = { + isa = PBXVariantGroup; + children = ( + 0259C581FE90428111CA0C5A /* English */, + ); + name = PSMTabBarControlPalette.nib; + sourceTree = ""; + }; + 8D1AC97F0486D23B00FE50C9 /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + 8D1AC97B0486D23100FE50C9 /* English */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; + A251BEC20959BC0E0058BC7F /* MainMenu.nib */ = { + isa = PBXVariantGroup; + children = ( + A251BEC30959BC0E0058BC7F /* English */, + ); + name = MainMenu.nib; + sourceTree = ""; + }; + A2A711B909E5AE1E00D0089B /* Window.nib */ = { + isa = PBXVariantGroup; + children = ( + A2A711BA09E5AE1E00D0089B /* English */, + ); + name = Window.nib; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + C056398008A954F8003078D8 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = ( + ppc, + i386, + ); + COPY_PHASE_STRIP = NO; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + FRAMEWORK_VERSION = A; + GCC_DYNAMIC_NO_PIC = NO; + GCC_ENABLE_FIX_AND_CONTINUE = YES; + GCC_MODEL_TUNING = G5; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/AppKit.framework/Headers/AppKit.h"; + INFOPLIST_FILE = "PSMTabBarControlFramework-Info.plist"; + INSTALL_PATH = "@executable_path/../Frameworks"; + OTHER_LDFLAGS = ( + "-seg1addr", + 0xc0000000, + ); + PRODUCT_NAME = PSMTabBarControl; + SYMROOT = ../build; + ZERO_LINK = NO; + }; + name = Debug; + }; + C056398108A954F8003078D8 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = ( + ppc, + i386, + ); + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + FRAMEWORK_VERSION = A; + GCC_GENERATE_DEBUGGING_SYMBOLS = NO; + GCC_MODEL_TUNING = G5; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/AppKit.framework/Headers/AppKit.h"; + INFOPLIST_FILE = "PSMTabBarControlFramework-Info.plist"; + INSTALL_PATH = "@executable_path/../Frameworks"; + OTHER_LDFLAGS = ( + "-seg1addr", + 0xc0000000, + ); + PRODUCT_NAME = PSMTabBarControl; + SYMROOT = ../build; + }; + name = Release; + }; + C056398808A954F8003078D8 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = NO; + GCC_DYNAMIC_NO_PIC = NO; + GCC_ENABLE_FIX_AND_CONTINUE = YES; + GCC_MODEL_TUNING = G5; + GCC_OPTIMIZATION_LEVEL = 0; + PRODUCT_NAME = All; + WARNING_CFLAGS = ( + "-Wmost", + "-Wno-four-char-constants", + "-Wno-unknown-pragmas", + ); + ZERO_LINK = YES; + }; + name = Debug; + }; + C056398908A954F8003078D8 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = ( + ppc, + i386, + ); + GCC_GENERATE_DEBUGGING_SYMBOLS = NO; + GCC_MODEL_TUNING = G5; + PRODUCT_NAME = All; + WARNING_CFLAGS = ( + "-Wmost", + "-Wno-four-char-constants", + "-Wno-unknown-pragmas", + ); + }; + name = Release; + }; + C056398C08A954F8003078D8 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + PREBINDING = NO; + SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk; + }; + name = Debug; + }; + C056398D08A954F8003078D8 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + PREBINDING = NO; + SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + C056397F08A954F8003078D8 /* Build configuration list for PBXNativeTarget "PSMTabBarControlFramework" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C056398008A954F8003078D8 /* Debug */, + C056398108A954F8003078D8 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + C056398708A954F8003078D8 /* Build configuration list for PBXAggregateTarget "All" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C056398808A954F8003078D8 /* Debug */, + C056398908A954F8003078D8 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + C056398B08A954F8003078D8 /* Build configuration list for PBXProject "PSMTabBarControl" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C056398C08A954F8003078D8 /* Debug */, + C056398D08A954F8003078D8 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 0259C573FE90428111CA0C5A /* Project object */; +} diff --git a/PSMTabBarControl/PSMTabBarControl.xcodeproj/winckler.mode1 b/PSMTabBarControl/PSMTabBarControl.xcodeproj/winckler.mode1 new file mode 100644 index 0000000000..fc778d781a --- /dev/null +++ b/PSMTabBarControl/PSMTabBarControl.xcodeproj/winckler.mode1 @@ -0,0 +1,1330 @@ + + + + + ActivePerspectiveName + Project + AllowedModules + + + BundleLoadPath + + MaxInstances + n + Module + PBXSmartGroupTreeModule + Name + Groups and Files Outline View + + + BundleLoadPath + + MaxInstances + n + Module + PBXNavigatorGroup + Name + Editor + + + BundleLoadPath + + MaxInstances + n + Module + XCTaskListModule + Name + Task List + + + BundleLoadPath + + MaxInstances + n + Module + XCDetailModule + Name + File and Smart Group Detail Viewer + + + BundleLoadPath + + MaxInstances + 1 + Module + PBXBuildResultsModule + Name + Detailed Build Results Viewer + + + BundleLoadPath + + MaxInstances + 1 + Module + PBXProjectFindModule + Name + Project Batch Find Tool + + + BundleLoadPath + + MaxInstances + n + Module + PBXRunSessionModule + Name + Run Log + + + BundleLoadPath + + MaxInstances + n + Module + PBXBookmarksModule + Name + Bookmarks Tool + + + BundleLoadPath + + MaxInstances + n + Module + PBXClassBrowserModule + Name + Class Browser + + + BundleLoadPath + + MaxInstances + n + Module + PBXCVSModule + Name + Source Code Control Tool + + + BundleLoadPath + + MaxInstances + n + Module + PBXDebugBreakpointsModule + Name + Debug Breakpoints Tool + + + BundleLoadPath + + MaxInstances + n + Module + XCDockableInspector + Name + Inspector + + + BundleLoadPath + + MaxInstances + n + Module + PBXOpenQuicklyModule + Name + Open Quickly Tool + + + BundleLoadPath + + MaxInstances + 1 + Module + PBXDebugSessionModule + Name + Debugger + + + BundleLoadPath + + MaxInstances + 1 + Module + PBXDebugCLIModule + Name + Debug Console + + + Description + DefaultDescriptionKey + DockingSystemVisible + + Extension + mode1 + FavBarConfig + + PBXProjectModuleGUID + 1D82C60D0AC093AF00AAD418 + XCBarModuleItemNames + + XCBarModuleItems + + + FirstTimeWindowDisplayed + + Identifier + com.apple.perspectives.project.mode1 + MajorVersion + 31 + MinorVersion + 1 + Name + Default + Notifications + + OpenEditors + + PerspectiveWidths + + -1 + -1 + + Perspectives + + + ChosenToolbarItems + + active-target-popup + active-buildstyle-popup + action + NSToolbarFlexibleSpaceItem + buildOrClean + build-and-runOrDebug + com.apple.ide.PBXToolbarStopButton + get-info + toggle-editor + NSToolbarFlexibleSpaceItem + com.apple.pbx.toolbar.searchfield + + ControllerClassBaseName + + IconName + WindowOfProjectWithEditor + Identifier + perspective.project + IsVertical + + Layout + + + BecomeActive + + ContentConfiguration + + PBXBottomSmartGroupGIDs + + 1C37FBAC04509CD000000102 + 1C37FAAC04509CD000000102 + 1C08E77C0454961000C914BD + 1C37FABC05509CD000000102 + 1C37FABC05539CD112110102 + E2644B35053B69B200211256 + 1C37FABC04509CD000100104 + 1CC0EA4004350EF90044410B + 1CC0EA4004350EF90041110B + + PBXProjectModuleGUID + 1CE0B1FE06471DED0097A5F4 + PBXProjectModuleLabel + Files + PBXProjectStructureProvided + yes + PBXSmartGroupTreeModuleColumnData + + PBXSmartGroupTreeModuleColumnWidthsKey + + 186 + + PBXSmartGroupTreeModuleColumnsKey_v4 + + MainColumn + + + PBXSmartGroupTreeModuleOutlineStateKey_v7 + + PBXSmartGroupTreeModuleOutlineStateExpansionKey + + 0259C574FE90428111CA0C5A + 1C37FBAC04509CD000000102 + 1C37FABC05509CD000000102 + + PBXSmartGroupTreeModuleOutlineStateSelectionKey + + + 9 + + + PBXSmartGroupTreeModuleOutlineStateVisibleRectKey + {{0, 0}, {186, 338}} + + PBXTopSmartGroupGIDs + + XCIncludePerspectivesSwitch + + XCSharingToken + com.apple.Xcode.GFSharingToken + + GeometryConfiguration + + Frame + {{0, 0}, {203, 356}} + GroupTreeTableConfiguration + + MainColumn + 186 + + RubberWindowFrame + 160 82 690 397 0 0 1024 746 + + Module + PBXSmartGroupTreeModule + Proportion + 203pt + + + Dock + + + ContentConfiguration + + PBXProjectModuleGUID + 1CE0B20306471E060097A5F4 + PBXProjectModuleLabel + MyNewFile14.java + PBXSplitModuleInNavigatorKey + + Split0 + + PBXProjectModuleGUID + 1CE0B20406471E060097A5F4 + PBXProjectModuleLabel + MyNewFile14.java + + SplitCount + 1 + + StatusBarVisibility + + + GeometryConfiguration + + Frame + {{0, 0}, {482, 0}} + RubberWindowFrame + 160 82 690 397 0 0 1024 746 + + Module + PBXNavigatorGroup + Proportion + 0pt + + + ContentConfiguration + + PBXProjectModuleGUID + 1CE0B20506471E060097A5F4 + PBXProjectModuleLabel + Detail + + GeometryConfiguration + + Frame + {{0, 5}, {482, 351}} + RubberWindowFrame + 160 82 690 397 0 0 1024 746 + + Module + XCDetailModule + Proportion + 351pt + + + Proportion + 482pt + + + Name + Project + ServiceClasses + + XCModuleDock + PBXSmartGroupTreeModule + XCModuleDock + PBXNavigatorGroup + XCDetailModule + + TableOfContents + + 1D493DC50C5253D100AB718C + 1CE0B1FE06471DED0097A5F4 + 1D493DC60C5253D100AB718C + 1CE0B20306471E060097A5F4 + 1CE0B20506471E060097A5F4 + + ToolbarConfiguration + xcode.toolbar.config.default + + + ControllerClassBaseName + + IconName + WindowOfProject + Identifier + perspective.morph + IsVertical + 0 + Layout + + + BecomeActive + 1 + ContentConfiguration + + PBXBottomSmartGroupGIDs + + 1C37FBAC04509CD000000102 + 1C37FAAC04509CD000000102 + 1C08E77C0454961000C914BD + 1C37FABC05509CD000000102 + 1C37FABC05539CD112110102 + E2644B35053B69B200211256 + 1C37FABC04509CD000100104 + 1CC0EA4004350EF90044410B + 1CC0EA4004350EF90041110B + + PBXProjectModuleGUID + 11E0B1FE06471DED0097A5F4 + PBXProjectModuleLabel + Files + PBXProjectStructureProvided + yes + PBXSmartGroupTreeModuleColumnData + + PBXSmartGroupTreeModuleColumnWidthsKey + + 186 + + PBXSmartGroupTreeModuleColumnsKey_v4 + + MainColumn + + + PBXSmartGroupTreeModuleOutlineStateKey_v7 + + PBXSmartGroupTreeModuleOutlineStateExpansionKey + + 29B97314FDCFA39411CA2CEA + 1C37FABC05509CD000000102 + + PBXSmartGroupTreeModuleOutlineStateSelectionKey + + + 0 + + + PBXSmartGroupTreeModuleOutlineStateVisibleRectKey + {{0, 0}, {186, 337}} + + PBXTopSmartGroupGIDs + + XCIncludePerspectivesSwitch + 1 + XCSharingToken + com.apple.Xcode.GFSharingToken + + GeometryConfiguration + + Frame + {{0, 0}, {203, 355}} + GroupTreeTableConfiguration + + MainColumn + 186 + + RubberWindowFrame + 373 269 690 397 0 0 1440 878 + + Module + PBXSmartGroupTreeModule + Proportion + 100% + + + Name + Morph + PreferredWidth + 300 + ServiceClasses + + XCModuleDock + PBXSmartGroupTreeModule + + TableOfContents + + 11E0B1FE06471DED0097A5F4 + + ToolbarConfiguration + xcode.toolbar.config.default.short + + + PerspectivesBarVisible + + ShelfIsVisible + + SourceDescription + file at '/System/Library/PrivateFrameworks/DevToolsInterface.framework/Versions/A/Resources/XCPerspectivesSpecificationMode1.xcperspec' + StatusbarIsVisible + + TimeStamp + 0.0 + ToolbarDisplayMode + 1 + ToolbarIsVisible + + ToolbarSizeMode + 1 + Type + Perspectives + UpdateMessage + The Default Workspace in this version of Xcode now includes support to hide and show the detail view (what has been referred to as the "Metro-Morph" feature). You must discard your current Default Workspace settings and update to the latest Default Workspace in order to gain this feature. Do you wish to update to the latest Workspace defaults for project '%@'? + WindowJustification + 5 + WindowOrderList + + 1D82C60E0AC093AF00AAD418 + /Users/winckler/Projects/vim70/src/MacVim/PSMTabBarControl/PSMTabBarControl.xcodeproj + + WindowString + 160 82 690 397 0 0 1024 746 + WindowTools + + + FirstTimeWindowDisplayed + + Identifier + windowTool.build + IsVertical + + Layout + + + Dock + + + ContentConfiguration + + PBXProjectModuleGUID + 1CD0528F0623707200166675 + PBXProjectModuleLabel + + StatusBarVisibility + + + GeometryConfiguration + + Frame + {{0, 0}, {500, 218}} + RubberWindowFrame + 188 201 500 500 0 0 1024 746 + + Module + PBXNavigatorGroup + Proportion + 218pt + + + ContentConfiguration + + PBXProjectModuleGUID + XCMainBuildResultsModuleGUID + PBXProjectModuleLabel + Build + XCBuildResultsTrigger_Collapse + 1021 + XCBuildResultsTrigger_Open + 1011 + + GeometryConfiguration + + Frame + {{0, 223}, {500, 236}} + RubberWindowFrame + 188 201 500 500 0 0 1024 746 + + Module + PBXBuildResultsModule + Proportion + 236pt + + + Proportion + 459pt + + + Name + Build Results + ServiceClasses + + PBXBuildResultsModule + + StatusbarIsVisible + + TableOfContents + + 1D82C60E0AC093AF00AAD418 + 1D493DC70C5253D100AB718C + 1CD0528F0623707200166675 + XCMainBuildResultsModuleGUID + + ToolbarConfiguration + xcode.toolbar.config.build + WindowString + 188 201 500 500 0 0 1024 746 + WindowToolGUID + 1D82C60E0AC093AF00AAD418 + WindowToolIsVisible + + + + Identifier + windowTool.debugger + Layout + + + Dock + + + ContentConfiguration + + Debugger + + HorizontalSplitView + + _collapsingFrameDimension + 0.0 + _indexOfCollapsedView + 0 + _percentageOfCollapsedView + 0.0 + isCollapsed + yes + sizes + + {{0, 0}, {317, 164}} + {{317, 0}, {377, 164}} + + + VerticalSplitView + + _collapsingFrameDimension + 0.0 + _indexOfCollapsedView + 0 + _percentageOfCollapsedView + 0.0 + isCollapsed + yes + sizes + + {{0, 0}, {694, 164}} + {{0, 164}, {694, 216}} + + + + LauncherConfigVersion + 8 + PBXProjectModuleGUID + 1C162984064C10D400B95A72 + PBXProjectModuleLabel + Debug - GLUTExamples (Underwater) + + GeometryConfiguration + + DebugConsoleDrawerSize + {100, 120} + DebugConsoleVisible + None + DebugConsoleWindowFrame + {{200, 200}, {500, 300}} + DebugSTDIOWindowFrame + {{200, 200}, {500, 300}} + Frame + {{0, 0}, {694, 380}} + RubberWindowFrame + 321 238 694 422 0 0 1440 878 + + Module + PBXDebugSessionModule + Proportion + 100% + + + Proportion + 100% + + + Name + Debugger + ServiceClasses + + PBXDebugSessionModule + + StatusbarIsVisible + 1 + TableOfContents + + 1CD10A99069EF8BA00B06720 + 1C0AD2AB069F1E9B00FABCE6 + 1C162984064C10D400B95A72 + 1C0AD2AC069F1E9B00FABCE6 + + ToolbarConfiguration + xcode.toolbar.config.debug + WindowString + 321 238 694 422 0 0 1440 878 + WindowToolGUID + 1CD10A99069EF8BA00B06720 + WindowToolIsVisible + 0 + + + Identifier + windowTool.find + Layout + + + Dock + + + Dock + + + ContentConfiguration + + PBXProjectModuleGUID + 1CDD528C0622207200134675 + PBXProjectModuleLabel + <No Editor> + PBXSplitModuleInNavigatorKey + + Split0 + + PBXProjectModuleGUID + 1CD0528D0623707200166675 + + SplitCount + 1 + + StatusBarVisibility + 1 + + GeometryConfiguration + + Frame + {{0, 0}, {781, 167}} + RubberWindowFrame + 62 385 781 470 0 0 1440 878 + + Module + PBXNavigatorGroup + Proportion + 781pt + + + Proportion + 50% + + + BecomeActive + 1 + ContentConfiguration + + PBXProjectModuleGUID + 1CD0528E0623707200166675 + PBXProjectModuleLabel + Project Find + + GeometryConfiguration + + Frame + {{8, 0}, {773, 254}} + RubberWindowFrame + 62 385 781 470 0 0 1440 878 + + Module + PBXProjectFindModule + Proportion + 50% + + + Proportion + 428pt + + + Name + Project Find + ServiceClasses + + PBXProjectFindModule + + StatusbarIsVisible + 1 + TableOfContents + + 1C530D57069F1CE1000CFCEE + 1C530D58069F1CE1000CFCEE + 1C530D59069F1CE1000CFCEE + 1CDD528C0622207200134675 + 1C530D5A069F1CE1000CFCEE + 1CE0B1FE06471DED0097A5F4 + 1CD0528E0623707200166675 + + WindowString + 62 385 781 470 0 0 1440 878 + WindowToolGUID + 1C530D57069F1CE1000CFCEE + WindowToolIsVisible + 0 + + + Identifier + MENUSEPARATOR + + + Identifier + windowTool.debuggerConsole + Layout + + + Dock + + + BecomeActive + 1 + ContentConfiguration + + PBXProjectModuleGUID + 1C78EAAC065D492600B07095 + PBXProjectModuleLabel + Debugger Console + + GeometryConfiguration + + Frame + {{0, 0}, {440, 358}} + RubberWindowFrame + 650 41 440 400 0 0 1280 1002 + + Module + PBXDebugCLIModule + Proportion + 358pt + + + Proportion + 358pt + + + Name + Debugger Console + ServiceClasses + + PBXDebugCLIModule + + StatusbarIsVisible + 1 + TableOfContents + + 1C78EAAD065D492600B07095 + 1C78EAAE065D492600B07095 + 1C78EAAC065D492600B07095 + + WindowString + 650 41 440 400 0 0 1280 1002 + + + FirstTimeWindowDisplayed + + Identifier + windowTool.run + IsVertical + + Layout + + + Dock + + + ContentConfiguration + + LauncherConfigVersion + 3 + PBXProjectModuleGUID + 1CD0528B0623707200166675 + PBXProjectModuleLabel + Run + Runner + + HorizontalSplitView + + _collapsingFrameDimension + 0.0 + _indexOfCollapsedView + 0 + _percentageOfCollapsedView + 0.0 + isCollapsed + yes + sizes + + {{0, 0}, {493, 167}} + {{0, 176}, {493, 267}} + + + VerticalSplitView + + _collapsingFrameDimension + 0.0 + _indexOfCollapsedView + 0 + _percentageOfCollapsedView + 0.0 + isCollapsed + yes + sizes + + {{0, 0}, {405, 443}} + {{414, 0}, {514, 443}} + + + + + GeometryConfiguration + + Frame + {{0, 0}, {459, 159}} + RubberWindowFrame + 188 501 459 200 0 0 1024 746 + + Module + PBXRunSessionModule + Proportion + 159pt + + + Proportion + 159pt + + + Name + Run Log + ServiceClasses + + PBXRunSessionModule + + StatusbarIsVisible + + TableOfContents + + 1C0AD2B3069F1EA900FABCE6 + 1DE46F2A0BAB3A66004EEB67 + 1CD0528B0623707200166675 + 1DE46F2B0BAB3A66004EEB67 + + ToolbarConfiguration + xcode.toolbar.config.run + WindowString + 188 501 459 200 0 0 1024 746 + WindowToolGUID + 1C0AD2B3069F1EA900FABCE6 + WindowToolIsVisible + + + + Identifier + windowTool.scm + Layout + + + Dock + + + ContentConfiguration + + PBXProjectModuleGUID + 1C78EAB2065D492600B07095 + PBXProjectModuleLabel + <No Editor> + PBXSplitModuleInNavigatorKey + + Split0 + + PBXProjectModuleGUID + 1C78EAB3065D492600B07095 + + SplitCount + 1 + + StatusBarVisibility + 1 + + GeometryConfiguration + + Frame + {{0, 0}, {452, 0}} + RubberWindowFrame + 743 379 452 308 0 0 1280 1002 + + Module + PBXNavigatorGroup + Proportion + 0pt + + + BecomeActive + 1 + ContentConfiguration + + PBXProjectModuleGUID + 1CD052920623707200166675 + PBXProjectModuleLabel + SCM + + GeometryConfiguration + + ConsoleFrame + {{0, 259}, {452, 0}} + Frame + {{0, 7}, {452, 259}} + RubberWindowFrame + 743 379 452 308 0 0 1280 1002 + TableConfiguration + + Status + 30 + FileName + 199 + Path + 197.09500122070312 + + TableFrame + {{0, 0}, {452, 250}} + + Module + PBXCVSModule + Proportion + 262pt + + + Proportion + 266pt + + + Name + SCM + ServiceClasses + + PBXCVSModule + + StatusbarIsVisible + 1 + TableOfContents + + 1C78EAB4065D492600B07095 + 1C78EAB5065D492600B07095 + 1C78EAB2065D492600B07095 + 1CD052920623707200166675 + + ToolbarConfiguration + xcode.toolbar.config.scm + WindowString + 743 379 452 308 0 0 1280 1002 + + + Identifier + windowTool.breakpoints + IsVertical + 0 + Layout + + + Dock + + + BecomeActive + 1 + ContentConfiguration + + PBXBottomSmartGroupGIDs + + 1C77FABC04509CD000000102 + + PBXProjectModuleGUID + 1CE0B1FE06471DED0097A5F4 + PBXProjectModuleLabel + Files + PBXProjectStructureProvided + no + PBXSmartGroupTreeModuleColumnData + + PBXSmartGroupTreeModuleColumnWidthsKey + + 168 + + PBXSmartGroupTreeModuleColumnsKey_v4 + + MainColumn + + + PBXSmartGroupTreeModuleOutlineStateKey_v7 + + PBXSmartGroupTreeModuleOutlineStateExpansionKey + + 1C77FABC04509CD000000102 + + PBXSmartGroupTreeModuleOutlineStateSelectionKey + + + 0 + + + PBXSmartGroupTreeModuleOutlineStateVisibleRectKey + {{0, 0}, {168, 350}} + + PBXTopSmartGroupGIDs + + XCIncludePerspectivesSwitch + 0 + + GeometryConfiguration + + Frame + {{0, 0}, {185, 368}} + GroupTreeTableConfiguration + + MainColumn + 168 + + RubberWindowFrame + 315 424 744 409 0 0 1440 878 + + Module + PBXSmartGroupTreeModule + Proportion + 185pt + + + ContentConfiguration + + PBXProjectModuleGUID + 1CA1AED706398EBD00589147 + PBXProjectModuleLabel + Detail + + GeometryConfiguration + + Frame + {{190, 0}, {554, 368}} + RubberWindowFrame + 315 424 744 409 0 0 1440 878 + + Module + XCDetailModule + Proportion + 554pt + + + Proportion + 368pt + + + MajorVersion + 2 + MinorVersion + 0 + Name + Breakpoints + ServiceClasses + + PBXSmartGroupTreeModule + XCDetailModule + + StatusbarIsVisible + 1 + TableOfContents + + 1CDDB66807F98D9800BB5817 + 1CDDB66907F98D9800BB5817 + 1CE0B1FE06471DED0097A5F4 + 1CA1AED706398EBD00589147 + + ToolbarConfiguration + xcode.toolbar.config.breakpoints + WindowString + 315 424 744 409 0 0 1440 878 + WindowToolGUID + 1CDDB66807F98D9800BB5817 + WindowToolIsVisible + 1 + + + Identifier + windowTool.debugAnimator + Layout + + + Dock + + + Module + PBXNavigatorGroup + Proportion + 100% + + + Proportion + 100% + + + Name + Debug Visualizer + ServiceClasses + + PBXNavigatorGroup + + StatusbarIsVisible + 1 + ToolbarConfiguration + xcode.toolbar.config.debugAnimator + WindowString + 100 100 700 500 0 0 1280 1002 + + + Identifier + windowTool.bookmarks + Layout + + + Dock + + + Module + PBXBookmarksModule + Proportion + 100% + + + Proportion + 100% + + + Name + Bookmarks + ServiceClasses + + PBXBookmarksModule + + StatusbarIsVisible + 0 + WindowString + 538 42 401 187 0 0 1280 1002 + + + Identifier + windowTool.classBrowser + Layout + + + Dock + + + BecomeActive + 1 + ContentConfiguration + + OptionsSetName + Hierarchy, all classes + PBXProjectModuleGUID + 1CA6456E063B45B4001379D8 + PBXProjectModuleLabel + Class Browser - NSObject + + GeometryConfiguration + + ClassesFrame + {{0, 0}, {374, 96}} + ClassesTreeTableConfiguration + + PBXClassNameColumnIdentifier + 208 + PBXClassBookColumnIdentifier + 22 + + Frame + {{0, 0}, {630, 331}} + MembersFrame + {{0, 105}, {374, 395}} + MembersTreeTableConfiguration + + PBXMemberTypeIconColumnIdentifier + 22 + PBXMemberNameColumnIdentifier + 216 + PBXMemberTypeColumnIdentifier + 97 + PBXMemberBookColumnIdentifier + 22 + + PBXModuleWindowStatusBarHidden2 + 1 + RubberWindowFrame + 385 179 630 352 0 0 1440 878 + + Module + PBXClassBrowserModule + Proportion + 332pt + + + Proportion + 332pt + + + Name + Class Browser + ServiceClasses + + PBXClassBrowserModule + + StatusbarIsVisible + 0 + TableOfContents + + 1C0AD2AF069F1E9B00FABCE6 + 1C0AD2B0069F1E9B00FABCE6 + 1CA6456E063B45B4001379D8 + + ToolbarConfiguration + xcode.toolbar.config.classbrowser + WindowString + 385 179 630 352 0 0 1440 878 + WindowToolGUID + 1C0AD2AF069F1E9B00FABCE6 + WindowToolIsVisible + 0 + + + + diff --git a/PSMTabBarControl/PSMTabBarControl.xcodeproj/winckler.pbxuser b/PSMTabBarControl/PSMTabBarControl.xcodeproj/winckler.pbxuser new file mode 100644 index 0000000000..745102e89d --- /dev/null +++ b/PSMTabBarControl/PSMTabBarControl.xcodeproj/winckler.pbxuser @@ -0,0 +1,178 @@ +// !$*UTF8*$! +{ + 0259C573FE90428111CA0C5A /* Project object */ = { + activeBuildConfigurationName = Debug; + activeTarget = 53DF68FC067E5B5A0090B5B0 /* PSMTabBarControlFramework */; + codeSenseManager = 1D82C6110AC093AF00AAD418 /* Code sense */; + perUserDictionary = { + PBXConfiguration.PBXFileTableDataSource3.PBXFileTableDataSource = { + PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; + PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID; + PBXFileTableDataSourceColumnWidthsKey = ( + 20, + 243, + 20, + 48, + 43, + 43, + 20, + ); + PBXFileTableDataSourceColumnsKey = ( + PBXFileDataSource_FiletypeID, + PBXFileDataSource_Filename_ColumnID, + PBXFileDataSource_Built_ColumnID, + PBXFileDataSource_ObjectSize_ColumnID, + PBXFileDataSource_Errors_ColumnID, + PBXFileDataSource_Warnings_ColumnID, + PBXFileDataSource_Target_ColumnID, + ); + }; + PBXConfiguration.PBXTargetDataSource.PBXTargetDataSource = { + PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; + PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID; + PBXFileTableDataSourceColumnWidthsKey = ( + 20, + 200, + 63, + 20, + 48, + 43, + 43, + ); + PBXFileTableDataSourceColumnsKey = ( + PBXFileDataSource_FiletypeID, + PBXFileDataSource_Filename_ColumnID, + PBXTargetDataSource_PrimaryAttribute, + PBXFileDataSource_Built_ColumnID, + PBXFileDataSource_ObjectSize_ColumnID, + PBXFileDataSource_Errors_ColumnID, + PBXFileDataSource_Warnings_ColumnID, + ); + }; + PBXPerProjectTemplateStateSaveDate = 206721719; + PBXWorkspaceStateSaveDate = 206721719; + }; + sourceControlManager = 1D82C6100AC093AF00AAD418 /* Source Control */; + userBuildSettings = { + }; + }; + 0259C576FE90428111CA0C5A /* PSMTabBarControl.m */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {4143, 22432}}"; + sepNavSelRange = "{48941, 0}"; + sepNavVisRect = "{{0, 1451}, {459, 186}}"; + sepNavWindowFrame = "{{15, -1}, {750, 742}}"; + }; + }; + 0259C57AFE90428111CA0C5A /* PSMTabBarControl.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1077, 2000}}"; + sepNavSelRange = "{3919, 0}"; + sepNavVisRect = "{{0, 1387}, {711, 613}}"; + sepNavWindowFrame = "{{15, -1}, {750, 742}}"; + }; + }; + 1D82C6100AC093AF00AAD418 /* Source Control */ = { + isa = PBXSourceControlManager; + fallbackIsa = XCSourceControlManager; + isSCMEnabled = 0; + scmConfiguration = { + }; + scmType = ""; + }; + 1D82C6110AC093AF00AAD418 /* Code sense */ = { + isa = PBXCodeSenseManager; + indexTemplatePath = ""; + }; + 53DF68FC067E5B5A0090B5B0 /* PSMTabBarControlFramework */ = { + activeExec = 0; + }; + 53DF6901067E5B8E0090B5B0 /* All */ = { + activeExec = 0; + }; + A2082A8E09EAEB33009AC8BE /* PSMTabDragAssistant.m */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1420, 7040}}"; + sepNavSelRange = "{14900, 0}"; + sepNavVisRect = "{{0, 3817}, {978, 600}}"; + sepNavWindowFrame = "{{6, 17}, {1017, 729}}"; + }; + }; + A246FB040A2BD6F9005BDF7B /* PSMTabBarControlDoc.html */ = { + uiCtxt = { + sepNavWindowFrame = "{{15, 3}, {750, 742}}"; + }; + }; + A251BE830959A1B90058BC7F /* PSMTabBarCell.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {804, 1648}}"; + sepNavSelRange = "{0, 0}"; + sepNavVisRect = "{{0, 744}, {619, 599}}"; + sepNavWindowFrame = "{{15, 13}, {658, 728}}"; + }; + }; + A251BE840959A1B90058BC7F /* PSMTabBarCell.m */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {972, 6368}}"; + sepNavSelRange = "{0, 0}"; + sepNavVisRect = "{{0, 5769}, {619, 599}}"; + sepNavWindowFrame = "{{15, 13}, {658, 728}}"; + }; + }; + A251BE8A0959A1EA0058BC7F /* AppController.m */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {711, 613}}"; + sepNavSelRange = "{0, 0}"; + sepNavVisRect = "{{0, 0}, {711, 613}}"; + sepNavWindowFrame = "{{15, -1}, {750, 742}}"; + }; + }; + A251BE8B0959A1EA0058BC7F /* FakeModel.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {711, 613}}"; + sepNavSelRange = "{0, 0}"; + sepNavVisRect = "{{0, 0}, {711, 613}}"; + sepNavWindowFrame = "{{15, -1}, {750, 742}}"; + }; + }; + A251BE8C0959A1EA0058BC7F /* FakeModel.m */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {711, 1248}}"; + sepNavSelRange = "{0, 0}"; + sepNavVisRect = "{{0, 117}, {711, 613}}"; + sepNavWindowFrame = "{{15, -1}, {750, 742}}"; + }; + }; + A251BE9B0959A2530058BC7F /* ReadMe.rtfd */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {711, 3047}}"; + sepNavSelRange = "{0, 0}"; + sepNavVisRect = "{{0, 2419}, {711, 628}}"; + sepNavWindowFrame = "{{15, -1}, {750, 742}}"; + }; + }; + A2A711BD09E5BF0500D0089B /* WindowController.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {958, 944}}"; + sepNavSelRange = "{0, 0}"; + sepNavVisRect = "{{0, 197}, {711, 613}}"; + sepNavWindowFrame = "{{15, -1}, {750, 742}}"; + }; + }; + A2A711BE09E5BF0500D0089B /* WindowController.m */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1399, 4496}}"; + sepNavSelRange = "{2008, 125}"; + sepNavVisRect = "{{0, 824}, {784, 608}}"; + sepNavWindowFrame = "{{15, 4}, {823, 737}}"; + }; + }; + A2D32EFF09A63D7A00EC8662 /* PSMMetalTabStyle.m */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1728, 8400}}"; + sepNavSelRange = "{683, 5}"; + sepNavVisRect = "{{0, 0}, {781, 608}}"; + sepNavWindowFrame = "{{15, 4}, {820, 737}}"; + }; + }; +} diff --git a/PSMTabBarControl/PSMTabBarControlFramework-Info.plist b/PSMTabBarControl/PSMTabBarControlFramework-Info.plist new file mode 100644 index 0000000000..f7840b712b --- /dev/null +++ b/PSMTabBarControl/PSMTabBarControlFramework-Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + PSMTabBarControl + CFBundleIdentifier + com.positivespinmedia.PSMTabBarControlFramework + CFBundleInfoDictionaryVersion + 6.0 + CFBundlePackageType + FMWK + CFBundleSignature + PSM1 + CFBundleVersion + 1.1 + NSPrincipalClass + PSMTabBarControl + + diff --git a/PSMTabBarControl/PSMTabBarControl_Prefix.pch b/PSMTabBarControl/PSMTabBarControl_Prefix.pch new file mode 100644 index 0000000000..65df9ffedb --- /dev/null +++ b/PSMTabBarControl/PSMTabBarControl_Prefix.pch @@ -0,0 +1,8 @@ +// +// Prefix header for all source files of the 'PSMTabBarControl' target in the 'PSMTabBarControl' project +// + +#ifdef __OBJC__ + #import + #import +#endif diff --git a/PSMTabBarControl/ReadMe.rtfd/TXT.rtf b/PSMTabBarControl/ReadMe.rtfd/TXT.rtf new file mode 100644 index 0000000000..acd9372a24 --- /dev/null +++ b/PSMTabBarControl/ReadMe.rtfd/TXT.rtf @@ -0,0 +1,186 @@ +{\rtf1\mac\ansicpg10000\cocoartf824\cocoasubrtf380 +{\fonttbl\f0\fswiss\fcharset77 Helvetica-Bold;\f1\fswiss\fcharset77 Helvetica;\f2\fswiss\fcharset77 Helvetica-Oblique; +\f3\fnil\fcharset77 Monaco;} +{\colortbl;\red255\green255\blue255;\red118\green15\blue80;\red0\green0\blue255;\red35\green110\blue37; +} +{\*\listtable{\list\listtemplateid1\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid0\'02\'05.;}{\levelnumbers\'01;}}{\listname ;}\listid1}} +{\*\listoverridetable{\listoverride\listid1\listoverridecount0\ls1}} +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\qc\pardirnatural + +\f0\b\fs24 \cf0 \ +PSMTabBarControl (and related classes)\ + +\f1\b0 developed by John Pannell, Positive Spin Media\ +\ +as seen in the super-cool app...\ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\qc\pardirnatural +\cf0 {{\NeXTGraphic startpage.gif \width7200 \height2820 +}¬}\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\qc\pardirnatural +\cf0 \ +\ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural +\cf0 This source code and all related materials are released under the BSD license, which is explained at the end of this document, along with some other legalese. I've made my best effort to make everything bug free, but please let me know of any bugs found or suggestions you have: johnp@positivespinmedia.com.\ +\ + +\f0\b Purpose +\f1\b0 \ +\ +PSMTabBarControl seeks to provide developers with a high-quality, easy to use GUI to manage an NSTabView (or subclasses) in a manner similar to Safari's tabbed browsing implementation. It attempts to add a few features as well. Here's what you get:\ +\ + +\f0\b The look: +\f1\b0 a control/cell architecture that draws the expected tab appearance below a toolbar or similar view. Included styles work consistently in Aqua, Metal, or customized metal variations by basing fills on the window's background color. Includes drawing of a close button, and rollover states for the close button and tab cell. Also provides pop-up button and menu when tabs overflow available space, and support for individual tab progress indicators, icons, and object counters. Tabs can be drawn sized to fit the string content of the label, or uniformly sized.\ +\ + +\f0\b The functionality: +\f1\b0 Close button removes tabs, click on a tab cell selects. Indicators start, stop, and hide if things are hooked up correctly.\ +\ + +\f0\b Extras: +\f1\b0 Supports multi-window drag-and-drop reordering of the tabs with aqua-licious animation.\ +\ + +\f0\b Files +\f1\b0 \ +\ +Your project will need the files in the "Framework" folder of the project. The actual framework packages these (and some images) up nicely for you, if desired. Please look over the "TabBarControlDemo" target of the source code project to see exactly what is needed to get everything to build. Building and playing with the demo is also a good way to get a feel for the features provided by these classes.\ +\ + +\f0\b Usage +\f1\b0 \ +\ +Simply drag a custom view object from the views palette in IB, read the PSMTabBarControl class into IB, and set the view's custom class to PSMTabBarControl. Then connect the control's tabview outlet to the tab view being controlled, and make the control the delegate of the tab view. You can also connect the control's "partner view" outlet to another view that will resize in response to the hide/show behavior of the control.\ +\ +Alternately, you can build the Palette subproject and add the built IB palette to Interface Builder. In this case, creating and configuring an instance is as easy and drag, drop, and a few clicks. A demo movie and the built palette are available in a separate download from my website: http://www.positivespinmedia.com/dev/PSMTabBarControl.html\ +\ + +\f2\i Please read the PSMTabBarControlDoc.html file in the documentation folder of this project. It provides an Apple-ish page describing the interface and usage of this object. +\f1\i0 \ +\ + +\f0\b Patterns of Use +\f1\b0 \ +\ +There are a few random notes I can think of for usage guidelines...\ +\ +- You may see a line between the toolbar and the control in your app; it is part of the toolbar. In Tiger, you can eliminate the appearance of this line:\ +\ +\pard\tx960\tx1920\tx2880\tx3840\tx4800\tx5760\tx6720\tx7680\tx8640\tx9600\tx10560\tx11520\tx12480\tx13440\tx14400\tx15360\tx16320\tx17280\tx18240\tx19200\tx20160\tx21120\tx22080\tx23040\tx24000\tx24960\tx25920\tx26880\tx27840\tx28800\tx29760\tx30720\tx31680\tx32640\tx33600\tx34560\tx35520\tx36480\tx37440\tx38400\tx39360\tx40320\tx41280\tx42240\tx43200\tx44160\tx45120\tx46080\tx47040\tx48000\tx48960\tx49920\tx50880\tx51840\tx52800\tx53760\tx54720\tx55680\tx56640\tx57600\tx58560\tx59520\tx60480\tx61440\tx62400\tx63360\tx64320\tx65280\tx66240\tx67200\tx68160\tx69120\tx70080\tx71040\tx72000\tx72960\tx73920\tx74880\tx75840\tx76800\tx77760\tx78720\tx79680\tx80640\tx81600\tx82560\tx83520\tx84480\tx85440\tx86400\tx87360\tx88320\tx89280\tx90240\tx91200\tx92160\tx93120\tx94080\tx95040\tx96000\ql\qnatural\pardirnatural + +\f3\fs20 \cf0 \CocoaLigature0 SInt32 MacVersion;\ +\pard\tx960\tx1920\tx2880\tx3840\tx4800\tx5760\tx6720\tx7680\tx8640\tx9600\tx10560\tx11520\tx12480\tx13440\tx14400\tx15360\tx16320\tx17280\tx18240\tx19200\tx20160\tx21120\tx22080\tx23040\tx24000\tx24960\tx25920\tx26880\tx27840\tx28800\tx29760\tx30720\tx31680\tx32640\tx33600\tx34560\tx35520\tx36480\tx37440\tx38400\tx39360\tx40320\tx41280\tx42240\tx43200\tx44160\tx45120\tx46080\tx47040\tx48000\tx48960\tx49920\tx50880\tx51840\tx52800\tx53760\tx54720\tx55680\tx56640\tx57600\tx58560\tx59520\tx60480\tx61440\tx62400\tx63360\tx64320\tx65280\tx66240\tx67200\tx68160\tx69120\tx70080\tx71040\tx72000\tx72960\tx73920\tx74880\tx75840\tx76800\tx77760\tx78720\tx79680\tx80640\tx81600\tx82560\tx83520\tx84480\tx85440\tx86400\tx87360\tx88320\tx89280\tx90240\tx91200\tx92160\tx93120\tx94080\tx95040\tx96000\ql\qnatural\pardirnatural +\cf2 if\cf0 (Gestalt(gestaltSystemVersion, &MacVersion) == noErr)\{\ + \cf2 if\cf0 (MacVersion >= \cf3 0x1040\cf0 )\{\ + \cf4 // this call is Tiger only\cf0 \ + [toolbar setShowsBaselineSeparator:\cf2 NO\cf0 ];\ + \}\ +\}\ +\ +\pard\tx960\tx1920\tx2880\tx3840\tx4800\tx5760\tx6720\tx7680\tx8640\tx9600\tx10560\tx11520\tx12480\tx13440\tx14400\tx15360\tx16320\tx17280\tx18240\tx19200\tx20160\tx21120\tx22080\tx23040\tx24000\tx24960\tx25920\tx26880\tx27840\tx28800\tx29760\tx30720\tx31680\tx32640\tx33600\tx34560\tx35520\tx36480\tx37440\tx38400\tx39360\tx40320\tx41280\tx42240\tx43200\tx44160\tx45120\tx46080\tx47040\tx48000\tx48960\tx49920\tx50880\tx51840\tx52800\tx53760\tx54720\tx55680\tx56640\tx57600\tx58560\tx59520\tx60480\tx61440\tx62400\tx63360\tx64320\tx65280\tx66240\tx67200\tx68160\tx69120\tx70080\tx71040\tx72000\tx72960\tx73920\tx74880\tx75840\tx76800\tx77760\tx78720\tx79680\tx80640\tx81600\tx82560\tx83520\tx84480\tx85440\tx86400\tx87360\tx88320\tx89280\tx90240\tx91200\tx92160\tx93120\tx94080\tx95040\tx96000\ql\qnatural\pardirnatural + +\f1\fs24 \cf0 - In general, there is no reason for your app objects to communicate (outside of configuration) with the PSMTabBarControl at all. Changes made to the NSTabView instance programmatically should be directed at the NSTabView instance itself, and the control will update to reflect the changes made.\ +\ +- Your app might want to receive tab view delegate notifications in order to perform some actions. No problem, simply make the desired object the delegate of the PSMTabBarControl instance... it passes along all tab view notifications. Note that it uses these notifications to make changes itself - read the source code to make sure you aren't tripping over something.\ +\ +- The control creates bindings between each cell's progress indicator and the represented NSTabViewItem's identifier object, if it can. In my app design, I set an instance of NSObjectController as the NSTabViewItem's identifier, and then bind to the "isProcessing" key of the controller's content object. All of this can be seen in the source of the demo app...\ +\ +- The control can be set to hide itself when there is only a single tab, and can also be told to hide/show on demand. It can animate to appear and disappear, and will resize something to compensate for the missing window real estate. By default, it will resize the window, but you can also connect the "partnerView" outlet in IB to specify another view to resize to take up the missing space. Note that this takes some attention to sizing springs and wires to get right, and complex views may need a container view to achieve the desired effect.\ +\ +- The control can be configured to draw an attractive "Add Tab" button at the end of the tab cells. Unfortunately, the button is all looks and no brains - it has no idea what your app wants to do when adding a tab. If you configure your app to show the add tab button, you need to hook up the add tab button to the proper target with the proper selector. Something like this will do nicely in your app controller's awakeFromNib:\ +\ +\pard\tx960\tx1920\tx2880\tx3840\tx4800\tx5760\tx6720\tx7680\tx8640\tx9600\tx10560\tx11520\tx12480\tx13440\tx14400\tx15360\tx16320\tx17280\tx18240\tx19200\tx20160\tx21120\tx22080\tx23040\tx24000\tx24960\tx25920\tx26880\tx27840\tx28800\tx29760\tx30720\tx31680\tx32640\tx33600\tx34560\tx35520\tx36480\tx37440\tx38400\tx39360\tx40320\tx41280\tx42240\tx43200\tx44160\tx45120\tx46080\tx47040\tx48000\tx48960\tx49920\tx50880\tx51840\tx52800\tx53760\tx54720\tx55680\tx56640\tx57600\tx58560\tx59520\tx60480\tx61440\tx62400\tx63360\tx64320\tx65280\tx66240\tx67200\tx68160\tx69120\tx70080\tx71040\tx72000\tx72960\tx73920\tx74880\tx75840\tx76800\tx77760\tx78720\tx79680\tx80640\tx81600\tx82560\tx83520\tx84480\tx85440\tx86400\tx87360\tx88320\tx89280\tx90240\tx91200\tx92160\tx93120\tx94080\tx95040\tx96000\ql\qnatural\pardirnatural + +\f3\fs20 \cf4 // hook up add tab button\cf0 \ +[[tabBar addTabButton] setTarget:\cf2 self\cf0 ];\ +[[tabBar addTabButton] setAction:\cf2 @selector\cf0 (addNewTab:)]; +\f1\fs24 \ +\ +- The tabs have some sizing options: You can specify the minimum width, maximum width, and optimum width, as well as spcifying if the tabs should size to fit their label or not. The sizing bahavior of the tabs is as follows: If "size to fit" is specified, then tabs will be generated to fit the label, but will never exceed the specified max or min widths. Once the end of the control is reached, the overflow menu will appear as tabs are added; the last tab will squeeze in if it can, or the remaining tabs will stretch to occupy the full control. If "size to fit" is not specified, then all successive tabs will appear at the optimum width. Once the end of the control is reached, adding new tabs will cause all tabs to shrink to accomodate, until the minumum width is reached, and then the overflow menu will be used; max width is ignored in this case. Hopefully that all makes sense :-)\ +\ +- PSMTabBarControl will load the existing tabs from the tabView outlet at startup. However, many of the advanced features (icon display, progress indicator, object count) rely on binding to a controller that is likely not set up in IB. Solution? Nuke the existing tabs in the NSTabView and add new ones, configured the way you like. The demo app does this in the awakeFromNib: method of the app controller.\ +\ +- As a design choice, I elected to keep a cell object around until its tab was closed, instead of "churning" cell objects in each update cycle. Each cell keeps its NSTabViewItem as its representedObject and maintains reference that way, rather than by any index. As a result of this, drag-and-drop reordering of tabs does not change the underlying NSTabView instance at all. All that to say: don't rely on numerical indices if communicating with both the control and the tab view - the indices may not correlate if the user moved some tabs around (and remember - you shouldn't need to communicate with the control anyway :-). The Shiira Project, from which I gained much insight and inspiration from for this UI element, elected to scrap and rebuild the array of cells each time through the update cycle, and rely on indices to correlate between cells and NSTabViewItems. I felt the representedObject route was cleaner, and preferred not to churn objects.\ +\ +\pard\tx960\tx1920\tx2880\tx3840\tx4800\tx5760\tx6720\tx7680\tx8640\tx9600\tx10560\tx11520\tx12480\tx13440\tx14400\tx15360\tx16320\tx17280\tx18240\tx19200\tx20160\tx21120\tx22080\tx23040\tx24000\tx24960\tx25920\tx26880\tx27840\tx28800\tx29760\tx30720\tx31680\tx32640\tx33600\tx34560\tx35520\tx36480\tx37440\tx38400\tx39360\tx40320\tx41280\tx42240\tx43200\tx44160\tx45120\tx46080\tx47040\tx48000\tx48960\tx49920\tx50880\tx51840\tx52800\tx53760\tx54720\tx55680\tx56640\tx57600\tx58560\tx59520\tx60480\tx61440\tx62400\tx63360\tx64320\tx65280\tx66240\tx67200\tx68160\tx69120\tx70080\tx71040\tx72000\tx72960\tx73920\tx74880\tx75840\tx76800\tx77760\tx78720\tx79680\tx80640\tx81600\tx82560\tx83520\tx84480\tx85440\tx86400\tx87360\tx88320\tx89280\tx90240\tx91200\tx92160\tx93120\tx94080\tx95040\tx96000\ql\qnatural\pardirnatural + +\f0\b \cf0 Improvements? +\f1\b0 \ +\ +Pipe up if you think of something you'd like to see; here's my current list:\ +\ +- "Pop-up" tabs - like pop-up folders in the finder, in case you want to drag to a destination in another tab.\ +- Support for the +\f3\fs22 \CocoaLigature1 NSUnifiedTitleAndToolbarWindowMask +\f1\fs24 \CocoaLigature0 "unified" window appearance. (Help! I really searched around to try to make this work... the color pattern of the title and toolbar seem to be top secret! The new "unified" style is an excellent replication of a unified look, but isn't "built from" the unified appearance like the metal is.)\ +- During multi-window drag, having a "drag window/image" that shows the represented view getting moved to the other window.\ +- During multi-window drag, support for dragging out solo tabs to consolidate in another window, removing the source window in the process.\ +- Support vertical as well as horizontal alignment.\ +\ + +\f0\b Version History +\f1\b0 \ +\ +Version 1.3 (May 29, 2006)\ +- new feature: Unified tab style, compliments of Keith Blount\ +- new feature: allow multi-window drag config option (again from Keith).\ +- fixed bug: Palette installation/usage instructions were wrong.\ +- enhancement: exposed the +\f3\fs20 representedTabViewItems +\f1\fs24 method, which can be used to retrieve the order of the tabs as displayed in the control, since the underlying NSTabView does not get reordered during drag and drop rearrangement.\ +\ +Version 1.2 (April 20, 2006)\ +- new feature: multi-window drag and drop support.\ +- bug fixed: zombie issue with tabView:didCloseTabViewItem\ +- bugs fixed: some drawing issues around the progress indicators in tabs, and the add tab button.\ +- enhancement: the hide/show animation has been improved with less "flickering" of progress indicators during the hide and show.\ +\ +Version 1.1.2 (April 5, 2006)\ +- fixed bug: tabs of non-integer width resulted in occasional anti-aliased drawing issues of dividers between tabs in the Metal style (Thanks, Kent).\ +- added feature: delegate can now respond to -tabView:shouldCloseTabViewItem: and -tabView:willCloseTabViewItem:, and -tabView:didCloseTabViewItem: messages, so your app can take care of any needed setup/cleanup for these actions.\ +- fixed bug: tab close buttons now show down state when pressed down.\ +\ +Version 1.1.1 (March 16, 2006)\ +- fixed bug: Palette inspector would not reflect state of previously instantiated control. This has been fixed (Thanks, Guillaume).\ +- enhancement: Overflow button now highlights when mouse down (Thanks, Kent).\ +- fixed bug: when set to not close a solo tab, the close button would be hidden for the tab, but could still be closed if you clicked the tab in the right location. This has been fixed (Thanks, malcom).\ +\ +Version 1.1 (March 10, 2006)\ +- Bound the "title" of the cell to the "label" of the source tabview item. Just in case you wanted to change the label on the tab during the running of your application.\ +- PSMTabBarCell factored to support new tab "styles", or appearances in drawing. Now supported are the existing "Metal" style and a new "Aqua" style. Many thanks to David Smith, Seth Willits, and Chris Forsythe for their contributions!\ +- Control can be configured to "Hide for single tab", so it doesn't appear unless there are more than a single tab view present. Features animated show/hide behavior (that can be called anytime, and is called automatically in the case that a single tab exists). The show/hide behavior can also be set up to resize either the window (default) or a selected "partner view" to compensate for the lost height of the tab bar.\ +- Control can be configured for "Can close only tab" behavior. If set to NO, no close button will appear on a lone tab.\ +- Cells can be set to "size to fit", or given uniform min/max/optimum sizes.\ +- Added support for display of an icon and an object count, if the proper app design pattern is followed.\ +- Sweet animated drag-and-drop drawing!\ +- A few drawing bugs surrounding the progress indicators in cells were squished.\ +- New documentation, in case you found this read me a little pithy.\ +\ +Version 1.0 (December 2005)\ +Initial release of safari-like tab implementation.\ +\ + +\f0\b The standard disavowal of this beautiful mess +\f1\b0 \ +\ +I should note that portions of this source code were inspired by the Shiira project's implementation of Safari-style tabs. While I made some different design decisions, the drawing and some other aspects are only slight modifications of their excellent work. As such, I note their copyright under their BSD licence:\ +\ +\pard\tx960\tx1920\tx2880\tx3840\tx4800\tx5760\tx6720\tx7680\tx8640\tx9600\tx10560\tx11520\tx12480\tx13440\tx14400\tx15360\tx16320\tx17280\tx18240\tx19200\tx20160\tx21120\tx22080\tx23040\tx24000\tx24960\tx25920\tx26880\tx27840\tx28800\tx29760\tx30720\tx31680\tx32640\tx33600\tx34560\tx35520\tx36480\tx37440\tx38400\tx39360\tx40320\tx41280\tx42240\tx43200\tx44160\tx45120\tx46080\tx47040\tx48000\tx48960\tx49920\tx50880\tx51840\tx52800\tx53760\tx54720\tx55680\tx56640\tx57600\tx58560\tx59520\tx60480\tx61440\tx62400\tx63360\tx64320\tx65280\tx66240\tx67200\tx68160\tx69120\tx70080\tx71040\tx72000\tx72960\tx73920\tx74880\tx75840\tx76800\tx77760\tx78720\tx79680\tx80640\tx81600\tx82560\tx83520\tx84480\tx85440\tx86400\tx87360\tx88320\tx89280\tx90240\tx91200\tx92160\tx93120\tx94080\tx95040\tx96000\ql\qnatural\pardirnatural + +\f3\fs20 \cf4 Portions of this software Copyright 2004 The Shiira Project. All rights reserved.\ +\pard\tx960\tx1920\tx2880\tx3840\tx4800\tx5760\tx6720\tx7680\tx8640\tx9600\tx10560\tx11520\tx12480\tx13440\tx14400\tx15360\tx16320\tx17280\tx18240\tx19200\tx20160\tx21120\tx22080\tx23040\tx24000\tx24960\tx25920\tx26880\tx27840\tx28800\tx29760\tx30720\tx31680\tx32640\tx33600\tx34560\tx35520\tx36480\tx37440\tx38400\tx39360\tx40320\tx41280\tx42240\tx43200\tx44160\tx45120\tx46080\tx47040\tx48000\tx48960\tx49920\tx50880\tx51840\tx52800\tx53760\tx54720\tx55680\tx56640\tx57600\tx58560\tx59520\tx60480\tx61440\tx62400\tx63360\tx64320\tx65280\tx66240\tx67200\tx68160\tx69120\tx70080\tx71040\tx72000\tx72960\tx73920\tx74880\tx75840\tx76800\tx77760\tx78720\tx79680\tx80640\tx81600\tx82560\tx83520\tx84480\tx85440\tx86400\tx87360\tx88320\tx89280\tx90240\tx91200\tx92160\tx93120\tx94080\tx95040\tx96000\ql\qnatural\pardirnatural + +\f1\fs24 \cf0 Check them out at: http://hmdt-web.net/shiira/\ +\ +This source code is provided under BSD license, the conditions of which are listed below. I hope you'll make note somewhere in your about window or ReadMe stating the sweet coding goodness of Positive Spin Media and link to the fascinating and informative website at www.positivespinmedia.com\ +\ +\pard\pardeftab720\sa320\ql\qnatural +\cf0 \CocoaLigature1 Copyright (c) 2005, Positive Spin Media\uc0\u8232 All rights reserved.\ +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\ +\pard\tx220\tx720\pardeftab720\li720\fi-720\ql\qnatural +\ls1\ilvl0\cf0 {\listtext \'a5 }Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\ +{\listtext \'a5 }Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\ +{\listtext \'a5 }Neither the name of Positive Spin Media nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.\ + \ +\pard\pardeftab720\sa320\ql\qnatural +\cf0 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\CocoaLigature0 \ +} \ No newline at end of file diff --git a/PSMTabBarControl/ReadMe.rtfd/startpage.gif b/PSMTabBarControl/ReadMe.rtfd/startpage.gif new file mode 100644 index 0000000000000000000000000000000000000000..8707a77ab0af2648e9e13dd44e44982eaee9c85a GIT binary patch literal 11246 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 N{Tml;OacJC{{wL3HY@-D literal 0 HcmV?d00001 diff --git a/PSMTabBarControl/TabBarControlDemo-Info.plist b/PSMTabBarControl/TabBarControlDemo-Info.plist new file mode 100644 index 0000000000..673218b406 --- /dev/null +++ b/PSMTabBarControl/TabBarControlDemo-Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + com.positivespinmedia.TabBarControlDemo + CFBundleInfoDictionaryVersion + 6.0 + CFBundlePackageType + APPL + CFBundleSignature + ???? + CFBundleVersion + 1.1 + NSMainNibFile + MainMenu + NSPrincipalClass + NSApplication + + diff --git a/PSMTabBarControl/documentation/PSMTabBarControlDoc.html b/PSMTabBarControl/documentation/PSMTabBarControlDoc.html new file mode 100644 index 0000000000..fa8b99009a --- /dev/null +++ b/PSMTabBarControl/documentation/PSMTabBarControlDoc.html @@ -0,0 +1,301 @@ + + + + + PSMTabBarControl - Safari-style Tabs (Objective-C) + + + + + + + + +

PSMTabBarControl

+ + + +
Inherits from
Conforms to
Declared in
PSMTabBarControl.h
+

Class Description

+ +

PSMTabBarControl provides a user interface for the management of tabbed views that has an appearance similar to Apple's Safari web browser.

+

Internally, PSMTabBarControl uses a custom cell class and supporting style objects to implement its user interface.

+

Currently, this object supports "Aqua" and "Metal" tab styles to present an appearance consistent with the rest of your application. Numerous configuration options exist to customize behavior, as outlined below. PSMTabBarControl instances require a few specific connections with other application objects to perform properly at runtime:

+
    +
  • The control's "tabView" outlet must be connected to the desired NSTabView instance in Interface Builder, or set programmatically with the setTabView: method.
  • +
  • The "delegate" outlet of the NSTabView being controlled must be connected to the instance of PSMTabBarControl, either programmatically or in IB.
  • +
  • Optionally, you may connect the control's "partnerView" outlet to a view that will be resized to compensate when PSMTabBarControl changes size due to hide/show behavior. If no connection is made, PSMTabBarControl will resize the window in response to hide/show messages.
  • +
+

A PSMTabBarControl instance should occupy the width of the window, and should be precisely 22 pixels in height. It should be resizable in width, but not height. It can be placed at the top or botton of the window (or anywhere in between, if desired).

+

Outside of configuring it, your application should have little interaction with this class. The presented tabs will change in conjunction with changes your application makes in the NSTabView being controlled.

+ +

A Usage Pattern

+ +

PSMTabBarControl becomes even more powerful if your application design matches an expected pattern: the control attempts to bind a number of tab attributes to the NSTabViewItem's identifier object if possible. These visible attributes include a progress indicator, an icon, and an object counter. Additionally, the control binds each tab's title to the label of the represented NSTabViewItem.

+ +

Taking advantage of these features requires no glue code on your part, but it does require providing a particular object graph. Here's the basics...

+ +
  • For each tab that is created, your application should have a model object that keeps the state of model attributes: isProcessing (a BOOL), objectCount (an int), and icon (an NSImage). You can pick and choose any number of these to support, or none, at your option. +
  • Your application should create an NSObjectController to control your model (the model object is the "content" of the NSObjectController instance). +
  • When you create new tabs (via the NSTabView interface), you should set the object controller instance to be the identifier object of the newly created NSTabViewItem object.
+ +

The demo application included with this project illustrates a very quick way to accomplish these goals. If this pattern is followed, PSMTabBarControl will take care of the rest.

+ + +

Methods by Task

+

Setting needed connections

+
– setTabView:

Specifies the instance of NSTabView to be controlled.

+ +
– tabView

Returns the instance of NSTabView being controlled.

+ +

Setting optional connections

+
– setPartnerView:

Specifies a view that will resize to compensate for control size changes in response to hide and show messages.

+ +
– partnerView

Returns the instance of a view that will resize to compensate for control size changes in response to hide and show messages.

+ +
– setDelegate:

Specifies an object that will receive delegate messages as passed through from the NSTabView instance.

+ +
– delegate:

Returns the specified delegate object.

+ +

Control configuration

+
– canCloseOnlyTab

Returns YES if the user is allowed to close a tab when it is the only tab left, NO otherwise.

+ +
– setCanCloseOnlyTab:

Controls whether the receiver will present a close button for a single tab in a tab bar.

+ +
– styleName

Returns the name of the current drawing style. "Aqua", "Metal", and "Unified" are the currently supported options.

+ +
– setStyleNamed:

Specifies the style in which the tabs and control are drawn. "Aqua", "Metal", and "Unified" are the currently supported options.

+ +
– hideForSingleTab

Returns YES if the control will hide if there is only one tab left, NO otherwise.

+ +
– setHideForSingleTab:

Controls whether the receiver will hide when the user closes all but a single tab in a tab bar.

+ +
– showAddTabButton

Returns YES if the control will display a small "add tab" button at the rightmost end of the tabs, NO otherwise.

+ +
– setShowAddTabButton:

Controls whether the receiver will will display a small "add tab" button at the rightmost end of the tabs.

+ +
– cellMinWidth

Returns the minimum width (in pixels) that a tab will be allowed to occupy.

+ +
– setCellMinWidth:

Specifies the maximum width (in pixels) that a tab will be allowed to occupy.

+ +
– cellMaxWidth

Returns the maximum width (in pixels) that a tab will be allowed to occupy.

+ +
– setCellMaxWidth:

Specifies the maximum width (in pixels) that a tab will be allowed to occupy.

+ +
– cellOptimumWidth

Returns the default width (in pixels) that a tab will be allowed to occupy when tabs are drawn with uniform size.

+ +
– setCellMaxWidth:

Specifies the default width (in pixels) that a tab will be allowed to occupy when tabs are drawn with uniform size.

+ +
– sizeCellsToFit

Returns YES if the control will make the tabs sized to fit the content of the tab, NO otherwise.

+ +
– setSizeCellsToFit:

Controls whether the receiver will make the tabs sized to fit the content of the tab.

+ +
– allowsDragBetweenWindows

Returns YES if the control allows a user to drag a tab to another instance of this control, NO otherwise.

+ +
– setAllowsDragBetweenWindows:

Controls whether the receiver will allow a user to drag a tab to another instance of this control.

+ +

Internal UI components

+
– addTabButton

Returns an instance of an NSButton subclass that is used to present the "add tab" button. If "showAddTabButton" is YES, developers must use this method to access the button and specify a target and action for the button.

+ +
– overflowPopUpButton

Returns an instance of an NSPopUpButton subclass that is used to present the overflow menu (which shows when there are more tabs than can fit across the control).

+ +
– representedTabViewItems

Returns an array of the NSTabViewItems represented by the tabs in the control. Useful if you want to archive the order of the tabs between runs of your program.

+ +

Visibility

+
– hideTabBar:animate:

If desired, obejcts can tell the tab bar to hide (reduce in size to a single pixel line spanning the window) or show, and optionally whether to animate this effect or not.

+ +

Instance Methods

+ +

addTabButton

+

Returns an instance of an NSButton subclass that is used to present the "add tab" button. If "showAddTabButton" is YES, developers must use this method to access the button and specify a target and action for the button.

- (PSMRolloverButton *)addTabButton;

+
Discussion

If you have configured the control to show the add tab button, you must use this method to access the button and set the target and action for it. Example:

[[tabBar addTabButton] setTarget:self];
+[[tabBar addTabButton] setAction:@selector(addNewTab:)];

+
See Also
+ +

allowsDragBetweenWindows

+

Returns YES if the control allows a user to drag a tab to another instance of this control, NO otherwise.

- (BOOL)allowsDragBetweenWindows

+
Discussion

The default is YES.

+
See Also
+ +

canCloseOnlyTab

+

Returns YES if the receiver has been configured to allow users to close a single remaining tab.

- (BOOL)canCloseOnlyTab

+
Discussion

The default is NO.

+
See Also
+ +

cellMaxWidth

+

Returns the maximum width (in pixels) that a tab will be allowed to occupy.

- (int)cellMaxWidth

+
Discussion

The cellMaxWidth value applies to both uniformly sized tabs, and tabs that are sized to fit. No tab will be drawn wider than the specified value.

+
See Also
+ +

cellMinWidth

+

Returns the minimum width (in pixels) that a tab will be allowed to occupy.

- (int)cellMinWidth

+
Discussion

The cellMinWidth value applies only to uniformly sized tabs. No tab will be drawn smaller than the specified value. Size-to-fit tabs ignore this value, and are made just small enough to fit their content.

+
See Also
+ +

cellOptimumWidth

+

Returns the width (in pixels) that a tab will be made to occupy if the tabs are uniformly sized.

- (int)cellOptimumWidth

+
Discussion

The cellOptimumWidth value applies only to uniformly sized tabs. All tabs will be drawn at the specified value. Size-to-fit tabs ignore this value, and are made just small enough to fit their content.

+
See Also
+ +

delegate

+

Returns the object that will be sent passed-through NSTabView delegate messages.

- (id)delegate

+
See Also
+ +

hideForSingleTab

+

Returns YES if the receiver has been configured to hide if there is a single remaining tab.

- (BOOL)hideForSingleTab

+
Discussion

The default is NO.

+
See Also
+ +

hideTabBar:animate:

+

If desired, obejcts can tell the tab bar to hide (reduce in size to a single pixel line spanning the window) or show, and optionally whether to animate this effect or not.

- (void)hideTabBar:(BOOL)hide animate:(BOOL)animate

+
Discussion

If hide is YES the control will shrink to a single pixel line spanning the window; otherwise the control will expand to its normal appearance. If animate is YES, the shrinking and expanding will happen in a visible animation; otherwise the transition will be instant. There is no effect if the control is already in the specified state.

+ +

overflowPopUpButton

+

Returns an instance of an NSPopUpButton subclass that is used to present the overflow menu.

- (PSMOverflowPopUpButton *)overflowPopUpButton;

+
Discussion

This method could be used to modify the button or menu if desired.

+ +

partnerView

+

Returns the object that will be resized to compensate for the changing size of the control during hide/show behavior.

- (id)partnerView

+
Discussion

If a partnerView has not been specified, the window will be resized during hide/show.

+
See Also
+ +

representedTabViewItems

+

Returns an array of NSTabViewItems, ordered according to the display order of the tabs in the control.

- (NSMutableArray *)representedTabViewItems;

+
Discussion

This method could be used archive the order of the tabs between application runs. When the user reorders tabs via drag and drop, the represented NSTabView does not change order.

+ +

setAllowsDragBetweenWindows

+

If set to YES, the receiver is configured to allow users to drag a tab to an instance of PSMTabBarControl in another window.

- (void)setAllowsDragBetweenWindows:(BOOL)value

+
Discussion

The default is YES.

+
See Also
+ +

setCanCloseOnlyTab:

+

If set to YES, the receiver is configured to allow users to close a single remaining tab.

- (void)setCanCloseOnlyTab:(BOOL)value

+
Discussion

The default is NO.

+
See Also
+ +

setCellMaxWidth:

+

Specifies the maximum width (in pixels) that a tab will be allowed to occupy.

- (void)setCellMaxWidth:(int)value

+
Discussion

No tab will be drawn any wider than the specified value.

+
See Also
+ +

setCellMinWidth:

+

Specifies the minimum width (in pixels) that a tab will be allowed to occupy.

- (void)setCellMinWidth:(int)value

+
Discussion

No tab will be drawn any smaller than the specified value. This value is ignored when drawing in size-to-fit; tabs are made just small enough to fit their content.

+
See Also
+ +

setCellOptimumWidth:

+

Specifies the width (in pixels) that a tab will occupy when tabs are uniformly sized.

- (void)setCellOptimumWidth:(int)value

+
Discussion

This value is ignored when drawing in size-to-fit; tabs are made just small enough to fit their content.

+
See Also
+ +

setDelegate:

+

Specifies an object that will receive delegate messages as passed through from the NSTabView instance.

- (void)setDelegate:(id)object

+
See Also
+ +

setHideForSingleTab:

+

If set to YES, the receiver is configured to hide when there is a single remaining tab.

- (void)setHideForSingleTab:(BOOL)value

+
Discussion

The default is NO.

+
See Also
+ +

setPartnerView:

+

Specifies a view that will resize to compensate for control size changes in response to hide and show messages.

- (void)setPartnerView:(id)view

+
Discussion

if nil, the control will resize the window in response to hide/show messages.

+
See Also
+ +

setStyleNamed:

+

Specifies the style in which the tabs and control are drawn.

- (void)setStyleNamed:(NSString *)name

+
Discussion

"Aqua" and "Metal" are the currently supported options.

+
See Also
+ +

setShowAddTabButton:

+

Controls whether the receiver will will display a small "add tab" button at the rightmost end of the tabs.

- (void)setShowAddTabButton:(BOOL)value

+
Discussion

Default is NO.

+
See Also
+ +

setSizeCellsToFit:

+

Controls whether the receiver will make the tabs sized to fit the content of the tab.

- (void)setSizeCellsToFit:(BOOL)value

+
Discussion

Default is NO.

+
See Also
+ +

setTabView:

+

Specifies the instance of NSTabView to be controlled.

- (void)setTabView:(NSTabView *)view

+
Discussion

This class will not function properly without this outlet being set.

+
See Also
+ +

sizeCellsToFit

+

Returns YES if the control will make the tabs sized to fit the content of the tab, NO otherwise.

+

Discussion

The default is NO.

+
See Also
+ +

styleName:

+

Returns the name of the current drawing style.

- (NSString *)styleName

+
Discussion

"Aqua" and "Metal" are the currently supported options.

+
See Also
+ +

tabView:

+

Returns the instance of NSTabView being controlled.

- (NSTabView *)tabView

+
Discussion

This class will not function properly if this object is nil.

+
See Also
+ +

Delegate Methods

+ +

You application controller can keep track of activity from the tab view and the user via the following delegate methods.

+ +

tabView:shouldCloseTabViewItem:

+

Sent when a user clicks the close button on a tab.

- (BOOL)tabView:(NSTabView *)tabView shouldCloseTabViewItem:(NSTabViewItem *)tabViewItem

+
Discussion

If you return NO, the tab will not be closed. Please make sure to alert the user as to why with a sheet or dialog.

+ +

tabView:willCloseTabViewItem:

+

Sent when tab is about to be closed.

- (void)tabView:(NSTabView *)tabView willCloseTabViewItem:(NSTabViewItem *)tabViewItem

+
Discussion

This presents you with an opportunity to clean up the application objects/events/sessions represented by the tab.

+ +

tabView:didCloseTabViewItem:

+

Sent after a tab has been closed.

- (void)tabView:(NSTabView *)tabView didCloseTabViewItem:(NSTabViewItem *)tabViewItem

+
Discussion

This presents you with an opportunity to clean up the application objects/events/sessions represented by the tab. Don't go trying to modify the tabViewItem - it is about to be released, and has already been removed from the tabView!

+ +

tabView:didSelectTabViewItem:

+

Informs the delegate that tabView has selected tabViewItem.

- (void)tabView:(NSTabView *)tabView didSelectTabViewItem:(NSTabViewItem *)tabViewItem

+ +

tabView:shouldSelectTabViewItem:

+

Invoked just before tabViewItem in tabView is selected.

- (BOOL)tabView:(NSTabView *)tabView shouldSelectTabViewItem:(NSTabViewItem *)tabViewItem

+
Discussion

The delegate can return NO to prevent selection of specific tabs.

+ +

tabView:willSelectTabViewItem:

+

Informs the delegate that tabView is about to select tabViewItem.

- (void)tabView:(NSTabView *)tabView willSelectTabViewItem:(NSTabViewItem *)tabViewItem

+ +

tabViewDidChangeNumberOfTabViewItems:

+

Informs the delegate that the number of tab view items in tabView has changed.

- (void)tabViewDidChangeNumberOfTabViewItems:(NSTabView *)tabView

+ + + + + + \ No newline at end of file diff --git a/PSMTabBarControl/documentation/frameset_styles.css b/PSMTabBarControl/documentation/frameset_styles.css new file mode 100644 index 0000000000..298e192a89 --- /dev/null +++ b/PSMTabBarControl/documentation/frameset_styles.css @@ -0,0 +1,943 @@ +/* link classes */ +A:link { COLOR: #0000FF; TEXT-DECORATION: none; } +A:link:hover { COLOR: #FF6600; TEXT-DECORATION: underline; } +A:active { COLOR: #FF6600; TEXT-DECORATION: underline; } + +/* apple.com site does not explicitly define visited link properties, but we do here */ +A:visited { COLOR: #0000AA; TEXT-DECORATION: none; } +A:visited:hover { COLOR: #FF6600; TEXT-DECORATION: underline; } + +/* used to convert otherCodeCharacters to code, thus saving character space in HTML for smaller file sizes */ +tt { + FONT-SIZE: 11px; FONT-FAMILY: monaco, courier, monospace; } + +/* redefine preformated text and code blocks */ +PRE { + FONT-SIZE: 11px; FONT-FAMILY: monaco, courier, monospace; margin-top: 5px; margin-bottom: 10px;} +CODE { + FONT-SIZE: 11px; FONT-FAMILY: monaco, courier, monospace; } + + +/* JavaScript toc frame */ +.jtoc_closed { background-color: #e9e9e9; } +.jtoc_open { background-color: #FFFFFF; padding-bottom: 10px; } +.jtoc_open_top_line {border-top: 1px solid #CCC; background-color: #fff; padding-bottom: 10px;} +.jtoc_open_bottom_line {border-bottom: 1px solid #CCC; background-color: #fff; padding-bottom: 10px;} +.jtoc_open_both_lines {border-bottom: 1px solid #CCC; border-top: 1px solid #CCC; background-color: #fff; padding-bottom: 10px;} + +/* frameset: toc frame */ +.toc_contents_text { + font-family: lucida grande, geneva, helvetica, arial, sans-serif; font-size: 12px; font-weight: bold; padding-top: 4px 0; + color: #0000FF; +} +.toc_contents_text_open { + font-family: lucida grande, geneva, helvetica, arial, sans-serif; font-size: 12px; + background: #FFFFFF; color: #0000FF; +} +.low_level_text { + font-family: lucida grande, geneva, helvetica, arial, sans-serif; font-size: 11px; padding: 4px 5px 4px 5px + color: #0000FF; +} + +#toc_contents_title { + font-family: lucida grande, geneva, helvetica, arial, sans-serif; font-size: 16px; color: #FFFFFF; font-weight: bold; +} +.toc_contents_heading { + font-family: lucida grande, geneva, helvetica, arial, sans-serif; font-size: 12px; font-weight: bold; +} + +/* Special TOC heading for Help books only */ +.toc_contents_help_heading { + font-family: lucida grande, geneva, helvetica, arial, sans-serif; font-size: 14px; color: #330099; font-weight: bold; +} + +/* frameset: toc frame styles WEB AS. used for any document that uses the disclosure model for TOC like conceptural and procedural C documents*/ +#toc { + padding: 0 0 0 0; +} + +#toc p.download { + padding: 5px 10px; + margin: 0; + font-weight: normal; font-size: 11px; +} + +#toc_PDFbottomborder { + padding-top: 5px; + border-bottom: 1px solid #CCC; +} + + +#toc h2 { + margin: 0; + padding: 10px; + font-size: 15px; font-weight: bold; + border-bottom: 0px solid; +} + +#toc h3 { + margin: 6px 5px 0 10px; + font-size: 13px; font-weight: bold; color: black; +} + +#toc h4 { + font-size: 11px; font-weight: bold; color: black; + margin: -5px 0px 0 14px; +} + +#toc_staticbox { + padding: 0 0 0 0; + border: 1px solid #919699; + background: #e9e9e9; +} + +#toc ul { + list-style: none outside; + margin-left: 20px; margin-bottom: -2px; + padding: 0px; +} + +#toc ul ul{ + list-style: none outside; + margin-left: 10px; margin-bottom: -2px; + padding: 0px; +} + +#toc li a { + margin-left: 5px; + display: block; + padding: 0px 5px 0px 5px; +} + +#toc li a.location { + font-weight: bold; color: #000; + text-decoration: none; +} + +#toc li{ + font-weight: normal; font-size: 11px; + padding: 0px 5px 0px 0px; + list-style-type: none; background: url(../Images/bullet.gif) no-repeat 0px .5em; + } + +#toc li li a { + margin-left: 0px; +} + + +#toc ul ul li { + background: url(../Images/dash.gif) no-repeat 0px .6em; +} + +#toc ul ul ul li { + background: url(../Images/sm_bullet.gif) no-repeat 0px .5em; +} + +#toc li.open { + border-top: 1px solid #CCC; border-bottom: 1px solid #CCC; background-color: #fff; +} + +#toc .open ul { + background-color: #fff; +} + +li img { + margin-left: 0px; +} +/*#toc li.open { background: #FFF;}*/ + + +/* frameset: toc frame styles WEB AS. used for any document that uses the static model for TOC topics documents*/ + +#topicstoc { + padding: 0px 0px 0px; +} + + +#topicstoc p.download { + border-bottom: 1px solid #CCC; + padding: 5px 10px; + margin: 0px; + font-weight: normal; font-size: 11px; +} + +#topicstoc h2 { + margin: 0; + padding: 10px; + font-size: 15px; font-weight: bold; + border-bottom: 0px solid; +} + +#topicstoc h3 { + margin: 6px 5px 0 10px; + font-size: 13px; font-weight: bold; color: black; +} + +#topicstoc h4 { + font-size: 11px; font-weight: bold; color: black; + margin: 2px 0px 0px 14px; +} + +#topicstoc ul { + list-style: none outside; + margin-left: 13px; margin-bottom: -2px; + padding: 0px; +} + + +#topicstoc ul ul{ + list-style: none outside; + margin-left: 10px; margin-bottom: -2px; + padding: 0px; +} + +#topicstoc li{ + font-weight: normal; font-size: 12px; + padding: 0px 5px 2px 10px; + list-style-type: none; background: url(../Images/bullet.gif) no-repeat 0px .5em; +} + +#topicstoc li.intro { + font-weight: normal; + padding: 0px 0px; + list-style-type: none; background: none; +} + +#topicstoc li a { + display: block; + padding: 0px 5px 0px 0px; +} + +#topicstoc li a.location { + font-weight: bold; color: #000; + text-decoration: none; +} + +#topicstoc li.intro a { + margin-left: -5px; + display: block; +} + + +img.toplevel { float: left; } + + + +/* frameset: content frame */ +BODY { + margin-top: 0; + color: #000; + font: 12px lucida grande, geneva, helvetica, arial, sans-serif; + } + +/* frameset: H1,H2,H3,H4,H5,Head for code voice */ + +h1 { + margin-top: 1em; + margin-bottom: 25px; + font: bold 30px lucida grande, geneva, helvetica, arial, sans-serif; + color: #000; + } +h2 { + margin-top: 2.5em; + font-size: 24px; + color: #000; + padding-bottom: 2px; border-bottom: 1px solid black; + } +h3 { + margin-top: 2em; + margin-bottom: .5em; + font-size: 19px; + color: #000; + } +h3.tight { + margin-top: 3em; + margin-bottom: -.25em; + font-size: 19px; + color: #000; + } +h4 { + margin-top: 2em; + margin-bottom: .5em; + font-size: 15px; + color: #000; + } +h5 { + margin: 20 0 0 0; + padding: 0; + font-size: 13px; + color: #000; + } +.mach4{ + margin-top: 40; + margin-bottom: 0; + padding-top: 0; + font: bold 16px lucida grande, geneva, helvetica, arial, sans-serif; + color: #000; + } +.mach5{ + margin: 30 0 -9 0; + font: bold 13px lucida grande, geneva, helvetica, arial, sans-serif; + color: #000; + } +h5.tight{ + margin: 1.5em 0 2px 0; + font: bold 13px lucida grande, geneva, helvetica, arial, sans-serif; + color: #000; + } + + +.code_head{ + FONT-SIZE: 18px; FONT-FAMILY: monaco, courier, monospace; font-weight: bold; +} +p { + margin-top: 0px; margin-bottom: 10px; font: 12px lucida grande, geneva, helvetica, arial, sans-serif; + } +p.spaceabove { + margin-top: 13px; margin-bottom: 10px; font: 12px lucida grande, geneva, helvetica, arial, sans-serif; + } +p.spaceabovemethod { + font: 11px monaco, courier, monospace; margin-top: 13px; margin-bottom: 10px; +} +h3.tight + p { + margin-top: 13px; margin-bottom: 10px; font: 12px lucida grande, geneva, helvetica, arial, sans-serif; + } +h3.tight + p.spaceabovemethod { + font: 11px monaco, courier, monospace; margin-top: 13px; margin-bottom: 10px; +} +.content_text{ + margin-top: 0px; margin-bottom: 10px; font: 12px lucida grande, geneva, helvetica, arial, sans-serif; +} +p.blockquote{ + padding-left: 50pt; + padding-right: 50pt; + } +ul.availability { + list-style-type: none; + margin: 0 0 -10px 0; + } +.availability li { + margin: 2px 0 0 -6px; + } + +/* frameset: content frame bold style for text*/ +b{ + font-family: lucida grande, geneva, helvetica, arial, sans-serif; font-size: 12px; font-weight: bold; +} + +/* Used for text that is sligtly larger than bold text like lables and captions*/ +.content_text_label{ + font-family: lucida grande, geneva, helvetica, arial, sans-serif; font-size: 12px; +} + +/* frameset: content frame italic style for text*/ +i{ + font-family: lucida grande, geneva, helvetica, arial, sans-serif; font-size: 12px; font-style: italic; +} + +/* Used for reference heads in ProcedualC and AppleScript Language*/ +.content_ref_head{ + font-family: lucida grande, geneva, helvetica, arial, sans-serif; + font-size: 16px; font-weight: bold; margin-top: 50px; padding-bottom: 4px; border-bottom: 1px solid black + } + +.content_ref_head_code{ + font-family: monaco, courier, monospace; + font-size: 16px; font-weight: bold; margin-top: 50px; padding-bottom: 4px; border-bottom: 1px solid black + } + +/* frameset: page title */ +.page_title{ + font-family: lucida grande, geneva, helvetica, arial, sans-serif; + font-size: 34px; + font-weight: bold; + color: #000000; + padding-top: 10px; + } + +/* frameset: Unordered List */ + +ul.spaceabove { + list-style: square outside; + margin: 0 0 0 30px; + padding: 7 0 12px 6px; + } + +ul { + list-style: square outside; + margin: 0 0 0 30px; + padding: 0 0 12px 6px; + } + +li { + margin-top: 7px; + } + + +li p { + margin-top: 8px; + } + +ul ul { + list-style: circle outside; + margin: 6 0 0 30px; + padding: 0 0 12px 6px; + } +ul.3head { + list-style: square outside; + margin: 0 0 0 20px; + padding: 0 0 0px 0px; + } + + +/* alternate mappings for 2nd level bulleted list that are still in testing phase*/ +.nested li { + list-style-image: url(../Images/openbullet.gif); + list-style-position: outside; + } + +ul.nested { + list-style: none; + margin: 6 0 0 30px; + } + +ol { + list-style-type: decimal; + list-style-position: outside; + margin: 0 0 0 30px; + padding: 0 0 12px 6px; + } + +ol ol { + list-style-type: lower-alpha; + list-style-position: outside; + margin: 7 0 0 30px; + padding: 0 0 12px 10px; + } + +ul.simple-spaceabove { + list-style-type: none; + margin: 5 0 0 20px; + } +.simple-spaceabove li { + margin-top: 1px; + } + +ul.simple { + list-style-type: none; + margin: 0 0 0 30px; + } +.simple li { + margin-top: -1px; + } + +dl.table-display { + clear: both; + width: auto; + margin: 0; + padding: 0px; + } + +.table-display dt { + width: 8em; + float: left; + margin: 0 0 0 0; + padding: .1em; + } + +/* commented backslash hack for mac-ie5 \*/ +dt { clear: both; } + + +.table-display dd { + float: left; + width: 80%; + margin: 0 0 0 0; + padding: .1em; + display: block; + } + +.clear { + clear: both; + } +dl.termdef { + margin-top: 0px; + margin-bottom: 10px; } +.termdef dt { + margin-top: 0px; } +.termdef dd { + margin-left: 15px; + margin-top: 1px; + margin-bottom: 6px; } +.termdef p{ + margin-left: 15px; + margin-top: -1px; + margin-bottom: 6px; } +h3.tight + dl.termdef { + margin-top: 13px; + margin-bottom: 10px; } + +/* frameset: list items */ +/* Everything in a list item is wrapped in an element now. */ +/* First para in a list item should be inline, others should be block. */ +li>p { display: inline } +li>p+p { display: block } + + +/* frameset: Index styles for docs */ +/* frameset: Index styles for alpah listing */ +.index_alpa{ + font-size: 18px; padding-bottom: 5px; margin: 25px 0 15px; border-bottom: 1px solid #91969C; } + +/* frameset: Index styles for singal and page range entries */ +.libindex{ +font-size: 12px; padding: 0 3px; background-color: #FFFFFF; margin: 0 3px; } + + + +/* frameset: mini navigation style (Hide/Show TOC & next/prev) */ +.mini_nav_text { + font-family: lucida grande, geneva, helvetica, arial, sans-serif; + font-size: 9px; + font-weight: normal; +} + +.breadcrumb { + font-family: lucida grande, geneva, helvetica, arial, sans-serif; + font-size: 10px; + font-weight: normal; + margin-left: 10px; + margin-top: 8px; +} + +/* ADC header/footer mappings for Getting Started */ +/* header */ +#adcnavheader td { + font: 10px lucida grande, geneva, helvetica, arial, sans-serif; + } + +#adcnavheader input { + margin: 0 3px 0 0; + padding: 0; + } + +#adcnavheader .textpadding { + padding-top: 2px; + vertical-align: middle; + } + +#adcnavheader .searchbutton { + border: 0; + } + +#adcnavheader h6 { + margin: 0; + padding: 0; + font: normal 12px lucida grande, geneva, helvetica, arial, sans-serif; + color: #000; +} + +#adcnavheader form { + margin: 0; +} + + +/* footer */ +#footer td, #footer p { + font-size: 10px; + } + + +/* Getting Started styles */ + +/* font definitions */ + +/* keep ".gettingstarted pre, code" above ".gettingstarted h1" below otherwise, +the main h1 tag above will be used instead of".gettingstarted h1" */ +.gettingstarted pre, code { + font: 11px Monaco, Courier, monospace; + } + +/* Added this style since the ADC template was trying to do this with a graphic (Note: their h2 +attached to the image tag is only used by search engines; their h2 does not function if the +graphic is missing).--DA */ +.gettingstarted h2 { + margin: 0; + margin-bottom: 15px; + padding: 0px; + font: bold 32px 'Lucida Grande', Geneva, Verdana, Arial, Helvetica, sans-serif; + color: #000; + } + +.gettingstarted h3 { + margin: 0 0 5px 0; + padding: 0px; + font: bold 16px 'Lucida Grande', Geneva, Verdana, Arial, Helvetica, sans-serif; + color: #000; + } + +.gettingstarted p + .gettingstarted h3 { + margin-top: 20px; + } + +.gettingstarted ol + .gettingstarted h3 { + margin-top: 20px; + } + +.gettingstarted ul + .gettingstarted h3 { + margin-top: 20px; + } + +.gettingstarted h4 { + margin: 0px; + padding: 0px; + font: bold 12px 'Lucida Grande', Geneva, Verdana, Arial, Helvetica, sans-serif; + color: #000; + } + +.gettingstarted h4 + .gettingstarted table { + margin-top: 10px; + } + +.gettingstarted p { + margin-top: 0; + margin-bottom: 10px; + padding: 0; + font: 12px 'Lucida Grande', Geneva, Verdana, Arial, Helvetica, sans-serif; + color: #000; + } + +.gettingstarted th { + font-weight: bold; + text-align: left; + } + + +/* list definitions */ +.gettingstarted ul { + font: 12px 'Lucida Grande', Geneva, Verdana, Arial, Helvetica, sans-serif; + padding-left: 10px; + margin-top: 0; + margin-left: 10px; + margin-bottom: 10px; + list-style-type: none; + } + +.gettingstarted li { + margin-top: 3px; + } + + +.gettingstarted ul li { + list-style: square outside; + margin: 0 0 0 30px; + padding: 0 0 4px 0; + } + +.gettingstarted ul ul { + margin-left: 20px; + } + +.gettingstarted ol { + font: 12px 'Lucida Grande', Geneva, Verdana, Arial, Helvetica, sans-serif; + margin-top: 0; + margin-left: 1.5em; + margin-bottom: 10px; + padding-left: 1.5em; + } + +.gettingstarted ul.inline, .gettingstarted ol.inline, .gettingstarted p.inline { + margin-top: -7px; + } + +/* table styles */ +caption.tablecaption { + margin-bottom: 5px; + text-align: left; +} +.sourcecodebox { + border: 1px solid #c7cfd5; + background: #f1f5f9; + margin: 20px 0; + } + +div.tableholder { + margin-top: 20px; + margin-bottom: 20px; + } + +p.tableholder { + margin-bottom: 7px; + font: 12px lucida grande, geneva, helvetica, arial, sans-serif; + } + +.graybox { + border-top: 1px solid #919699; + border-left: 1px solid #919699; + } + +.graybox th { + padding: 4px 8px 4px 8px; + background: #E2E2E2; + font-size: 12px; + border-bottom: 1px solid #919699; + border-right: 1px solid #919699; + } +.graybox th p { + font-weight: bold; + margin-bottom: 0px; + } + +.graybox td { + padding: 8px; + font-size: 12px; + text-align: left; + vertical-align: top; + border-bottom: 1px solid #919699; + border-right: 1px solid #919699; + } +.graybox td p { + margin-bottom: 0px; + } +.graybox td p + p { + margin-top: 5px; + } +.graybox td p + p + p { + margin-top: 5px; + } + + +/* footnote definitions */ +.footnote h4, .footnote p { + color: #76797C; + font-size: 11px; + } + +.gettingstarted .footnote { + font-size: 11px; + color: #76797C; + } + + +.notebox { + border: 1px solid #a1a5a9; + background-color: #f7f7f7; + margin: 20px 0; + padding: 0px 8px 1px 9px; + text-align: left; + } +.notebox p { + font: 12px lucida grande, geneva, helvetica, arial, sans-serif; + margin-top: 7px; + margin-bottom: 0px; + } +.importantbox { + border: 1px solid #111; + background-color: #e8e8e8; + margin: 20px 0; + padding: 0px 8px 1px 9px; + text-align: left; + } +.importantbox p { + font: 12px lucida grande, geneva, helvetica, arial, sans-serif; + margin-top: 7px; + margin-bottom: 0px; + } +.warningbox { + border: 1px solid #000; + background-color: #fff; + margin: 20px 0; + padding: 8px; + text-align: left; + } +.warningicon { + background-color: transparent; + padding-right: 10px; + float: left; + } +.warningbox p { + border-style: none; + font: 12px lucida grande, geneva, helvetica, arial, sans-serif; + margin: -8px 0 -8px 30px; + } +div.codesample { + margin: 20px 0; + } +.codesample pre { + font-size: 11px; + font-family: monaco, courier, monospace; + margin: -1px 4px -3px 6px; + white-space: pre; + } +.codesample span { + margin-right: 8px; + float: right; + } +p.codesample { + margin-top: 20px; margin-bottom: -15px; font: 12px lucida grande, geneva, helvetica, arial, sans-serif; + } + + +/* Controller Layer Bindings styles */ + +.class_binding_block { + } + +.binding_category_block { + margin-left: 1em + } + +.binding_category_name { + font-size: 24px; font-family: lucida grande, geneva, helvetica, arial, sans-serif; font-weight: bold; line-height: 35px; padding-bottom: 1px; border-top: 2px solid black + } + +.binding_block { + margin-left: 2em + } + +.binding_name { + font-size: 18px; font-family: monaco, courier, monospace; font-weight: 400; margin-top: 10px; margin-bottom: 12px; border-bottom: 1px solid #69f + } + +.bindings_tablehead { font-size: 14px; font-family: lucida grande, geneva, helvetica, arial, sans-serif; font-weight: bold; position: relative; top: -5px; margin-left: -20px + } + +.placeholder_options_block { + margin-left: 2em + } + +.availabilityList { + border: none; + margin-top: 5px; + margin-bottom: 0px; + font-size: 12px; + text-align: left; + } + +.availabilityItem { + margin-top: -15px; + margin-bottom: 15px; + padding-left: 78px; + } + + +.metadata_attributes_name { + font-size: 24px; font-family: lucida grande, geneva, helvetica, arial, sans-serif; font-weight: bold; padding-top: 5px; margin-bottom: -10px; border-top: 2px solid black + } + +.metadata_attribute_name { + font-size: 18px; font-family: monaco, courier, monospace; font-weight: 400; margin-top: 10px; padding-bottom: 2px; + } + + +/* Spec Sheet Info Box */ +/* Used in AppKit Obj-C, Appkit Java, Foundation Obj-C, and Foundation Java References */ + +.spec_sheet_info_box { margin-left: 1em } + +/* This builds a table */ +.specbox { + border-top: 1px solid #919699; + border-left: 1px solid #919699; + border-right: 1px solid #919699; + margin-bottom: 10px; + } + +.specbox td { + padding: 8px; + font-size: 12px; + text-align: left; + vertical-align: top; + border-bottom: 1px solid #919699; + } + +/* This alternates colors in up to six table rows (light blue for odd, white for even)*/ + +.specbox tr { + background: #F0F5F9; +} + +.specbox tr + tr { + background: #FFFFFF; +} + +.specbox tr + tr + tr { + background: #F0F5F9; +} + +.specbox tr + tr + tr + tr { + background: #FFFFFF; +} + +.specbox tr + tr + tr +tr + tr { + background: #F0F5F9; +} + +.specbox tr + tr + tr + tr + tr + tr { + background: #FFFFFF; +} + +/* informal protocol subtitling */ + +.protocol_subtitle { + margin-top: -25px; + margin-bottom: 25px; + font-size: 13px; +} + +/* HeaderDoc headings */ + +.hd_tocAccess { + margin-left: 16px; + margin-top: 3px; + display: block; + font-weight: bold; +} +.hd_tocAccessSpace { + display: block; + font-size: 8px; +} + +.hd_tocGroup { + margin-left: 8px; + margin-top: 5px; + display: block; + font-style: italic; +} +.hd_tocGroupSpace { + display: block; + font-size: 8px; +} + +/* "Collection page" mappings */ + +.forums { margin-bottom: 5px;} +.forums b, +.forums a:link, +.forums a:visited { color: #017; font-family: lucida grande, geneva, helvetica, arial, sans-serif; font-size: 11px; font-weight: bold; line-height: 13px;} +.forums a:hover { color: #00F; text-decoration: underline; font-weight: bold;} +.collection { margin-bottom: 5px;} +.collection h3, +.collection a:link, +.collection a:visited { font-size: 13px; color: #76797C; padding-bottom: 2px; border-bottom: 1px dotted #a1a5a9; margin-bottom: 0px; margin-right: 3px;} +.collection a:hover { color: #00F; text-decoration: underline; font-weight: bold;} + +.collection_title { width: 100%; + background-color: #7E91A4; + padding: 15px; + padding-right: 15px; + padding-bottom: 2px; + padding-left: 15px; + } + +.collection_title a:link, +.collection_title a:visited { color: #E8F3FD; } + +h1.collections { + margin-top: 0px; + margin-bottom: 25px; + font: bold 30px lucida grande, geneva, helvetica, arial, sans-serif; + color: #ffffff; + text-align: center; } + + \ No newline at end of file diff --git a/PSMTabBarControl/images/32x32_log.tiff b/PSMTabBarControl/images/32x32_log.tiff new file mode 100644 index 0000000000000000000000000000000000000000..86cdfb51116ccf04b04114327380fff707a24bac GIT binary patch literal 20328 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 OMpmprX|x{M<^Kl-Vhvyb literal 0 HcmV?d00001 diff --git a/PSMTabBarControl/images/AquaTabNew.png b/PSMTabBarControl/images/AquaTabNew.png new file mode 100644 index 0000000000000000000000000000000000000000..843b3c386d52b0b487cca15df6d207890bc9a666 GIT binary patch literal 3139 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 literal 0 HcmV?d00001 diff --git a/PSMTabBarControl/images/AquaTabNewRollover.png b/PSMTabBarControl/images/AquaTabNewRollover.png new file mode 100644 index 0000000000000000000000000000000000000000..f7285117956f4356eb19b4ed8edc7f99a95a9841 GIT binary patch literal 3147 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 literal 0 HcmV?d00001 diff --git a/PSMTabBarControl/images/AquaTabsBackground.png b/PSMTabBarControl/images/AquaTabsBackground.png new file mode 100644 index 0000000000000000000000000000000000000000..456ca6172d9e6ec3a6f46078b5c6cdbb898012d7 GIT binary patch literal 3091 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 literal 0 HcmV?d00001 diff --git a/PSMTabBarControl/images/AquaTabsDown.png b/PSMTabBarControl/images/AquaTabsDown.png new file mode 100644 index 0000000000000000000000000000000000000000..2db28ae1f4a58288922f7abeb7da69e6a14dd28b GIT binary patch literal 2901 zcmV-b3##;qP)KLZ*U+5Lu!Sk^o_Z5E4Meg@_7P6crJiNL9pw)e1;Xm069{HJUZAPk55R%$-RIA z6-eL&AQ0xu!e<4=008gy@A0LT~suv4>S3ILP<0Bm`DLLvaF4FK%)Nj?Pt*r}7;7Xa9z9H|HZjR63e zC`Tj$K)V27Re@400>HumpsYY5E(E}?0f1SyGDiY{y#)Yvj#!WnKwtoXnL;eg03bL5 z07D)V%>y7z1E4U{zu>7~aD})?0RX_umCct+(lZpemCzb@^6=o|A>zVpu|i=NDG+7} zl4`aK{0#b-!z=TL9Wt0BGO&T{GJWpjryhdijfaIQ&2!o}p04JRKYg3k&Tf zVxhe-O!X z{f;To;xw^bEES6JSc$k$B2CA6xl)ltA<32E66t?3@gJ7`36pmX0IY^jz)rRYwaaY4 ze(nJRiw;=Qb^t(r^DT@T3y}a2XEZW-_W%Hszxj_qD**t_m!#tW0KDiJT&R>6OvVTR z07RgHDzHHZ48atvzz&?j9lXF70$~P3Knx_nJP<+#`N z#-MZ2bTkiLfR>_b(HgWKJ%F~Nr_oF3b#wrIijHG|(J>BYjM-sajE6;FiC7vY#};Gd zST$CUHDeuEH+B^pz@B062qXfFfD`NpUW5?BY=V%GM_5c)L#QR}BeW8_2v-S%gfYS= zB9o|3v?Y2H`NVi)In3rTB8+ej^> zQ=~r95NVuDChL%G$=>7$vVg20myx%S50Foi`^m%Pw-h?Xh~i8Mq9jtJloCocWk2Nv zrJpiFnV_ms&8eQ$2&#xWpIS+6pmtC%Q-`S&GF4Q#^mhymh7E(qNMa}%YZ-ePrx>>xFPTiH1=E+A$W$=bG8>s^ zm=Bn5Rah$aDtr}@$`X}2l~$F0mFKEdRdZE8)p@E5RI61Ft6o-prbbn>P~)iy)E2AN zsU20jsWz_8Qg>31P|s0cqrPALg8E|(vWA65poU1JRAaZs8I2(p#xiB`SVGovRs-uS zYnV-9TeA7=Om+qP8+I>yOjAR1s%ETak!GFdam@h^# z)@rS0t$wXH+Irf)+G6c;?H29p+V6F6oj{!|o%K3xI`?%6x;DB|x`n#ibhIR?(H}Q3Gzd138Ei2)WAMz7W9Vy`X}HnwgyEn!VS)>mv$8&{hQn>w4zwy3R}t;BYlZQm5)6pty=DfLrs+A-|>>;~;Q z_F?uV_HFjh9n2gO9o9Q^JA86v({H5aB!kjoO6 zc9$1ZZKsN-Zl8L~mE{`ly3)1N^`o1+o7}D0ZPeY&J;i;i`%NyJ8_8Y6J?}yE@b_5a zam?eLr<8@mESk|3$_SkmS{wQ>%qC18))9_|&j{ZT zes8AvOzF(F2#DZEY>2oYX&IRp`F#{ADl)1r>QS^)ba8a|EY_^#S^HO&t^Rgqwv=MZThqqEWH8 zxJo>d=ABlR_Bh=;eM9Tw|Ih34~oTE|= zX_mAr*D$vzw@+p(E0Yc6dFE}(8oqt`+R{gE3x4zjX+Sb3_cYE^= zgB=w+-tUy`ytONMS8KgRef4hA?t0j zufM;t32jm~jUGrkaOInTZ`zyfns>EuS}G30LFK_G-==(f<51|K&cocp&EJ`SxAh3? zNO>#LI=^+SEu(FqJ)ynt=!~PC9bO$rzPJB=?=j6w@a-(u02P7 zaQ)#(uUl{HW%tYNS3ItC^iAtK(eKlL`f9+{bJzISE?u8_z3;~C8@FyI-5j_jy7l;W z_U#vU3hqqYU3!mrul&B+{ptt$59)uk{;_4iZQ%G|z+lhASr6|H35TBkl>gI*;nGLU zN7W-nBaM%pA0HbH8olyl&XeJ%vZoWz%6?Y=dFykl=imL}`%BMQ{Mhgd`HRoLu6e2R za__6DuR6yg#~-}Tc|Gx_{H@O0eebyMy5GmWADJlpK>kqk(fVV@r_fLLKIeS?{4e)} z^ZO;zpECde00d`2O+f$vv5tKEQIh}w03c&XQcVB=dL;k=fP(-4`Tqa_faw4Lbua(` z>RI+y?e7jKeZ#YO-C0CGu0K~#9!q|q@7fG`vT(EhekYZcGl%|Y+gOKLZ*U+a;PZ6DwmS#U-~Zwqe!V{P^5NQ_9g-#oEmo*;xPb(iB&l8cre(mz}OV*eH{#TR|kW=R}lIJ?{~DG)Bo+4 zAbf;><^G%f96osg?Z>_^0LZWiQ~(8dnuN(GaAFtKB$Sef@py224*@uu&M1l$ljTHK zt?-}2?DT>;$ABYkFINIi10NQgY%ySKzHl{Q!_CYMd)nDtz_zCj@7`&ZDgj?_Tv3NQ zoq`guZlp5--{|Itvka>|)OY)H!ydhn&X4p{g@8$uK|w(xhKx*tEGiZMzX2RyhVO^s z`Kt2n`O3XNJ@AZM9zd#V-*(!~mM6{HcE^xXUDNJ)h7*-?mUba3#bh}F@C(a=tFsg9 z>D&MS00d`2O+f$v*z5Hi6siCK03c&XQcVB=ZYKZ$bFTmZ^``&;g(d(1Z?6CV=e_^{ zG3)>U7w#KILV^GQ0E|gQK~#9!T+hJ@!axj!;Xm7Kw?(Y)?x6_!ekzI}wMc2Z@unN+ z_CaPK()S07$oYB$%m75t;WdJQWg{T^97aUG_xhfuvaid$I9q`dQ zM(n!cxk;^*|D_nge(t*6l2^klTL?in+fD*zU{s3iPseiaGXQy- VF0>PS{}KQI002ovPDHLkV1ldzb_@Uj literal 0 HcmV?d00001 diff --git a/PSMTabBarControl/images/AquaTabsDownNonKey.png b/PSMTabBarControl/images/AquaTabsDownNonKey.png new file mode 100644 index 0000000000000000000000000000000000000000..34a57ff6396a34b6ec6ab983d16e788ad1a4eceb GIT binary patch literal 787 zcmV+u1MK{XP)KLZ*U+a;PZ6DwmS#U-~Zwqe!V{P^5NQ_9g-#oEmo*;xPb(iB&l8cre(mz}OV*eH{#TR|kW=R}lIJ?{~DG)Bo+4 zAbf;><^G%f96osg?Z>_^0LZWiQ~(8dnuN(GaAFtKB$Sef@py224*@uu&M1l$ljTHK zt?-}2?DT>;$ABYkFINIi10NQgY%ySKzHl{Q!_CYMd)nDtz_zCj@7`&ZDgj?_Tv3NQ zoq`guZlp5--{|Itvka>|)OY)H!ydhn&X4p{g@8$uK|w(xhKx*tEGiZMzX2RyhVO^s z`Kt2n`O3XNJ@AZM9zd#V-*(!~mM6{HcE^xXUDNJ)h7*-?mUba3#bh}F@C(a=tFsg9 z>D&MS00d`2O+f$v*z5Hi6siCK03c&XQcVB=ZYKZ$bFTmZ^``&;g(d(1Z?6CV=e_^{ zG3)>U7w#KILV^GQ08~jtK~#9!l+U3Nz%UF$(WtSrKgt!Bw%gg%z9b8%z@NSo5azra z3uZ<^B7#F^a#(8>Veef8036(%!qt9~F$Ra;I|o%QE<~iZK>0@<R|DNig)WpGT%PfAtr%uP&B4N6T+sVqF1Y6Da>+0(@_q~cc6Jj>!|{(JaZG%Q-e|yQz{EjrrH1%&GK|{45_%4G|McP&4IyirNl2r z7JD iYe34jRB<{qFfs(35dFs3=&}LmN(N6?KbLh*2~7Yrom!Lt literal 0 HcmV?d00001 diff --git a/PSMTabBarControl/images/Folder.tif b/PSMTabBarControl/images/Folder.tif new file mode 100644 index 0000000000000000000000000000000000000000..4d4cc0bbceafa936043573af09417be64d097b1c GIT binary patch literal 926 zcmebEWzb?^V7k%3pb%i8BF4+!;*=P$BgIUXzk?yk@qtOmG>0C|(2v`HuCrOi;or}+Y?(XADyh*pJ0ENuig9abN70CP5-Z#o)&#m z2?^>r;v_onbGg<1H{Vuge!GxkasOHHA;B{$@>8!fbtn81*s{a^ez^JHYj4Zy?q!@e zU;OvZhf4dKzG=Vzx@}FgKkw-}`OmqApnVs*uC4y#mh7>Oaps08iZXp3333tQ!o4T{ zXKXcE^{TE+8HU4N1SSx?xXs~(O+HCtvUEe-`__y*RbQ|>;?bY4>iUibUaI3&Wjs^cb);~w1Mkv}Zx|aMczCt(Cogzb(zk?@tA6sbl@GaP z++Y3)lRkd%m%o(z#&7O3-A{gTl4$?<$9{&uiXX9am%rHNKAruChBEK76HJT@2}^}+ z`r0ebSoWuXfw=pt9#aV%B*r04CAX|_DC=b-jz`(&M3Ka*6Fp9y%nHU(w;q3E_QVc*7 qKrWR0gSr3%lm-AXOkSS= literal 0 HcmV?d00001 diff --git a/PSMTabBarControl/images/Globe.tiff b/PSMTabBarControl/images/Globe.tiff new file mode 100644 index 0000000000000000000000000000000000000000..3c893505eb64071e676a67591d5712682e7fee55 GIT binary patch literal 17104 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 literal 0 HcmV?d00001 diff --git a/PSMTabBarControl/images/TabClose_Front.tif b/PSMTabBarControl/images/TabClose_Front.tif new file mode 100644 index 0000000000000000000000000000000000000000..abdea19f7a02aacd797e91af4fd275bffd56b1ca GIT binary patch literal 518 zcmebEWzb?^V036;PzbP4V31@MJ8;s#=!=mkN8`Z<8!aSa#Kko_7JD@ADYbH&psm7^ zno^QCx0hq0U_qptwg?+*n(M|jSIvCq=sah+dF5HT?L7Zyi$m_5(2DM8)^wgFbFXOs z3j2#w&EEX04|X%p;{N`ZE7yyS&sEI0H>#+0i^c0wt))p@1Ggx~lx05c2`H3}3l?{s zDfVagj$5nD_VE7b+PyE%-LomoG_Yp=!cTtOvFlaZ3sTfAE(I-EIp6QT?hS80w(EKO z(oc0>O55_e=2Fat(|hO5T3mB&GQWutXL-%y`TaY5bmx9fKO}Fk{P&|*{T2K#m`}+X z+Z#99y$Pr`VVxhnEWr4S;|GWLQ><4RNY#2K-QVgF_(S_2t7!d}ZA-pN1>Ng6DAQ=# z<9LKchI@j>4y%I#K7!2L6C?^g+P~mnVBlk9U|?nd1|b6vkYI$ed4X&uFq;L)ddJ8N z6=wzV*r04CAX|_DC=b-jz`(&M3Ka+G5QB*`tzs01u^G)7r5J!FfYdX7W0Z!o|1ruy d^@3zHkjxK4hy(QjZGl3rKMf2F>H-W<8USCtlym?9 literal 0 HcmV?d00001 diff --git a/PSMTabBarControl/images/TabClose_Front_Pressed.tif b/PSMTabBarControl/images/TabClose_Front_Pressed.tif new file mode 100644 index 0000000000000000000000000000000000000000..125cf7e310067592a9a516a5d6d325503172bf60 GIT binary patch literal 520 zcmebEWzb?^V03C=PzbP4U{GdOJaG1cNs5suN8`Z<8!aR{gvBje7khowDXr0;V5GwI z&85U^UoY#_j|HCRv_&}1IH_-xxmsa7$5@@&^2)Pv+j;)a7MVUd@m-MhlIIo6Jx?Y5 z>t|~Db^iIcB&8(yV*f9ZTa&oeIdnW;t$A`Vz3kd5Q>(pc3)2m(b2gtAXq3_1qnnp= zF!$@yf-P5cBe-8|U0S_|D{OI0GTV21!<5*v)nP72ULQYK*c`^mZ?kdl?Sir%)>XHw z&kI~r@lBHZzIeyOsAyeXr|)Z&6pzi`q^Vz9HRn;(ZS8xfTkY=)UE95Jp@{r>_Q_Um z@BEpX?cS9B_BprSV@BQ!<_C@U6-t&qH=MrLOUQp~p4AV-eay?uw@ljpReXwF(Zv2! ze2Y4?56L(*9@xp;-MmJW^=K2P;rnBF_<{hDn@Y_o6(9NIl~ZMrjzE hiGfiDsuv`qfn4i-PgtI_GWKi^sVQAk$*()!9N=+&FADie)m~K zZZ7lMi_e99=NzaJu)fbXWsjRO|5O{lFFGA^+t}AM9QYzUEiRa=`bdyr1@lG^{epu3 z?MzQt^!PUD@G>1pdcq)M-T#P*fq{>afq|I;7<>#oK!Op<<^{5uz-$&E>lGt2RGbya zV}r7Rni&Ndfbu}S3=ABMqEK;=4l$TG(<(-B7@N_UQHlX*0!TgMCq`*F`xm1OR4+(I Z1Ihd#gg8(i&=x4<`qRL`pf11wr2(Hfla>Gg literal 0 HcmV?d00001 diff --git a/PSMTabBarControl/images/TabControlRep.tif b/PSMTabBarControl/images/TabControlRep.tif new file mode 100644 index 0000000000000000000000000000000000000000..6ad0f4042a2a716d62a0480d2432d3cdb2280df7 GIT binary patch literal 29768 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 literal 0 HcmV?d00001 diff --git a/PSMTabBarControl/images/TabNewMetal.png b/PSMTabBarControl/images/TabNewMetal.png new file mode 100644 index 0000000000000000000000000000000000000000..5b8301845a2397fd3335f7c3c6a55e716833032c GIT binary patch literal 3137 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 bkIw@DtN)X%NLHKy00000NkvXXu0mjf9LMoo literal 0 HcmV?d00001 diff --git a/PSMTabBarControl/images/TabNewMetalPressed.png b/PSMTabBarControl/images/TabNewMetalPressed.png new file mode 100644 index 0000000000000000000000000000000000000000..b18f6d4cfeebd6f6b279cd0097685b06b64037da GIT binary patch literal 3160 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 literal 0 HcmV?d00001 diff --git a/PSMTabBarControl/images/overflowImagePressed.tif b/PSMTabBarControl/images/overflowImagePressed.tif new file mode 100755 index 0000000000000000000000000000000000000000..f6ad227df7b32d6e4b174ab4f3813e450da480c9 GIT binary patch literal 1018 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 + + + + + Class PSMTabBarControlPalette + + + NibFile PSMTabBarControlPalette + + + Icon TabIcon.tif + + + ToolTips PSMTabBarControl + + + ExportClasses + + PSMTabBarControl + PSMTabBarCell + PSMAquaTabStyle + PSMMetalTabStyle + PSMRolloverButton + PSMProgressIndcator + PSMOverflowPopUpButton + + + + ExportImages + + TabControlRep.tif + TabIcon.tif + + + + ExportSounds + + + + + diff --git a/PSMTabBarControl/source/AppController.h b/PSMTabBarControl/source/AppController.h new file mode 100644 index 0000000000..532e91da64 --- /dev/null +++ b/PSMTabBarControl/source/AppController.h @@ -0,0 +1,17 @@ +// +// AppController.h +// PSMTabBarControl +// +// Created by John Pannell on 12/19/05. +// Copyright 2005 Positive Spin Media. All rights reserved. +// + +#import + +@interface AppController : NSObject { + +} + +- (IBAction)newWindow:(id)sender; + +@end diff --git a/PSMTabBarControl/source/AppController.m b/PSMTabBarControl/source/AppController.m new file mode 100644 index 0000000000..16dfd30c44 --- /dev/null +++ b/PSMTabBarControl/source/AppController.m @@ -0,0 +1,30 @@ +// +// AppController.m +// TabBarControl +// +// Created by John Pannell on 12/19/05. +// Copyright 2005 Positive Spin Media. All rights reserved. +// + +#import "AppController.h" +#import "WindowController.h" + +@implementation AppController + +- (void)awakeFromNib +{ + [self newWindow:self]; + [self newWindow:self]; + NSRect frontFrame = [[NSApp keyWindow] frame]; + frontFrame.origin.x += 400; + [[NSApp keyWindow] setFrame:frontFrame display:YES]; +} + +- (IBAction)newWindow:(id)sender +{ + // put up a window + WindowController *newWindow = [[WindowController alloc] initWithWindowNibName:@"Window"]; + [newWindow showWindow:self]; +} + +@end diff --git a/PSMTabBarControl/source/FakeModel.h b/PSMTabBarControl/source/FakeModel.h new file mode 100644 index 0000000000..aeece3f530 --- /dev/null +++ b/PSMTabBarControl/source/FakeModel.h @@ -0,0 +1,34 @@ +// +// FakeModel.h +// TabBarControl +// +// Created by John Pannell on 12/19/05. +// Copyright 2005 Positive Spin Media. All rights reserved. +// + +#import + + +@interface FakeModel : NSObject { + BOOL _isProcessing; + NSImage *_icon; + NSString *_iconName; + NSObjectController *controller; + int _objectCount; +} + +// creation/destruction +- (id)init; + +// accessors +- (BOOL)isProcessing; +- (void)setIsProcessing:(BOOL)value; +- (NSImage *)icon; +- (void)setIcon:(NSImage *)icon; +- (NSString *)iconName; +- (void)setIconName:(NSString *)iconName; +- (int)objectCount; +- (void)setObjectCount:(int)value; +- (NSObjectController *)controller; + +@end diff --git a/PSMTabBarControl/source/FakeModel.m b/PSMTabBarControl/source/FakeModel.m new file mode 100644 index 0000000000..dee72ec085 --- /dev/null +++ b/PSMTabBarControl/source/FakeModel.m @@ -0,0 +1,77 @@ +// +// FakeModel.m +// TabBarControl +// +// Created by John Pannell on 12/19/05. +// Copyright 2005 Positive Spin Media. All rights reserved. +// + +#import "FakeModel.h" + + +@implementation FakeModel + +- (id)init +{ + if(self == [super init]){ + _isProcessing = YES; + _icon = nil; + _iconName = nil; + _objectCount = 2; + controller = [[NSObjectController alloc] initWithContent:self]; + } + return self; +} + + +// accessors +- (BOOL)isProcessing +{ + return _isProcessing; +} + +- (void)setIsProcessing:(BOOL)value +{ + _isProcessing = value; +} + +- (NSImage *)icon +{ + return _icon; +} + +- (void)setIcon:(NSImage *)icon +{ + [icon retain]; + [_icon release]; + _icon = icon; +} + +- (NSString *)iconName +{ + return _iconName; +} + +- (void)setIconName:(NSString *)iconName +{ + [iconName retain]; + [_iconName release]; + _iconName = iconName; +} + +- (int)objectCount +{ + return _objectCount; +} + +- (void)setObjectCount:(int)value +{ + _objectCount = value; +} + +- (NSObjectController *)controller +{ + return controller; +} + +@end diff --git a/PSMTabBarControl/source/NSBezierPath_AMShading.h b/PSMTabBarControl/source/NSBezierPath_AMShading.h new file mode 100755 index 0000000000..9c6c335fbe --- /dev/null +++ b/PSMTabBarControl/source/NSBezierPath_AMShading.h @@ -0,0 +1,23 @@ +// +// NSBezierPath_AMShading.h +// ------------------------ +// +// Created by Andreas on 2005-06-01. +// Copyright 2005 Andreas Mayer. All rights reserved. +// +// based on http://www.cocoadev.com/index.pl?GradientFill + + +#import + + +@interface NSBezierPath (AMShading) + +- (void)customHorizontalFillWithCallbacks:(CGFunctionCallbacks)functionCallbacks firstColor:(NSColor *)firstColor secondColor:(NSColor *)secondColor; + +- (void)linearGradientFillWithStartColor:(NSColor *)startColor endColor:(NSColor *)endColor; + +- (void)bilinearGradientFillWithOuterColor:(NSColor *)outerColor innerColor:(NSColor *)innerColor; + + +@end diff --git a/PSMTabBarControl/source/NSBezierPath_AMShading.m b/PSMTabBarControl/source/NSBezierPath_AMShading.m new file mode 100755 index 0000000000..1d1755b84e --- /dev/null +++ b/PSMTabBarControl/source/NSBezierPath_AMShading.m @@ -0,0 +1,169 @@ +// +// NSBezierPath_AMShading.m +// ------------------------ +// +// Created by Andreas on 2005-06-01. +// Copyright 2005 Andreas Mayer. All rights reserved. +// + +#import "NSBezierPath_AMShading.h" + + +@implementation NSBezierPath (AMShading) + +static void linearShadedColor(void *info, const float *in, float *out) +{ + float *colors = info; + *out++ = colors[0] + *in * colors[8]; + *out++ = colors[1] + *in * colors[9]; + *out++ = colors[2] + *in * colors[10]; + *out++ = colors[3] + *in * colors[11]; +} + +static void bilinearShadedColor(void *info, const float *in, float *out) +{ + float *colors = info; + float factor = (*in)*2.0; + if (*in > 0.5) { + factor = 2-factor; + } + *out++ = colors[0] + factor * colors[8]; + *out++ = colors[1] + factor * colors[9]; + *out++ = colors[2] + factor * colors[10]; + *out++ = colors[3] + factor * colors[11]; +} + +- (void)linearGradientFillWithStartColor:(NSColor *)startColor endColor:(NSColor *)endColor +{ + /* + CGColorSpaceRef colorspace; + CGShadingRef shading; + CGPoint startPoint = {0, 0}; + CGPoint endPoint = {0, 0}; + CGFunctionRef function; + float colors[12]; // pointer to color values + + // get my context + CGContextRef currentContext = (CGContextRef)[[NSGraphicsContext currentContext] graphicsPort]; + + NSColor *deviceDependentStartColor = [startColor colorUsingColorSpaceName:NSDeviceRGBColorSpace]; + NSColor *deviceDependentEndColor = [endColor colorUsingColorSpaceName:NSDeviceRGBColorSpace]; + + // set up colors for gradient + colors[0] = [deviceDependentStartColor redComponent]; + colors[1] = [deviceDependentStartColor greenComponent]; + colors[2] = [deviceDependentStartColor blueComponent]; + colors[3] = [deviceDependentStartColor alphaComponent]; + + colors[4] = [deviceDependentEndColor redComponent]; + colors[5] = [deviceDependentEndColor greenComponent]; + colors[6] = [deviceDependentEndColor blueComponent]; + colors[7] = [deviceDependentEndColor alphaComponent]; + + // difference between start and end color for each color components + colors[8] = (colors[4]-colors[0]); + colors[9] = (colors[5]-colors[1]); + colors[10] = (colors[6]-colors[2]); + colors[11] = (colors[7]-colors[3]); + + // draw gradient + colorspace = CGColorSpaceCreateDeviceRGB(); + + size_t components = 1 + CGColorSpaceGetNumberOfComponents(colorspace); + static const float domain[2] = {0.0, 1.0}; + static const float range[10] = {0, 1, 0, 1, 0, 1, 0, 1, 0, 1}; + static const CGFunctionCallbacks callbacks = {0, &shadedColor, NULL}; + + // Create a CGFunctionRef that describes a function taking 1 input and kChannelsPerColor outputs. + function = CGFunctionCreate(colors, 1, domain, components, range, &callbacks); + + startPoint.x=0; + startPoint.y=[self bounds].origin.y; + endPoint.x=0; + endPoint.y=NSMaxY([self bounds]); + + shading = CGShadingCreateAxial(colorspace, startPoint, endPoint, function, NO, NO); + + CGContextSaveGState(currentContext); + [self addClip]; + CGContextDrawShading(currentContext, shading); + CGContextRestoreGState(currentContext); + + CGShadingRelease(shading); + CGFunctionRelease(function); + CGColorSpaceRelease(colorspace); + */ + + static const CGFunctionCallbacks callbacks = {0, &linearShadedColor, NULL}; + + [self customHorizontalFillWithCallbacks:callbacks firstColor:startColor secondColor:endColor]; +}; + +- (void)bilinearGradientFillWithOuterColor:(NSColor *)outerColor innerColor:(NSColor *)innerColor +{ + static const CGFunctionCallbacks callbacks = {0, &bilinearShadedColor, NULL}; + + [self customHorizontalFillWithCallbacks:callbacks firstColor:innerColor secondColor:outerColor]; +} + +- (void)customHorizontalFillWithCallbacks:(CGFunctionCallbacks)functionCallbacks firstColor:(NSColor *)firstColor secondColor:(NSColor *)secondColor +{ + CGColorSpaceRef colorspace; + CGShadingRef shading; + CGPoint startPoint = {0, 0}; + CGPoint endPoint = {0, 0}; + CGFunctionRef function; + float colors[12]; // pointer to color values + + // get my context + CGContextRef currentContext = (CGContextRef)[[NSGraphicsContext currentContext] graphicsPort]; + + NSColor *deviceDependentFirstColor = [firstColor colorUsingColorSpaceName:NSDeviceRGBColorSpace]; + NSColor *deviceDependentSecondColor = [secondColor colorUsingColorSpaceName:NSDeviceRGBColorSpace]; + + // set up colors for gradient + colors[0] = [deviceDependentFirstColor redComponent]; + colors[1] = [deviceDependentFirstColor greenComponent]; + colors[2] = [deviceDependentFirstColor blueComponent]; + colors[3] = [deviceDependentFirstColor alphaComponent]; + + colors[4] = [deviceDependentSecondColor redComponent]; + colors[5] = [deviceDependentSecondColor greenComponent]; + colors[6] = [deviceDependentSecondColor blueComponent]; + colors[7] = [deviceDependentSecondColor alphaComponent]; + + // difference between start and end color for each color components + colors[8] = (colors[4]-colors[0]); + colors[9] = (colors[5]-colors[1]); + colors[10] = (colors[6]-colors[2]); + colors[11] = (colors[7]-colors[3]); + + // draw gradient + colorspace = CGColorSpaceCreateDeviceRGB(); + size_t components = 1 + CGColorSpaceGetNumberOfComponents(colorspace); + static const float domain[2] = {0.0, 1.0}; + static const float range[10] = {0, 1, 0, 1, 0, 1, 0, 1, 0, 1}; + //static const CGFunctionCallbacks callbacks = {0, &bilinearShadedColor, NULL}; + + // Create a CGFunctionRef that describes a function taking 1 input and kChannelsPerColor outputs. + function = CGFunctionCreate(colors, 1, domain, components, range, &functionCallbacks); + + startPoint.x=0; + startPoint.y=[self bounds].origin.y; + endPoint.x=0; + endPoint.y=NSMaxY([self bounds]); + + shading = CGShadingCreateAxial(colorspace, startPoint, endPoint, function, NO, NO); + + CGContextSaveGState(currentContext); + [self addClip]; + CGContextDrawShading(currentContext, shading); + CGContextRestoreGState(currentContext); + + CGShadingRelease(shading); + CGFunctionRelease(function); + CGColorSpaceRelease(colorspace); +} + + +@end diff --git a/PSMTabBarControl/source/PSMAquaTabStyle.h b/PSMTabBarControl/source/PSMAquaTabStyle.h new file mode 100644 index 0000000000..06540dac1a --- /dev/null +++ b/PSMTabBarControl/source/PSMAquaTabStyle.h @@ -0,0 +1,32 @@ +// +// PSMAquaTabStyle.h +// PSMTabBarControl +// +// Created by John Pannell on 2/17/06. +// Copyright 2006 Positive Spin Media. All rights reserved. +// + +#import +#import "PSMTabStyle.h" + +@interface PSMAquaTabStyle : NSObject { + NSImage *aquaTabBg; + NSImage *aquaTabBgDown; + NSImage *aquaTabBgDownGraphite; + NSImage *aquaTabBgDownNonKey; + NSImage *aquaDividerDown; + NSImage *aquaDivider; + NSImage *aquaCloseButton; + NSImage *aquaCloseButtonDown; + NSImage *aquaCloseButtonOver; + NSImage *_addTabButtonImage; + NSImage *_addTabButtonPressedImage; + NSImage *_addTabButtonRolloverImage; +} + +- (void)loadImages; +- (void)drawInteriorWithTabCell:(PSMTabBarCell *)cell inView:(NSView*)controlView; + +- (void)encodeWithCoder:(NSCoder *)aCoder; +- (id)initWithCoder:(NSCoder *)aDecoder; +@end diff --git a/PSMTabBarControl/source/PSMAquaTabStyle.m b/PSMTabBarControl/source/PSMAquaTabStyle.m new file mode 100644 index 0000000000..7235c4c6b4 --- /dev/null +++ b/PSMTabBarControl/source/PSMAquaTabStyle.m @@ -0,0 +1,516 @@ +// +// PSMAquaTabStyle.m +// PSMTabBarControl +// +// Created by John Pannell on 2/17/06. +// Copyright 2006 Positive Spin Media. All rights reserved. +// + +#import "PSMAquaTabStyle.h" +#import "PSMTabBarCell.h" +#import "PSMTabBarControl.h" + +#define kPSMAquaObjectCounterRadius 7.0 +#define kPSMAquaCounterMinWidth 20 + +@implementation PSMAquaTabStyle + +- (NSString *)name +{ + return @"Aqua"; +} + +#pragma mark - +#pragma mark Creation/Destruction + +- (id) init +{ + if((self = [super init])) + { + [self loadImages]; + } + return self; +} + +- (void) loadImages +{ + NSLog(@"PSMAquaTabStyle loadImages"); + + // Aqua Tabs Images + aquaTabBg = [[NSImage alloc] initByReferencingFile:[[PSMTabBarControl bundle] pathForImageResource:@"AquaTabsBackground"]]; + [aquaTabBg setFlipped:YES]; + + aquaTabBgDown = [[NSImage alloc] initByReferencingFile:[[PSMTabBarControl bundle] pathForImageResource:@"AquaTabsDown"]]; + [aquaTabBgDown setFlipped:YES]; + + aquaTabBgDownGraphite = [[NSImage alloc] initByReferencingFile:[[PSMTabBarControl bundle] pathForImageResource:@"AquaTabsDownGraphite"]]; + [aquaTabBgDown setFlipped:YES]; + + aquaTabBgDownNonKey = [[NSImage alloc] initByReferencingFile:[[PSMTabBarControl bundle] pathForImageResource:@"AquaTabsDownNonKey"]]; + [aquaTabBgDown setFlipped:YES]; + + aquaDividerDown = [[NSImage alloc] initByReferencingFile:[[PSMTabBarControl bundle] pathForImageResource:@"AquaTabsSeparatorDown"]]; + [aquaDivider setFlipped:NO]; + + aquaDivider = [[NSImage alloc] initByReferencingFile:[[PSMTabBarControl bundle] pathForImageResource:@"AquaTabsSeparator"]]; + [aquaDivider setFlipped:NO]; + + aquaCloseButton = [[NSImage alloc] initByReferencingFile:[[PSMTabBarControl bundle] pathForImageResource:@"AquaTabClose_Front"]]; + aquaCloseButtonDown = [[NSImage alloc] initByReferencingFile:[[PSMTabBarControl bundle] pathForImageResource:@"AquaTabClose_Front_Pressed"]]; + aquaCloseButtonOver = [[NSImage alloc] initByReferencingFile:[[PSMTabBarControl bundle] pathForImageResource:@"AquaTabClose_Front_Rollover"]]; + + _addTabButtonImage = [[NSImage alloc] initByReferencingFile:[[PSMTabBarControl bundle] pathForImageResource:@"AquaTabNew"]]; + _addTabButtonPressedImage = [[NSImage alloc] initByReferencingFile:[[PSMTabBarControl bundle] pathForImageResource:@"AquaTabNewPressed"]]; + _addTabButtonRolloverImage = [[NSImage alloc] initByReferencingFile:[[PSMTabBarControl bundle] pathForImageResource:@"AquaTabNewRollover"]]; +} + +- (void)dealloc +{ + [aquaTabBg release]; + [aquaTabBgDown release]; + [aquaDividerDown release]; + [aquaDivider release]; + [aquaCloseButton release]; + [aquaCloseButtonDown release]; + [aquaCloseButtonOver release]; + [_addTabButtonImage release]; + [_addTabButtonPressedImage release]; + [_addTabButtonRolloverImage release]; + + [super dealloc]; +} + +#pragma mark - +#pragma mark Control Specifics + +- (float)leftMarginForTabBarControl +{ + return 0.0f; +} + +- (float)rightMarginForTabBarControl +{ + return 24.0f; +} + +#pragma mark - +#pragma mark Add Tab Button + +- (NSImage *)addTabButtonImage +{ + return _addTabButtonImage; +} + +- (NSImage *)addTabButtonPressedImage +{ + return _addTabButtonPressedImage; +} + +- (NSImage *)addTabButtonRolloverImage +{ + return _addTabButtonRolloverImage; +} + +#pragma mark - +#pragma mark Cell Specifics + +- (NSRect)closeButtonRectForTabCell:(PSMTabBarCell *)cell +{ + NSRect cellFrame = [cell frame]; + + if ([cell hasCloseButton] == NO) { + return NSZeroRect; + } + + NSRect result; + result.size = [aquaCloseButton size]; + result.origin.x = cellFrame.origin.x + MARGIN_X; + result.origin.y = cellFrame.origin.y + MARGIN_Y + 2.0; + + return result; +} + +- (NSRect)iconRectForTabCell:(PSMTabBarCell *)cell +{ + NSRect cellFrame = [cell frame]; + + if ([cell hasIcon] == NO) { + return NSZeroRect; + } + + NSRect result; + result.size = NSMakeSize(kPSMTabBarIconWidth, kPSMTabBarIconWidth); + result.origin.x = cellFrame.origin.x + MARGIN_X; + result.origin.y = cellFrame.origin.y + MARGIN_Y; + + if([cell hasCloseButton] && ![cell isCloseButtonSuppressed]) + result.origin.x += [aquaCloseButton size].width + kPSMTabBarCellPadding; + + return result; +} + +- (NSRect)indicatorRectForTabCell:(PSMTabBarCell *)cell +{ + NSRect cellFrame = [cell frame]; + + if ([[cell indicator] isHidden]) { + return NSZeroRect; + } + + NSRect result; + result.size = NSMakeSize(kPSMTabBarIndicatorWidth, kPSMTabBarIndicatorWidth); + result.origin.x = cellFrame.origin.x + cellFrame.size.width - MARGIN_X - kPSMTabBarIndicatorWidth; + result.origin.y = cellFrame.origin.y + MARGIN_Y; + + return result; +} + +- (NSRect)objectCounterRectForTabCell:(PSMTabBarCell *)cell +{ + NSRect cellFrame = [cell frame]; + + if ([cell count] == 0) { + return NSZeroRect; + } + + float countWidth = [[self attributedObjectCountValueForTabCell:cell] size].width; + countWidth += (2 * kPSMAquaObjectCounterRadius - 6.0); + if(countWidth < kPSMAquaCounterMinWidth) + countWidth = kPSMAquaCounterMinWidth; + + NSRect result; + result.size = NSMakeSize(countWidth, 2 * kPSMAquaObjectCounterRadius); // temp + result.origin.x = cellFrame.origin.x + cellFrame.size.width - MARGIN_X - result.size.width; + result.origin.y = cellFrame.origin.y + MARGIN_Y + 1.0; + + if(![[cell indicator] isHidden]) + result.origin.x -= kPSMTabBarIndicatorWidth + kPSMTabBarCellPadding; + + return result; +} + +- (float)minimumWidthOfTabCell:(PSMTabBarCell *)cell +{ + float resultWidth = 0.0; + + // left margin + resultWidth = MARGIN_X; + + // close button? + if ([cell hasCloseButton] && ![cell isCloseButtonSuppressed]) + resultWidth += [aquaCloseButton size].width + kPSMTabBarCellPadding; + + // icon? + if([cell hasIcon]) + resultWidth += kPSMTabBarIconWidth + kPSMTabBarCellPadding; + + // the label + resultWidth += kPSMMinimumTitleWidth; + + // object counter? + if([cell count] > 0) + resultWidth += [self objectCounterRectForTabCell:cell].size.width + kPSMTabBarCellPadding; + + // indicator? + if ([[cell indicator] isHidden] == NO) + resultWidth += kPSMTabBarCellPadding + kPSMTabBarIndicatorWidth; + + // right margin + resultWidth += MARGIN_X; + + return ceil(resultWidth); +} + +- (float)desiredWidthOfTabCell:(PSMTabBarCell *)cell +{ + float resultWidth = 0.0; + + // left margin + resultWidth = MARGIN_X; + + // close button? + if ([cell hasCloseButton] && ![cell isCloseButtonSuppressed]) + resultWidth += [aquaCloseButton size].width + kPSMTabBarCellPadding; + + // icon? + if([cell hasIcon]) + resultWidth += kPSMTabBarIconWidth + kPSMTabBarCellPadding; + + // the label + resultWidth += [[cell attributedStringValue] size].width; + + // object counter? + if([cell count] > 0) + resultWidth += [self objectCounterRectForTabCell:cell].size.width + kPSMTabBarCellPadding; + + // indicator? + if ([[cell indicator] isHidden] == NO) + resultWidth += kPSMTabBarCellPadding + kPSMTabBarIndicatorWidth; + + // right margin + resultWidth += MARGIN_X; + + return ceil(resultWidth); +} + +#pragma mark - +#pragma mark Cell Values + +- (NSAttributedString *)attributedObjectCountValueForTabCell:(PSMTabBarCell *)cell +{ + NSMutableAttributedString *attrStr; + NSFontManager *fm = [NSFontManager sharedFontManager]; + NSNumberFormatter *nf = [[[NSNumberFormatter alloc] init] autorelease]; + [nf setLocalizesFormat:YES]; + [nf setFormat:@"0"]; + [nf setHasThousandSeparators:YES]; + NSString *contents = [nf stringFromNumber:[NSNumber numberWithInt:[cell count]]]; + attrStr = [[[NSMutableAttributedString alloc] initWithString:contents] autorelease]; + NSRange range = NSMakeRange(0, [contents length]); + + // Add font attribute + [attrStr addAttribute:NSFontAttributeName value:[fm convertFont:[NSFont fontWithName:@"Helvetica" size:11.0] toHaveTrait:NSBoldFontMask] range:range]; + [attrStr addAttribute:NSForegroundColorAttributeName value:[[NSColor whiteColor] colorWithAlphaComponent:0.85] range:range]; + + return attrStr; +} + +- (NSAttributedString *)attributedStringValueForTabCell:(PSMTabBarCell *)cell +{ + NSMutableAttributedString *attrStr; + NSString * contents = [cell stringValue]; + attrStr = [[[NSMutableAttributedString alloc] initWithString:contents] autorelease]; + NSRange range = NSMakeRange(0, [contents length]); + + [attrStr addAttribute:NSFontAttributeName value:[NSFont systemFontOfSize:11.0] range:range]; + + // Paragraph Style for Truncating Long Text + static NSMutableParagraphStyle *TruncatingTailParagraphStyle = nil; + if (!TruncatingTailParagraphStyle) { + TruncatingTailParagraphStyle = [[[NSParagraphStyle defaultParagraphStyle] mutableCopy] retain]; + [TruncatingTailParagraphStyle setLineBreakMode:NSLineBreakByTruncatingTail]; + [TruncatingTailParagraphStyle setAlignment:NSCenterTextAlignment]; + } + [attrStr addAttribute:NSParagraphStyleAttributeName value:TruncatingTailParagraphStyle range:range]; + + return attrStr; +} + +#pragma mark - +#pragma mark Drawing + +- (void)drawTabCell:(PSMTabBarCell *)cell; +{ + NSRect cellFrame = [cell frame]; + + // Selected Tab + if ([cell state] == NSOnState) { + NSRect aRect = NSMakeRect(cellFrame.origin.x, cellFrame.origin.y, cellFrame.size.width, cellFrame.size.height-2.5); + aRect.size.height -= 0.5; + + // proper tint + NSControlTint currentTint; + if ([cell controlTint] == NSDefaultControlTint) + currentTint = [NSColor currentControlTint]; + else + currentTint = [cell controlTint]; + + if (![[[cell controlView] window] isKeyWindow]) + currentTint = NSClearControlTint; + + NSImage *bgImage; + switch(currentTint){ + case NSGraphiteControlTint: + bgImage = aquaTabBgDownGraphite; + break; + case NSClearControlTint: + bgImage = aquaTabBgDownNonKey; + break; + case NSBlueControlTint: + default: + bgImage = aquaTabBgDown; + break; + } + + [bgImage drawInRect:cellFrame fromRect:NSMakeRect(0.0, 0.0, 1.0, 22.0) operation:NSCompositeSourceOver fraction:1.0]; + [aquaDivider compositeToPoint:NSMakePoint(cellFrame.origin.x + cellFrame.size.width - 1.0, cellFrame.origin.y + cellFrame.size.height) operation:NSCompositeSourceOver]; + + aRect.size.height+=0.5; + + } else { // Unselected Tab + + NSRect aRect = NSMakeRect(cellFrame.origin.x, cellFrame.origin.y, cellFrame.size.width, cellFrame.size.height); + aRect.origin.y += 0.5; + aRect.origin.x += 1.5; + aRect.size.width -= 1; + + aRect.origin.x -= 1; + aRect.size.width += 1; + + // Rollover + if ([cell isHighlighted]) { + [[NSColor colorWithCalibratedWhite:0.0 alpha:0.1] set]; + NSRectFillUsingOperation(aRect, NSCompositeSourceAtop); + } + + [aquaDivider compositeToPoint:NSMakePoint(cellFrame.origin.x + cellFrame.size.width - 1.0, cellFrame.origin.y + cellFrame.size.height) operation:NSCompositeSourceOver]; + } + + [self drawInteriorWithTabCell:cell inView:[cell controlView]]; +} + +- (void)drawTabBar:(PSMTabBarControl *)bar inRect:(NSRect)rect +{ + [aquaTabBg drawInRect:rect fromRect:NSMakeRect(0.0, 0.0, 1.0, 22.0) operation:NSCompositeSourceOver fraction:1.0]; + + // no tab view == not connected + if(![bar tabView]){ + NSRect labelRect = rect; + labelRect.size.height -= 4.0; + labelRect.origin.y += 4.0; + NSMutableAttributedString *attrStr; + NSString *contents = @"PSMTabBarControl"; + attrStr = [[[NSMutableAttributedString alloc] initWithString:contents] autorelease]; + NSRange range = NSMakeRange(0, [contents length]); + [attrStr addAttribute:NSFontAttributeName value:[NSFont systemFontOfSize:11.0] range:range]; + NSMutableParagraphStyle *centeredParagraphStyle = nil; + if (!centeredParagraphStyle) { + centeredParagraphStyle = [[[NSParagraphStyle defaultParagraphStyle] mutableCopy] retain]; + [centeredParagraphStyle setAlignment:NSCenterTextAlignment]; + } + [attrStr addAttribute:NSParagraphStyleAttributeName value:centeredParagraphStyle range:range]; + [attrStr drawInRect:labelRect]; + return; + } + + // Draw cells + NSEnumerator *e = [[bar cells] objectEnumerator]; + PSMTabBarCell *cell; + while(cell = [e nextObject]){ + if(![cell isInOverflowMenu]){ + [cell drawWithFrame:[cell frame] inView:bar]; + } + } +} + +- (void)drawInteriorWithTabCell:(PSMTabBarCell *)cell inView:(NSView*)controlView +{ + NSRect cellFrame = [cell frame]; + float labelPosition = cellFrame.origin.x + MARGIN_X; + + // close button + if([cell hasCloseButton] && ![cell isCloseButtonSuppressed]) { + NSSize closeButtonSize = NSZeroSize; + NSRect closeButtonRect = [cell closeButtonRectForFrame:cellFrame]; + NSImage *closeButton = nil; + + closeButton = aquaCloseButton; + if([cell closeButtonOver]) closeButton = aquaCloseButtonOver; + if([cell closeButtonPressed]) closeButton = aquaCloseButtonDown; + + closeButtonSize = [closeButton size]; + if([controlView isFlipped]) { + closeButtonRect.origin.y += closeButtonRect.size.height; + } + + [closeButton compositeToPoint:closeButtonRect.origin operation:NSCompositeSourceOver fraction:1.0]; + + // scoot label over + labelPosition += closeButtonSize.width + kPSMTabBarCellPadding; + } + + // icon + if([cell hasIcon]){ + NSRect iconRect = [self iconRectForTabCell:cell]; + NSImage *icon = [[[[cell representedObject] identifier] content] icon]; + if ([controlView isFlipped]) { + iconRect.origin.y = cellFrame.size.height - iconRect.origin.y; + } + [icon compositeToPoint:iconRect.origin operation:NSCompositeSourceOver fraction:1.0]; + + // scoot label over + labelPosition += iconRect.size.width + kPSMTabBarCellPadding; + } + + // object counter + if([cell count] > 0){ + [[NSColor colorWithCalibratedWhite:0.3 alpha:0.45] set]; + NSBezierPath *path = [NSBezierPath bezierPath]; + NSRect myRect = [self objectCounterRectForTabCell:cell]; + [path moveToPoint:NSMakePoint(myRect.origin.x + kPSMAquaObjectCounterRadius, myRect.origin.y)]; + [path lineToPoint:NSMakePoint(myRect.origin.x + myRect.size.width - kPSMAquaObjectCounterRadius, myRect.origin.y)]; + [path appendBezierPathWithArcWithCenter:NSMakePoint(myRect.origin.x + myRect.size.width - kPSMAquaObjectCounterRadius, myRect.origin.y + kPSMAquaObjectCounterRadius) radius:kPSMAquaObjectCounterRadius startAngle:270.0 endAngle:90.0]; + [path lineToPoint:NSMakePoint(myRect.origin.x + kPSMAquaObjectCounterRadius, myRect.origin.y + myRect.size.height)]; + [path appendBezierPathWithArcWithCenter:NSMakePoint(myRect.origin.x + kPSMAquaObjectCounterRadius, myRect.origin.y + kPSMAquaObjectCounterRadius) radius:kPSMAquaObjectCounterRadius startAngle:90.0 endAngle:270.0]; + [path fill]; + + // draw attributed string centered in area + NSRect counterStringRect; + NSAttributedString *counterString = [self attributedObjectCountValueForTabCell:cell]; + counterStringRect.size = [counterString size]; + counterStringRect.origin.x = myRect.origin.x + ((myRect.size.width - counterStringRect.size.width) / 2.0) + 0.25; + counterStringRect.origin.y = myRect.origin.y + ((myRect.size.height - counterStringRect.size.height) / 2.0) + 0.5; + [counterString drawInRect:counterStringRect]; + } + + + // label rect + NSRect labelRect; + labelRect.origin.x = labelPosition; + labelRect.size.width = cellFrame.size.width - (labelRect.origin.x - cellFrame.origin.x) - kPSMTabBarCellPadding; + labelRect.size.height = cellFrame.size.height; + labelRect.origin.y = cellFrame.origin.y + MARGIN_Y + 1.0; + + if(![[cell indicator] isHidden]) + labelRect.size.width -= (kPSMTabBarIndicatorWidth + kPSMTabBarCellPadding); + + if([cell count] > 0) + labelRect.size.width -= ([self objectCounterRectForTabCell:cell].size.width + kPSMTabBarCellPadding); + + // Draw Label + [[cell attributedStringValue] drawInRect:labelRect]; +} + +#pragma mark - +#pragma mark Archiving + +- (void)encodeWithCoder:(NSCoder *)aCoder { + //[super encodeWithCoder:aCoder]; + if ([aCoder allowsKeyedCoding]) { + [aCoder encodeObject:aquaTabBg forKey:@"aquaTabBg"]; + [aCoder encodeObject:aquaTabBgDown forKey:@"aquaTabBgDown"]; + [aCoder encodeObject:aquaTabBgDownGraphite forKey:@"aquaTabBgDownGraphite"]; + [aCoder encodeObject:aquaTabBgDownNonKey forKey:@"aquaTabBgDownNonKey"]; + [aCoder encodeObject:aquaDividerDown forKey:@"aquaDividerDown"]; + [aCoder encodeObject:aquaDivider forKey:@"aquaDivider"]; + [aCoder encodeObject:aquaCloseButton forKey:@"aquaCloseButton"]; + [aCoder encodeObject:aquaCloseButtonDown forKey:@"aquaCloseButtonDown"]; + [aCoder encodeObject:aquaCloseButtonOver forKey:@"aquaCloseButtonOver"]; + [aCoder encodeObject:_addTabButtonImage forKey:@"addTabButtonImage"]; + [aCoder encodeObject:_addTabButtonPressedImage forKey:@"addTabButtonPressedImage"]; + [aCoder encodeObject:_addTabButtonRolloverImage forKey:@"addTabButtonRolloverImage"]; + } +} + +- (id)initWithCoder:(NSCoder *)aDecoder { + //self = [super initWithCoder:aDecoder]; + //if (self) { + if ([aDecoder allowsKeyedCoding]) { + aquaTabBg = [[aDecoder decodeObjectForKey:@"aquaTabBg"] retain]; + aquaTabBgDown = [[aDecoder decodeObjectForKey:@"aquaTabBgDown"] retain]; + aquaTabBgDownGraphite = [[aDecoder decodeObjectForKey:@"aquaTabBgDownGraphite"] retain]; + aquaTabBgDownNonKey = [[aDecoder decodeObjectForKey:@"aquaTabBgDownNonKey"] retain]; + aquaDividerDown = [[aDecoder decodeObjectForKey:@"aquaDividerDown"] retain]; + aquaDivider = [[aDecoder decodeObjectForKey:@"aquaDivider"] retain]; + aquaCloseButton = [[aDecoder decodeObjectForKey:@"aquaCloseButton"] retain]; + aquaCloseButtonDown = [[aDecoder decodeObjectForKey:@"aquaCloseButtonDown"] retain]; + aquaCloseButtonOver = [[aDecoder decodeObjectForKey:@"aquaCloseButtonOver"] retain]; + _addTabButtonImage = [[aDecoder decodeObjectForKey:@"addTabButtonImage"] retain]; + _addTabButtonPressedImage = [[aDecoder decodeObjectForKey:@"addTabButtonPressedImage"] retain]; + _addTabButtonRolloverImage = [[aDecoder decodeObjectForKey:@"addTabButtonRolloverImage"] retain]; + } + //} + return self; +} + +@end diff --git a/PSMTabBarControl/source/PSMMetalTabStyle.h b/PSMTabBarControl/source/PSMMetalTabStyle.h new file mode 100644 index 0000000000..0cbdb1ee85 --- /dev/null +++ b/PSMTabBarControl/source/PSMMetalTabStyle.h @@ -0,0 +1,26 @@ +// +// PSMMetalTabStyle.h +// PSMTabBarControl +// +// Created by John Pannell on 2/17/06. +// Copyright 2006 Positive Spin Media. All rights reserved. +// + +#import +#import "PSMTabStyle.h" + +@interface PSMMetalTabStyle : NSObject { + NSImage *metalCloseButton; + NSImage *metalCloseButtonDown; + NSImage *metalCloseButtonOver; + NSImage *_addTabButtonImage; + NSImage *_addTabButtonPressedImage; + NSImage *_addTabButtonRolloverImage; +} + +- (void)drawInteriorWithTabCell:(PSMTabBarCell *)cell inView:(NSView*)controlView; + +- (void)encodeWithCoder:(NSCoder *)aCoder; +- (id)initWithCoder:(NSCoder *)aDecoder; + +@end diff --git a/PSMTabBarControl/source/PSMMetalTabStyle.m b/PSMTabBarControl/source/PSMMetalTabStyle.m new file mode 100644 index 0000000000..ca0051f19b --- /dev/null +++ b/PSMTabBarControl/source/PSMMetalTabStyle.m @@ -0,0 +1,524 @@ +// +// PSMMetalTabStyle.m +// PSMTabBarControl +// +// Created by John Pannell on 2/17/06. +// Copyright 2006 Positive Spin Media. All rights reserved. +// + +#import "PSMMetalTabStyle.h" +#import "PSMTabBarCell.h" +#import "PSMTabBarControl.h" + +#define kPSMMetalObjectCounterRadius 7.0 +#define kPSMMetalCounterMinWidth 20 + +@implementation PSMMetalTabStyle + +- (NSString *)name +{ + return @"Metal"; +} + +#pragma mark - +#pragma mark Creation/Destruction + +- (id) init +{ + //NSLog(@"PSMMetalTabStyle init"); + + if((self = [super init])) + { + + metalCloseButton = [[NSImage alloc] initByReferencingFile:[[PSMTabBarControl bundle] pathForImageResource:@"TabClose_Front"]]; + //NSLog(@"metalCloseButton=%@ path=%@", metalCloseButton, + // [[PSMTabBarControl bundle] pathForImageResource:@"TabClose_Front"]); + metalCloseButtonDown = [[NSImage alloc] initByReferencingFile:[[PSMTabBarControl bundle] pathForImageResource:@"TabClose_Front_Pressed"]]; + metalCloseButtonOver = [[NSImage alloc] initByReferencingFile:[[PSMTabBarControl bundle] pathForImageResource:@"TabClose_Front_Rollover"]]; + + _addTabButtonImage = [[NSImage alloc] initByReferencingFile:[[PSMTabBarControl bundle] pathForImageResource:@"TabNewMetal"]]; + _addTabButtonPressedImage = [[NSImage alloc] initByReferencingFile:[[PSMTabBarControl bundle] pathForImageResource:@"TabNewMetalPressed"]]; + _addTabButtonRolloverImage = [[NSImage alloc] initByReferencingFile:[[PSMTabBarControl bundle] pathForImageResource:@"TabNewMetalRollover"]]; + } + return self; +} + +- (void)dealloc +{ + [metalCloseButton release]; + [metalCloseButtonDown release]; + [metalCloseButtonOver release]; + [_addTabButtonImage release]; + [_addTabButtonPressedImage release]; + [_addTabButtonRolloverImage release]; + + [super dealloc]; +} + +#pragma mark - +#pragma mark Control Specific + +- (float)leftMarginForTabBarControl +{ + return 10.0f; +} + +- (float)rightMarginForTabBarControl +{ + return 24.0f; +} + +#pragma mark - +#pragma mark Add Tab Button + +- (NSImage *)addTabButtonImage +{ + return _addTabButtonImage; +} + +- (NSImage *)addTabButtonPressedImage +{ + return _addTabButtonPressedImage; +} + +- (NSImage *)addTabButtonRolloverImage +{ + return _addTabButtonRolloverImage; +} + +#pragma mark - +#pragma mark Cell Specific + +- (NSRect) closeButtonRectForTabCell:(PSMTabBarCell *)cell +{ + NSRect cellFrame = [cell frame]; + + if ([cell hasCloseButton] == NO) { + return NSZeroRect; + } + + NSRect result; + result.size = [metalCloseButton size]; + result.origin.x = cellFrame.origin.x + MARGIN_X; + result.origin.y = cellFrame.origin.y + MARGIN_Y + 2.0; + + if([cell state] == NSOnState){ + result.origin.y -= 1; + } + + return result; +} + +- (NSRect)iconRectForTabCell:(PSMTabBarCell *)cell +{ + NSRect cellFrame = [cell frame]; + + if ([cell hasIcon] == NO) { + return NSZeroRect; + } + + NSRect result; + result.size = NSMakeSize(kPSMTabBarIconWidth, kPSMTabBarIconWidth); + result.origin.x = cellFrame.origin.x + MARGIN_X; + result.origin.y = cellFrame.origin.y + MARGIN_Y; + + if([cell hasCloseButton] && ![cell isCloseButtonSuppressed]) + result.origin.x += [metalCloseButton size].width + kPSMTabBarCellPadding; + + if([cell state] == NSOnState){ + result.origin.y += 1; + } + + return result; +} + +- (NSRect)indicatorRectForTabCell:(PSMTabBarCell *)cell +{ + NSRect cellFrame = [cell frame]; + + if ([[cell indicator] isHidden]) { + return NSZeroRect; + } + + NSRect result; + result.size = NSMakeSize(kPSMTabBarIndicatorWidth, kPSMTabBarIndicatorWidth); + result.origin.x = cellFrame.origin.x + cellFrame.size.width - MARGIN_X - kPSMTabBarIndicatorWidth; + result.origin.y = cellFrame.origin.y + MARGIN_Y; + + if([cell state] == NSOnState){ + result.origin.y -= 1; + } + + return result; +} + +- (NSRect)objectCounterRectForTabCell:(PSMTabBarCell *)cell +{ + NSRect cellFrame = [cell frame]; + + if ([cell count] == 0) { + return NSZeroRect; + } + + float countWidth = [[self attributedObjectCountValueForTabCell:cell] size].width; + countWidth += (2 * kPSMMetalObjectCounterRadius - 6.0); + if(countWidth < kPSMMetalCounterMinWidth) + countWidth = kPSMMetalCounterMinWidth; + + NSRect result; + result.size = NSMakeSize(countWidth, 2 * kPSMMetalObjectCounterRadius); // temp + result.origin.x = cellFrame.origin.x + cellFrame.size.width - MARGIN_X - result.size.width; + result.origin.y = cellFrame.origin.y + MARGIN_Y + 1.0; + + if(![[cell indicator] isHidden]) + result.origin.x -= kPSMTabBarIndicatorWidth + kPSMTabBarCellPadding; + + return result; +} + + +- (float)minimumWidthOfTabCell:(PSMTabBarCell *)cell +{ + float resultWidth = 0.0; + + // left margin + resultWidth = MARGIN_X; + + // close button? + if([cell hasCloseButton] && ![cell isCloseButtonSuppressed]) + resultWidth += [metalCloseButton size].width + kPSMTabBarCellPadding; + + // icon? + if([cell hasIcon]) + resultWidth += kPSMTabBarIconWidth + kPSMTabBarCellPadding; + + // the label + resultWidth += kPSMMinimumTitleWidth; + + // object counter? + if([cell count] > 0) + resultWidth += [self objectCounterRectForTabCell:cell].size.width + kPSMTabBarCellPadding; + + // indicator? + if ([[cell indicator] isHidden] == NO) + resultWidth += kPSMTabBarCellPadding + kPSMTabBarIndicatorWidth; + + // right margin + resultWidth += MARGIN_X; + + return ceil(resultWidth); +} + +- (float)desiredWidthOfTabCell:(PSMTabBarCell *)cell +{ + float resultWidth = 0.0; + + // left margin + resultWidth = MARGIN_X; + + // close button? + if ([cell hasCloseButton] && ![cell isCloseButtonSuppressed]) + resultWidth += [metalCloseButton size].width + kPSMTabBarCellPadding; + + // icon? + if([cell hasIcon]) + resultWidth += kPSMTabBarIconWidth + kPSMTabBarCellPadding; + + // the label + resultWidth += [[cell attributedStringValue] size].width; + + // object counter? + if([cell count] > 0) + resultWidth += [self objectCounterRectForTabCell:cell].size.width + kPSMTabBarCellPadding; + + // indicator? + if ([[cell indicator] isHidden] == NO) + resultWidth += kPSMTabBarCellPadding + kPSMTabBarIndicatorWidth; + + // right margin + resultWidth += MARGIN_X; + + return ceil(resultWidth); +} + +#pragma mark - +#pragma mark Cell Values + +- (NSAttributedString *)attributedObjectCountValueForTabCell:(PSMTabBarCell *)cell +{ + NSMutableAttributedString *attrStr; + NSFontManager *fm = [NSFontManager sharedFontManager]; + NSNumberFormatter *nf = [[[NSNumberFormatter alloc] init] autorelease]; + [nf setLocalizesFormat:YES]; + [nf setFormat:@"0"]; + [nf setHasThousandSeparators:YES]; + NSString *contents = [nf stringFromNumber:[NSNumber numberWithInt:[cell count]]]; + attrStr = [[[NSMutableAttributedString alloc] initWithString:contents] autorelease]; + NSRange range = NSMakeRange(0, [contents length]); + + // Add font attribute + [attrStr addAttribute:NSFontAttributeName value:[fm convertFont:[NSFont fontWithName:@"Helvetica" size:11.0] toHaveTrait:NSBoldFontMask] range:range]; + [attrStr addAttribute:NSForegroundColorAttributeName value:[[NSColor whiteColor] colorWithAlphaComponent:0.85] range:range]; + + return attrStr; +} + +- (NSAttributedString *)attributedStringValueForTabCell:(PSMTabBarCell *)cell +{ + NSMutableAttributedString *attrStr; + NSString *contents = [cell stringValue]; + attrStr = [[[NSMutableAttributedString alloc] initWithString:contents] autorelease]; + NSRange range = NSMakeRange(0, [contents length]); + + // Add font attribute + [attrStr addAttribute:NSFontAttributeName value:[NSFont boldSystemFontOfSize:11.0] range:range]; + [attrStr addAttribute:NSForegroundColorAttributeName value:[[NSColor textColor] colorWithAlphaComponent:0.75] range:range]; + + // Add shadow attribute + NSShadow* shadow; + shadow = [[[NSShadow alloc] init] autorelease]; + float shadowAlpha; + if(([cell state] == NSOnState) || [cell isHighlighted]){ + shadowAlpha = 0.8; + } else { + shadowAlpha = 0.5; + } + [shadow setShadowColor:[NSColor colorWithCalibratedWhite:1.0 alpha:shadowAlpha]]; + [shadow setShadowOffset:NSMakeSize(0, -1)]; + [shadow setShadowBlurRadius:1.0]; + [attrStr addAttribute:NSShadowAttributeName value:shadow range:range]; + + // Paragraph Style for Truncating Long Text + static NSMutableParagraphStyle *TruncatingTailParagraphStyle = nil; + if (!TruncatingTailParagraphStyle) { + TruncatingTailParagraphStyle = [[[NSParagraphStyle defaultParagraphStyle] mutableCopy] retain]; + [TruncatingTailParagraphStyle setLineBreakMode:NSLineBreakByTruncatingTail]; + [TruncatingTailParagraphStyle setAlignment:NSCenterTextAlignment]; + } + [attrStr addAttribute:NSParagraphStyleAttributeName value:TruncatingTailParagraphStyle range:range]; + + return attrStr; +} + +#pragma mark - +#pragma mark ---- drawing ---- + +- (void)drawTabCell:(PSMTabBarCell *)cell +{ + NSRect cellFrame = [cell frame]; + NSColor * lineColor = nil; + NSBezierPath* bezier = [NSBezierPath bezierPath]; + lineColor = [NSColor darkGrayColor]; + + if ([cell state] == NSOnState) { + // selected tab + NSRect aRect = NSMakeRect(cellFrame.origin.x, cellFrame.origin.y, cellFrame.size.width, cellFrame.size.height-2.5); + aRect.size.height -= 0.5; + + // background + NSDrawWindowBackground(aRect); + + aRect.size.height+=0.5; + + // frame + aRect.origin.x += 0.5; + [lineColor set]; + [bezier moveToPoint:NSMakePoint(aRect.origin.x, aRect.origin.y)]; + [bezier lineToPoint:NSMakePoint(aRect.origin.x, aRect.origin.y+aRect.size.height-1.5)]; + [bezier lineToPoint:NSMakePoint(aRect.origin.x+1.5, aRect.origin.y+aRect.size.height)]; + [bezier lineToPoint:NSMakePoint(aRect.origin.x+aRect.size.width-1.5, aRect.origin.y+aRect.size.height)]; + [bezier lineToPoint:NSMakePoint(aRect.origin.x+aRect.size.width, aRect.origin.y+aRect.size.height-1.5)]; + [bezier lineToPoint:NSMakePoint(aRect.origin.x+aRect.size.width, aRect.origin.y)]; + if([[cell controlView] frame].size.height < 2){ + // special case of hidden control; need line across top of cell + [bezier moveToPoint:NSMakePoint(aRect.origin.x, aRect.origin.y+0.5)]; + [bezier lineToPoint:NSMakePoint(aRect.origin.x+aRect.size.width, aRect.origin.y+0.5)]; + } + [bezier stroke]; + } else { + + // unselected tab + NSRect aRect = NSMakeRect(cellFrame.origin.x, cellFrame.origin.y, cellFrame.size.width, cellFrame.size.height); + aRect.origin.y += 0.5; + aRect.origin.x += 1.5; + aRect.size.width -= 1; + + // rollover + if ([cell isHighlighted]) { + [[NSColor colorWithCalibratedWhite:0.0 alpha:0.1] set]; + NSRectFillUsingOperation(aRect, NSCompositeSourceAtop); + } + + aRect.origin.x -= 1; + aRect.size.width += 1; + + // frame + [lineColor set]; + [bezier moveToPoint:NSMakePoint(aRect.origin.x, aRect.origin.y)]; + [bezier lineToPoint:NSMakePoint(aRect.origin.x + aRect.size.width, aRect.origin.y)]; + if(!([cell tabState] & PSMTab_RightIsSelectedMask)){ + [bezier lineToPoint:NSMakePoint(aRect.origin.x + aRect.size.width, aRect.origin.y + aRect.size.height)]; + } + [bezier stroke]; + } + + [self drawInteriorWithTabCell:cell inView:[cell controlView]]; +} + + + +- (void)drawInteriorWithTabCell:(PSMTabBarCell *)cell inView:(NSView*)controlView +{ + NSRect cellFrame = [cell frame]; + float labelPosition = cellFrame.origin.x + MARGIN_X; + + // close button + if ([cell hasCloseButton] && ![cell isCloseButtonSuppressed]) { + NSSize closeButtonSize = NSZeroSize; + NSRect closeButtonRect = [cell closeButtonRectForFrame:cellFrame]; + NSImage * closeButton = nil; + + closeButton = metalCloseButton; + if ([cell closeButtonOver]) closeButton = metalCloseButtonOver; + if ([cell closeButtonPressed]) closeButton = metalCloseButtonDown; + + closeButtonSize = [closeButton size]; + if ([controlView isFlipped]) { + closeButtonRect.origin.y += closeButtonRect.size.height; + } + + [closeButton compositeToPoint:closeButtonRect.origin operation:NSCompositeSourceOver fraction:1.0]; + + // scoot label over + labelPosition += closeButtonSize.width + kPSMTabBarCellPadding; + } + + // icon + if([cell hasIcon]){ + NSRect iconRect = [self iconRectForTabCell:cell]; + NSImage *icon = [[[[cell representedObject] identifier] content] icon]; + if ([controlView isFlipped]) { + iconRect.origin.y = cellFrame.size.height - iconRect.origin.y; + } + [icon compositeToPoint:iconRect.origin operation:NSCompositeSourceOver fraction:1.0]; + + // scoot label over + labelPosition += iconRect.size.width + kPSMTabBarCellPadding; + } + + // object counter + if([cell count] > 0){ + [[NSColor colorWithCalibratedWhite:0.3 alpha:0.6] set]; + NSBezierPath *path = [NSBezierPath bezierPath]; + NSRect myRect = [self objectCounterRectForTabCell:cell]; + if([cell state] == NSOnState) + myRect.origin.y -= 1.0; + [path moveToPoint:NSMakePoint(myRect.origin.x + kPSMMetalObjectCounterRadius, myRect.origin.y)]; + [path lineToPoint:NSMakePoint(myRect.origin.x + myRect.size.width - kPSMMetalObjectCounterRadius, myRect.origin.y)]; + [path appendBezierPathWithArcWithCenter:NSMakePoint(myRect.origin.x + myRect.size.width - kPSMMetalObjectCounterRadius, myRect.origin.y + kPSMMetalObjectCounterRadius) radius:kPSMMetalObjectCounterRadius startAngle:270.0 endAngle:90.0]; + [path lineToPoint:NSMakePoint(myRect.origin.x + kPSMMetalObjectCounterRadius, myRect.origin.y + myRect.size.height)]; + [path appendBezierPathWithArcWithCenter:NSMakePoint(myRect.origin.x + kPSMMetalObjectCounterRadius, myRect.origin.y + kPSMMetalObjectCounterRadius) radius:kPSMMetalObjectCounterRadius startAngle:90.0 endAngle:270.0]; + [path fill]; + + // draw attributed string centered in area + NSRect counterStringRect; + NSAttributedString *counterString = [self attributedObjectCountValueForTabCell:cell]; + counterStringRect.size = [counterString size]; + counterStringRect.origin.x = myRect.origin.x + ((myRect.size.width - counterStringRect.size.width) / 2.0) + 0.25; + counterStringRect.origin.y = myRect.origin.y + ((myRect.size.height - counterStringRect.size.height) / 2.0) + 0.5; + [counterString drawInRect:counterStringRect]; + } + + // label rect + NSRect labelRect; + labelRect.origin.x = labelPosition; + labelRect.size.width = cellFrame.size.width - (labelRect.origin.x - cellFrame.origin.x) - kPSMTabBarCellPadding; + labelRect.size.height = cellFrame.size.height; + labelRect.origin.y = cellFrame.origin.y + MARGIN_Y + 1.0; + + if([cell state] == NSOnState){ + labelRect.origin.y -= 1; + } + + if(![[cell indicator] isHidden]) + labelRect.size.width -= (kPSMTabBarIndicatorWidth + kPSMTabBarCellPadding); + + if([cell count] > 0) + labelRect.size.width -= ([self objectCounterRectForTabCell:cell].size.width + kPSMTabBarCellPadding); + + // label + [[cell attributedStringValue] drawInRect:labelRect]; +} + +- (void)drawTabBar:(PSMTabBarControl *)bar inRect:(NSRect)rect +{ + NSDrawWindowBackground(rect); + [[NSColor colorWithCalibratedWhite:0.0 alpha:0.2] set]; + NSRectFillUsingOperation(rect, NSCompositeSourceAtop); + [[NSColor darkGrayColor] set]; + [NSBezierPath strokeLineFromPoint:NSMakePoint(rect.origin.x,rect.origin.y+0.5) toPoint:NSMakePoint(rect.origin.x+rect.size.width,rect.origin.y+0.5)]; + [NSBezierPath strokeLineFromPoint:NSMakePoint(rect.origin.x,rect.origin.y+rect.size.height-0.5) toPoint:NSMakePoint(rect.origin.x+rect.size.width,rect.origin.y+rect.size.height-0.5)]; + + // no tab view == not connected + if(![bar tabView]){ + NSRect labelRect = rect; + labelRect.size.height -= 4.0; + labelRect.origin.y += 4.0; + NSMutableAttributedString *attrStr; + NSString *contents = @"PSMTabBarControl"; + attrStr = [[[NSMutableAttributedString alloc] initWithString:contents] autorelease]; + NSRange range = NSMakeRange(0, [contents length]); + [attrStr addAttribute:NSFontAttributeName value:[NSFont systemFontOfSize:11.0] range:range]; + NSMutableParagraphStyle *centeredParagraphStyle = nil; + if (!centeredParagraphStyle) { + centeredParagraphStyle = [[[NSParagraphStyle defaultParagraphStyle] mutableCopy] retain]; + [centeredParagraphStyle setAlignment:NSCenterTextAlignment]; + } + [attrStr addAttribute:NSParagraphStyleAttributeName value:centeredParagraphStyle range:range]; + [attrStr drawInRect:labelRect]; + return; + } + + // draw cells + NSEnumerator *e = [[bar cells] objectEnumerator]; + PSMTabBarCell *cell; + while(cell = [e nextObject]){ + if(![cell isInOverflowMenu]){ + [cell drawWithFrame:[cell frame] inView:bar]; + } + } +} + +#pragma mark - +#pragma mark Archiving + +- (void)encodeWithCoder:(NSCoder *)aCoder +{ + //[super encodeWithCoder:aCoder]; + if ([aCoder allowsKeyedCoding]) { + [aCoder encodeObject:metalCloseButton forKey:@"metalCloseButton"]; + [aCoder encodeObject:metalCloseButtonDown forKey:@"metalCloseButtonDown"]; + [aCoder encodeObject:metalCloseButtonOver forKey:@"metalCloseButtonOver"]; + [aCoder encodeObject:_addTabButtonImage forKey:@"addTabButtonImage"]; + [aCoder encodeObject:_addTabButtonPressedImage forKey:@"addTabButtonPressedImage"]; + [aCoder encodeObject:_addTabButtonRolloverImage forKey:@"addTabButtonRolloverImage"]; + } +} + +- (id)initWithCoder:(NSCoder *)aDecoder +{ + // self = [super initWithCoder:aDecoder]; + //if (self) { + if ([aDecoder allowsKeyedCoding]) { + metalCloseButton = [[aDecoder decodeObjectForKey:@"metalCloseButton"] retain]; + metalCloseButtonDown = [[aDecoder decodeObjectForKey:@"metalCloseButtonDown"] retain]; + metalCloseButtonOver = [[aDecoder decodeObjectForKey:@"metalCloseButtonOver"] retain]; + _addTabButtonImage = [[aDecoder decodeObjectForKey:@"addTabButtonImage"] retain]; + _addTabButtonPressedImage = [[aDecoder decodeObjectForKey:@"addTabButtonPressedImage"] retain]; + _addTabButtonRolloverImage = [[aDecoder decodeObjectForKey:@"addTabButtonRolloverImage"] retain]; + } + //} + return self; +} + +@end diff --git a/PSMTabBarControl/source/PSMOverflowPopUpButton.h b/PSMTabBarControl/source/PSMOverflowPopUpButton.h new file mode 100644 index 0000000000..1ee16bdcb2 --- /dev/null +++ b/PSMTabBarControl/source/PSMOverflowPopUpButton.h @@ -0,0 +1,21 @@ +// +// PSMOverflowPopUpButton.h +// PSMTabBarControl +// +// Created by John Pannell on 11/4/05. +// Copyright 2005 Positive Spin Media. All rights reserved. +// + +#import + + +@interface PSMOverflowPopUpButton : NSPopUpButton { + NSImage *_PSMTabBarOverflowPopUpImage; + NSImage *_PSMTabBarOverflowDownPopUpImage; + BOOL _down; +} + +// archiving +- (void)encodeWithCoder:(NSCoder *)aCoder; +- (id)initWithCoder:(NSCoder *)aDecoder; +@end diff --git a/PSMTabBarControl/source/PSMOverflowPopUpButton.m b/PSMTabBarControl/source/PSMOverflowPopUpButton.m new file mode 100644 index 0000000000..d3623f1edc --- /dev/null +++ b/PSMTabBarControl/source/PSMOverflowPopUpButton.m @@ -0,0 +1,89 @@ +// +// PSMOverflowPopUpButton.m +// PSMTabBarControl +// +// Created by John Pannell on 11/4/05. +// Copyright 2005 Positive Spin Media. All rights reserved. +// + +#import "PSMOverflowPopUpButton.h" +#import "PSMTabBarControl.h" + +@implementation PSMOverflowPopUpButton + +- (id)initWithFrame:(NSRect)frameRect pullsDown:(BOOL)flag +{ + self=[super initWithFrame:frameRect pullsDown:YES]; + if (self) { + [self setBezelStyle:NSRegularSquareBezelStyle]; + [self setBordered:NO]; + [self setTitle:@""]; + [self setPreferredEdge:NSMaxXEdge]; + _PSMTabBarOverflowPopUpImage = [[NSImage alloc] initByReferencingFile:[[PSMTabBarControl bundle] pathForImageResource:@"overflowImage"]]; + _PSMTabBarOverflowDownPopUpImage = [[NSImage alloc] initByReferencingFile:[[PSMTabBarControl bundle] pathForImageResource:@"overflowImagePressed"]]; + } + return self; +} + +- (void)dealloc +{ + [_PSMTabBarOverflowPopUpImage release]; + [_PSMTabBarOverflowDownPopUpImage release]; + [super dealloc]; +} + +- (void)drawRect:(NSRect)rect +{ + if(_PSMTabBarOverflowPopUpImage == nil){ + [super drawRect:rect]; + return; + } + + NSImage *image = (_down) ? _PSMTabBarOverflowDownPopUpImage : _PSMTabBarOverflowPopUpImage; + NSSize imageSize = [image size]; + rect.origin.x = NSMidX(rect) - (imageSize.width * 0.5); + rect.origin.y = NSMidY(rect) - (imageSize.height * 0.5); + if([self isFlipped]) { + rect.origin.y += imageSize.height; + } + [image compositeToPoint:rect.origin operation:NSCompositeSourceOver]; +} + +- (void)mouseDown:(NSEvent *)event +{ + _down = YES; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notificationReceived:) name:NSMenuDidEndTrackingNotification object:[self menu]]; + [self setNeedsDisplay:YES]; + [super mouseDown:event]; +} + +- (void)notificationReceived:(NSNotification *)notification +{ + _down = NO; + [self setNeedsDisplay:YES]; + [[NSNotificationCenter defaultCenter] removeObserver:self]; +} + +#pragma mark - +#pragma mark Archiving + +- (void)encodeWithCoder:(NSCoder *)aCoder { + [super encodeWithCoder:aCoder]; + if ([aCoder allowsKeyedCoding]) { + [aCoder encodeObject:_PSMTabBarOverflowPopUpImage forKey:@"PSMTabBarOverflowPopUpImage"]; + [aCoder encodeObject:_PSMTabBarOverflowDownPopUpImage forKey:@"PSMTabBarOverflowDownPopUpImage"]; + } +} + +- (id)initWithCoder:(NSCoder *)aDecoder { + self = [super initWithCoder:aDecoder]; + if (self) { + if ([aDecoder allowsKeyedCoding]) { + _PSMTabBarOverflowPopUpImage = [[aDecoder decodeObjectForKey:@"PSMTabBarOverflowPopUpImage"] retain]; + _PSMTabBarOverflowDownPopUpImage = [[aDecoder decodeObjectForKey:@"PSMTabBarOverflowDownPopUpImage"] retain]; + } + } + return self; +} + +@end diff --git a/PSMTabBarControl/source/PSMProgressIndicator.h b/PSMTabBarControl/source/PSMProgressIndicator.h new file mode 100644 index 0000000000..8f56bd73ae --- /dev/null +++ b/PSMTabBarControl/source/PSMProgressIndicator.h @@ -0,0 +1,23 @@ +// +// PSMProgressIndicator.h +// PSMTabBarControl +// +// Created by John Pannell on 2/23/06. +// Copyright 2006 Positive Spin Media. All rights reserved. +// + +#import +#import "PSMTabBarControl.h" + + +@interface PSMProgressIndicator : NSProgressIndicator { + +} + +@end + +@interface PSMTabBarControl (LayoutPlease) + +- (void)update; + +@end \ No newline at end of file diff --git a/PSMTabBarControl/source/PSMProgressIndicator.m b/PSMTabBarControl/source/PSMProgressIndicator.m new file mode 100644 index 0000000000..d3046d518a --- /dev/null +++ b/PSMTabBarControl/source/PSMProgressIndicator.m @@ -0,0 +1,20 @@ +// +// PSMProgressIndicator.m +// PSMTabBarControl +// +// Created by John Pannell on 2/23/06. +// Copyright 2006 Positive Spin Media. All rights reserved. +// + +#import "PSMProgressIndicator.h" + +@implementation PSMProgressIndicator + +// overrides to make tab bar control re-layout things if status changes +- (void)setHidden:(BOOL)flag +{ + [super setHidden:flag]; + [(PSMTabBarControl *)[self superview] update]; +} + +@end diff --git a/PSMTabBarControl/source/PSMRolloverButton.h b/PSMTabBarControl/source/PSMRolloverButton.h new file mode 100644 index 0000000000..d78b47c272 --- /dev/null +++ b/PSMTabBarControl/source/PSMRolloverButton.h @@ -0,0 +1,29 @@ +// +// PSMOverflowPopUpButton.h +// NetScrape +// +// Created by John Pannell on 8/4/04. +// Copyright 2004 Positive Spin Media. All rights reserved. +// + +#import + +@interface PSMRolloverButton : NSButton +{ + NSImage *_rolloverImage; + NSImage *_usualImage; + NSTrackingRectTag _myTrackingRectTag; +} + +// the regular image +- (void)setUsualImage:(NSImage *)newImage; +- (NSImage *)usualImage; + +// the rollover image +- (void)setRolloverImage:(NSImage *)newImage; +- (NSImage *)rolloverImage; + +// tracking rect for mouse events +- (void)addTrackingRect; +- (void)removeTrackingRect; +@end \ No newline at end of file diff --git a/PSMTabBarControl/source/PSMRolloverButton.m b/PSMTabBarControl/source/PSMRolloverButton.m new file mode 100644 index 0000000000..2ed10f95c6 --- /dev/null +++ b/PSMTabBarControl/source/PSMRolloverButton.m @@ -0,0 +1,107 @@ +// +// PSMOverflowPopUpButton.m +// NetScrape +// +// Created by John Pannell on 8/4/04. +// Copyright 2004 Positive Spin Media. All rights reserved. +// + +#import "PSMRolloverButton.h" + +@implementation PSMRolloverButton + +// the regular image +- (void)setUsualImage:(NSImage *)newImage +{ + [newImage retain]; + [_usualImage release]; + _usualImage = newImage; + [self setImage:_usualImage]; +} + +- (NSImage *)usualImage +{ + return _usualImage; +} + +- (void)setRolloverImage:(NSImage *)newImage +{ + [newImage retain]; + [_rolloverImage release]; + _rolloverImage = newImage; +} + +- (NSImage *)rolloverImage +{ + return _rolloverImage; +} + +- (void)addTrackingRect +{ + // assign a tracking rect to watch for mouse enter/exit + _myTrackingRectTag = [self addTrackingRect:[self bounds] owner:self userData:nil assumeInside:NO]; +} + +- (void)removeTrackingRect +{ + [self removeTrackingRect:_myTrackingRectTag]; +} + +// override for rollover effect +- (void)mouseEntered:(NSEvent *)theEvent; +{ + // set rollover image + [self setImage:_rolloverImage]; + [self setNeedsDisplay]; + [[self superview] setNeedsDisplay:YES]; // eliminates a drawing artifact +} + +- (void)mouseExited:(NSEvent *)theEvent; +{ + // restore usual image + [self setImage:_usualImage]; + [self setNeedsDisplay]; + [[self superview] setNeedsDisplay:YES]; // eliminates a drawing artifact +} + +- (void)mouseDown:(NSEvent *)theEvent +{ + // eliminates drawing artifact + [[NSRunLoop currentRunLoop] performSelector:@selector(display) target:[self superview] argument:nil order:1 modes:[NSArray arrayWithObjects:@"NSEventTrackingRunLoopMode", @"NSDefaultRunLoopMode", nil]]; + [super mouseDown:theEvent]; +} + +- (void)resetCursorRects +{ + // called when the button rect has been changed + [self removeTrackingRect]; + [self addTrackingRect]; + [[self superview] setNeedsDisplay:YES]; // eliminates a drawing artifact +} + +#pragma mark - +#pragma mark Archiving + +- (void)encodeWithCoder:(NSCoder *)aCoder { + [super encodeWithCoder:aCoder]; + if ([aCoder allowsKeyedCoding]) { + [aCoder encodeObject:_rolloverImage forKey:@"rolloverImage"]; + [aCoder encodeObject:_usualImage forKey:@"usualImage"]; + [aCoder encodeInt:_myTrackingRectTag forKey:@"myTrackingRectTag"]; + } +} + +- (id)initWithCoder:(NSCoder *)aDecoder { + self = [super initWithCoder:aDecoder]; + if (self) { + if ([aDecoder allowsKeyedCoding]) { + _rolloverImage = [[aDecoder decodeObjectForKey:@"rolloverImage"] retain]; + _usualImage = [[aDecoder decodeObjectForKey:@"usualImage"] retain]; + _myTrackingRectTag = [aDecoder decodeIntForKey:@"myTrackingRectTag"]; + } + } + return self; +} + + +@end diff --git a/PSMTabBarControl/source/PSMTabBarCell.h b/PSMTabBarControl/source/PSMTabBarCell.h new file mode 100644 index 0000000000..51717d6280 --- /dev/null +++ b/PSMTabBarControl/source/PSMTabBarCell.h @@ -0,0 +1,102 @@ +// +// PSMTabBarCell.h +// PSMTabBarControl +// +// Created by John Pannell on 10/13/05. +// Copyright 2005 Positive Spin Media. All rights reserved. +// + +#import +#import "PSMTabBarControl.h" + +@class PSMTabBarControl; +@class PSMProgressIndicator; + +@interface PSMTabBarCell : NSActionCell { + // sizing + NSRect _frame; + NSSize _stringSize; + int _currentStep; + BOOL _isPlaceholder; + + // state + int _tabState; + NSTrackingRectTag _closeButtonTrackingTag; // left side tracking, if dragging + NSTrackingRectTag _cellTrackingTag; // right side tracking, if dragging + BOOL _closeButtonOver; + BOOL _closeButtonPressed; + PSMProgressIndicator *_indicator; + BOOL _isInOverflowMenu; + BOOL _hasCloseButton; + BOOL _isCloseButtonSuppressed; + BOOL _hasIcon; + int _count; +} + +// creation/destruction +- (id)initWithControlView:(PSMTabBarControl *)controlView; +- (id)initPlaceholderWithFrame:(NSRect)frame expanded:(BOOL)value inControlView:(PSMTabBarControl *)controlView; +- (void)dealloc; + +// accessors +- (id)controlView; +- (void)setControlView:(id)view; +- (NSTrackingRectTag)closeButtonTrackingTag; +- (void)setCloseButtonTrackingTag:(NSTrackingRectTag)tag; +- (NSTrackingRectTag)cellTrackingTag; +- (void)setCellTrackingTag:(NSTrackingRectTag)tag; +- (float)width; +- (NSRect)frame; +- (void)setFrame:(NSRect)rect; +- (void)setStringValue:(NSString *)aString; +- (NSSize)stringSize; +- (NSAttributedString *)attributedStringValue; +- (int)tabState; +- (void)setTabState:(int)state; +- (NSProgressIndicator *)indicator; +- (BOOL)isInOverflowMenu; +- (void)setIsInOverflowMenu:(BOOL)value; +- (BOOL)closeButtonPressed; +- (void)setCloseButtonPressed:(BOOL)value; +- (BOOL)closeButtonOver; +- (void)setCloseButtonOver:(BOOL)value; +- (BOOL)hasCloseButton; +- (void)setHasCloseButton:(BOOL)set; +- (void)setCloseButtonSuppressed:(BOOL)suppress; +- (BOOL)isCloseButtonSuppressed; +- (BOOL)hasIcon; +- (void)setHasIcon:(BOOL)value; +- (int)count; +- (void)setCount:(int)value; +- (BOOL)isPlaceholder; +- (void)setIsPlaceholder:(BOOL)value; +- (int)currentStep; +- (void)setCurrentStep:(int)value; + +// component attributes +- (NSRect)indicatorRectForFrame:(NSRect)cellFrame; +- (NSRect)closeButtonRectForFrame:(NSRect)cellFrame; +- (float)minimumWidthOfCell; +- (float)desiredWidthOfCell; + +// drawing +- (void)drawWithFrame:(NSRect)cellFrame inView:(NSView *)controlView; + +// tracking the mouse +- (void)mouseEntered:(NSEvent *)theEvent; +- (void)mouseExited:(NSEvent *)theEvent; + +// drag support +- (NSImage*)dragImageForRect:(NSRect)cellFrame; + +// archiving +- (void)encodeWithCoder:(NSCoder *)aCoder; +- (id)initWithCoder:(NSCoder *)aDecoder; + +@end + +@interface PSMTabBarControl (CellAccessors) + +- (id)style; + +@end diff --git a/PSMTabBarControl/source/PSMTabBarCell.m b/PSMTabBarControl/source/PSMTabBarCell.m new file mode 100644 index 0000000000..c71793ba16 --- /dev/null +++ b/PSMTabBarControl/source/PSMTabBarCell.m @@ -0,0 +1,397 @@ +// +// PSMTabBarCell.m +// PSMTabBarControl +// +// Created by John Pannell on 10/13/05. +// Copyright 2005 Positive Spin Media. All rights reserved. +// + +#import "PSMTabBarCell.h" +#import "PSMTabBarControl.h" +#import "PSMTabStyle.h" +#import "PSMProgressIndicator.h" +#import "PSMTabDragAssistant.h" + + +@implementation PSMTabBarCell + +#pragma mark - +#pragma mark Creation/Destruction +- (id)initWithControlView:(PSMTabBarControl *)controlView +{ + self = [super init]; + if(self){ + _controlView = controlView; + _closeButtonTrackingTag = 0; + _cellTrackingTag = 0; + _closeButtonOver = NO; + _closeButtonPressed = NO; + _indicator = [[PSMProgressIndicator alloc] initWithFrame:NSMakeRect(0.0,0.0,kPSMTabBarIndicatorWidth,kPSMTabBarIndicatorWidth)]; + [_indicator setStyle:NSProgressIndicatorSpinningStyle]; + [_indicator setAutoresizingMask:NSViewMinYMargin]; + _hasCloseButton = YES; + _isCloseButtonSuppressed = NO; + _count = 0; + _isPlaceholder = NO; + } + return self; +} + +- (id)initPlaceholderWithFrame:(NSRect)frame expanded:(BOOL)value inControlView:(PSMTabBarControl *)controlView +{ + self = [super init]; + if(self){ + _controlView = controlView; + _isPlaceholder = YES; + if(!value) + frame.size.width = 0.0; + [self setFrame:frame]; + _closeButtonTrackingTag = 0; + _cellTrackingTag = 0; + _closeButtonOver = NO; + _closeButtonPressed = NO; + _indicator = nil; + _hasCloseButton = YES; + _isCloseButtonSuppressed = NO; + _count = 0; + + if(value){ + [self setCurrentStep:(kPSMTabDragAnimationSteps - 1)]; + } else { + [self setCurrentStep:0]; + } + + } + + return self; +} + +- (void)dealloc +{ + [_indicator release]; + [super dealloc]; +} + +#pragma mark - +#pragma mark Accessors + +- (id)controlView +{ + return _controlView; +} + +- (void)setControlView:(id)view +{ + // no retain release pattern, as this simply switches a tab to another view. + _controlView = view; +} + +- (NSTrackingRectTag)closeButtonTrackingTag +{ + return _closeButtonTrackingTag; +} + +- (void)setCloseButtonTrackingTag:(NSTrackingRectTag)tag +{ + _closeButtonTrackingTag = tag; +} + +- (NSTrackingRectTag)cellTrackingTag +{ + return _cellTrackingTag; +} + +- (void)setCellTrackingTag:(NSTrackingRectTag)tag +{ + _cellTrackingTag = tag; +} + +- (float)width +{ + return _frame.size.width; +} + +- (NSRect)frame +{ + return _frame; +} + +- (void)setFrame:(NSRect)rect +{ + _frame = rect; +} + +- (void)setStringValue:(NSString *)aString +{ + [super setStringValue:aString]; + _stringSize = [[self attributedStringValue] size]; + // need to redisplay now - binding observation was too quick. + [_controlView update]; +} + +- (NSSize)stringSize +{ + return _stringSize; +} + +- (NSAttributedString *)attributedStringValue +{ + return [(id )[_controlView style] attributedStringValueForTabCell:self]; +} + +- (int)tabState +{ + return _tabState; +} + +- (void)setTabState:(int)state +{ + _tabState = state; +} + +- (NSProgressIndicator *)indicator +{ + return _indicator; +} + +- (BOOL)isInOverflowMenu +{ + return _isInOverflowMenu; +} + +- (void)setIsInOverflowMenu:(BOOL)value +{ + _isInOverflowMenu = value; +} + +- (BOOL)closeButtonPressed +{ + return _closeButtonPressed; +} + +- (void)setCloseButtonPressed:(BOOL)value +{ + _closeButtonPressed = value; +} + +- (BOOL)closeButtonOver +{ + return _closeButtonOver; +} + +- (void)setCloseButtonOver:(BOOL)value +{ + _closeButtonOver = value; +} + +- (BOOL)hasCloseButton +{ + return _hasCloseButton; +} + +- (void)setHasCloseButton:(BOOL)set; +{ + _hasCloseButton = set; +} + +- (void)setCloseButtonSuppressed:(BOOL)suppress; +{ + _isCloseButtonSuppressed = suppress; +} + +- (BOOL)isCloseButtonSuppressed; +{ + return _isCloseButtonSuppressed; +} + +- (BOOL)hasIcon +{ + return _hasIcon; +} + +- (void)setHasIcon:(BOOL)value +{ + _hasIcon = value; + [_controlView update]; // binding notice is too fast +} + +- (int)count +{ + return _count; +} + +- (void)setCount:(int)value +{ + _count = value; + [_controlView update]; // binding notice is too fast +} + +- (BOOL)isPlaceholder +{ + return _isPlaceholder; +} + +- (void)setIsPlaceholder:(BOOL)value; +{ + _isPlaceholder = value; +} + +- (int)currentStep +{ + return _currentStep; +} + +- (void)setCurrentStep:(int)value +{ + if(value < 0) + value = 0; + + if(value > (kPSMTabDragAnimationSteps - 1)) + value = (kPSMTabDragAnimationSteps - 1); + + _currentStep = value; +} + +#pragma mark - +#pragma mark Component Attributes + +- (NSRect)indicatorRectForFrame:(NSRect)cellFrame +{ + return [(id )[_controlView style] indicatorRectForTabCell:self]; +} + +- (NSRect)closeButtonRectForFrame:(NSRect)cellFrame +{ + return [(id )[_controlView style] closeButtonRectForTabCell:self]; +} + +- (float)minimumWidthOfCell +{ + return [(id )[_controlView style] minimumWidthOfTabCell:self]; +} + +- (float)desiredWidthOfCell +{ + return [(id )[_controlView style] desiredWidthOfTabCell:self]; +} + +#pragma mark - +#pragma mark Drawing + +- (void)drawWithFrame:(NSRect)cellFrame inView:(NSView *)controlView +{ + if(_isPlaceholder){ + [[NSColor colorWithCalibratedWhite:0.0 alpha:0.2] set]; + NSRectFillUsingOperation(cellFrame, NSCompositeSourceAtop); + return; + } + + [(id )[_controlView style] drawTabCell:self]; +} + +#pragma mark - +#pragma mark Tracking + +- (void)mouseEntered:(NSEvent *)theEvent +{ + // check for which tag + if([theEvent trackingNumber] == _closeButtonTrackingTag){ + _closeButtonOver = YES; + } + if([theEvent trackingNumber] == _cellTrackingTag){ + [self setHighlighted:YES]; + } + [_controlView setNeedsDisplay]; +} + +- (void)mouseExited:(NSEvent *)theEvent +{ + // check for which tag + if([theEvent trackingNumber] == _closeButtonTrackingTag){ + _closeButtonOver = NO; + } + if([theEvent trackingNumber] == _cellTrackingTag){ + [self setHighlighted:NO]; + } + [_controlView setNeedsDisplay]; +} + +#pragma mark - +#pragma mark Drag Support + +- (NSImage*)dragImageForRect:(NSRect)cellFrame +{ + if(([self state] == NSOnState) && ([[_controlView styleName] isEqualToString:@"Metal"])) + cellFrame.size.width += 1.0; + [_controlView lockFocus]; + NSBitmapImageRep *rep = [[NSBitmapImageRep alloc] initWithFocusedViewRect:cellFrame]; + [_controlView unlockFocus]; + NSImage *image = [[[NSImage alloc] initWithSize:[rep size]] autorelease]; + [image addRepresentation:rep]; + NSImage *returnImage = [[[NSImage alloc] initWithSize:[rep size]] autorelease]; + [returnImage lockFocus]; + [image compositeToPoint:NSMakePoint(0.0, 0.0) operation:NSCompositeSourceOver fraction:0.7]; + [returnImage unlockFocus]; + if(![[self indicator] isHidden]){ + NSImage *pi = [[NSImage alloc] initByReferencingFile:[[PSMTabBarControl bundle] pathForImageResource:@"pi"]]; + [returnImage lockFocus]; + NSPoint indicatorPoint = NSMakePoint([self frame].size.width - MARGIN_X - kPSMTabBarIndicatorWidth, MARGIN_Y); + if(([self state] == NSOnState) && ([[_controlView styleName] isEqualToString:@"Metal"])) + indicatorPoint.y += 1.0; + [pi compositeToPoint:indicatorPoint operation:NSCompositeSourceOver fraction:0.7]; + [returnImage unlockFocus]; + [pi release]; + } + return returnImage; +} + +#pragma mark - +#pragma mark Archiving + +- (void)encodeWithCoder:(NSCoder *)aCoder { + [super encodeWithCoder:aCoder]; + if ([aCoder allowsKeyedCoding]) { + [aCoder encodeRect:_frame forKey:@"frame"]; + [aCoder encodeSize:_stringSize forKey:@"stringSize"]; + [aCoder encodeInt:_currentStep forKey:@"currentStep"]; + [aCoder encodeBool:_isPlaceholder forKey:@"isPlaceholder"]; + [aCoder encodeInt:_tabState forKey:@"tabState"]; + [aCoder encodeInt:_closeButtonTrackingTag forKey:@"closeButtonTrackingTag"]; + [aCoder encodeInt:_cellTrackingTag forKey:@"cellTrackingTag"]; + [aCoder encodeBool:_closeButtonOver forKey:@"closeButtonOver"]; + [aCoder encodeBool:_closeButtonPressed forKey:@"closeButtonPressed"]; + [aCoder encodeObject:_indicator forKey:@"indicator"]; + [aCoder encodeBool:_isInOverflowMenu forKey:@"isInOverflowMenu"]; + [aCoder encodeBool:_hasCloseButton forKey:@"hasCloseButton"]; + [aCoder encodeBool:_isCloseButtonSuppressed forKey:@"isCloseButtonSuppressed"]; + [aCoder encodeBool:_hasIcon forKey:@"hasIcon"]; + [aCoder encodeInt:_count forKey:@"count"]; + } +} + +- (id)initWithCoder:(NSCoder *)aDecoder { + self = [super initWithCoder:aDecoder]; + if (self) { + if ([aDecoder allowsKeyedCoding]) { + _frame = [aDecoder decodeRectForKey:@"frame"]; + NSLog(@"decoding cell"); + _stringSize = [aDecoder decodeSizeForKey:@"stringSize"]; + _currentStep = [aDecoder decodeIntForKey:@"currentStep"]; + _isPlaceholder = [aDecoder decodeBoolForKey:@"isPlaceholder"]; + _tabState = [aDecoder decodeIntForKey:@"tabState"]; + _closeButtonTrackingTag = [aDecoder decodeIntForKey:@"closeButtonTrackingTag"]; + _cellTrackingTag = [aDecoder decodeIntForKey:@"cellTrackingTag"]; + _closeButtonOver = [aDecoder decodeBoolForKey:@"closeButtonOver"]; + _closeButtonPressed = [aDecoder decodeBoolForKey:@"closeButtonPressed"]; + _indicator = [[aDecoder decodeObjectForKey:@"indicator"] retain]; + _isInOverflowMenu = [aDecoder decodeBoolForKey:@"isInOverflowMenu"]; + _hasCloseButton = [aDecoder decodeBoolForKey:@"hasCloseButton"]; + _isCloseButtonSuppressed = [aDecoder decodeBoolForKey:@"isCloseButtonSuppressed"]; + _hasIcon = [aDecoder decodeBoolForKey:@"hasIcon"]; + _count = [aDecoder decodeIntForKey:@"count"]; + } + } + return self; +} + +@end diff --git a/PSMTabBarControl/source/PSMTabBarControl.h b/PSMTabBarControl/source/PSMTabBarControl.h new file mode 100644 index 0000000000..361c744136 --- /dev/null +++ b/PSMTabBarControl/source/PSMTabBarControl.h @@ -0,0 +1,124 @@ +// +// PSMTabBarControl.h +// PSMTabBarControl +// +// Created by John Pannell on 10/13/05. +// Copyright 2005 Positive Spin Media. All rights reserved. +// + +/* + This view provides a control interface to manage a regular NSTabView. It looks and works like the tabbed browsing interface of many popular browsers. + */ + +#import + +#define kPSMTabBarControlHeight 22 +// internal cell border +#define MARGIN_X 6 +#define MARGIN_Y 3 +// padding between objects +#define kPSMTabBarCellPadding 4 +// fixed size objects +#define kPSMMinimumTitleWidth 30 +#define kPSMTabBarIndicatorWidth 16.0 +#define kPSMTabBarIconWidth 16.0 +#define kPSMHideAnimationSteps 2.0 + +@class PSMOverflowPopUpButton; +@class PSMRolloverButton; +@class PSMTabBarCell; +@protocol PSMTabStyle; + +enum { + PSMTab_SelectedMask = 1 << 1, + PSMTab_LeftIsSelectedMask = 1 << 2, + PSMTab_RightIsSelectedMask = 1 << 3, + PSMTab_PositionLeftMask = 1 << 4, + PSMTab_PositionMiddleMask = 1 << 5, + PSMTab_PositionRightMask = 1 << 6, + PSMTab_PositionSingleMask = 1 << 7 +}; + +@interface PSMTabBarControl : NSControl { + + // control basics + NSMutableArray *_cells; // the cells that draw the tabs + IBOutlet NSTabView *tabView; // the tab view being navigated + PSMOverflowPopUpButton *_overflowPopUpButton; // for too many tabs + PSMRolloverButton *_addTabButton; + + // drawing style + id style; + BOOL _canCloseOnlyTab; + BOOL _hideForSingleTab; + BOOL _showAddTabButton; + BOOL _sizeCellsToFit; + + // cell width + int _cellMinWidth; + int _cellMaxWidth; + int _cellOptimumWidth; + + // animation for hide/show + int _currentStep; + BOOL _isHidden; + BOOL _hideIndicators; + IBOutlet id partnerView; // gets resized when hide/show + BOOL _awakenedFromNib; + + // drag and drop + NSEvent *_lastMouseDownEvent; // keep this for dragging reference + BOOL _allowsDragBetweenWindows; + + // MVC help + IBOutlet id delegate; +} + +// control characteristics ++ (NSBundle *)bundle; + +// control configuration +- (BOOL)canCloseOnlyTab; +- (void)setCanCloseOnlyTab:(BOOL)value; +- (NSString *)styleName; +- (void)setStyleNamed:(NSString *)name; +- (BOOL)hideForSingleTab; +- (void)setHideForSingleTab:(BOOL)value; +- (BOOL)showAddTabButton; +- (void)setShowAddTabButton:(BOOL)value; +- (int)cellMinWidth; +- (void)setCellMinWidth:(int)value; +- (int)cellMaxWidth; +- (void)setCellMaxWidth:(int)value; +- (int)cellOptimumWidth; +- (void)setCellOptimumWidth:(int)value; +- (BOOL)sizeCellsToFit; +- (void)setSizeCellsToFit:(BOOL)value; +- (BOOL)allowsDragBetweenWindows; +- (void)setAllowsDragBetweenWindows:(BOOL)flag; + +// accessors +- (NSTabView *)tabView; +- (void)setTabView:(NSTabView *)view; +- (id)delegate; +- (void)setDelegate:(id)object; +- (id)partnerView; +- (void)setPartnerView:(id)view; + +// the buttons +- (PSMRolloverButton *)addTabButton; +- (PSMOverflowPopUpButton *)overflowPopUpButton; +- (NSMutableArray *)representedTabViewItems; + +// special effects +- (void)hideTabBar:(BOOL)hide animate:(BOOL)animate; + +@end + + +@interface NSObject (TabBarControlDelegateMethods) +- (BOOL)tabView:(NSTabView *)aTabView shouldCloseTabViewItem:(NSTabViewItem *)tabViewItem; +- (void)tabView:(NSTabView *)aTabView willCloseTabViewItem:(NSTabViewItem *)tabViewItem; +- (void)tabView:(NSTabView *)aTabView didCloseTabViewItem:(NSTabViewItem *)tabViewItem; +- (void)tabView:(NSTabView *)aTabView didDragTabViewItem:(NSTabViewItem *)tabViewItem toIndex:(int)idx; +@end diff --git a/PSMTabBarControl/source/PSMTabBarControl.m b/PSMTabBarControl/source/PSMTabBarControl.m new file mode 100644 index 0000000000..df4c6aed51 --- /dev/null +++ b/PSMTabBarControl/source/PSMTabBarControl.m @@ -0,0 +1,1398 @@ +// +// PSMTabBarControl.m +// PSMTabBarControl +// +// Created by John Pannell on 10/13/05. +// Copyright 2005 Positive Spin Media. All rights reserved. +// + +#import "PSMTabBarControl.h" +#import "PSMTabBarCell.h" +#import "PSMOverflowPopUpButton.h" +#import "PSMRolloverButton.h" +#import "PSMTabStyle.h" +#import "PSMMetalTabStyle.h" +#import "PSMAquaTabStyle.h" +#import "PSMUnifiedTabStyle.h" +#import "PSMTabDragAssistant.h" + +@interface PSMTabBarControl (Private) +// characteristics +- (float)availableCellWidth; +- (NSRect)genericCellRect; + + // constructor/destructor +- (void)initAddedProperties; +- (void)dealloc; + + // accessors +- (NSEvent *)lastMouseDownEvent; +- (void)setLastMouseDownEvent:(NSEvent *)event; + + // contents +- (void)addTabViewItem:(NSTabViewItem *)item; +- (void)removeTabForCell:(PSMTabBarCell *)cell; + + // draw +- (void)update; + + // actions +- (void)overflowMenuAction:(id)sender; +- (void)closeTabClick:(id)sender; +- (void)tabClick:(id)sender; +- (void)tabNothing:(id)sender; +- (void)frameDidChange:(NSNotification *)notification; +- (void)windowDidMove:(NSNotification *)aNotification; +- (void)windowStatusDidChange:(NSNotification *)notification; + + // NSTabView delegate +- (void)tabView:(NSTabView *)tabView didSelectTabViewItem:(NSTabViewItem *)tabViewItem; +- (BOOL)tabView:(NSTabView *)tabView shouldSelectTabViewItem:(NSTabViewItem *)tabViewItem; +- (void)tabView:(NSTabView *)tabView willSelectTabViewItem:(NSTabViewItem *)tabViewItem; +- (void)tabViewDidChangeNumberOfTabViewItems:(NSTabView *)tabView; + + // archiving +- (void)encodeWithCoder:(NSCoder *)aCoder; +- (id)initWithCoder:(NSCoder *)aDecoder; + + // convenience +- (id)cellForPoint:(NSPoint)point cellFrame:(NSRectPointer)outFrame; +- (PSMTabBarCell *)lastVisibleTab; +- (int)numberOfVisibleTabs; + +@end + +@implementation PSMTabBarControl +#pragma mark - +#pragma mark Characteristics ++ (NSBundle *)bundle; +{ + static NSBundle *bundle = nil; + if (!bundle) bundle = [NSBundle bundleForClass:[PSMTabBarControl class]]; + return bundle; +} + +- (float)availableCellWidth +{ + float width = [self frame].size.width; + width = width - [style leftMarginForTabBarControl] - [style rightMarginForTabBarControl]; + return width; +} + +- (NSRect)genericCellRect +{ + NSRect aRect=[self frame]; + aRect.origin.x = [style leftMarginForTabBarControl]; + aRect.origin.y = 0.0; + aRect.size.width = [self availableCellWidth]; + aRect.size.height = kPSMTabBarControlHeight; + return aRect; +} + +#pragma mark - +#pragma mark Constructor/destructor + +- (void)initAddedProperties +{ + _cells = [[NSMutableArray alloc] initWithCapacity:10]; + + // default config + _allowsDragBetweenWindows = YES; + _canCloseOnlyTab = NO; + _showAddTabButton = NO; + _hideForSingleTab = NO; + _sizeCellsToFit = NO; + _isHidden = NO; + _hideIndicators = NO; + _awakenedFromNib = NO; + _cellMinWidth = 100; + _cellMaxWidth = 280; + _cellOptimumWidth = 130; + style = [[PSMMetalTabStyle alloc] init]; + + // the overflow button/menu + NSRect overflowButtonRect = NSMakeRect([self frame].size.width - [style rightMarginForTabBarControl] + 1, 0, [style rightMarginForTabBarControl] - 1, [self frame].size.height); + _overflowPopUpButton = [[PSMOverflowPopUpButton alloc] initWithFrame:overflowButtonRect pullsDown:YES]; + if(_overflowPopUpButton){ + // configure + [_overflowPopUpButton setAutoresizingMask:NSViewNotSizable|NSViewMinXMargin]; + } + + // new tab button + NSRect addTabButtonRect = NSMakeRect([self frame].size.width - [style rightMarginForTabBarControl] + 1, 3.0, 16.0, 16.0); + _addTabButton = [[PSMRolloverButton alloc] initWithFrame:addTabButtonRect]; + if(_addTabButton){ + NSImage *newButtonImage = [style addTabButtonImage]; + if(newButtonImage) + [_addTabButton setUsualImage:newButtonImage]; + newButtonImage = [style addTabButtonPressedImage]; + if(newButtonImage) + [_addTabButton setAlternateImage:newButtonImage]; + newButtonImage = [style addTabButtonRolloverImage]; + if(newButtonImage) + [_addTabButton setRolloverImage:newButtonImage]; + [_addTabButton setTitle:@""]; + [_addTabButton setImagePosition:NSImageOnly]; + [_addTabButton setButtonType:NSMomentaryChangeButton]; + [_addTabButton setBordered:NO]; + [_addTabButton setBezelStyle:NSShadowlessSquareBezelStyle]; + if(_showAddTabButton){ + [_addTabButton setHidden:NO]; + } else { + [_addTabButton setHidden:YES]; + } + [_addTabButton setNeedsDisplay:YES]; + } +} + +- (id)initWithFrame:(NSRect)frame +{ + self = [super initWithFrame:frame]; + if (self) { + // Initialization + [self initAddedProperties]; + [self registerForDraggedTypes:[NSArray arrayWithObjects: @"PSMTabBarControlItemPBType", nil]]; + } + [self setTarget:self]; + return self; +} + +- (void)dealloc +{ + [_overflowPopUpButton release]; + [_cells release]; + [tabView release]; + [_addTabButton release]; + [partnerView release]; + [_lastMouseDownEvent release]; + [style release]; + [delegate release]; + + [self unregisterDraggedTypes]; + + [super dealloc]; +} + +- (void)awakeFromNib +{ + // build cells from existing tab view items + NSArray *existingItems = [tabView tabViewItems]; + NSEnumerator *e = [existingItems objectEnumerator]; + NSTabViewItem *item; + while(item = [e nextObject]){ + if(![[self representedTabViewItems] containsObject:item]) + [self addTabViewItem:item]; + } + + // resize + [self setPostsFrameChangedNotifications:YES]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(frameDidChange:) name:NSViewFrameDidChangeNotification object:self]; + + // window status + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(windowStatusDidChange:) name:NSWindowDidBecomeKeyNotification object:[self window]]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(windowStatusDidChange:) name:NSWindowDidResignKeyNotification object:[self window]]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(windowDidMove:) name:NSWindowDidMoveNotification object:[self window]]; +} + + +#pragma mark - +#pragma mark Accessors + +- (NSMutableArray *)cells +{ + return _cells; +} + +- (NSEvent *)lastMouseDownEvent +{ + return _lastMouseDownEvent; +} + +- (void)setLastMouseDownEvent:(NSEvent *)event +{ + [event retain]; + [_lastMouseDownEvent release]; + _lastMouseDownEvent = event; +} + +- (id)delegate +{ + return delegate; +} + +- (void)setDelegate:(id)object +{ + [object retain]; + [delegate release]; + delegate = object; +} + +- (NSTabView *)tabView +{ + return tabView; +} + +- (void)setTabView:(NSTabView *)view +{ + [view retain]; + [tabView release]; + tabView = view; +} + +- (id)style +{ + return style; +} + +- (NSString *)styleName +{ + return [style name]; +} + +- (void)setStyleNamed:(NSString *)name +{ + [style release]; + if([name isEqualToString:@"Aqua"]){ + style = [[PSMAquaTabStyle alloc] init]; + } + else if ([name isEqualToString:@"Unified"]){ + style = [[PSMUnifiedTabStyle alloc] init]; + } + else { + style = [[PSMMetalTabStyle alloc] init]; + } + + // restyle add tab button + if(_addTabButton){ + NSImage *newButtonImage = [style addTabButtonImage]; + if(newButtonImage) + [_addTabButton setUsualImage:newButtonImage]; + newButtonImage = [style addTabButtonPressedImage]; + if(newButtonImage) + [_addTabButton setAlternateImage:newButtonImage]; + newButtonImage = [style addTabButtonRolloverImage]; + if(newButtonImage) + [_addTabButton setRolloverImage:newButtonImage]; + } + + [self update]; +} + +- (BOOL)canCloseOnlyTab +{ + return _canCloseOnlyTab; +} + +- (void)setCanCloseOnlyTab:(BOOL)value +{ + _canCloseOnlyTab = value; + if ([_cells count] == 1) { + [self update]; + } +} + +- (BOOL)allowsDragBetweenWindows +{ + return _allowsDragBetweenWindows; +} + +- (void)setAllowsDragBetweenWindows:(BOOL)flag +{ + _allowsDragBetweenWindows = flag; +} + +- (BOOL)hideForSingleTab +{ + return _hideForSingleTab; +} + +- (void)setHideForSingleTab:(BOOL)value +{ + _hideForSingleTab = value; + [self update]; +} + +- (BOOL)showAddTabButton +{ + return _showAddTabButton; +} + +- (void)setShowAddTabButton:(BOOL)value +{ + _showAddTabButton = value; + [self update]; +} + +- (int)cellMinWidth +{ + return _cellMinWidth; +} + +- (void)setCellMinWidth:(int)value +{ + _cellMinWidth = value; + [self update]; +} + +- (int)cellMaxWidth +{ + return _cellMaxWidth; +} + +- (void)setCellMaxWidth:(int)value +{ + _cellMaxWidth = value; + [self update]; +} + +- (int)cellOptimumWidth +{ + return _cellOptimumWidth; +} + +- (void)setCellOptimumWidth:(int)value +{ + _cellOptimumWidth = value; + [self update]; +} + +- (BOOL)sizeCellsToFit +{ + return _sizeCellsToFit; +} + +- (void)setSizeCellsToFit:(BOOL)value +{ + _sizeCellsToFit = value; + [self update]; +} + +- (PSMRolloverButton *)addTabButton +{ + return _addTabButton; +} + +- (PSMOverflowPopUpButton *)overflowPopUpButton +{ + return _overflowPopUpButton; +} + +#pragma mark - +#pragma mark Functionality +- (void)addTabViewItem:(NSTabViewItem *)item +{ + // create cell + PSMTabBarCell *cell = [[PSMTabBarCell alloc] initWithControlView:self]; + [cell setRepresentedObject:item]; + // bind the indicator to the represented object's status (if it exists) + [[cell indicator] setHidden:YES]; + if([item identifier] != nil){ + if([[item identifier] respondsToSelector:@selector(content)]){ + if([[[[cell representedObject] identifier] content] respondsToSelector:@selector(isProcessing)]){ + NSMutableDictionary *bindingOptions = [NSMutableDictionary dictionary]; + [bindingOptions setObject:NSNegateBooleanTransformerName forKey:@"NSValueTransformerName"]; + [[cell indicator] bind:@"animate" toObject:[item identifier] withKeyPath:@"selection.isProcessing" options:nil]; + [[cell indicator] bind:@"hidden" toObject:[item identifier] withKeyPath:@"selection.isProcessing" options:bindingOptions]; + [[item identifier] addObserver:self forKeyPath:@"selection.isProcessing" options:nil context:nil]; + } + } + } + + // bind for the existence of an icon + [cell setHasIcon:NO]; + if([item identifier] != nil){ + if([[item identifier] respondsToSelector:@selector(content)]){ + if([[[[cell representedObject] identifier] content] respondsToSelector:@selector(icon)]){ + NSMutableDictionary *bindingOptions = [NSMutableDictionary dictionary]; + [bindingOptions setObject:NSIsNotNilTransformerName forKey:@"NSValueTransformerName"]; + [cell bind:@"hasIcon" toObject:[item identifier] withKeyPath:@"selection.icon" options:bindingOptions]; + [[item identifier] addObserver:self forKeyPath:@"selection.icon" options:nil context:nil]; + } + } + } + + // bind for the existence of a counter + [cell setCount:0]; + if([item identifier] != nil){ + if([[item identifier] respondsToSelector:@selector(content)]){ + if([[[[cell representedObject] identifier] content] respondsToSelector:@selector(objectCount)]){ + [cell bind:@"count" toObject:[item identifier] withKeyPath:@"selection.objectCount" options:nil]; + [[item identifier] addObserver:self forKeyPath:@"selection.objectCount" options:nil context:nil]; + } + } + } + + // bind my string value to the label on the represented tab + [cell bind:@"title" toObject:item withKeyPath:@"label" options:nil]; + + // add to collection + [_cells addObject:cell]; + [cell release]; + if([_cells count] == [tabView numberOfTabViewItems]){ + [self update]; // don't update unless all are accounted for! + } +} + +- (void)removeTabForCell:(PSMTabBarCell *)cell +{ + // unbind + [[cell indicator] unbind:@"animate"]; + [[cell indicator] unbind:@"hidden"]; + [cell unbind:@"hasIcon"]; + [cell unbind:@"title"]; + [cell unbind:@"count"]; + + // remove indicator + if([[self subviews] containsObject:[cell indicator]]){ + [[cell indicator] removeFromSuperview]; + } + // remove tracking + [[NSNotificationCenter defaultCenter] removeObserver:cell]; + if([cell closeButtonTrackingTag] != 0){ + [self removeTrackingRect:[cell closeButtonTrackingTag]]; + } + if([cell cellTrackingTag] != 0){ + [self removeTrackingRect:[cell cellTrackingTag]]; + } + + // pull from collection + [_cells removeObject:cell]; + + [self update]; +} + +- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context +{ + // the progress indicator, label, icon, or count has changed - must redraw + [self update]; +} + +#pragma mark - +#pragma mark Hide/Show + +- (void)hideTabBar:(BOOL)hide animate:(BOOL)animate +{ + if(!_awakenedFromNib) + return; + if(_isHidden && hide) + return; + if(!_isHidden && !hide) + return; + + [[self subviews] makeObjectsPerformSelector:@selector(removeFromSuperview)]; + _hideIndicators = YES; + + NSTimer *animationTimer; + _isHidden = hide; + _currentStep = 0; + if(!animate) + _currentStep = (int)kPSMHideAnimationSteps; + + float partnerOriginalHeight, partnerOriginalY, myOriginalHeight, myOriginalY, partnerTargetHeight, partnerTargetY, myTargetHeight, myTargetY; + + // current (original) values + myOriginalHeight = [self frame].size.height; + myOriginalY = [self frame].origin.y; + if(partnerView){ + partnerOriginalHeight = [partnerView frame].size.height; + partnerOriginalY = [partnerView frame].origin.y; + } else { + partnerOriginalHeight = [[self window] frame].size.height; + partnerOriginalY = [[self window] frame].origin.y; + } + + // target values for partner + if(partnerView){ + // above or below me? + if((myOriginalY - 22) > partnerOriginalY){ + // partner is below me + if(_isHidden){ + // I'm shrinking + myTargetY = myOriginalY + 21; + myTargetHeight = myOriginalHeight - 21; + partnerTargetY = partnerOriginalY; + partnerTargetHeight = partnerOriginalHeight + 21; + } else { + // I'm growing + myTargetY = myOriginalY - 21; + myTargetHeight = myOriginalHeight + 21; + partnerTargetY = partnerOriginalY; + partnerTargetHeight = partnerOriginalHeight - 21; + } + } else { + // partner is above me + if(_isHidden){ + // I'm shrinking + myTargetY = myOriginalY; + myTargetHeight = myOriginalHeight - 21; + partnerTargetY = partnerOriginalY - 21; + partnerTargetHeight = partnerOriginalHeight + 21; + } else { + // I'm growing + myTargetY = myOriginalY; + myTargetHeight = myOriginalHeight + 21; + partnerTargetY = partnerOriginalY + 21; + partnerTargetHeight = partnerOriginalHeight - 21; + } + } + } else { + // for window movement + if(_isHidden){ + // I'm shrinking + myTargetY = myOriginalY; + myTargetHeight = myOriginalHeight - 21; + partnerTargetY = partnerOriginalY + 21; + partnerTargetHeight = partnerOriginalHeight - 21; + } else { + // I'm growing + myTargetY = myOriginalY; + myTargetHeight = myOriginalHeight + 21; + partnerTargetY = partnerOriginalY - 21; + partnerTargetHeight = partnerOriginalHeight + 21; + } + } + + NSDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithFloat:myOriginalY], @"myOriginalY", [NSNumber numberWithFloat:partnerOriginalY], @"partnerOriginalY", [NSNumber numberWithFloat:myOriginalHeight], @"myOriginalHeight", [NSNumber numberWithFloat:partnerOriginalHeight], @"partnerOriginalHeight", [NSNumber numberWithFloat:myTargetY], @"myTargetY", [NSNumber numberWithFloat:partnerTargetY], @"partnerTargetY", [NSNumber numberWithFloat:myTargetHeight], @"myTargetHeight", [NSNumber numberWithFloat:partnerTargetHeight], @"partnerTargetHeight", nil]; + animationTimer = [NSTimer scheduledTimerWithTimeInterval:(1.0/20.0) target:self selector:@selector(animateShowHide:) userInfo:userInfo repeats:YES]; +} + +- (void)animateShowHide:(NSTimer *)timer +{ + // moves the frame of the tab bar and window (or partner view) linearly to hide or show the tab bar + NSRect myFrame = [self frame]; + float myCurrentY = ([[[timer userInfo] objectForKey:@"myOriginalY"] floatValue] + (([[[timer userInfo] objectForKey:@"myTargetY"] floatValue] - [[[timer userInfo] objectForKey:@"myOriginalY"] floatValue]) * (_currentStep/kPSMHideAnimationSteps))); + float myCurrentHeight = ([[[timer userInfo] objectForKey:@"myOriginalHeight"] floatValue] + (([[[timer userInfo] objectForKey:@"myTargetHeight"] floatValue] - [[[timer userInfo] objectForKey:@"myOriginalHeight"] floatValue]) * (_currentStep/kPSMHideAnimationSteps))); + float partnerCurrentY = ([[[timer userInfo] objectForKey:@"partnerOriginalY"] floatValue] + (([[[timer userInfo] objectForKey:@"partnerTargetY"] floatValue] - [[[timer userInfo] objectForKey:@"partnerOriginalY"] floatValue]) * (_currentStep/kPSMHideAnimationSteps))); + float partnerCurrentHeight = ([[[timer userInfo] objectForKey:@"partnerOriginalHeight"] floatValue] + (([[[timer userInfo] objectForKey:@"partnerTargetHeight"] floatValue] - [[[timer userInfo] objectForKey:@"partnerOriginalHeight"] floatValue]) * (_currentStep/kPSMHideAnimationSteps))); + + NSRect myNewFrame = NSMakeRect(myFrame.origin.x, myCurrentY, myFrame.size.width, myCurrentHeight); + + if(partnerView){ + // resize self and view + [partnerView setFrame:NSMakeRect([partnerView frame].origin.x, partnerCurrentY, [partnerView frame].size.width, partnerCurrentHeight)]; + [partnerView setNeedsDisplay:YES]; + [self setFrame:myNewFrame]; + } else { + // resize self and window + [[self window] setFrame:NSMakeRect([[self window] frame].origin.x, partnerCurrentY, [[self window] frame].size.width, partnerCurrentHeight) display:YES]; + [self setFrame:myNewFrame]; + } + + // next + _currentStep++; + if(_currentStep == kPSMHideAnimationSteps + 1){ + [timer invalidate]; + [self viewDidEndLiveResize]; + _hideIndicators = NO; + [self update]; + } + [[self window] display]; +} + +- (id)partnerView +{ + return partnerView; +} + +- (void)setPartnerView:(id)view +{ + [partnerView release]; + [view retain]; + partnerView = view; +} + +#pragma mark - +#pragma mark Drawing + +- (BOOL)isFlipped +{ + return YES; +} + +- (void)drawRect:(NSRect)rect +{ + [style drawTabBar:self inRect:rect]; +} + +- (void)update +{ + // abandon hope, all ye who enter here :-) + // this method handles all of the cell layout, and is called when something changes to require the refresh. This method is not called during drag and drop; see the PSMTabDragAssistant's calculateDragAnimationForTabBar: method, which does layout in that case. + + // make sure all of our tabs are accounted for before updating + if ([tabView numberOfTabViewItems] != [_cells count]) { + return; + } + + // hide/show? (these return if already in desired state) + if((_hideForSingleTab) && ([_cells count] <= 1)){ + [self hideTabBar:YES animate:YES]; + } else { + [self hideTabBar:NO animate:YES]; + } + + // size all cells appropriately and create tracking rects + // nuke old tracking rects + int i, cellCount = [_cells count]; + for(i = 0; i < cellCount; i++){ + id cell = [_cells objectAtIndex:i]; + [[NSNotificationCenter defaultCenter] removeObserver:cell]; + if([cell closeButtonTrackingTag] != 0){ + [self removeTrackingRect:[cell closeButtonTrackingTag]]; + } + if([cell cellTrackingTag] != 0){ + [self removeTrackingRect:[cell cellTrackingTag]]; + } + } + + // calculate number of cells to fit in control and cell widths + float availableWidth = [self availableCellWidth]; + NSMutableArray *newWidths = [NSMutableArray arrayWithCapacity:cellCount]; + int numberOfVisibleCells = 1; + float totalOccupiedWidth = 0.0; + NSMenu *overflowMenu = nil; + for(i = 0; i < cellCount; i++){ + PSMTabBarCell *cell = [_cells objectAtIndex:i]; + float width; + + // supress close button? + if (cellCount == 1 && [self canCloseOnlyTab] == NO) { + [cell setCloseButtonSuppressed:YES]; + } else { + [cell setCloseButtonSuppressed:NO]; + } + + // Determine cell width + if(_sizeCellsToFit){ + width = [cell desiredWidthOfCell]; + if (width > _cellMaxWidth) { + width = _cellMaxWidth; + } + } else { + width = _cellOptimumWidth; + } + + // too much? + totalOccupiedWidth += width; + if (totalOccupiedWidth >= availableWidth) { + numberOfVisibleCells = i; + if(_sizeCellsToFit){ + int neededWidth = width - (totalOccupiedWidth - availableWidth); + // can I squeeze it in without violating min cell width? + int widthIfAllMin = (numberOfVisibleCells + 1) * _cellMinWidth; + + if ((width + widthIfAllMin) <= availableWidth) { + // squeeze - distribute needed sacrifice among all cells + int q; + for(q = (i - 1); q >= 0; q--){ + int desiredReduction = (int)neededWidth/(q+1); + if(([[newWidths objectAtIndex:q] floatValue] - desiredReduction) < _cellMinWidth){ + int actualReduction = (int)[[newWidths objectAtIndex:q] floatValue] - _cellMinWidth; + [newWidths replaceObjectAtIndex:q withObject:[NSNumber numberWithFloat:_cellMinWidth]]; + neededWidth -= actualReduction; + } else { + int newCellWidth = (int)[[newWidths objectAtIndex:q] floatValue] - desiredReduction; + [newWidths replaceObjectAtIndex:q withObject:[NSNumber numberWithFloat:newCellWidth]]; + neededWidth -= desiredReduction; + } + } + // one cell left! + int thisWidth = width - neededWidth; + [newWidths addObject:[NSNumber numberWithFloat:thisWidth]]; + numberOfVisibleCells++; + } else { + // stretch - distribute leftover room among cells + int leftoverWidth = availableWidth - totalOccupiedWidth + width; + int q; + for(q = (i - 1); q >= 0; q--){ + int desiredAddition = (int)leftoverWidth/(q+1); + int newCellWidth = (int)[[newWidths objectAtIndex:q] floatValue] + desiredAddition; + [newWidths replaceObjectAtIndex:q withObject:[NSNumber numberWithFloat:newCellWidth]]; + leftoverWidth -= desiredAddition; + } + } + break; // done assigning widths; remaining cells go in overflow menu + } else { + int revisedWidth = availableWidth/(i + 1); + if(revisedWidth >= _cellMinWidth){ + int q; + totalOccupiedWidth = 0; + for(q = 0; q < [newWidths count]; q++){ + [newWidths replaceObjectAtIndex:q withObject:[NSNumber numberWithFloat:revisedWidth]]; + totalOccupiedWidth += revisedWidth; + } + // just squeezed this one in... + [newWidths addObject:[NSNumber numberWithFloat:revisedWidth]]; + totalOccupiedWidth += revisedWidth; + numberOfVisibleCells++; + } else { + // couldn't fit that last one... + break; + } + } + } else { + numberOfVisibleCells = cellCount; + [newWidths addObject:[NSNumber numberWithFloat:width]]; + } + } + + // Set up cells with frames and rects + NSRect cellRect = [self genericCellRect]; + for(i = 0; i < cellCount; i++){ + PSMTabBarCell *cell = [_cells objectAtIndex:i]; + int tabState = 0; + if (i < numberOfVisibleCells) { + // set cell frame + cellRect.size.width = [[newWidths objectAtIndex:i] floatValue]; + [cell setFrame:cellRect]; + NSTrackingRectTag tag; + + // close button tracking rect + if ([cell hasCloseButton]) { + tag = [self addTrackingRect:[cell closeButtonRectForFrame:cellRect] owner:cell userData:nil assumeInside:NO]; + [cell setCloseButtonTrackingTag:tag]; + } + + // entire tab tracking rect + tag = [self addTrackingRect:cellRect owner:cell userData:nil assumeInside:NO]; + [cell setCellTrackingTag:tag]; + [cell setEnabled:YES]; + + // selected? set tab states... + if([[cell representedObject] isEqualTo:[tabView selectedTabViewItem]]){ + [cell setState:NSOnState]; + tabState |= PSMTab_SelectedMask; + // previous cell + if(i > 0){ + [[_cells objectAtIndex:i-1] setTabState:([(PSMTabBarCell *)[_cells objectAtIndex:i-1] tabState] | PSMTab_RightIsSelectedMask)]; + } + // next cell - see below + } else { + [cell setState:NSOffState]; + // see if prev cell was selected + if(i > 0){ + if([[_cells objectAtIndex:i-1] state] == NSOnState){ + tabState |= PSMTab_LeftIsSelectedMask; + } + } + } + // more tab states + if(cellCount == 1){ + tabState |= PSMTab_PositionLeftMask | PSMTab_PositionRightMask | PSMTab_PositionSingleMask; + } else if(i == 0){ + tabState |= PSMTab_PositionLeftMask; + } else if(i-1 == cellCount){ + tabState |= PSMTab_PositionRightMask; + } + [cell setTabState:tabState]; + [cell setIsInOverflowMenu:NO]; + + // indicator + if(![[cell indicator] isHidden] && !_hideIndicators){ + [[cell indicator] setFrame:[cell indicatorRectForFrame:cellRect]]; + if(![[self subviews] containsObject:[cell indicator]]){ + [self addSubview:[cell indicator]]; + [[cell indicator] startAnimation:self]; + } + } + + // next... + cellRect.origin.x += [[newWidths objectAtIndex:i] floatValue]; + + } else { + // set up menu items + NSMenuItem *menuItem; + if(overflowMenu == nil){ + overflowMenu = [[[NSMenu alloc] initWithTitle:@"TITLE"] autorelease]; + [overflowMenu insertItemWithTitle:@"FIRST" action:nil keyEquivalent:@"" atIndex:0]; // Because the overflowPupUpButton is a pull down menu + } + menuItem = [[[NSMenuItem alloc] initWithTitle:[[cell attributedStringValue] string] action:@selector(overflowMenuAction:) keyEquivalent:@""] autorelease]; + [menuItem setTarget:self]; + [menuItem setRepresentedObject:[cell representedObject]]; + [cell setIsInOverflowMenu:YES]; + [[cell indicator] removeFromSuperview]; + if ([[cell representedObject] isEqualTo:[tabView selectedTabViewItem]]) + [menuItem setState:NSOnState]; + if([cell hasIcon]) + [menuItem setImage:[[[[cell representedObject] identifier] content] icon]]; + if([cell count] > 0) + [menuItem setTitle:[[menuItem title] stringByAppendingFormat:@" (%d)",[cell count]]]; + [overflowMenu addItem:menuItem]; + } + } + + + // Overflow menu + cellRect.origin.y = 0; + cellRect.size.height = kPSMTabBarControlHeight; + cellRect.size.width = [style rightMarginForTabBarControl]; + if (overflowMenu) { + cellRect.origin.x = [self frame].size.width - [style rightMarginForTabBarControl] + 1; + if(![[self subviews] containsObject:_overflowPopUpButton]){ + [self addSubview:_overflowPopUpButton]; + } + [_overflowPopUpButton setFrame:cellRect]; + [_overflowPopUpButton setMenu:overflowMenu]; + if ([_overflowPopUpButton isHidden]) [_overflowPopUpButton setHidden:NO]; + } else { + if (![_overflowPopUpButton isHidden]) [_overflowPopUpButton setHidden:YES]; + } + + // add tab button + if(!overflowMenu && _showAddTabButton){ + if(![[self subviews] containsObject:_addTabButton]) + [self addSubview:_addTabButton]; + if([_addTabButton isHidden] && _showAddTabButton) + [_addTabButton setHidden:NO]; + cellRect.size = [_addTabButton frame].size; + cellRect.origin.y = MARGIN_Y; + cellRect.origin.x += 2; + [_addTabButton setImage:[style addTabButtonImage]]; + [_addTabButton setFrame:cellRect]; + [_addTabButton setNeedsDisplay:YES]; + } else { + [_addTabButton setHidden:YES]; + [_addTabButton setNeedsDisplay:YES]; + } + + [self setNeedsDisplay:YES]; +} + +#pragma mark - +#pragma mark Mouse Tracking + +- (BOOL)mouseDownCanMoveWindow +{ + return NO; +} + +- (BOOL)acceptsFirstMouse:(NSEvent *)theEvent +{ + return YES; +} + +- (void)mouseDown:(NSEvent *)theEvent +{ + // keep for dragging + [self setLastMouseDownEvent:theEvent]; + // what cell? + NSPoint mousePt = [self convertPoint:[theEvent locationInWindow] fromView:nil]; + NSRect cellFrame; + PSMTabBarCell *cell = [self cellForPoint:mousePt cellFrame:&cellFrame]; + if(cell){ +#if 0 + NSRect iconRect = [cell closeButtonRectForFrame:cellFrame]; + if(NSMouseInRect(mousePt, iconRect,[self isFlipped])){ + [cell setCloseButtonPressed:YES]; + } else { + [cell setCloseButtonPressed:NO]; + } + [self setNeedsDisplay:YES]; +#else + // HACK! Let the tabs react on the mouse down instead of mouse up + NSRect iconRect = [cell closeButtonRectForFrame:cellFrame]; + if((NSMouseInRect(mousePt, iconRect,[self isFlipped]))){ + //[self performSelector:@selector(closeTabClick:) withObject:cell]; + [self closeTabClick:cell]; + } else if(NSMouseInRect(mousePt, cellFrame,[self isFlipped])){ + //[self performSelector:@selector(tabClick:) withObject:cell]; + [self tabClick:cell]; + } else { + //[self performSelector:@selector(tabNothing:) withObject:cell]; + [self tabNothing:cell]; + } +#endif + } +} + +- (void)mouseDragged:(NSEvent *)theEvent +{ + if([self lastMouseDownEvent] == nil){ + return; + } + + if ([_cells count] < 2) { + return; + } + + NSRect cellFrame; + NSPoint trackingStartPoint = [self convertPoint:[[self lastMouseDownEvent] locationInWindow] fromView:nil]; + PSMTabBarCell *cell = [self cellForPoint:trackingStartPoint cellFrame:&cellFrame]; + if (!cell) + return; + + NSPoint currentPoint = [self convertPoint:[theEvent locationInWindow] fromView:nil]; + float dx = fabs(currentPoint.x - trackingStartPoint.x); + float dy = fabs(currentPoint.y - trackingStartPoint.y); + float distance = sqrt(dx * dx + dy * dy); + if (distance < 10) + return; + + if(![[PSMTabDragAssistant sharedDragAssistant] isDragging]) { + [[PSMTabDragAssistant sharedDragAssistant] startDraggingCell:cell fromTabBar:self withMouseDownEvent:[self lastMouseDownEvent]]; + } +} + +- (void)mouseUp:(NSEvent *)theEvent +{ +#if 0 // HACK! Tabs react on mouse down instead of mouse up + // what cell? + NSPoint mousePt = [self convertPoint:[theEvent locationInWindow] fromView:nil]; + NSRect cellFrame, mouseDownCellFrame; + PSMTabBarCell *cell = [self cellForPoint:mousePt cellFrame:&cellFrame]; + PSMTabBarCell *mouseDownCell = [self cellForPoint:[self convertPoint:[[self lastMouseDownEvent] locationInWindow] fromView:nil] cellFrame:&mouseDownCellFrame]; + if(cell){ + NSRect iconRect = [mouseDownCell closeButtonRectForFrame:mouseDownCellFrame]; + if((NSMouseInRect(mousePt, iconRect,[self isFlipped])) && [mouseDownCell closeButtonPressed]){ + [self performSelector:@selector(closeTabClick:) withObject:cell]; + } else if(NSMouseInRect(mousePt, mouseDownCellFrame,[self isFlipped])){ + [mouseDownCell setCloseButtonPressed:NO]; + [self performSelector:@selector(tabClick:) withObject:cell]; + } else { + [mouseDownCell setCloseButtonPressed:NO]; + [self performSelector:@selector(tabNothing:) withObject:cell]; + } + } +#endif +} + +#pragma mark - +#pragma mark Drag and Drop + +- (BOOL)shouldDelayWindowOrderingForEvent:(NSEvent *)theEvent +{ + return YES; +} + +// NSDraggingSource +- (unsigned int)draggingSourceOperationMaskForLocal:(BOOL)isLocal +{ + return (isLocal ? NSDragOperationMove : NSDragOperationNone); +} + +- (BOOL)ignoreModifierKeysWhileDragging +{ + return YES; +} + +// NSDraggingDestination +- (NSDragOperation)draggingEntered:(id )sender +{ + if([[[sender draggingPasteboard] types] indexOfObject:@"PSMTabBarControlItemPBType"] != NSNotFound) { + + if ([sender draggingSource] != self && ![self allowsDragBetweenWindows]) + return NSDragOperationNone; + + [[PSMTabDragAssistant sharedDragAssistant] draggingEnteredTabBar:self atPoint:[self convertPoint:[sender draggingLocation] fromView:nil]]; + return NSDragOperationMove; + } + + return NSDragOperationNone; +} + +- (NSDragOperation)draggingUpdated:(id )sender +{ + if ([[[sender draggingPasteboard] types] indexOfObject:@"PSMTabBarControlItemPBType"] != NSNotFound) { + + if ([sender draggingSource] != self && ![self allowsDragBetweenWindows]) + return NSDragOperationNone; + + [[PSMTabDragAssistant sharedDragAssistant] draggingUpdatedInTabBar:self atPoint:[self convertPoint:[sender draggingLocation] fromView:nil]]; + return NSDragOperationMove; + } + + return NSDragOperationNone; +} + +- (void)draggingExited:(id )sender +{ + [[PSMTabDragAssistant sharedDragAssistant] draggingExitedTabBar:self]; +} + +- (BOOL)prepareForDragOperation:(id )sender +{ + return YES; +} + +- (BOOL)performDragOperation:(id )sender +{ +#if 1 + // HACK! Used below. + NSTabViewItem *tvi = [[[PSMTabDragAssistant sharedDragAssistant] draggedCell] representedObject]; +#endif + + [[PSMTabDragAssistant sharedDragAssistant] performDragOperation]; + +#if 1 + // HACK! Notify the delegate that a tab was dragged to a new position. + if (delegate && [delegate respondsToSelector:@selector(tabView:didDragTabViewItem:toIndex:)]) { + int idx = [[self representedTabViewItems] indexOfObject:tvi]; + if (NSNotFound != idx) { + [delegate tabView:[self tabView] didDragTabViewItem:tvi toIndex:idx]; + } + } +#endif + + return YES; +} + +- (void)draggedImage:(NSImage *)anImage endedAt:(NSPoint)aPoint operation:(NSDragOperation)operation +{ + [[PSMTabDragAssistant sharedDragAssistant] draggedImageEndedAt:aPoint operation:operation]; +} + +- (void)concludeDragOperation:(id )sender +{ + +} + +#pragma mark - +#pragma mark Actions + +- (void)overflowMenuAction:(id)sender +{ + [tabView selectTabViewItem:[sender representedObject]]; + [self update]; +} + +- (void)closeTabClick:(id)sender +{ + [sender retain]; + if(([_cells count] == 1) && (![self canCloseOnlyTab])) + return; + + if(([self delegate]) && ([[self delegate] respondsToSelector:@selector(tabView:shouldCloseTabViewItem:)])){ + if(![[self delegate] tabView:tabView shouldCloseTabViewItem:[sender representedObject]]){ + // fix mouse downed close button + [sender setCloseButtonPressed:NO]; + return; + } + } + + if(([self delegate]) && ([[self delegate] respondsToSelector:@selector(tabView:willCloseTabViewItem:)])){ + [[self delegate] tabView:tabView willCloseTabViewItem:[sender representedObject]]; + } + + [[sender representedObject] retain]; + [tabView removeTabViewItem:[sender representedObject]]; + + if(([self delegate]) && ([[self delegate] respondsToSelector:@selector(tabView:didCloseTabViewItem:)])){ + [[self delegate] tabView:tabView didCloseTabViewItem:[sender representedObject]]; + } + [[sender representedObject] release]; + [sender release]; +} + +- (void)tabClick:(id)sender +{ + [tabView selectTabViewItem:[sender representedObject]]; + [self update]; +} + +- (void)tabNothing:(id)sender +{ + [self update]; // takes care of highlighting based on state +} + +- (void)frameDidChange:(NSNotification *)notification +{ + [self update]; + // trying to address the drawing artifacts for the progress indicators - hackery follows + // this one fixes the "blanking" effect when the control hides and shows itself + NSEnumerator *e = [_cells objectEnumerator]; + PSMTabBarCell *cell; + while(cell = [e nextObject]){ + [[cell indicator] stopAnimation:self]; + [[cell indicator] startAnimation:self]; + } + [self setNeedsDisplay:YES]; +} + +- (void)viewWillStartLiveResize +{ + NSEnumerator *e = [_cells objectEnumerator]; + PSMTabBarCell *cell; + while(cell = [e nextObject]){ + [[cell indicator] stopAnimation:self]; + } + [self setNeedsDisplay:YES]; +} + +-(void)viewDidEndLiveResize +{ + NSEnumerator *e = [_cells objectEnumerator]; + PSMTabBarCell *cell; + while(cell = [e nextObject]){ + [[cell indicator] startAnimation:self]; + } + [self setNeedsDisplay:YES]; +} + +- (void)windowDidMove:(NSNotification *)aNotification +{ + [self setNeedsDisplay:YES]; +} + +- (void)windowStatusDidChange:(NSNotification *)notification +{ + // hide? must readjust things if I'm not supposed to be showing + // this block of code only runs when the app launches + if(_hideForSingleTab && ([_cells count] <= 1) && !_awakenedFromNib){ + // must adjust frames now before display + NSRect myFrame = [self frame]; + if(partnerView){ + NSRect partnerFrame = [partnerView frame]; + // above or below me? + if(([self frame].origin.y - 22) > [partnerView frame].origin.y){ + // partner is below me + [self setFrame:NSMakeRect(myFrame.origin.x, myFrame.origin.y + 21, myFrame.size.width, myFrame.size.height - 21)]; + [partnerView setFrame:NSMakeRect(partnerFrame.origin.x, partnerFrame.origin.y, partnerFrame.size.width, partnerFrame.size.height + 21)]; + } else { + // partner is above me + [self setFrame:NSMakeRect(myFrame.origin.x, myFrame.origin.y, myFrame.size.width, myFrame.size.height - 21)]; + [partnerView setFrame:NSMakeRect(partnerFrame.origin.x, partnerFrame.origin.y - 21, partnerFrame.size.width, partnerFrame.size.height + 21)]; + } + [partnerView setNeedsDisplay:YES]; + [self setNeedsDisplay:YES]; + } else { + // for window movement + NSRect windowFrame = [[self window] frame]; + [[self window] setFrame:NSMakeRect(windowFrame.origin.x, windowFrame.origin.y + 21, windowFrame.size.width, windowFrame.size.height - 21) display:YES]; + [self setFrame:NSMakeRect(myFrame.origin.x, myFrame.origin.y, myFrame.size.width, myFrame.size.height - 21)]; + } + _isHidden = YES; + [self setNeedsDisplay:YES]; + //[[self window] display]; + } + _awakenedFromNib = YES; + [self update]; +} + +#pragma mark - +#pragma mark NSTabView Delegate + +- (void)tabView:(NSTabView *)aTabView didSelectTabViewItem:(NSTabViewItem *)tabViewItem +{ + // here's a weird one - this message is sent before the "tabViewDidChangeNumberOfTabViewItems" + // message, thus I can end up updating when there are no cells, if no tabs were (yet) present + if([_cells count] > 0){ + [self update]; + } + if([self delegate]){ + if([[self delegate] respondsToSelector:@selector(tabView:didSelectTabViewItem:)]){ + [[self delegate] performSelector:@selector(tabView:didSelectTabViewItem:) withObject:aTabView withObject:tabViewItem]; + } + } +} + +- (BOOL)tabView:(NSTabView *)aTabView shouldSelectTabViewItem:(NSTabViewItem *)tabViewItem +{ + if([self delegate]){ + if([[self delegate] respondsToSelector:@selector(tabView:shouldSelectTabViewItem:)]){ + return (int)[[self delegate] performSelector:@selector(tabView:shouldSelectTabViewItem:) withObject:aTabView withObject:tabViewItem]; + } else { + return YES; + } + } else { + return YES; + } +} +- (void)tabView:(NSTabView *)aTabView willSelectTabViewItem:(NSTabViewItem *)tabViewItem +{ + if([self delegate]){ + if([[self delegate] respondsToSelector:@selector(tabView:willSelectTabViewItem:)]){ + [[self delegate] performSelector:@selector(tabView:willSelectTabViewItem:) withObject:aTabView withObject:tabViewItem]; + } + } +} + +- (void)tabViewDidChangeNumberOfTabViewItems:(NSTabView *)aTabView +{ + NSArray *tabItems = [tabView tabViewItems]; + // go through cells, remove any whose representedObjects are not in [tabView tabViewItems] + NSEnumerator *e = [_cells objectEnumerator]; + PSMTabBarCell *cell; + while(cell = [e nextObject]){ + if(![tabItems containsObject:[cell representedObject]]){ + [self removeTabForCell:cell]; + } + } + + // go through tab view items, add cell for any not present + NSMutableArray *cellItems = [self representedTabViewItems]; + NSEnumerator *ex = [tabItems objectEnumerator]; + NSTabViewItem *item; + while(item = [ex nextObject]){ + if(![cellItems containsObject:item]){ + [self addTabViewItem:item]; + } + } + +#if 0 + // HACK! Make sure '_cells' is ordered the same as 'tabItems'. + NSMutableArray *temp = [[NSMutableArray alloc] initWithArray:_cells]; + e = [_cells objectEnumerator]; + int count = [temp count]; + while ((cell = [e nextObject])) { + int idx = [tabItems indexOfObject:[cell representedObject]]; + if (NSNotFound != idx && idx < count) { + [temp replaceObjectAtIndex:idx withObject:cell]; + } + } + + [_cells release]; + _cells = temp; + + if ([_cells count] == [tabView numberOfTabViewItems]) { + [self update]; // don't update unless all are accounted for! + } +#endif + + // pass along for other delegate responses + if([self delegate]){ + if([[self delegate] respondsToSelector:@selector(tabViewDidChangeNumberOfTabViewItems:)]){ + [[self delegate] performSelector:@selector(tabViewDidChangeNumberOfTabViewItems:) withObject:aTabView]; + } + } +} + +#pragma mark - +#pragma mark Archiving + +- (void)encodeWithCoder:(NSCoder *)aCoder +{ + [super encodeWithCoder:aCoder]; + if ([aCoder allowsKeyedCoding]) { + [aCoder encodeObject:_cells forKey:@"PSMcells"]; + [aCoder encodeObject:tabView forKey:@"PSMtabView"]; + [aCoder encodeObject:_overflowPopUpButton forKey:@"PSMoverflowPopUpButton"]; + [aCoder encodeObject:_addTabButton forKey:@"PSMaddTabButton"]; + [aCoder encodeObject:style forKey:@"PSMstyle"]; + [aCoder encodeBool:_canCloseOnlyTab forKey:@"PSMcanCloseOnlyTab"]; + [aCoder encodeBool:_hideForSingleTab forKey:@"PSMhideForSingleTab"]; + [aCoder encodeBool:_showAddTabButton forKey:@"PSMshowAddTabButton"]; + [aCoder encodeBool:_sizeCellsToFit forKey:@"PSMsizeCellsToFit"]; + [aCoder encodeInt:_cellMinWidth forKey:@"PSMcellMinWidth"]; + [aCoder encodeInt:_cellMaxWidth forKey:@"PSMcellMaxWidth"]; + [aCoder encodeInt:_cellOptimumWidth forKey:@"PSMcellOptimumWidth"]; + [aCoder encodeInt:_currentStep forKey:@"PSMcurrentStep"]; + [aCoder encodeBool:_isHidden forKey:@"PSMisHidden"]; + [aCoder encodeBool:_hideIndicators forKey:@"PSMhideIndicators"]; + [aCoder encodeObject:partnerView forKey:@"PSMpartnerView"]; + [aCoder encodeBool:_awakenedFromNib forKey:@"PSMawakenedFromNib"]; + [aCoder encodeObject:_lastMouseDownEvent forKey:@"PSMlastMouseDownEvent"]; + [aCoder encodeObject:delegate forKey:@"PSMdelegate"]; + + } +} + +- (id)initWithCoder:(NSCoder *)aDecoder +{ + self = [super initWithCoder:aDecoder]; + if (self) { + if ([aDecoder allowsKeyedCoding]) { + _cells = [[aDecoder decodeObjectForKey:@"PSMcells"] retain]; + tabView = [[aDecoder decodeObjectForKey:@"PSMtabView"] retain]; + _overflowPopUpButton = [[aDecoder decodeObjectForKey:@"PSMoverflowPopUpButton"] retain]; + _addTabButton = [[aDecoder decodeObjectForKey:@"PSMaddTabButton"] retain]; + style = [[aDecoder decodeObjectForKey:@"PSMstyle"] retain]; + _canCloseOnlyTab = [aDecoder decodeBoolForKey:@"PSMcanCloseOnlyTab"]; + _hideForSingleTab = [aDecoder decodeBoolForKey:@"PSMhideForSingleTab"]; + _showAddTabButton = [aDecoder decodeBoolForKey:@"PSMshowAddTabButton"]; + _sizeCellsToFit = [aDecoder decodeBoolForKey:@"PSMsizeCellsToFit"]; + _cellMinWidth = [aDecoder decodeIntForKey:@"PSMcellMinWidth"]; + _cellMaxWidth = [aDecoder decodeIntForKey:@"PSMcellMaxWidth"]; + _cellOptimumWidth = [aDecoder decodeIntForKey:@"PSMcellOptimumWidth"]; + _currentStep = [aDecoder decodeIntForKey:@"PSMcurrentStep"]; + _isHidden = [aDecoder decodeBoolForKey:@"PSMisHidden"]; + _hideIndicators = [aDecoder decodeBoolForKey:@"PSMhideIndicators"]; + partnerView = [[aDecoder decodeObjectForKey:@"PSMpartnerView"] retain]; + _awakenedFromNib = [aDecoder decodeBoolForKey:@"PSMawakenedFromNib"]; + _lastMouseDownEvent = [[aDecoder decodeObjectForKey:@"PSMlastMouseDownEvent"] retain]; + delegate = [[aDecoder decodeObjectForKey:@"PSMdelegate"] retain]; + } + } + return self; +} + +#pragma mark - +#pragma mark IB Palette + +- (NSSize)minimumFrameSizeFromKnobPosition:(int)position +{ + return NSMakeSize(100.0, 22.0); +} + +- (NSSize)maximumFrameSizeFromKnobPosition:(int)knobPosition +{ + return NSMakeSize(10000.0, 22.0); +} + +- (void)placeView:(NSRect)newFrame +{ + // this is called any time the view is resized in IB + [self setFrame:newFrame]; + [self update]; +} + +#pragma mark - +#pragma mark Convenience + +- (NSMutableArray *)representedTabViewItems +{ + NSMutableArray *temp = [NSMutableArray arrayWithCapacity:[_cells count]]; + NSEnumerator *e = [_cells objectEnumerator]; + PSMTabBarCell *cell; + while(cell = [e nextObject]){ + [temp addObject:[cell representedObject]]; + } + return temp; +} + +- (id)cellForPoint:(NSPoint)point cellFrame:(NSRectPointer)outFrame +{ + NSRect aRect = [self genericCellRect]; + + if(!NSPointInRect(point,aRect)){ + return nil; + } + + int i, cnt = [_cells count]; + for(i = 0; i < cnt; i++){ + PSMTabBarCell *cell = [_cells objectAtIndex:i]; + float width = [cell width]; + aRect.size.width = width; + + if(NSPointInRect(point, aRect)){ + if(outFrame){ + *outFrame = aRect; + } + return cell; + } + aRect.origin.x += width; + } + return nil; +} + +- (PSMTabBarCell *)lastVisibleTab +{ + int i, cellCount = [_cells count]; + for(i = 0; i < cellCount; i++){ + if([[_cells objectAtIndex:i] isInOverflowMenu]) + return [_cells objectAtIndex:(i-1)]; + } + return [_cells objectAtIndex:(cellCount - 1)]; +} + +- (int)numberOfVisibleTabs +{ + int i, cellCount = [_cells count]; + for(i = 0; i < cellCount; i++){ + if([[_cells objectAtIndex:i] isInOverflowMenu]) + return i+1; + } + return cellCount; +} + + +@end diff --git a/PSMTabBarControl/source/PSMTabBarControlInspector.h b/PSMTabBarControl/source/PSMTabBarControlInspector.h new file mode 100644 index 0000000000..ba5d684b90 --- /dev/null +++ b/PSMTabBarControl/source/PSMTabBarControlInspector.h @@ -0,0 +1,23 @@ +// +// PSMTabBarControlInspector.h +// PSMTabBarControl +// +// Created by John Pannell on 12/21/05. +// Copyright Positive Spin Media 2005. All rights reserved. +// + +#import + +@interface PSMTabBarControlInspector : IBInspector +{ + IBOutlet NSPopUpButton *_stylePopUp; + IBOutlet NSButton *_canCloseOnlyTab; + IBOutlet NSButton *_hideForSingleTab; + IBOutlet NSButton *_showAddTab; + IBOutlet NSTextField *_cellMinWidth; + IBOutlet NSTextField *_cellMaxWidth; + IBOutlet NSTextField *_cellOptimumWidth; + IBOutlet NSButton *_sizeToFit; + IBOutlet NSButton *_allowsDragBetweenWindows; +} +@end diff --git a/PSMTabBarControl/source/PSMTabBarControlInspector.m b/PSMTabBarControl/source/PSMTabBarControlInspector.m new file mode 100644 index 0000000000..d9c5b91c4f --- /dev/null +++ b/PSMTabBarControl/source/PSMTabBarControlInspector.m @@ -0,0 +1,99 @@ +// +// PSMTabBarControlInspector.m +// PSMTabBarControl +// +// Created by John Pannell on 12/21/05. +// Copyright Positive Spin Media 2005 . All rights reserved. +// + +#import "PSMTabBarControlInspector.h" +#import "PSMTabBarControl.h" + +#define kPSMStyleTag 0 +#define kPSMCanCloseOnlyTabTag 1 +#define kPSMHideForSingleTabTag 2 +#define kPSMShowAddTabTag 3 +#define kPSMMinWidthTag 4 +#define kPSMMaxWidthTag 5 +#define kPSMOptimumWidthTag 6 +#define kPSMSizeToFitTag 7 +#define kPSMAllowsDragBetweenWindows 8 + +@implementation PSMTabBarControlInspector + +- (id)init +{ + self = [super init]; + [NSBundle loadNibNamed:@"PSMTabBarControlInspector" owner:self]; + return self; +} + +- (void)ok:(id)sender +{ + if([sender tag] == kPSMStyleTag){ + [[self object] setStyleNamed:[sender titleOfSelectedItem]]; + + } else if([sender tag] == kPSMCanCloseOnlyTabTag){ + [[self object] setCanCloseOnlyTab:[sender state]]; + + } else if([sender tag] == kPSMHideForSingleTabTag){ + [[self object] setHideForSingleTab:[sender state]]; + + } else if([sender tag] == kPSMShowAddTabTag){ + [[self object] setShowAddTabButton:[sender state]]; + + } else if([sender tag] == kPSMMinWidthTag){ + if([[self object] cellOptimumWidth] < [sender intValue]){ + [[self object] setCellMinWidth:[[self object] cellOptimumWidth]]; + [sender setIntValue:[[self object] cellOptimumWidth]]; + } else { + [[self object] setCellMinWidth:[sender intValue]]; + } + + } else if([sender tag] == kPSMMaxWidthTag){ + if([[self object] cellOptimumWidth] > [sender intValue]){ + [[self object] setCellMaxWidth:[[self object] cellOptimumWidth]]; + [sender setIntValue:[[self object] cellOptimumWidth]]; + } else { + [[self object] setCellMaxWidth:[sender intValue]]; + } + + } else if([sender tag] == kPSMOptimumWidthTag){ + if([[self object] cellMaxWidth] < [sender intValue]){ + [[self object] setCellOptimumWidth:[[self object] cellMaxWidth]]; + [sender setIntValue:[[self object] cellMaxWidth]]; + } else if([[self object] cellMinWidth] > [sender intValue]){ + [[self object] setCellOptimumWidth:[[self object] cellMinWidth]]; + [sender setIntValue:[[self object] cellMinWidth]]; + } else { + [[self object] setCellOptimumWidth:[sender intValue]]; + } + + } else if([sender tag] == kPSMSizeToFitTag){ + [[self object] setSizeCellsToFit:[sender state]]; + + } else if([sender tag] == kPSMAllowsDragBetweenWindows){ + [[self object] setAllowsDragBetweenWindows:[sender state]]; + + } + + + [super ok:sender]; +} + +- (void)revert:(id)sender +{ + [_stylePopUp selectItemWithTitle:[[self object] styleName]]; + [_canCloseOnlyTab setState:[[self object] canCloseOnlyTab]]; + [_hideForSingleTab setState:[[self object] hideForSingleTab]]; + [_showAddTab setState:[[self object] showAddTabButton]]; + [_cellMinWidth setIntValue:[[self object] cellMinWidth]]; + [_cellMaxWidth setIntValue:[[self object] cellMaxWidth]]; + [_cellOptimumWidth setIntValue:[[self object] cellOptimumWidth]]; + [_sizeToFit setState:[[self object] sizeCellsToFit]]; + [_allowsDragBetweenWindows setState:[[self object] allowsDragBetweenWindows]]; + + [super revert:sender]; +} + +@end diff --git a/PSMTabBarControl/source/PSMTabBarControlPalette.h b/PSMTabBarControl/source/PSMTabBarControlPalette.h new file mode 100644 index 0000000000..0feb9ad9d0 --- /dev/null +++ b/PSMTabBarControl/source/PSMTabBarControlPalette.h @@ -0,0 +1,21 @@ +// +// PSMTabBarControlPalette.h +// PSMTabBarControl +// +// Created by John Pannell on 12/21/05. +// Copyright Positive Spin Media 2005 . All rights reserved. +// + +#import +#import "PSMTabBarControl.h" + +@interface PSMTabBarControlPalette : IBPalette +{ + IBOutlet NSImageView *repImage; + PSMTabBarControl *_customControl; +} +@end + +@interface PSMTabBarControl (PSMTabBarControlPaletteInspector) +- (NSString *)inspectorClassName; +@end diff --git a/PSMTabBarControl/source/PSMTabBarControlPalette.m b/PSMTabBarControl/source/PSMTabBarControlPalette.m new file mode 100644 index 0000000000..bb5851aa18 --- /dev/null +++ b/PSMTabBarControl/source/PSMTabBarControlPalette.m @@ -0,0 +1,35 @@ +// +// PSMTabBarControlPalette.m +// PSMTabBarControl +// +// Created by John Pannell on 12/21/05. +// Copyright Positive Spin Media 2005 . All rights reserved. +// + +#import "PSMTabBarControlPalette.h" + +@implementation PSMTabBarControlPalette + +- (void)finishInstantiate +{ + // associate representative image with actual control + _customControl = [[PSMTabBarControl alloc] initWithFrame:NSMakeRect(0,0,180,22)]; + [self associateObject:_customControl ofType:IBViewPboardType withView:repImage]; +} + +- (void)dealloc +{ + [_customControl release]; + [super dealloc]; +} + +@end + +@implementation PSMTabBarControl (PSMTabBarControlPaletteInspector) + +- (NSString *)inspectorClassName +{ + return @"PSMTabBarControlInspector"; +} + +@end diff --git a/PSMTabBarControl/source/PSMTabBarControl_Prefix.pch b/PSMTabBarControl/source/PSMTabBarControl_Prefix.pch new file mode 100644 index 0000000000..65df9ffedb --- /dev/null +++ b/PSMTabBarControl/source/PSMTabBarControl_Prefix.pch @@ -0,0 +1,8 @@ +// +// Prefix header for all source files of the 'PSMTabBarControl' target in the 'PSMTabBarControl' project +// + +#ifdef __OBJC__ + #import + #import +#endif diff --git a/PSMTabBarControl/source/PSMTabDragAssistant.h b/PSMTabBarControl/source/PSMTabDragAssistant.h new file mode 100644 index 0000000000..e89692a7e3 --- /dev/null +++ b/PSMTabBarControl/source/PSMTabDragAssistant.h @@ -0,0 +1,84 @@ +// +// PSMTabDragAssistant.h +// PSMTabBarControl +// +// Created by John Pannell on 4/10/06. +// Copyright 2006 Positive Spin Media. All rights reserved. +// + +/* + This class is a sigleton that manages the details of a tab drag and drop. The details were beginning to overwhelm me when keeping all of this in the control and cells :-) + */ + +#import +#import "PSMTabBarControl.h" +@class PSMTabBarCell; +@class PSMTabDragWindow; + +#define kPSMTabDragAnimationSteps 8 +#define PI 3.1417 + +@interface PSMTabDragAssistant : NSObject { + PSMTabBarControl *_sourceTabBar; + PSMTabBarControl *_destinationTabBar; + NSMutableSet *_participatingTabBars; + PSMTabBarCell *_draggedCell; + int _draggedCellIndex; // for snap back + BOOL _isDragging; + + // Animation + NSTimer *_animationTimer; + NSMutableArray *_sineCurveWidths; + NSPoint _currentMouseLoc; + PSMTabBarCell *_targetCell; +} + +// Creation/destruction ++ (PSMTabDragAssistant *)sharedDragAssistant; + +// Accessors +- (PSMTabBarControl *)sourceTabBar; +- (void)setSourceTabBar:(PSMTabBarControl *)tabBar; +- (PSMTabBarControl *)destinationTabBar; +- (void)setDestinationTabBar:(PSMTabBarControl *)tabBar; +- (PSMTabBarCell *)draggedCell; +- (void)setDraggedCell:(PSMTabBarCell *)cell; +- (int)draggedCellIndex; +- (void)setDraggedCellIndex:(int)value; +- (BOOL)isDragging; +- (void)setIsDragging:(BOOL)value; +- (NSPoint)currentMouseLoc; +- (void)setCurrentMouseLoc:(NSPoint)point; +- (PSMTabBarCell *)targetCell; +- (void)setTargetCell:(PSMTabBarCell *)cell; + +// Functionality +- (void)startDraggingCell:(PSMTabBarCell *)cell fromTabBar:(PSMTabBarControl *)control withMouseDownEvent:(NSEvent *)event; +- (void)draggingEnteredTabBar:(PSMTabBarControl *)control atPoint:(NSPoint)mouseLoc; +- (void)draggingUpdatedInTabBar:(PSMTabBarControl *)control atPoint:(NSPoint)mouseLoc; +- (void)draggingExitedTabBar:(PSMTabBarControl *)control; +- (void)performDragOperation; +- (void)draggedImageEndedAt:(NSPoint)aPoint operation:(NSDragOperation)operation; +- (void)finishDrag; + +// Animation +- (void)animateDrag:(NSTimer *)timer; +- (void)calculateDragAnimationForTabBar:(PSMTabBarControl *)control; + +// Placeholder +- (void)distributePlaceholdersInTabBar:(PSMTabBarControl *)control withDraggedCell:(PSMTabBarCell *)cell; +- (void)distributePlaceholdersInTabBar:(PSMTabBarControl *)control; +- (void)removeAllPlaceholdersFromTabBar:(PSMTabBarControl *)control; + +@end + +@interface PSMTabBarControl (DragAccessors) + +- (id)style; +- (NSMutableArray *)cells; +- (void)setControlView:(id)view; +- (id)cellForPoint:(NSPoint)point cellFrame:(NSRectPointer)outFrame; +- (PSMTabBarCell *)lastVisibleTab; +- (int)numberOfVisibleTabs; + +@end diff --git a/PSMTabBarControl/source/PSMTabDragAssistant.m b/PSMTabBarControl/source/PSMTabDragAssistant.m new file mode 100644 index 0000000000..c5b937693c --- /dev/null +++ b/PSMTabBarControl/source/PSMTabDragAssistant.m @@ -0,0 +1,439 @@ +// +// PSMTabDragAssistant.m +// PSMTabBarControl +// +// Created by John Pannell on 4/10/06. +// Copyright 2006 Positive Spin Media. All rights reserved. +// + +#import "PSMTabDragAssistant.h" +#import "PSMTabBarCell.h" +#import "PSMTabStyle.h" + + +@implementation PSMTabDragAssistant + +static PSMTabDragAssistant *sharedDragAssistant = nil; + +#pragma mark - +#pragma mark Creation/Destruction + ++ (PSMTabDragAssistant *)sharedDragAssistant +{ + if (!sharedDragAssistant){ + sharedDragAssistant = [[PSMTabDragAssistant alloc] init]; + } + + return sharedDragAssistant; +} + +- (id)init +{ + if(self = [super init]){ + _sourceTabBar = nil; + _destinationTabBar = nil; + _participatingTabBars = [[NSMutableSet alloc] init]; + _draggedCell = nil; + _animationTimer = nil; + _sineCurveWidths = [[NSMutableArray alloc] initWithCapacity:kPSMTabDragAnimationSteps]; + _targetCell = nil; + _isDragging = NO; + } + + return self; +} + +- (void)dealloc +{ + [_sourceTabBar release]; + [_destinationTabBar release]; + [_participatingTabBars release]; + [_draggedCell release]; + [_animationTimer release]; + [_sineCurveWidths release]; + [_targetCell release]; + [super dealloc]; +} + +#pragma mark - +#pragma mark Accessors + +- (PSMTabBarControl *)sourceTabBar +{ + return _sourceTabBar; +} + +- (void)setSourceTabBar:(PSMTabBarControl *)tabBar +{ + [tabBar retain]; + [_sourceTabBar release]; + _sourceTabBar = tabBar; +} + +- (PSMTabBarControl *)destinationTabBar +{ + return _destinationTabBar; +} + +- (void)setDestinationTabBar:(PSMTabBarControl *)tabBar +{ + [tabBar retain]; + [_destinationTabBar release]; + _destinationTabBar = tabBar; +} + +- (PSMTabBarCell *)draggedCell +{ + return _draggedCell; +} + +- (void)setDraggedCell:(PSMTabBarCell *)cell +{ + [cell retain]; + [_draggedCell release]; + _draggedCell = cell; +} + +- (int)draggedCellIndex +{ + return _draggedCellIndex; +} + +- (void)setDraggedCellIndex:(int)value +{ + _draggedCellIndex = value; +} + +- (BOOL)isDragging +{ + return _isDragging; +} + +- (void)setIsDragging:(BOOL)value +{ + _isDragging = value; +} + +- (NSPoint)currentMouseLoc +{ + return _currentMouseLoc; +} + +- (void)setCurrentMouseLoc:(NSPoint)point +{ + _currentMouseLoc = point; +} + +- (PSMTabBarCell *)targetCell +{ + return _targetCell; +} + +- (void)setTargetCell:(PSMTabBarCell *)cell +{ + [cell retain]; + [_targetCell release]; + _targetCell = cell; +} + +#pragma mark - +#pragma mark Functionality + +- (void)startDraggingCell:(PSMTabBarCell *)cell fromTabBar:(PSMTabBarControl *)control withMouseDownEvent:(NSEvent *)event +{ + [self setIsDragging:YES]; + [self setSourceTabBar:control]; + [self setDestinationTabBar:control]; + [_participatingTabBars addObject:control]; + [self setDraggedCell:cell]; + [self setDraggedCellIndex:[[control cells] indexOfObject:cell]]; + + NSRect cellFrame = [cell frame]; + // list of widths for animation + int i; + float cellWidth = cellFrame.size.width; + for(i = 0; i < kPSMTabDragAnimationSteps; i++){ + int thisWidth; + thisWidth = (int)(cellWidth - ((cellWidth/2.0) + ((sin((PI/2.0) + ((float)i/(float)kPSMTabDragAnimationSteps)*PI) * cellWidth) / 2.0))); + [_sineCurveWidths addObject:[NSNumber numberWithInt:thisWidth]]; + } + + // hide UI buttons + [[control overflowPopUpButton] setHidden:YES]; + [[control addTabButton] setHidden:YES]; + + [[NSCursor closedHandCursor] set]; + + NSPasteboard *pboard = [NSPasteboard pasteboardWithName:NSDragPboard]; + NSImage *dragImage = [cell dragImageForRect:cellFrame]; + [[cell indicator] removeFromSuperview]; + [self distributePlaceholdersInTabBar:control withDraggedCell:cell]; + + if([control isFlipped]){ + cellFrame.origin.y += cellFrame.size.height; + } + [cell setHighlighted:NO]; + NSSize offset = NSZeroSize; + [pboard declareTypes:[NSArray arrayWithObjects:@"PSMTabBarControlItemPBType", nil] owner: nil]; + [pboard setString:[[NSNumber numberWithInt:[[control cells] indexOfObject:cell]] stringValue] forType:@"PSMTabBarControlItemPBType"]; + _animationTimer = [NSTimer scheduledTimerWithTimeInterval:(1.0/30.0) target:self selector:@selector(animateDrag:) userInfo:nil repeats:YES]; + [control dragImage:dragImage at:cellFrame.origin offset:offset event:event pasteboard:pboard source:control slideBack:YES]; +} + +- (void)draggingEnteredTabBar:(PSMTabBarControl *)control atPoint:(NSPoint)mouseLoc +{ + [self setDestinationTabBar:control]; + [self setCurrentMouseLoc:mouseLoc]; + // hide UI buttons + [[control overflowPopUpButton] setHidden:YES]; + [[control addTabButton] setHidden:YES]; + if(![[[control cells] objectAtIndex:0] isPlaceholder]) + [self distributePlaceholdersInTabBar:control]; + [_participatingTabBars addObject:control]; +} + +- (void)draggingUpdatedInTabBar:(PSMTabBarControl *)control atPoint:(NSPoint)mouseLoc +{ + if([self destinationTabBar] != control) + [self setDestinationTabBar:control]; + [self setCurrentMouseLoc:mouseLoc]; +} + +- (void)draggingExitedTabBar:(PSMTabBarControl *)control +{ + [self setDestinationTabBar:nil]; + [self setCurrentMouseLoc:NSMakePoint(-1.0, -1.0)]; +} + +- (void)performDragOperation +{ +#if 1 + // move cell + [[[self destinationTabBar] cells] replaceObjectAtIndex:[[[self destinationTabBar] cells] indexOfObject:[self targetCell]] withObject:[self draggedCell]]; + [[self draggedCell] setControlView:[self destinationTabBar]]; + // move actual NSTabViewItem + if([self sourceTabBar] != [self destinationTabBar]){ + [[[self sourceTabBar] tabView] removeTabViewItem:[[self draggedCell] representedObject]]; + [[[self destinationTabBar] tabView] addTabViewItem:[[self draggedCell] representedObject]]; + } + [self finishDrag]; +#else + unsigned idx = [[[self destinationTabBar] cells] indexOfObject:[self targetCell]]; + + // move cell + [[[self destinationTabBar] cells] replaceObjectAtIndex:idx withObject:[self draggedCell]]; + [[self draggedCell] setControlView:[self destinationTabBar]]; + // move actual NSTabViewItem + if([self sourceTabBar] != [self destinationTabBar]){ + [[[self sourceTabBar] tabView] removeTabViewItem:[[self draggedCell] representedObject]]; + idx = [[[self destinationTabBar] cells] indexOfObject:[self draggedCell]]; + NSLog(@"Inserting at index %d", idx); + [[[self destinationTabBar] tabView] insertTabViewItem:[[self draggedCell] representedObject] atIndex:idx]; + } + [self finishDrag]; +#endif +} + +- (void)draggedImageEndedAt:(NSPoint)aPoint operation:(NSDragOperation)operation +{ + if([self isDragging]){ // means there was not a successful drop (performDragOperation) + // put cell back + [[[self sourceTabBar] cells] insertObject:[self draggedCell] atIndex:[self draggedCellIndex]]; + [self finishDrag]; + } +} + +- (void)finishDrag +{ + [self setIsDragging:NO]; + [self removeAllPlaceholdersFromTabBar:[self sourceTabBar]]; + [self setSourceTabBar:nil]; + [self setDestinationTabBar:nil]; + NSEnumerator *e = [_participatingTabBars objectEnumerator]; + PSMTabBarControl *tabBar; + while(tabBar = [e nextObject]){ + [self removeAllPlaceholdersFromTabBar:tabBar]; + } + [_participatingTabBars removeAllObjects]; + [self setDraggedCell:nil]; + [_animationTimer invalidate]; + _animationTimer = nil; + [_sineCurveWidths removeAllObjects]; + [self setTargetCell:nil]; +} + +#pragma mark - +#pragma mark Animation + +- (void)animateDrag:(NSTimer *)timer +{ + NSEnumerator *e = [_participatingTabBars objectEnumerator]; + PSMTabBarControl *tabBar; + while(tabBar = [e nextObject]){ + [self calculateDragAnimationForTabBar:tabBar]; + [[NSRunLoop currentRunLoop] performSelector:@selector(display) target:tabBar argument:nil order:1 modes:[NSArray arrayWithObjects:@"NSEventTrackingRunLoopMode", @"NSDefaultRunLoopMode", nil]]; + } +} + +- (void)calculateDragAnimationForTabBar:(PSMTabBarControl *)control +{ + BOOL removeFlag = YES; + NSMutableArray *cells = [control cells]; + int i, cellCount = [cells count]; + float xPos = [[control style] leftMarginForTabBarControl]; + + // identify target cell + // mouse at beginning of tabs + NSPoint mouseLoc = [self currentMouseLoc]; + if([self destinationTabBar] == control){ + removeFlag = NO; + if(mouseLoc.x < [[control style] leftMarginForTabBarControl]){ + [self setTargetCell:[cells objectAtIndex:0]]; + goto layout; + } + + NSRect overCellRect; + PSMTabBarCell *overCell = [control cellForPoint:mouseLoc cellFrame:&overCellRect]; + if(overCell){ + // mouse among cells - placeholder + if([overCell isPlaceholder]){ + [self setTargetCell:overCell]; + goto layout; + } + + // non-placeholders + if(mouseLoc.x < (overCellRect.origin.x + (overCellRect.size.width / 2.0))){ + // mouse on left side of cell + [self setTargetCell:[cells objectAtIndex:([cells indexOfObject:overCell] - 1)]]; + goto layout; + } else { + // mouse on right side of cell + [self setTargetCell:[cells objectAtIndex:([cells indexOfObject:overCell] + 1)]]; + goto layout; + } + } else { + // out at end - must find proper cell (could be more in overflow menu) + [self setTargetCell:[control lastVisibleTab]]; + goto layout; + } + } else { + [self setTargetCell:nil]; + } + +layout: + for(i = 0; i < cellCount; i++){ + PSMTabBarCell *cell = [cells objectAtIndex:i]; + NSRect newRect = [cell frame]; + if(![cell isInOverflowMenu]){ + if([cell isPlaceholder]){ + if(cell == [self targetCell]){ + [cell setCurrentStep:([cell currentStep] + 1)]; + } else { + [cell setCurrentStep:([cell currentStep] - 1)]; + if([cell currentStep] > 0){ + removeFlag = NO; + } + } + newRect.size.width = [[_sineCurveWidths objectAtIndex:[cell currentStep]] intValue]; + } + } else { + break; + } + newRect.origin.x = xPos; + [cell setFrame:newRect]; + if([cell indicator]) + [[cell indicator] setFrame:[[control style] indicatorRectForTabCell:cell]]; + xPos += newRect.size.width; + } + if(removeFlag){ + [_participatingTabBars removeObject:control]; + [self removeAllPlaceholdersFromTabBar:control]; + } +} + +#pragma mark - +#pragma mark Placeholders + +- (void)distributePlaceholdersInTabBar:(PSMTabBarControl *)control withDraggedCell:(PSMTabBarCell *)cell +{ + // called upon first drag - must distribute placeholders + [self distributePlaceholdersInTabBar:control]; + // replace dragged cell with a placeholder, and clean up surrounding cells + int cellIndex = [[control cells] indexOfObject:cell]; + PSMTabBarCell *pc = [[[PSMTabBarCell alloc] initPlaceholderWithFrame:[[self draggedCell] frame] expanded:YES inControlView:control] autorelease]; + [[control cells] replaceObjectAtIndex:cellIndex withObject:pc]; + [[control cells] removeObjectAtIndex:(cellIndex + 1)]; + [[control cells] removeObjectAtIndex:(cellIndex - 1)]; + return; +} + +- (void)distributePlaceholdersInTabBar:(PSMTabBarControl *)control +{ + int i, numVisibleTabs = [control numberOfVisibleTabs]; + for(i = 0; i < numVisibleTabs; i++){ + PSMTabBarCell *pc = [[[PSMTabBarCell alloc] initPlaceholderWithFrame:[[self draggedCell] frame] expanded:NO inControlView:control] autorelease]; + [[control cells] insertObject:pc atIndex:(2 * i)]; + } + if(numVisibleTabs > 0){ + PSMTabBarCell *pc = [[[PSMTabBarCell alloc] initPlaceholderWithFrame:[[self draggedCell] frame] expanded:NO inControlView:control] autorelease]; + if([[control cells] count] > (2 * numVisibleTabs)){ + [[control cells] insertObject:pc atIndex:(2 * numVisibleTabs)]; + } else { + [[control cells] addObject:pc]; + } + } +} + +- (void)removeAllPlaceholdersFromTabBar:(PSMTabBarControl *)control +{ + int i, cellCount = [[control cells] count]; + for(i = (cellCount - 1); i >= 0; i--){ + PSMTabBarCell *cell = [[control cells] objectAtIndex:i]; + if([cell isPlaceholder]) + [[control cells] removeObject:cell]; + } + // redraw + [[NSRunLoop currentRunLoop] performSelector:@selector(update) target:control argument:nil order:1 modes:[NSArray arrayWithObjects:@"NSEventTrackingRunLoopMode", @"NSDefaultRunLoopMode", nil]]; + [[NSRunLoop currentRunLoop] performSelector:@selector(display) target:control argument:nil order:1 modes:[NSArray arrayWithObjects:@"NSEventTrackingRunLoopMode", @"NSDefaultRunLoopMode", nil]]; +} + +#pragma mark - +#pragma mark Archiving + +- (void)encodeWithCoder:(NSCoder *)aCoder { + //[super encodeWithCoder:aCoder]; + if ([aCoder allowsKeyedCoding]) { + [aCoder encodeObject:_sourceTabBar forKey:@"sourceTabBar"]; + [aCoder encodeObject:_destinationTabBar forKey:@"destinationTabBar"]; + [aCoder encodeObject:_participatingTabBars forKey:@"participatingTabBars"]; + [aCoder encodeObject:_draggedCell forKey:@"draggedCell"]; + [aCoder encodeInt:_draggedCellIndex forKey:@"draggedCellIndex"]; + [aCoder encodeBool:_isDragging forKey:@"isDragging"]; + [aCoder encodeObject:_animationTimer forKey:@"animationTimer"]; + [aCoder encodeObject:_sineCurveWidths forKey:@"sineCurveWidths"]; + [aCoder encodePoint:_currentMouseLoc forKey:@"currentMouseLoc"]; + [aCoder encodeObject:_targetCell forKey:@"targetCell"]; + } +} + +- (id)initWithCoder:(NSCoder *)aDecoder { + //self = [super initWithCoder:aDecoder]; + //if (self) { + if ([aDecoder allowsKeyedCoding]) { + _sourceTabBar = [[aDecoder decodeObjectForKey:@"sourceTabBar"] retain]; + _destinationTabBar = [[aDecoder decodeObjectForKey:@"destinationTabBar"] retain]; + _participatingTabBars = [[aDecoder decodeObjectForKey:@"participatingTabBars"] retain]; + _draggedCell = [[aDecoder decodeObjectForKey:@"draggedCell"] retain]; + _draggedCellIndex = [aDecoder decodeIntForKey:@"draggedCellIndex"]; + _isDragging = [aDecoder decodeBoolForKey:@"isDragging"]; + _animationTimer = [[aDecoder decodeObjectForKey:@"animationTimer"] retain]; + _sineCurveWidths = [[aDecoder decodeObjectForKey:@"sineCurveWidths"] retain]; + _currentMouseLoc = [aDecoder decodePointForKey:@"currentMouseLoc"]; + _targetCell = [[aDecoder decodeObjectForKey:@"targetCell"] retain]; + } + //} + return self; +} + + +@end diff --git a/PSMTabBarControl/source/PSMTabStyle.h b/PSMTabBarControl/source/PSMTabStyle.h new file mode 100644 index 0000000000..eedf7b7712 --- /dev/null +++ b/PSMTabBarControl/source/PSMTabStyle.h @@ -0,0 +1,52 @@ +// +// PSMTabStyle.h +// PSMTabBarControl +// +// Created by John Pannell on 2/17/06. +// Copyright 2006 Positive Spin Media. All rights reserved. +// + +/* +Protocol to be observed by all style delegate objects. These objects handle the drawing responsibilities for PSMTabBarCell; once the control has been assigned a style, the background and cells draw consistent with that style. Design pattern and implementation by David Smith, Seth Willits, and Chris Forsythe, all touch up and errors by John P. :-) +*/ + +#import "PSMTabBarCell.h" +#import "PSMTabBarControl.h" + +@protocol PSMTabStyle + +// identity +- (NSString *)name; + +// control specific parameters +- (float)leftMarginForTabBarControl; +- (float)rightMarginForTabBarControl; + +// add tab button +- (NSImage *)addTabButtonImage; +- (NSImage *)addTabButtonPressedImage; +- (NSImage *)addTabButtonRolloverImage; + +// cell specific parameters +- (NSRect)closeButtonRectForTabCell:(PSMTabBarCell *)cell; +- (NSRect)iconRectForTabCell:(PSMTabBarCell *)cell; +- (NSRect)indicatorRectForTabCell:(PSMTabBarCell *)cell; +- (NSRect)objectCounterRectForTabCell:(PSMTabBarCell *)cell; +- (float)minimumWidthOfTabCell:(PSMTabBarCell *)cell; +- (float)desiredWidthOfTabCell:(PSMTabBarCell *)cell; + +// cell values +- (NSAttributedString *)attributedObjectCountValueForTabCell:(PSMTabBarCell *)cell; +- (NSAttributedString *)attributedStringValueForTabCell:(PSMTabBarCell *)cell; + +// drawing +- (void)drawTabCell:(PSMTabBarCell *)cell; +- (void)drawTabBar:(PSMTabBarControl *)bar inRect:(NSRect)rect; + +@end + +@interface PSMTabBarControl (StyleAccessors) + +- (NSMutableArray *)cells; + +@end \ No newline at end of file diff --git a/PSMTabBarControl/source/PSMUnifiedTabStyle.h b/PSMTabBarControl/source/PSMUnifiedTabStyle.h new file mode 100644 index 0000000000..751956aaed --- /dev/null +++ b/PSMTabBarControl/source/PSMUnifiedTabStyle.h @@ -0,0 +1,24 @@ +// +// PSMUnifiedTabStyle.h +// -------------------- +// +// Created by Keith Blount on 30/04/2006. +// Copyright 2006 __MyCompanyName__. All rights reserved. +// + +#import +#import "PSMTabStyle.h" + +@interface PSMUnifiedTabStyle : NSObject +{ + NSImage *unifiedCloseButton; + NSImage *unifiedCloseButtonDown; + NSImage *unifiedCloseButtonOver; + NSImage *_addTabButtonImage; + NSImage *_addTabButtonPressedImage; + NSImage *_addTabButtonRolloverImage; + + float leftMargin; +} +- (void)setLeftMarginForTabBarControl:(float)margin; +@end diff --git a/PSMTabBarControl/source/PSMUnifiedTabStyle.m b/PSMTabBarControl/source/PSMUnifiedTabStyle.m new file mode 100644 index 0000000000..ea2910c6e2 --- /dev/null +++ b/PSMTabBarControl/source/PSMUnifiedTabStyle.m @@ -0,0 +1,529 @@ +// +// PSMUnifiedTabStyle.m +// -------------------- +// +// Created by Keith Blount on 30/04/2006. +// Copyright 2006 __MyCompanyName__. All rights reserved. +// + +#import "PSMUnifiedTabStyle.h" +#import "PSMTabBarCell.h" +#import "PSMTabBarControl.h" +#import "NSBezierPath_AMShading.h" + +#define kPSMUnifiedObjectCounterRadius 7.0 +#define kPSMUnifiedCounterMinWidth 20 + +@interface PSMUnifiedTabStyle (Private) +- (void)drawInteriorWithTabCell:(PSMTabBarCell *)cell inView:(NSView*)controlView; +@end + +@implementation PSMUnifiedTabStyle + +- (NSString *)name +{ + return @"Unified"; +} + +#pragma mark - +#pragma mark Creation/Destruction + +- (id) init +{ + if((self = [super init])) + { + NSLog(@"PSMUnifiedTabStyle init"); + + unifiedCloseButton = [[NSImage alloc] initByReferencingFile:[[PSMTabBarControl bundle] pathForImageResource:@"AquaTabClose_Front"]]; + unifiedCloseButtonDown = [[NSImage alloc] initByReferencingFile:[[PSMTabBarControl bundle] pathForImageResource:@"AquaTabClose_Front_Pressed"]]; + unifiedCloseButtonOver = [[NSImage alloc] initByReferencingFile:[[PSMTabBarControl bundle] pathForImageResource:@"AquaTabClose_Front_Rollover"]]; + + _addTabButtonImage = [[NSImage alloc] initByReferencingFile:[[PSMTabBarControl bundle] pathForImageResource:@"AquaTabNew"]]; + _addTabButtonPressedImage = [[NSImage alloc] initByReferencingFile:[[PSMTabBarControl bundle] pathForImageResource:@"AquaTabNewPressed"]]; + _addTabButtonRolloverImage = [[NSImage alloc] initByReferencingFile:[[PSMTabBarControl bundle] pathForImageResource:@"AquaTabNewRollover"]]; + + leftMargin = 5.0; + } + return self; +} + +- (void)dealloc +{ + [unifiedCloseButton release]; + [unifiedCloseButtonDown release]; + [unifiedCloseButtonOver release]; + [_addTabButtonImage release]; + [_addTabButtonPressedImage release]; + [_addTabButtonRolloverImage release]; + + [super dealloc]; +} + +#pragma mark - +#pragma mark Control Specific + +- (void)setLeftMarginForTabBarControl:(float)margin +{ + leftMargin = margin; +} + +- (float)leftMarginForTabBarControl +{ + return leftMargin; +} + +- (float)rightMarginForTabBarControl +{ + return 24.0f; +} + +#pragma mark - +#pragma mark Add Tab Button + +- (NSImage *)addTabButtonImage +{ + return _addTabButtonImage; +} + +- (NSImage *)addTabButtonPressedImage +{ + return _addTabButtonPressedImage; +} + +- (NSImage *)addTabButtonRolloverImage +{ + return _addTabButtonRolloverImage; +} + +#pragma mark - +#pragma mark Cell Specific + +- (NSRect) closeButtonRectForTabCell:(PSMTabBarCell *)cell +{ + NSRect cellFrame = [cell frame]; + + if ([cell hasCloseButton] == NO) { + return NSZeroRect; + } + + NSRect result; + result.size = [unifiedCloseButton size]; + result.origin.x = cellFrame.origin.x + MARGIN_X; + result.origin.y = cellFrame.origin.y + MARGIN_Y + 1.0; + + return result; +} + +- (NSRect)iconRectForTabCell:(PSMTabBarCell *)cell +{ + NSRect cellFrame = [cell frame]; + + if ([cell hasIcon] == NO) { + return NSZeroRect; + } + + NSRect result; + result.size = NSMakeSize(kPSMTabBarIconWidth, kPSMTabBarIconWidth); + result.origin.x = cellFrame.origin.x + MARGIN_X; + result.origin.y = cellFrame.origin.y + MARGIN_Y + 1.0; + + if([cell hasCloseButton] && ![cell isCloseButtonSuppressed]) + result.origin.x += [unifiedCloseButton size].width + kPSMTabBarCellPadding; + + return result; +} + +- (NSRect)indicatorRectForTabCell:(PSMTabBarCell *)cell +{ + NSRect cellFrame = [cell frame]; + + if ([[cell indicator] isHidden]) { + return NSZeroRect; + } + + NSRect result; + result.size = NSMakeSize(kPSMTabBarIndicatorWidth, kPSMTabBarIndicatorWidth); + result.origin.x = cellFrame.origin.x + cellFrame.size.width - MARGIN_X - kPSMTabBarIndicatorWidth; + result.origin.y = cellFrame.origin.y + MARGIN_Y - 1.0; + + return result; +} + +- (NSRect)objectCounterRectForTabCell:(PSMTabBarCell *)cell +{ + NSRect cellFrame = [cell frame]; + + if ([cell count] == 0) { + return NSZeroRect; + } + + float countWidth = [[self attributedObjectCountValueForTabCell:cell] size].width; + countWidth += (2 * kPSMUnifiedObjectCounterRadius - 6.0); + if(countWidth < kPSMUnifiedCounterMinWidth) + countWidth = kPSMUnifiedCounterMinWidth; + + NSRect result; + result.size = NSMakeSize(countWidth, 2 * kPSMUnifiedObjectCounterRadius); // temp + result.origin.x = cellFrame.origin.x + cellFrame.size.width - MARGIN_X - result.size.width; + result.origin.y = cellFrame.origin.y + MARGIN_Y + 1.0; + + if(![[cell indicator] isHidden]) + result.origin.x -= kPSMTabBarIndicatorWidth + kPSMTabBarCellPadding; + + return result; +} + + +- (float)minimumWidthOfTabCell:(PSMTabBarCell *)cell +{ + float resultWidth = 0.0; + + // left margin + resultWidth = MARGIN_X; + + // close button? + if([cell hasCloseButton] && ![cell isCloseButtonSuppressed]) + resultWidth += [unifiedCloseButton size].width + kPSMTabBarCellPadding; + + // icon? + if([cell hasIcon]) + resultWidth += kPSMTabBarIconWidth + kPSMTabBarCellPadding; + + // the label + resultWidth += kPSMMinimumTitleWidth; + + // object counter? + if([cell count] > 0) + resultWidth += [self objectCounterRectForTabCell:cell].size.width + kPSMTabBarCellPadding; + + // indicator? + if ([[cell indicator] isHidden] == NO) + resultWidth += kPSMTabBarCellPadding + kPSMTabBarIndicatorWidth; + + // right margin + resultWidth += MARGIN_X; + + return ceil(resultWidth); +} + +- (float)desiredWidthOfTabCell:(PSMTabBarCell *)cell +{ + float resultWidth = 0.0; + + // left margin + resultWidth = MARGIN_X; + + // close button? + if ([cell hasCloseButton] && ![cell isCloseButtonSuppressed]) + resultWidth += [unifiedCloseButton size].width + kPSMTabBarCellPadding; + + // icon? + if([cell hasIcon]) + resultWidth += kPSMTabBarIconWidth + kPSMTabBarCellPadding; + + // the label + resultWidth += [[cell attributedStringValue] size].width; + + // object counter? + if([cell count] > 0) + resultWidth += [self objectCounterRectForTabCell:cell].size.width + kPSMTabBarCellPadding; + + // indicator? + if ([[cell indicator] isHidden] == NO) + resultWidth += kPSMTabBarCellPadding + kPSMTabBarIndicatorWidth; + + // right margin + resultWidth += MARGIN_X; + + return ceil(resultWidth); +} + +#pragma mark - +#pragma mark Cell Values + +- (NSAttributedString *)attributedObjectCountValueForTabCell:(PSMTabBarCell *)cell +{ + NSMutableAttributedString *attrStr; + NSFontManager *fm = [NSFontManager sharedFontManager]; + NSNumberFormatter *nf = [[[NSNumberFormatter alloc] init] autorelease]; + [nf setLocalizesFormat:YES]; + [nf setFormat:@"0"]; + [nf setHasThousandSeparators:YES]; + NSString *contents = [nf stringFromNumber:[NSNumber numberWithInt:[cell count]]]; + attrStr = [[[NSMutableAttributedString alloc] initWithString:contents] autorelease]; + NSRange range = NSMakeRange(0, [contents length]); + + // Add font attribute + [attrStr addAttribute:NSFontAttributeName value:[fm convertFont:[NSFont fontWithName:@"Helvetica" size:11.0] toHaveTrait:NSBoldFontMask] range:range]; + [attrStr addAttribute:NSForegroundColorAttributeName value:[[NSColor whiteColor] colorWithAlphaComponent:0.85] range:range]; + + return attrStr; +} + +- (NSAttributedString *)attributedStringValueForTabCell:(PSMTabBarCell *)cell +{ + NSMutableAttributedString *attrStr; + NSString * contents = [cell stringValue]; + attrStr = [[[NSMutableAttributedString alloc] initWithString:contents] autorelease]; + NSRange range = NSMakeRange(0, [contents length]); + + [attrStr addAttribute:NSFontAttributeName value:[NSFont systemFontOfSize:11.0] range:range]; + + // Paragraph Style for Truncating Long Text + static NSMutableParagraphStyle *TruncatingTailParagraphStyle = nil; + if (!TruncatingTailParagraphStyle) { + TruncatingTailParagraphStyle = [[[NSParagraphStyle defaultParagraphStyle] mutableCopy] retain]; + [TruncatingTailParagraphStyle setLineBreakMode:NSLineBreakByTruncatingTail]; + } + [attrStr addAttribute:NSParagraphStyleAttributeName value:TruncatingTailParagraphStyle range:range]; + + return attrStr; +} + +#pragma mark - +#pragma mark ---- drawing ---- + +- (void)drawTabCell:(PSMTabBarCell *)cell +{ + NSRect cellFrame = [cell frame]; + NSColor * lineColor = nil; + NSBezierPath* bezier = [NSBezierPath bezierPath]; + lineColor = [NSColor colorWithCalibratedWhite:0.576 alpha:1.0]; + + if ([cell state] == NSOnState) + { + // selected tab + NSRect aRect = NSMakeRect(cellFrame.origin.x+0.5, cellFrame.origin.y-0.5, cellFrame.size.width-1.0, cellFrame.size.height); + aRect.size.height -= 0.5; + + aRect.size.height+=0.5; + + // frame + float radius = MIN(6.0, 0.5f * MIN(NSWidth(aRect), NSHeight(aRect))); + NSRect rect = NSInsetRect(aRect, radius, radius); + + [bezier appendBezierPathWithArcWithCenter:NSMakePoint(NSMinX(rect), NSMinY(rect)) radius:radius startAngle:180.0 endAngle:270.0]; + + [bezier appendBezierPathWithArcWithCenter:NSMakePoint(NSMaxX(rect), NSMinY(rect)) radius:radius startAngle:270.0 endAngle:360.0]; + + NSPoint cornerPoint = NSMakePoint(NSMaxX(aRect), NSMaxY(aRect)); + [bezier appendBezierPathWithPoints:&cornerPoint count:1]; + + cornerPoint = NSMakePoint(NSMinX(aRect), NSMaxY(aRect)); + [bezier appendBezierPathWithPoints:&cornerPoint count:1]; + + [bezier closePath]; + + //[[NSColor windowBackgroundColor] set]; + //[bezier fill]; + [bezier linearGradientFillWithStartColor:[NSColor colorWithCalibratedWhite:0.99 alpha:1.0] + endColor:[NSColor colorWithCalibratedWhite:0.941 alpha:1.0]]; + + [lineColor set]; + [bezier stroke]; + } + else + { + // unselected tab + NSRect aRect = NSMakeRect(cellFrame.origin.x, cellFrame.origin.y, cellFrame.size.width, cellFrame.size.height); + aRect.origin.y += 0.5; + aRect.origin.x += 1.5; + aRect.size.width -= 1; + + aRect.origin.x -= 1; + aRect.size.width += 1; + + // rollover + if ([cell isHighlighted]) + { + [[NSColor colorWithCalibratedWhite:0.0 alpha:0.1] set]; + NSRectFillUsingOperation(aRect, NSCompositeSourceAtop); + } + + // frame + + [lineColor set]; + [bezier moveToPoint:NSMakePoint(aRect.origin.x + aRect.size.width, aRect.origin.y-0.5)]; + if(!([cell tabState] & PSMTab_RightIsSelectedMask)){ + [bezier lineToPoint:NSMakePoint(NSMaxX(aRect), NSMaxY(aRect))]; + } + + [bezier stroke]; + + // Create a thin lighter line next to the dividing line for a bezel effect + if(!([cell tabState] & PSMTab_RightIsSelectedMask)){ + [[[NSColor whiteColor] colorWithAlphaComponent:0.5] set]; + [NSBezierPath strokeLineFromPoint:NSMakePoint(NSMaxX(aRect)+1.0, aRect.origin.y-0.5) + toPoint:NSMakePoint(NSMaxX(aRect)+1.0, NSMaxY(aRect)-2.5)]; + } + + // If this is the leftmost tab, we want to draw a line on the left, too + if ([cell tabState] & PSMTab_PositionLeftMask) + { + [lineColor set]; + [NSBezierPath strokeLineFromPoint:NSMakePoint(aRect.origin.x,aRect.origin.y-0.5) + toPoint:NSMakePoint(aRect.origin.x,NSMaxY(aRect)-2.5)]; + [[[NSColor whiteColor] colorWithAlphaComponent:0.5] set]; + [NSBezierPath strokeLineFromPoint:NSMakePoint(aRect.origin.x+1.0,aRect.origin.y-0.5) + toPoint:NSMakePoint(aRect.origin.x+1.0,NSMaxY(aRect)-2.5)]; + } + } + + [self drawInteriorWithTabCell:cell inView:[cell controlView]]; +} + + + +- (void)drawInteriorWithTabCell:(PSMTabBarCell *)cell inView:(NSView*)controlView +{ + NSRect cellFrame = [cell frame]; + float labelPosition = cellFrame.origin.x + MARGIN_X; + + // close button + if ([cell hasCloseButton] && ![cell isCloseButtonSuppressed]) { + NSSize closeButtonSize = NSZeroSize; + NSRect closeButtonRect = [cell closeButtonRectForFrame:cellFrame]; + NSImage * closeButton = nil; + + closeButton = unifiedCloseButton; + if ([cell closeButtonOver]) closeButton = unifiedCloseButtonOver; + if ([cell closeButtonPressed]) closeButton = unifiedCloseButtonDown; + + closeButtonSize = [closeButton size]; + if ([controlView isFlipped]) { + closeButtonRect.origin.y += closeButtonRect.size.height; + } + + [closeButton compositeToPoint:closeButtonRect.origin operation:NSCompositeSourceOver fraction:1.0]; + + // scoot label over + labelPosition += closeButtonSize.width + kPSMTabBarCellPadding; + } + + // icon + if([cell hasIcon]){ + NSRect iconRect = [self iconRectForTabCell:cell]; + NSImage *icon = [[[[cell representedObject] identifier] content] icon]; + if ([controlView isFlipped]) { + iconRect.origin.y = cellFrame.size.height - iconRect.origin.y; + } + [icon compositeToPoint:iconRect.origin operation:NSCompositeSourceOver fraction:1.0]; + + // scoot label over + labelPosition += iconRect.size.width + kPSMTabBarCellPadding; + } + + // object counter + if([cell count] > 0){ + [[NSColor colorWithCalibratedWhite:0.3 alpha:0.6] set]; + NSBezierPath *path = [NSBezierPath bezierPath]; + NSRect myRect = [self objectCounterRectForTabCell:cell]; + myRect.origin.y -= 1.0; + [path moveToPoint:NSMakePoint(myRect.origin.x + kPSMUnifiedObjectCounterRadius, myRect.origin.y)]; + [path lineToPoint:NSMakePoint(myRect.origin.x + myRect.size.width - kPSMUnifiedObjectCounterRadius, myRect.origin.y)]; + [path appendBezierPathWithArcWithCenter:NSMakePoint(myRect.origin.x + myRect.size.width - kPSMUnifiedObjectCounterRadius, myRect.origin.y + kPSMUnifiedObjectCounterRadius) radius:kPSMUnifiedObjectCounterRadius startAngle:270.0 endAngle:90.0]; + [path lineToPoint:NSMakePoint(myRect.origin.x + kPSMUnifiedObjectCounterRadius, myRect.origin.y + myRect.size.height)]; + [path appendBezierPathWithArcWithCenter:NSMakePoint(myRect.origin.x + kPSMUnifiedObjectCounterRadius, myRect.origin.y + kPSMUnifiedObjectCounterRadius) radius:kPSMUnifiedObjectCounterRadius startAngle:90.0 endAngle:270.0]; + [path fill]; + + // draw attributed string centered in area + NSRect counterStringRect; + NSAttributedString *counterString = [self attributedObjectCountValueForTabCell:cell]; + counterStringRect.size = [counterString size]; + counterStringRect.origin.x = myRect.origin.x + ((myRect.size.width - counterStringRect.size.width) / 2.0) + 0.25; + counterStringRect.origin.y = myRect.origin.y + ((myRect.size.height - counterStringRect.size.height) / 2.0) + 0.5; + [counterString drawInRect:counterStringRect]; + } + + // label rect + NSRect labelRect; + labelRect.origin.x = labelPosition; + labelRect.size.width = cellFrame.size.width - (labelRect.origin.x - cellFrame.origin.x) - kPSMTabBarCellPadding; + NSSize s = [[cell attributedStringValue] size]; + labelRect.origin.y = cellFrame.origin.y + (cellFrame.size.height-s.height)/2.0 - 1.0; + labelRect.size.height = s.height; + + if(![[cell indicator] isHidden]) + labelRect.size.width -= (kPSMTabBarIndicatorWidth + kPSMTabBarCellPadding); + + if([cell count] > 0) + labelRect.size.width -= ([self objectCounterRectForTabCell:cell].size.width + kPSMTabBarCellPadding); + + // label + [[cell attributedStringValue] drawInRect:labelRect]; +} + +- (void)drawTabBar:(PSMTabBarControl *)bar inRect:(NSRect)rect +{ + NSRect gradientRect = rect; + gradientRect.size.height -= 1.0; + NSBezierPath *path = [NSBezierPath bezierPathWithRect:gradientRect]; + [path linearGradientFillWithStartColor:[NSColor colorWithCalibratedWhite:0.918 alpha:1.0] + endColor:[NSColor colorWithCalibratedWhite:0.843 alpha:1.0]]; + [[NSColor colorWithCalibratedWhite:0.576 alpha:1.0] set]; + [NSBezierPath strokeLineFromPoint:NSMakePoint(rect.origin.x,NSMaxY(rect)-0.5) + toPoint:NSMakePoint(NSMaxX(rect),NSMaxY(rect)-0.5)]; + + // no tab view == not connected + if(![bar tabView]){ + NSRect labelRect = rect; + labelRect.size.height -= 4.0; + labelRect.origin.y += 4.0; + NSMutableAttributedString *attrStr; + NSString *contents = @"PSMTabBarControl"; + attrStr = [[[NSMutableAttributedString alloc] initWithString:contents] autorelease]; + NSRange range = NSMakeRange(0, [contents length]); + [attrStr addAttribute:NSFontAttributeName value:[NSFont systemFontOfSize:11.0] range:range]; + NSMutableParagraphStyle *centeredParagraphStyle = nil; + if (!centeredParagraphStyle) { + centeredParagraphStyle = [[[NSParagraphStyle defaultParagraphStyle] mutableCopy] retain]; + [centeredParagraphStyle setAlignment:NSCenterTextAlignment]; + } + [attrStr addAttribute:NSParagraphStyleAttributeName value:centeredParagraphStyle range:range]; + [attrStr drawInRect:labelRect]; + return; + } + + // draw cells + NSEnumerator *e = [[bar cells] objectEnumerator]; + PSMTabBarCell *cell; + while(cell = [e nextObject]){ + if(![cell isInOverflowMenu]){ + [cell drawWithFrame:[cell frame] inView:bar]; + } + } +} + +#pragma mark - +#pragma mark Archiving + +- (void)encodeWithCoder:(NSCoder *)aCoder +{ + //[super encodeWithCoder:aCoder]; + if ([aCoder allowsKeyedCoding]) { + [aCoder encodeObject:unifiedCloseButton forKey:@"unifiedCloseButton"]; + [aCoder encodeObject:unifiedCloseButtonDown forKey:@"unifiedCloseButtonDown"]; + [aCoder encodeObject:unifiedCloseButtonOver forKey:@"unifiedCloseButtonOver"]; + [aCoder encodeObject:_addTabButtonImage forKey:@"addTabButtonImage"]; + [aCoder encodeObject:_addTabButtonPressedImage forKey:@"addTabButtonPressedImage"]; + [aCoder encodeObject:_addTabButtonRolloverImage forKey:@"addTabButtonRolloverImage"]; + } +} + +- (id)initWithCoder:(NSCoder *)aDecoder +{ + // self = [super initWithCoder:aDecoder]; + //if (self) { + if ([aDecoder allowsKeyedCoding]) { + unifiedCloseButton = [[aDecoder decodeObjectForKey:@"unifiedCloseButton"] retain]; + unifiedCloseButtonDown = [[aDecoder decodeObjectForKey:@"unifiedCloseButtonDown"] retain]; + unifiedCloseButtonOver = [[aDecoder decodeObjectForKey:@"unifiedCloseButtonOver"] retain]; + _addTabButtonImage = [[aDecoder decodeObjectForKey:@"addTabButtonImage"] retain]; + _addTabButtonPressedImage = [[aDecoder decodeObjectForKey:@"addTabButtonPressedImage"] retain]; + _addTabButtonRolloverImage = [[aDecoder decodeObjectForKey:@"addTabButtonRolloverImage"] retain]; + } + //} + return self; +} + +@end diff --git a/PSMTabBarControl/source/WindowController.h b/PSMTabBarControl/source/WindowController.h new file mode 100644 index 0000000000..ae655b8bea --- /dev/null +++ b/PSMTabBarControl/source/WindowController.h @@ -0,0 +1,58 @@ +// +// WindowController.h +// PSMTabBarControl +// +// Created by John Pannell on 4/6/06. +// Copyright 2006 Positive Spin Media. All rights reserved. +// + +#import +@class PSMTabBarControl; + +@interface WindowController : NSWindowController { + IBOutlet NSTabView *tabView; + IBOutlet NSTextField *tabField; + IBOutlet NSDrawer *drawer; + + IBOutlet PSMTabBarControl *tabBar; + + IBOutlet NSButton *isProcessingButton; + IBOutlet NSTextField *objectCounterField; + IBOutlet NSPopUpButton *iconButton; +} + +// UI +- (IBAction)addNewTab:(id)sender; +- (IBAction)closeTab:(id)sender; +- (IBAction)stopProcessing:(id)sender; +- (IBAction)setIconNamed:(id)sender; +- (IBAction)setObjectCount:(id)sender; +- (IBAction)setTabLabel:(id)sender; + +// Actions +- (IBAction)isProcessingAction:(id)sender; + +// tab bar config +- (void)configStyle:(id)sender; +- (void)configCanCloseOnlyTab:(id)sender; +- (void)configHideForSingleTab:(id)sender; +- (void)configAddTabButton:(id)sender; +- (void)configTabMinWidth:(id)sender; +- (void)configTabMaxWidth:(id)sender; +- (void)configTabOptimumWidth:(id)sender; +- (void)configTabSizeToFit:(id)sender; + +// delegate +- (void)tabView:(NSTabView *)aTabView didSelectTabViewItem:(NSTabViewItem *)tabViewItem; +- (BOOL)tabView:(NSTabView *)aTabView shouldCloseTabViewItem:(NSTabViewItem *)tabViewItem; +- (void)tabView:(NSTabView *)aTabView willCloseTabViewItem:(NSTabViewItem *)tabViewItem; +- (void)tabView:(NSTabView *)aTabView didCloseTabViewItem:(NSTabViewItem *)tabViewItem; + +// toolbar +- (NSToolbarItem *)toolbar:(NSToolbar *)toolbar itemForItemIdentifier:(NSString *)itemIdentifier willBeInsertedIntoToolbar:(BOOL)flag; +- (NSArray *)toolbarDefaultItemIdentifiers:(NSToolbar*)toolbar; +- (NSArray *)toolbarAllowedItemIdentifiers:(NSToolbar*)toolbar; +- (IBAction)toggleToolbar:(id)sender; +- (BOOL)validateToolbarItem:(NSToolbarItem *)theItem; + +@end diff --git a/PSMTabBarControl/source/WindowController.m b/PSMTabBarControl/source/WindowController.m new file mode 100644 index 0000000000..07414dbdcf --- /dev/null +++ b/PSMTabBarControl/source/WindowController.m @@ -0,0 +1,280 @@ +// +// WindowController.m +// PSMTabBarControl +// +// Created by John Pannell on 4/6/06. +// Copyright 2006 Positive Spin Media. All rights reserved. +// + +#import "WindowController.h" +#import "FakeModel.h" +#import "PSMTabBarControl.h" + +@implementation WindowController + +- (void)awakeFromNib +{ + // toolbar + NSToolbar *toolbar = [[NSToolbar alloc] initWithIdentifier:@"DemoToolbar"]; + [toolbar setDelegate:self]; + [toolbar setAllowsUserCustomization:YES]; + [toolbar setAutosavesConfiguration:YES]; + /*SInt32 MacVersion; + if (Gestalt(gestaltSystemVersion, &MacVersion) == noErr){ + if (MacVersion >= 0x1040){ + // this call is Tiger only + [toolbar setShowsBaselineSeparator:NO]; + } + }*/ + [[self window] setToolbar:toolbar]; + + // hook up add tab button + [[tabBar addTabButton] setTarget:self]; + [[tabBar addTabButton] setAction:@selector(addNewTab:)]; + + // remove any tabs present in the nib + NSArray *existingItems = [tabView tabViewItems]; + NSEnumerator *e = [existingItems objectEnumerator]; + NSTabViewItem *item; + while(item = [e nextObject]){ + [tabView removeTabViewItem:item]; + } + + [self addNewTab:self]; + [self addNewTab:self]; + [self addNewTab:self]; + [[tabView tabViewItemAtIndex:0] setLabel:@"Tab"]; + [[tabView tabViewItemAtIndex:1] setLabel:@"Bar"]; + [[tabView tabViewItemAtIndex:2] setLabel:@"Control"]; + + // open drawer + //[drawer toggle:self]; +} + +- (IBAction)addNewTab:(id)sender +{ + FakeModel *newModel = [[FakeModel alloc] init]; + NSTabViewItem *newItem = [[[NSTabViewItem alloc] initWithIdentifier:[newModel controller]] autorelease]; + [newItem setLabel:@"Untitled"]; + [tabView addTabViewItem:newItem]; + [tabView selectTabViewItem:newItem]; // this is optional, but expected behavior + [newModel release]; +} + +- (IBAction)closeTab:(id)sender +{ + [tabView removeTabViewItem:[tabView selectedTabViewItem]]; +} + +- (void)stopProcessing:(id)sender +{ + [[[tabView selectedTabViewItem] identifier] setValue:[NSNumber numberWithBool:NO] forKeyPath:@"selection.isProcessing"]; +} + +- (void)setIconNamed:(id)sender +{ + NSString *iconName = [sender titleOfSelectedItem]; + if([iconName isEqualToString:@"None"]){ + [[[tabView selectedTabViewItem] identifier] setValue:nil forKeyPath:@"selection.icon"]; + [[[tabView selectedTabViewItem] identifier] setValue:@"None" forKeyPath:@"selection.iconName"]; + } else { + NSImage *newIcon = [NSImage imageNamed:iconName]; + [[[tabView selectedTabViewItem] identifier] setValue:newIcon forKeyPath:@"selection.icon"]; + [[[tabView selectedTabViewItem] identifier] setValue:iconName forKeyPath:@"selection.iconName"]; + } +} + +- (void)setObjectCount:(id)sender +{ + [[[tabView selectedTabViewItem] identifier] setValue:[NSNumber numberWithInt:[sender intValue]] forKeyPath:@"selection.objectCount"]; +} + +- (IBAction)isProcessingAction:(id)sender +{ + [[[tabView selectedTabViewItem] identifier] setValue:[NSNumber numberWithBool:[sender state]] forKeyPath:@"selection.isProcessing"]; +} + +- (IBAction)setTabLabel:(id)sender +{ + [[tabView selectedTabViewItem] setLabel:[sender stringValue]]; +} + +- (BOOL)validateMenuItem:(id )menuItem +{ + if([menuItem action] == @selector(closeTab:)){ + if(![tabBar canCloseOnlyTab] && ([tabView numberOfTabViewItems] <= 1)){ + return NO; + } + } + return YES; +} + +#pragma mark - +#pragma mark ---- tab bar config ---- + +- (void)configStyle:(id)sender +{ + [tabBar setStyleNamed:[sender titleOfSelectedItem]]; +} + +- (void)configCanCloseOnlyTab:(id)sender +{ + [tabBar setCanCloseOnlyTab:[sender state]]; +} + +- (void)configHideForSingleTab:(id)sender +{ + [tabBar setHideForSingleTab:[sender state]]; +} + +- (void)configAddTabButton:(id)sender +{ + [tabBar setShowAddTabButton:[sender state]]; +} + +- (void)configTabMinWidth:(id)sender +{ + if([tabBar cellOptimumWidth] < [sender intValue]){ + [tabBar setCellMinWidth:[tabBar cellOptimumWidth]]; + [sender setIntValue:[tabBar cellOptimumWidth]]; + return; + } + + [tabBar setCellMinWidth:[sender intValue]]; +} + +- (void)configTabMaxWidth:(id)sender +{ + if([tabBar cellOptimumWidth] > [sender intValue]){ + [tabBar setCellMaxWidth:[tabBar cellOptimumWidth]]; + [sender setIntValue:[tabBar cellOptimumWidth]]; + return; + } + + [tabBar setCellMaxWidth:[sender intValue]]; +} + +- (void)configTabOptimumWidth:(id)sender +{ + if([tabBar cellMaxWidth] < [sender intValue]){ + [tabBar setCellOptimumWidth:[tabBar cellMaxWidth]]; + [sender setIntValue:[tabBar cellMaxWidth]]; + return; + } + + if([tabBar cellMinWidth] > [sender intValue]){ + [tabBar setCellOptimumWidth:[tabBar cellMinWidth]]; + [sender setIntValue:[tabBar cellMinWidth]]; + return; + } + + [tabBar setCellOptimumWidth:[sender intValue]]; +} + +- (void)configTabSizeToFit:(id)sender +{ + [tabBar setSizeCellsToFit:[sender state]]; +} + +#pragma mark - +#pragma mark ---- delegate ---- + +- (void)tabView:(NSTabView *)aTabView didSelectTabViewItem:(NSTabViewItem *)tabViewItem +{ + // need to update bound values to match the selected tab + if([[tabViewItem identifier] respondsToSelector:@selector(content)]){ + if([[[tabViewItem identifier] content] respondsToSelector:@selector(objectCount)]){ + [objectCounterField setIntValue:[[[tabViewItem identifier] content] objectCount]]; + } + } + if([[tabViewItem identifier] respondsToSelector:@selector(content)]){ + if([[[tabViewItem identifier] content] respondsToSelector:@selector(isProcessing)]){ + [isProcessingButton setState:[[[tabViewItem identifier] content] isProcessing]]; + } + } + if([[tabViewItem identifier] respondsToSelector:@selector(content)]){ + if([[[tabViewItem identifier] content] respondsToSelector:@selector(iconName)]){ + NSString *newName = [[[tabViewItem identifier] content] iconName]; + if(newName){ + [iconButton selectItem:[[iconButton menu] itemWithTitle:newName]]; + } else { + [iconButton selectItem:[[iconButton menu] itemWithTitle:@"None"]]; + } + } + } +} + +- (BOOL)tabView:(NSTabView *)aTabView shouldCloseTabViewItem:(NSTabViewItem *)tabViewItem +{ + if([[tabViewItem label] isEqualToString:@"Drake"]){ + NSAlert *drakeAlert = [NSAlert alertWithMessageText:@"No Way!" defaultButton:@"OK" alternateButton:nil otherButton:nil informativeTextWithFormat:@"I refuse to close a tab named \"Drake\""]; + [drakeAlert beginSheetModalForWindow:[NSApp keyWindow] modalDelegate:nil didEndSelector:nil contextInfo:nil]; + return NO; + } + return YES; +} + +- (void)tabView:(NSTabView *)aTabView willCloseTabViewItem:(NSTabViewItem *)tabViewItem +{ + NSLog(@"willCloseTabViewItem: %@", [tabViewItem label]); +} + +- (void)tabView:(NSTabView *)aTabView didCloseTabViewItem:(NSTabViewItem *)tabViewItem +{ + NSLog(@"didCloseTabViewItem: %@", [tabViewItem label]); +} + +#pragma mark - +#pragma mark ---- toolbar ---- + +- (NSToolbarItem *)toolbar:(NSToolbar *)toolbar itemForItemIdentifier:(NSString *)itemIdentifier willBeInsertedIntoToolbar:(BOOL)flag +{ + NSToolbarItem *item = [[NSToolbarItem alloc] initWithItemIdentifier:itemIdentifier]; + + if([itemIdentifier isEqualToString:@"TabField"]){ + [item setPaletteLabel:@"Tab Label"]; + [item setLabel:@"Tab Label"]; + [item setView:tabField]; + [item setMinSize:NSMakeSize(100, [tabField frame].size.height)]; + [item setMaxSize:NSMakeSize(500, [tabField frame].size.height)]; + + } else if([itemIdentifier isEqualToString:@"DrawerItem"]){ + [item setPaletteLabel:@"Configuration"]; + [item setLabel:@"Configuration"]; + [item setToolTip:@"Configuration"]; + [item setImage:[NSImage imageNamed:@"32x32_log"]]; + [item setTarget:drawer]; + [item setAction:@selector(toggle:)]; + + } + + return [item autorelease]; +} + +- (NSArray *)toolbarDefaultItemIdentifiers:(NSToolbar*)toolbar +{ + return [NSArray arrayWithObjects:@"TabField", + NSToolbarFlexibleSpaceItemIdentifier, + @"DrawerItem", + nil]; +} + +- (NSArray *)toolbarAllowedItemIdentifiers:(NSToolbar*)toolbar +{ + return [NSArray arrayWithObjects:@"TabField", + NSToolbarFlexibleSpaceItemIdentifier, + @"DrawerItem", + nil]; +} + +- (IBAction)toggleToolbar:(id)sender +{ + [[[self window] toolbar] setVisible:![[[self window] toolbar] isVisible]]; +} + +- (BOOL)validateToolbarItem:(NSToolbarItem *)theItem +{ + return YES; +} + +@end diff --git a/PSMTabBarControl/source/main.m b/PSMTabBarControl/source/main.m new file mode 100644 index 0000000000..bcdabbe7b0 --- /dev/null +++ b/PSMTabBarControl/source/main.m @@ -0,0 +1,14 @@ +// +// main.m +// TabBarControl +// +// Created by John Pannell on 12/18/05. +// Copyright Positive Spin Media 2005. All rights reserved. +// + +#import + +int main(int argc, char *argv[]) +{ + return NSApplicationMain(argc, (const char **) argv); +} diff --git a/PSMTabBarControl/version.plist b/PSMTabBarControl/version.plist new file mode 100644 index 0000000000..df8c3dc7d1 --- /dev/null +++ b/PSMTabBarControl/version.plist @@ -0,0 +1,16 @@ + + + + + BuildVersion + 92 + CFBundleVersion + 1.0 + ProductBuildVersion + 7K571 + ProjectName + NibPBTemplates + SourceVersion + 1200000 + + diff --git a/README b/README new file mode 100644 index 0000000000..3cc2a23ba5 --- /dev/null +++ b/README @@ -0,0 +1,145 @@ +Compiling: + +- To build the project: + + open terminal, directory vimXX/src: type 'make' + this builds the Vim executable + + open MacVim.xcodeproj, choose 'Release' on pull-down menu 'Active Build + Configuration', click Build + this builds the PSMTabBarFramework, then MacVim.app (which can be found in + MacVim/build/Release) +- To install: + + copy MacVim.app to /Applications (or anywhere you want it) + + in ~/.profile add this line: + alias gvim='/Applications/MacVim.app/Contents/MacOS/Vim -g' +- To run: + + Double click MacVim icon + + with the above alias you can type 'gvim' in terminal to open MacVim + (if the -g switch is left out, then Vim is started in terminal mode) + + in terminal mode of Vim, type :gui and MacVim will start +- Technical notes: + + to build a universal binary, the compiler AND linker needs the flags + '-isysroot /Developer/SDKs/MacOSX10.4u.sdk -arch ppc -arch i386' + + vim runtime files are copied to + 'MacVim.app/Contents/Resources/vim/runtime/' + +Weirdness: + +- When the text system (Cocoa) comes across multi byte characters it + automatically chooses a font for those characters; this font may not be the + same height as the one set on the text storage and hence the program must + account for the fact that lines may have differing heights. + We get around this problem by resizing the window to fit the text storage + after the layout manager has performed layout. As a side-effect the user + sees how the window resizes when certain multi byte characters are being + displayed. +- Remember to set 'inputReceived = YES' in MMBackend + handlePortMessage:, otherwise Vim will not inform MMVimController of + changes it makes (e.g. in response to a key down event). +- The way delegate messages from the tab bar are handled are based on lots of + assumptions on how the code works. See comments in tabView:... delegate + messages in MMWindowController. +- The insertion point is automatically moved to wherever changes are made in + the text storage. To set the position manually (via setSelectedRange:), + first call endEditing on the text storage. +- Delegate messages from the tab view need to be able to differentiate whether + the message was sent due to the user clicking a tab with the mouse, or if the + vim task initiated the change. To facilitate this, flags must be set + whenever the vim task does something that results in these delegate messages + being sent. See comments in the tabView:...Item: messages in + MMWindowController. +- In Vim the first tab has index 1, in the gui the first tab has index 0. This + is compensated for in MMBackend.m. +- The PSMTabBarControl does not reorder the NSTabView when a user drags tabs + around, so we must rely on [PSMTabBarControl representedItems] to get the + correct order of tabs (the order which the user can 'see'). WARNING! This + means that the code cannot rely on calls like + [NSTabView selectTabViewItemAtIndex:] etc. since the NSTabView has the + 'wrong' order. +- The MMVimController is added to the NSEventTrackingRunLoopMode, otherwise + updates from Vim would not reach the MMVimController while the user + resizes the window using the mouse. + + +Design decisions: + +- Output is queued and sent to the MMVimController only when + [MMBackend flushQueue] is called in order to minimize the amount of + messages sent back and forth between the task and gui. (This does not apply + to all messages sent to the gui though.) +- Drawing commands are stored in a buffer (drawData) and put on the output + queue whenever [MMBackend flush] is called. This buffer might no + longer be needed now that there is a general output queue. However, the + existing code works, so why change it? +- The gui listens for tasks on a named port whose name is derived from + CFBundleIdentifier (which is defined inside Info.plist of the app bundle). + In order to run two different copies of MacVim at the same time, they need to + have differing bundle identifiers; otherwise one copy will not be able to + create the named listening port and all tasks will connect to the first copy. +- All tabs share one text view and its associated text storage. There used to + be one text view per tab, but this only complicated the code since Vim has no + concept of different views (as in NSView). + + +Keyboard stuff: + +- input ends up in one of the following methods + (1) insertText: + (2) doCommandBySelector: + (3) performKeyEquivalent: + +- (1) handles: printable keys (a, Space, 1, ...) and (also ). + if Ctrl+Option is held [NSEvents characters] will translate the input to + control characters; note that if the translation fails, then Shift and Option + modifiers are NOT includeded in [NSEvent characters], but they are included + in [NSEvent charactersIgnoringModifiers]. e.g. given , characters + returns 1, charactersIgnoringModifiers returns . +- (2) handles: Ctrl+key, enter, backspace, escape. + same note on translation of Ctrl+key as above holds true. +- (3) handles: Cmd+key, arrow keys, function keys +- and are two different characters (the former is 0xa0) + + +Bugs: + +- Using NSString initWithBytesNoCopy:::: causes crash when trying to set window + title. +- NSTabViewItem setInitialFirstResponder: seems to have no effect, so we + manually set the first responder when the tab item selection changes. + + +Features (!supp indicates that a feature is not supported): + +- Multiple top-level windows: each window runs its own vim process (they are + completely independent) +- Tabs: uses PSMTabBarControl to show tabs, can reorder tabs by dragging them, + has overflow menu, new tab button on tabline +- Menubar: accelerators !supp, actext hint displayed as tool tip + instead of on menu, each window has its own menu, key equivalents !supp +- Toolbar: toolbariconsize supported (tiny&small equiv to 24x24 px, + medium&large equiv to 32x32 px), toolbar supports 'icons' and 'text' options + (but not 'tooltip' which is always on), each window has its own toolbar, + custom toolbar items +- Cocoa input protocols: input managers, character palette input etc. + supported, marked text !supp, cocoa key bindings (DefaultKeyBinding.dict) + !supp +- Mouse: resize (vim) windows, selection, different mouse cursors !supp, + autoscrolling whilst selecting works poorly +- Drag and Drop: drag files onto dock icon to open in tabs, drag to text view + !supp +- Zoom: Command-click to zoom height only, otherwise maximize witdh as well, + hold down Option to zoom all windows +- Resize: live resize (although terribly slow), :set lines will not make window + higher than can fit the screen (no such restrictions on width at the moment) +- Pasteboard: star-register works with the mac os x pasteboard +- Open/Save dialog: use with :browse +- Fonts: bold/italic/underline traits supported, font changes !supp +- File type associations: add more associations by editing Info.plist +- Start GUI from terminal, type :gui +- Scroll bars: !supp +- Wide characters: !supp +- Printing: !supp +- Find/Replace dialog: !supp +- Gui dialogs: !supp +- External editor protocol: !supp +- Services menu: !supp +- Encodings: !supp (enc, tenc always set to utf-8) diff --git a/SpecialKeys.plist b/SpecialKeys.plist new file mode 100644 index 0000000000..8d91cccc37 --- /dev/null +++ b/SpecialKeys.plist @@ -0,0 +1,62 @@ + + + + +  + KA +  + kB +  + kb +  + ku + ïœ + kd +  + kl +  + kr +  + k1 +  + k2 +  + k3 +  + k4 +  + k5 +  + k6 +  + k7 +  + k8 +  + k9 + ïœ + k; +  + F1 + ïœ + F2 + ïœ + F3 +  + F4 +  + F5 +  + F6 +  + kD +  + kh +  + @7 +  + kP +  + kN + + diff --git a/TODO b/TODO new file mode 100644 index 0000000000..94559a0894 --- /dev/null +++ b/TODO @@ -0,0 +1,114 @@ +Active: + +- proper font handling +- font selection dialog (:set gfn=*) +- check for memory leaks +- startup is a bit flakey (up until openWindowWithRows:columns:) +- i8n +- services menu +- don't clear the text storage on setMaxRows:: so that display does not go + blank when dragging to resize +- gui dialogs (FEAT_GUI_DIALOG) +- find/replace toolbar item (FIND_REPLACE_DIALOG) +- main menu +- menu key equivalents +- add menu options with key equiv: + Cmd+Option+Left/Right to change tab, Cmd+x/c/v cut/copy/paste, + Cmd+z/Z undo/redo, Cmd+o open, Cmd+w/W close tab/window, + Cmd+Option+T special characters, + etc. +- popup menus +- encoding -- convert strings from vim to utf-8 +- change building procedure so that the Makefile compiles and links VimTask and + then calls pbxbuild to build MacVim (and put MacVim.app) in the src folder +- icons for all built in toolbar items +- hide baseline separator when tabbar is visible (and make sure clicking the + hide/show toolbar button in the top right of the corner does not show it + again) +- use DO to communicate between GUI and Vim (only for two-way communication, + one-way communication should still use mach ports) +- window title is never set when starting with terminal vim and typing :gui +- forking doesn't work with :gui (i think) +- make sure [NSMutableData appendByte:length:] is never called with 0 length + (this will lead to a crash) +- wide characters are badly supported: they render as too wide +- update speed whilst resizing with mouse is excruciatingly slow +- drag and drop inside view (FEAT_GUI_DND, gui_handle_drop()) +- window count should be typeset nicely in tab +- put marked text in status line (?) +- track pad scrolling is jerky +- memory leak with text view? (need to release text storage) +- sanity check all input in handlePortMessage: etc. +- cursor in replace mode +- nice looking cursors (both the block and in insert mode) +- support project builder external editor + http://www.codingmonkeys.de/techpubs/externaleditor/pbxexternaleditor.html +- dock icon menu +- horizontal scrolling with trackpad does not work +- got this error when clicking to close second last tab: + 2007-07-23 08:19:29.398 MacVim[335] *** Assertion failure in -[PSMTabBarControl lockFocus], AppKit.subproj/NSView.m:3248 + 2007-07-23 08:19:29.410 MacVim[335] lockFocus sent to a view whose window is deferred and does not yet have a corresponding platform window + + +Pending: + +- make scrollbar inactive if it is too small to display properly +- make vertical scrollbars cover command line as well +- setting font in .gvimrc has no effect since textStorage has not been init'ed +- fonts +- scroll bars +- Make MacVim project depend on PSMTabBarControl project +- Change Makefile so that it builds a vim executable and copy this into the + MacVim.app from the MacVim project +- warning before closing modified buffer +- On quitting, warn user if modified files are open +- An untitled window should not open when the GUI is started from the terminal + (figure out how to pass '-nowindow yes' option when launching GUI) +- support using VimTask as a standalone terminal app, with support for :gui +- path is set to / when not starting from command line, set it to $HOME instead + + +Done: + +- input of wide characters does not work +- tab completion doesn't work on iMac +- close icons on tabs don't appear on iMac +- toolbar +- copy runtime files to bundle properly (only works for debug at the moment) +- don't resize to make window bigger than what can fit on screen +- window resizing using mouse & zoom +- cmd-click to maximize window, :tabnew...the text view overlaps the tabline +- colorscheme changes are buggy (open two tabs, change colorscheme, open new + tab; the new tab has wrong color on first and last lines.) +- tab selection bug: open three tabs, selct middle, drag last tab so it becomes + middle without selecting it, select middle tab...selects middle, then last +- tab selection bug #2: :tabnew, drag tab #2 to pos #1, press enter. tab #2 is + selected. +- this stuffs up the display: set go-=e; :tabnew +- with 2 tabs: closing one tab using mouse makes screen flash (does not happen + if tab is closed using :q) +- resize to fit every draw update +- insertion point +- copy/paste +- compute text storage size based on actual content +- color changes (:colorscheme) +- set text storage dimensions properly when creating text view +- text dimension changes +- notify vim task when user closes/selects tabs +- mouse handling in text view +- file type associations (Info.plist) +- drag and drop onto app icon +- remove tab update hack when flushing (edit vim code to call update) +- crash when typing :browse e $vim (but not :browse e $vim/) +- maintain queue of messages to send from task (to ensure they are passed in + the same order they arrive) +- do not include shift flag in chars that are already shifted (%, A, etc.) +- open file(s) in tab(s) (never open in new window?) +- key handling: + works, does not + clean up dispatchKeyEvent +- reordering tab pages (gui tabs must have same order as vim tabs) +- make sure tab is wide enough to fit label +- encoding (did_set_string_option, option.c, line 5675) + in init: + set_option_value((char_u *)"termencoding", 0L, (char_u *)"utf-8", 0); diff --git a/Toolbar/Attention.png b/Toolbar/Attention.png new file mode 100644 index 0000000000000000000000000000000000000000..704cf4ba5ea90bbfcd9bd07528478840d2a475f4 GIT binary patch literal 1931 zcmV;62Xy#}P)5851PiPNsY0Ijn+i8MFj*39k$uGd*?3i`<`?B@ZMo7LxJd<{J-3D&a?cV z|MQ%4#V>wt0dS5PKj%P*D}U1?Z!#zQTZ&UKUiS^!w`68EFvHjPXAqBd-t;*Dnp-@U z_4c%moj)7B`_|FnKb^jb!_{PZJ3!u=djKB0>yBmTy6;>x1Uz_47UZo5(9yMZ$+InU z4NKRxvvd3Wmw?(^F{HJ=xdTZIEiLL>o9^j`$q|r}-rZe|zx(5>kDuu0zy}V9YZ$41 zO5GX*>$mORv@h@_rc{JdfuK3d1G^S}6KK9!V>cZ@+oH^~YrDFr44)xMEH19Vct72H zdsx~m4wej*43umYW@bbckPf&}#1-!D+S#>DxG|z)f=d!?5H2|=1)3&8wo1Kj*PxK>^REh#w zlGuubkpcL}zv-A?re}5VG|(_p_LCxm41EZ_6v1V{K~tl8rmOc(;tMA+Qi6?9wv3b( zmlQ7r;0#eQrgHi?@mPd2z)(MXceJV7YT2&@TnoSa%j9*t;I1t@*X*egqeSHjew?6O zjPDFtPoRXkv~%nR7z;_!0Xb7P3DoE?n7tiG=C*0q&bM2;_ zxqu?V^9;U7@TEh00zWPzO6M;IptMIemj)n38U!9NmC)E2(Yqn{5U~D+8EBm!erL_f z1w>;5c*@~PgZ30kB&g9dcq0|0yQBdrBD^rYUIo+7Hvw8feu7=yjm*h#u$Vx>TnV*h z)|Jj<%f9;`So>&OeHj;(&|0G~=wd&5_#7&VkvV}F`a7I{4UYT-as2m4TS4k71Cr`x zFClVdnmwW^*ZH?o@f!%ve1L(=T2OT^&AqT@`5fZnBsvqKl5uqZG1SNiLP^L5kjoHF z6c{f=jO9zj6Gf=WKp3R$q|~Ka2nqQDAKTo>ie{d_nr+q70!pT^iYFf2v+5JG>Jvn% zgc>@DH#m$?4niM-0Q?YyAnAUb-0oKi)_oNt$I$)nKoC}iP|ZqK6`6oHOOljmJ@$Tl zxH05Ntp~NMX2tx>SkjX-jC0OfF6+oRk$ym;v7hGCDOj4L=8A29yWIF=$=~L@;t3)GQDch>H-FAew?o5lSU4j%^L) zisHb}riTAHLL6@@a4wiKSPM1t z!PluDYtq6vn`R$HU~DQ1W6?DZ9g#hJ-sKOE^OoA)Dr)ZD+V;xg%%t{IDq`&cp@N(b zxoj16P*)GLXG47p)HcJM&eVBLLn=_ugHVGfz!*>oCcG^9o9xzQHD6i7>P^D zSg8@R1V(}K2r~*_{{j;@CV45b RP-6f9002ovPDHLkV1jFGhMxcc literal 0 HcmV?d00001 diff --git a/Toolbar/Copy.png b/Toolbar/Copy.png new file mode 100644 index 0000000000000000000000000000000000000000..8df8201ec9748822200f737fc52eb925382b0809 GIT binary patch literal 1075 zcmV-31kC%1P)F4XY$#51Tv%gLs5t!G=w?gLnvd05%ymjJ$&pBL##A z$}rOxw=c2NZJ9WZ9ox98>aei8V>_M8ke;%R&d$fFREnok zb7_jbfuOa9QW{z-+~$*W&OOholu9K_+!`IgU@&;QP$>M6&1M&s(y?=hMi4}V+t!p$ z&*AaoZ@vTY#hm~EKuTpusSpIgjq?n{xRXDnR0;sD1=!u)Wov6|831{uR1N?et?uUK z-KC`Cc{ByU7~|P&Hn+b1-ulMI`x_4*e*S4bpR4%3-`LvP{+2Q0Ev3|*oWITx0PyJ1 zmtP$m{Px+>($c&6d_FfnpJw5N^Yae&_xEqD>%9P0S64Q-x3@kD0tuxQdc8h?Q9b+p z9;B3SCVB{Pc=*@f0B#gmSpU1$__Y9R+p?6>Fbw0`07(OcUIYMCtJPAw-5zE#nYlQj zg`JgX2F89E0QkON_kF*~Iggz;GJ@90Sm-kX2!i0$b=_mm`BbX)#P`uhCt?~D6@iUY zs~pF63g=Mgzw6mzoHI3#3x1=(mN1Ma(^TV8jAAj$;z0SG}^bibA0P#uyMa(8M5&_jx@! zoB&|V0An1B3ybi5uhnX`{t!Yi07$3P^Ut6E`e!V_ix)>n{eC|R&KO57mjmYv;oA~L zt2DqE0~Z{Eb1=q00D|EVoo*Lrt=7Q1xHx5w zvxDX3<(v#8h%}^9;Eay~2?5Rp0K)L!A=>RW{DyyCtJNB=>sD>sa*9sTtksU)X0v(R z?RJle$S0!MH{L55==FMyhVR!lKitd>g8%?QN{Mc#Lw?O`SE`j0$9Bq=ZMo(v(=1oY zcEk58gTcTD&?2H?T%ha56#yc-*xTFtT}rulczAeZS*GQ>rDC;ODSDn)?)7>efHn~& ta#*-h0ss&~yrZ>dM07?($)Cq2#(#k4+4%v4qPzeA002ovPDHLkV1jDD`{Doq literal 0 HcmV?d00001 diff --git a/Toolbar/Cut.png b/Toolbar/Cut.png new file mode 100644 index 0000000000000000000000000000000000000000..514bd97c273a2ab2f85222a0113d5aff45297b5b GIT binary patch literal 1379 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 RO|<|3002ovPDHLkV1mTjV!HqU literal 0 HcmV?d00001 diff --git a/Toolbar/FindNext.png b/Toolbar/FindNext.png new file mode 100644 index 0000000000000000000000000000000000000000..e260865a1750443c56892fb86c3aeb4b9d982ba4 GIT binary patch literal 1596 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 tqZ zdvH|s70187``o>|n|)c$wY4+q z*r`QjYEi_#w6sMT0p$^#@JKK~APF&Vl594c>~8jX_jT|6^$#=}j3{HzUw7`@bH1N@ z&iVa*=SL`|_%>Ekd6y&FjL>QPa-hH`P#~2;Dv?HyU&VDRR{;jc^!FO22q!hPJh%DCUw1XV+CJny*dBCGepP(# za^lb3P`2rnU#@#WpKE6k9R&4t14$J`1r&vWj)4CalFMeEhedq5&L3z%a~3=eE6| zZ*K<4D~7^2@%p}wKfS!C`SH_K`;yqK8Q67i?e_J{%Nh_H1w3OQz948?L5lE*F%l9G z5Y$BY(@unX2EYgcBvC|0Mh2`lJ9O{A1`LjZDioY6hDVl{{aD9yCIA~Q)nYz-xch-$ z69Cv!QSi|Hi{~^T;RVLVfQbM!MMH?{;Z{s=2Pxd6LG+D8(AzhPqsLC*N%$d%)#U=CVS6qL)=cFme za}EwkgOMaa83xG70?Eq5CqBb?<4e1%o1!t#j1mY8tr~sj`Lk;uxaXE-4Qs6Djvd3` zPy!3$9t1fHJW&FVH;g^~ftC}&^lGte(MHYhK9Y*drwPEs<8jI79e4E{KUy8m)UUg* z#9pIvCb$F&NlO9~eo#?FiNlb+>c;Y)19)NvfEpZ6oZahb*Z^8R3`cN!plXxroux4!y8c22gDPzn$huKXMnuKGTX zNZIJwx7Rz882iMirD}q$dtW>ekA^R;Whmw!|>?8`r z;vjMqS&~&>J~!tM0KL;qXvr&_?{sB3jFKK81OO0@L=c~v0BZowwj6vT(fQGD4s{)W zdp7Y)K!O5r;($A{-Q$nZsKP=83!*51EJK8hsySJ=POpL+s_(Il2UTy>>*>`=`sqM1 zSw=`sps%fMMD|Y}W`M8U%`UYzO2huNda%=<=t-qCq`(27Ks*7c3CwY3T(^MXBmiK< z(!~;qP05zfs7PYL=^zP)N1QMi?>>JXz+fw-$~OhTMLG9qB-yRXaj3}zAcuiS5J*Ik zp%+~G{CV>MfD1RhnRE!6SkSahNBaK`XcAO=5uncnAJUK<9&{7nYfrUHjRjCfM56oJ6hR5Gom7?$H00BH4H==1ufIsq2o zc@P5V7!AD0qQoqg=?E#hQUD#t6%So}^%qI22iUQ@Pc!www^@n~GNpMtfe}t&ciNtE>*E0|x0+S4t6y#GrD# zn3@EGMXf2IrR^u-0FQou7Az`HMR{i9+okm_=;VW$ClCxR!NhoVh{;Q^xr zFbvEj4s(Wpe7nf6pKE)uK;+g}5W>$Uo@>qe!PVE@+-&VW{J~ne?anG~2rB}IQ1RA} z(6r@AOnmSUU}6wQ_wH?JefM9RO=We4oQ7vzGX|2?F8lJ=*Ol)za8b};7$g!wlJXc= z3^n+5E!p)&wuiGE2ElG*k;z0s zr~+Baz-dDnQnq4jefz*q-GSI)+p1rfAz4~x09;E5dHj}ZUu&$hJxrA-5D0?A6G&?e ze2fJn4bNjjZ^fj?gUR7xZ#W!w>juv&wxRx_>yv|4o5jFMMgbO`1`CxzKtc5)V6%Z3 zocP`G_v$J_CB;V%Y?m20%ddI%pO%U~r;&jJvS=Q1h?a z(&^4GYJRDyTGHu}WoF}sXV%=bb75)0RcdA!B&~s|Z-AKrGUgN_l}aO(PJwa)f`K7u z1x^%*#)|<61tlz~PK0JOfi>9C+#MKt=AZi?O({zErFye=_5M)w*b=>X-_IVp_l=cH z=2v6h0w^{Yh^m5N7>J?(Q4|0Gip7RR(LBHiXkbA(7MdV}k&K{J!0rRBr=Q=k=doxa z*?Q*Uk^S`m0Ps;fd9Ko6eXw;nx@Fzw#q}jX1_+=k3Mc>qfaQ54SP^Pr88oX1jpe}# zI)>m{A({JRnB<}oo1op_B)rZxZ}YM%L0{?>gJcrxHO&VNsqhqS=Lklb`s#6P~`lfzH7Z&&e32eF6|Zbs6C+0sw$o zPGHljqH&qICD7aQQbAuBET@C)_b92@IDj+BjL~joO;)oS^7&ij;1$mb bU$p-L(h)?sbJ0m{00000NkvXXu0mjfTsooG literal 0 HcmV?d00001 diff --git a/Toolbar/LoadSesn.png b/Toolbar/LoadSesn.png new file mode 100644 index 0000000000000000000000000000000000000000..f762a24bcbb70ca2226d1d7bddaac49eea957e62 GIT binary patch literal 1757 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 literal 0 HcmV?d00001 diff --git a/Toolbar/Open.png b/Toolbar/Open.png new file mode 100644 index 0000000000000000000000000000000000000000..e3528f02c939db2a07723980076767c367605454 GIT binary patch literal 1365 zcmV-b1*-aqP)em6veIk|M#5#Kew(? zRjyae&d&N%Q&Y7#j%T(^PuE4<&WY;euH}_%_YFIDeXw)O#Ovn25SX2v^=q|SEso=v zTCG;M*6yg)YP*avH&?6Gok0-X7)9lJISi)-FYKgBY?X4!@Y#3gP98mU>m$K9fTvEK zx~X2TKNg1Jo=T;1^TC4$Z;Ya-9t6R35Coy```3JcN zRKS=%byO6q*MWeD5XUhh4r2^T4rB!kfB{uNu0sZlG5r$ci&dmZb*4E1Pm4JOoco^% zj2y3;*V`$^fB@DCz7bsR!tn^Wf_6`Q=4xTD2}7Q45pa?dP!*gL@IXYzCor6WK_Y{$ z7#wd!u&Q_p&bqurx=8}P3=D^=_Oqd?p!w=m6z2rzz=|LueKDqX6D8QV29%x%MIp0- zIEx{-qg7=kb(<$Joa(_6^j%;I5elT41r>||&p1O4?5l%P*ga{_6Wky)F! zTm!y=rLG`ub1slRKoRRX!C6OU9k#HcZ=jng%c~i>NgGZLzZ>3|^3^L@mge9#7hx6RPbI0zG)}w>*@BphYF>3N2=-Pzx4M;?AgW}Emw1FWJo@q7{ zU=c`w3NT5Y{)s{14U2HSOei2uQ70G`d=wAJ>>4&a(`=^u8;ykmd>TkqwY-t@!yvFR zh9C&=yk*yCMPFpwU*O` zg@yCYpS!LV1&iPO(w=X}(n`b_Bl2+&n0MAAuma2jk;zGvC!&Z_skEjD(=>H)9G{z; zn>+o{haaB)_Uo^{KL69t^W1*?>H2{!TNjtpwh2mQKUseF!pleB>wPzpz?o)KfM54F z8Y_Mf+;(Mg@z;|lPP~8k@ZsBc@7YsdU0r2)d6`zLb*|g(e%@}kKe5)Ho|&0x&dkiD z$BrN8t~>82n=q(9yd?c2HU-g~^MyB~k_&tHE0e(vK}z8p1ftle;& X7MP!rkhXXe00000NkvXXu0mjfYNeO3 literal 0 HcmV?d00001 diff --git a/Toolbar/Paste.png b/Toolbar/Paste.png new file mode 100644 index 0000000000000000000000000000000000000000..8906e80f7e2c57bfca05f524105a861fb278f127 GIT binary patch literal 1550 zcmV+p2J!icP)Z zON?Ac6^6gMkDi&HmuH3{cCa1C5i$-ASb!Hiy~2vbB5?!~!crozEFo-1EV2P10Y)s5 zOyaFq2nn%r5=Fcw1PhE5p(KdN3ZB@;cKlF0_B`F)_jc7ehsC|!Gd-T^9wUxa-Kthq zoxlEb&VQ<%nbFJ6zW(ay%)I;qlTpLO;hdNyX_7qo%)zJM>UlsnGqaxKxkFEV>)Q1j zccw4>$1c2o(WWn6vWr)5+xNeF@CO^&-)$rQ)@`uxZyZc%%0@?tElJJ@1Kl=HRkk|WtR#OQ%8a%3k`lg*b zef;JZ55M$qb)cVmBeTDpe&P00U;WAfb7`z1s2MJbQB{(Gv4KDS>C9GO;{ZlC4L&w7 zF!|BB+4GnRSL)+@>A=&NX>lcNEN|SyH*-|g?fu%Zhnxzn40_}DFEdg5H<+M}jJ~vQ z=ZnW&^!zE)o&a7v>LSyJDp`FFHO0h}#ltk*AXlzkEmk_vE4K?kKwRku91hs=$aeC+ zNy6fJ(14lYAO-q>MsEfjP7Oj3R0K06%W?**1I*4X;N0qM4r6 zYt?-_*971IHA8|FF&8Dt?~>K;v2X9=0Bx%2sM=!ExVK1JzlBLCK$xsv*n z&B@QAD$CRX&Ola#W!KIF+ve`o-v04VPAEX+AWhRW&-1ehLqNfR z2%^SK9p`+sgLm?ep_MAvD?9k5dyYJK%zLESKz)O=7iv8Ji&qHE20mXN&8$JA-k`o> z0AyL-0VrBIX~o|}n9&j5OCRHEbqAN01_)6#J`4?# zY^vf#!3*jIR51lrL#_8Px&Tnql7&*!MaVT~bMrF$?@lpVt>A{MB%_0%hBX5g6hkp9 z1gqOn5llM)EKBi<5EOD-NUV9!pZ(`~W!JOVNR`AHttPAsbu0)d%M^Esx2?fIM-oyB zk(K~rZE`Mrj^FHkf%ws3;wJbofCSJgcyXn3EqaBmKEBhmT(>R&Z8w@imc1w+EID@n z^S7k$c)UTzCXzG-RYU+&CMFY96zx$0rnWYKLO_acC#}vWikjo#&|h&rM^#wLglzXW z`Oe`Zgy4&Y?;K4rLND)>6|ibqrx3N= zf`Kxl%l6yK3EGKSmfQwzyxL5AFi_lDmKi7?9?Q%~sd)Ftazg;t*w+G3q_5FV!gd+1 zEJ;-iEA*oKV|Ptc({;+w;Y20NvkcV;6UEeF8lffSh(pD-<@Eo{fDz-e*WUd5tJ{(& z8MC%tm7fOAj6Aq>%O`agX3_r&fOSG3J3o>A4zf25Mpz-ytsWmogzK}(-ix@X~9r$$i}FD@*6I6XZ*)q0fv7xf+NY*jU-p8x;=07*qoM6N<$g1$ZV AnE(I) literal 0 HcmV?d00001 diff --git a/Toolbar/Print.png b/Toolbar/Print.png new file mode 100644 index 0000000000000000000000000000000000000000..bbbac94c15b45ab65c0148ddd5169d196eada9bf GIT binary patch literal 1482 zcmV;*1vUDKP)ewjJ6sGxv2~E~f9!RB4TF{3YL=`jiPjpG z(A(SFS5;M&7D9^kHbN>swhYD?b6qc(p8jKSczC$HBdv8=>Fetwmo8nJ(OPSz^p?@x z-F^J>Sv zLMl3{6xotwvu}P@k>O?p{w@4ZpdtazIbyMx+^&OIET#ts2P^uiXsEBRXSQu`sQ*`m zX_`29?tDdiMFJljJC+HBLiL<)or9DThG9fbocNHvGJ#OYumdhEr7D*2U!qis$~biB z(4O0OZkMg&HI3-}`3vUcgwv{$&(*>OLNH5Uhu`4b8T&HE!V43RlEJb_ob8uB_!I~+6JXm>D^ib zq~xfitF=BiC5R(da!()r@~HdMPd=VlL!hUpr)O~Rt81~CjhBT2 zz8<;=-}k{NgVH6Bgb+~1KxruxOTS7gXlN*UvakN*DS zhi}~Y_WLz|K{A<4QcB>u9t!z9cJFRLYfBpe4+}+B9TmPSOazSyQ&GLP)dP-KyZ#nj~*hO&cL!P z5K0gUM_}7ggu`J(!V!4B2O%VE+eS@o9fS~2QleNaqEN`gaaG=va~sV%JoLMaFcT+am$I84)o9|Z7R2cGM} z_kB37gTN2qxh|}zjl*xh1E7?FSS(h%hQO(T0ovT$+)OA12tYvaa()4v2arlZ2m!$b zgy7(ugL47FIh0Zmk|Xc~2q7V*gcJf&Do9n*xd`CR2XGt*=}ZQcQe-ljJ*Nf+=;xk`hv> z(wJ0GYL&hyQb}m3AeDkv3PMVFu7ibz1sI_a7$Gn%YsbjQ2wl#A;}qH4+>3131ed7iOo4*Sp!Ndy(5#h z48uTsYYXvLZVu0r!33$($v({k;~-@TmK+ii>axpxtiLVz2$tBZN=Gawl$SX+1mqp1*>u7-6LHc?HzAPDZMh!yfPSL kk^4X0A0Ga0_|AIUpYQdhxg}6*(*OVf07*qoM6N<$f{dBDfdBvi literal 0 HcmV?d00001 diff --git a/Toolbar/Redo.png b/Toolbar/Redo.png new file mode 100644 index 0000000000000000000000000000000000000000..8a065ddae632b026c5d6c8876e0bc34a7eaf2c5c GIT binary patch literal 1236 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 Tjwl_{00000NkvXXu0mjf+=+ts literal 0 HcmV?d00001 diff --git a/Toolbar/RunCtags.png b/Toolbar/RunCtags.png new file mode 100644 index 0000000000000000000000000000000000000000..08d186924b16be71ab62e9b48c7d649249493b9a GIT binary patch literal 1225 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 literal 0 HcmV?d00001 diff --git a/Toolbar/SaveSesn.png b/Toolbar/SaveSesn.png new file mode 100644 index 0000000000000000000000000000000000000000..d8b3d7e2cdcbea34abe8a93b4c650555ecfe071a GIT binary patch literal 2039 zcmV)7U^`df1RrRe%ph6%ZwM9ThBq)g+Y%osj#P-@=uh-tQd(N4eKJ0PgfCHG7 zzMVNbbN=7=|K>k4=Ll;p>-`NCgfs@Wb|t>)`}*vGpN7v26@(lZv}WDGthJvAPd=pX zwsXIdxNJ-gN`j zNr>v8YY^2STmloZ>-sN!^Z1l6Du@jUmrL4mnLF?N%J=r+pM@v{;Q$U;8RsEEy6oO_+t&_1;2x_6 z(Xk-pO#eY!`mp%ITFb$H(VFzQG@VZNWHXt|v$o3Ib);I?V>Qiq;h^=! z-+$I}|GvJPf0Ay_=aT76QYO=&T#y2+1`~pgzyuIg8)PflpMwM&x55KA2QmrLi|^Zp zYqce!YRS}=X8pyf;n^2nfBD-=NpV?wbMpp~Nq{avWg0LsYz)zWh%;XiAe{5W=bZ4N zR&I>9tHKxyMx%t1nN+sP@tT?hqD#Gfru3NmkEeR~?cQ^1s&gY!Mqp|&2{EyV`#RQS z8(>9aeBX)&j6Fw)(V*kLo5O@2rPKe5UO4&2<8yxWnoE!wN&#U2LdJDq*ATGc0$>DIhP*uaFPfYbUM)cwSbAl^{P?lp$a|B2p7x`|uEQ8G zGcag_m6r$~IO8eaIaypDeDV0ZPy4e|mPj?$d1PYP^UxNwiQDtnBl8lKaR_oX%65TT z=<{;9WS$+H_~W!69(E<~0W&~Eyr3Bvv}ULvd|=XZU}VleXx=)dZ@tpo)zs`NR`0Dg z{=2||^Zo8?ZzPdTV4VoRX%XSW+ZBJj*kb=0lTQx}+F&KzxvhAW6O*39J0o-cZ(kjq zevK%KGhKx>9cc6&&qJjhq$dbeKwZ?BH+DQGFRms(=fG+aD^5s>cBQCeX%JlC0NncG zHp)SXn)Si6;DT@kQRX;%)m|2YMXJ#f`KHaZwRY`#=;Zv1wJ4bU;Xb)w>(G{M6W8q6 zb+=gSrF5tu+)%UOj_vv9uIy^xgM5QIJ;~=divULm^ ztIb6OSWJ`S^rWTmh|IZpZwP5zcrrnAE<-AxLIf7SQm0-INTpIZVVd#b7MKWkpd{DqpK}Z8mPB}XyG%9|@0Y`ywA=GTyw3X+cc!dpSN8{L# zpfPl`x03ElbGCDWsI^X2mU-rH$4QfA?9^B#a2KC8bx4||=u$BNJAlvFVThJDgtspZj&n@uw?DWL(YUN1L=%Z3_%9B(8Iit%%#6;wQCT=T zW%LnX)D_GCv%oSSl^|oGcv?pzj#c-dK}vy?5`jQTg@A1Q%!dmA94lbHZWor%mcsv( zW?!1r(Q{TXssvLs_VF?ht=KtK5Wav#S5U0`b<)NqB&2R?gi%0!IY0>9Mx|Wn!UqHh zkXA5vq+I%uu{3MJxRT7o#EU>MFla9bva*d26-1Cprs?WxqeJ)MSO+IkHk^qC}c>@M20+8JR0mMXLh76mvAr|j3PegHq**1zC0T4i# z4oLcdZn-1FdbJC1d6$y{3)?Mh1(IQy^*2=N1P8pOB2v6itGrG89enEjsOTC zW>$M#vG6DB`R_aRfjBAtge#2N;PEnbn_Xk_TYBJqby`cfXt|8_}aVxT^T?C z;ck#Dle&Nr|8PhAzW{fH**4scc$U8aCFrpLfB?eZBwHnq!x5lj8|Dax`M~x-0-mPt z1*AF#0{{dN;YR6N6>QO=fZ_-Spd<9wB#_e{00}c{{G$1@b|X>!=K+D82m zGz|a*5EBC>;J6#K0{ee~4Bg-o6(E2p3jui2S}(xx?~efqA@G6WPtOIA-2edw0M|-X U+z62-7ytkO07*qoM6N<$g0Hg5i~s-t literal 0 HcmV?d00001 diff --git a/Toolbar/Undo.png b/Toolbar/Undo.png new file mode 100644 index 0000000000000000000000000000000000000000..0cbd408ba50b973c21e370a0475f74dd4a206623 GIT binary patch literal 1178 zcmV;L1ZDe)P)iVSyYX91L7MTnvvNJ=S2b0y^RVWsU#{AVxT= z9cVc-!#rUfVFnFP4T2hu_%Epr001vPt@-PvuMFQde`8?y0(3+Nd5!=GAV!8-pyf=!^sNu%`H>NZ7lC*a$TdJm^pNfd zfB<4-sKOI>F+ePbCbkBMZ{bjXlOdjAEjXKgAvR3_1P}|u3kGY3_Y5jPAMgRSAQGh> zLkq)g1|9}+G#v^+d=-=k7?v?SV>k~Cy+6Q&`yXuKZiWj$niU$g_#IFT4*7b300Jpw zgO+X_D2Xx)=vQq9GloDcnil}^3!sxvGh{LxXE*`m{e)Wh3mOGK@H!w5nCh4q>VOe- z4IqF(KK=(a;2SjPAXt|{nBfD1GdOL4z#k;63dHw-4(DZXW#DJn&u||Y_zVmmp=RLD zl4%Tz4CcVJ@*fygAX~37)B^+%EXe;u9fH7Oz?kM`C;`h#LX*{Bq~ry1#C@P6*cqaL zA*ITo#PFEm1~5_}`cXkLFdU5;DnVroP*wq~;w>B*e+*B6UU>+lF9LOgk}p3nsBIzDDiF&+)xT#r#;}T^8kCX%0*DcBLa}6! z0tVVCU}#7)1VK{^F7OnJK@Ry06_bYQQHILx0jH9Cz#_aD7y@@dq5uKJNU*4O239@d z3>$$y;AL|P0j!T#7IJ&!3s`P+Q5t{ z&kzZW3VWc4GKNZ!rQaDY11&xZEU*p$tpoY?1Jqfcp^*a5DF6Y)NMekFvMnbxCGbK0 z&yLo#`wuNGejt@AU!i3UMjZhVK#XKmKa5a^utL)~GZu6HK^^f6S}^^?Wf(vJF%ER! s5FmgCyk7tiKm+aofB+hB2LJ>Z0O33%qw0R97ytkO07*qoM6N<$f-3UAfB*mh literal 0 HcmV?d00001 diff --git a/VimColorList.clr b/VimColorList.clr new file mode 100644 index 0000000000..1d6aaabe53 --- /dev/null +++ b/VimColorList.clr @@ -0,0 +1,803 @@ +802 +0 0.0000 0.0000 0.0000 1.0 Black +0 0.5020 0.5020 0.5020 1.0 darkgray +0 0.5020 0.5020 0.5020 1.0 darkgrey +0 0.7529 0.7529 0.7529 1.0 Gray +0 0.7529 0.7529 0.7529 1.0 Grey +0 0.8784 0.8784 0.8784 1.0 lightgray +0 0.8784 0.8784 0.8784 1.0 lightgrey +0 0.1020 0.1020 0.1020 1.0 gray10 +0 0.1020 0.1020 0.1020 1.0 grey10 +0 0.2000 0.2000 0.2000 1.0 gray20 +0 0.2000 0.2000 0.2000 1.0 grey20 +0 0.3020 0.3020 0.3020 1.0 gray30 +0 0.3020 0.3020 0.3020 1.0 grey30 +0 0.4000 0.4000 0.4000 1.0 gray40 +0 0.4000 0.4000 0.4000 1.0 grey40 +0 0.4980 0.4980 0.4980 1.0 gray50 +0 0.4980 0.4980 0.4980 1.0 grey50 +0 0.6000 0.6000 0.6000 1.0 gray60 +0 0.6000 0.6000 0.6000 1.0 grey60 +0 0.7020 0.7020 0.7020 1.0 gray70 +0 0.7020 0.7020 0.7020 1.0 grey70 +0 0.8000 0.8000 0.8000 1.0 gray80 +0 0.8000 0.8000 0.8000 1.0 grey80 +0 0.8980 0.8980 0.8980 1.0 gray90 +0 0.8980 0.8980 0.8980 1.0 grey90 +0 1.0000 1.0000 1.0000 1.0 white +0 0.5020 0.0000 0.0000 1.0 darkred +0 0.8667 0.0314 0.0235 1.0 red +0 1.0000 0.6275 0.6275 1.0 lightred +0 0.0000 0.0000 0.5020 1.0 DarkBlue +0 0.0000 0.0000 0.8314 1.0 Blue +0 0.6275 0.6275 1.0000 1.0 lightblue +0 0.0000 0.5020 0.0000 1.0 DarkGreen +0 0.0000 0.3922 0.0667 1.0 Green +0 0.6275 1.0000 0.6275 1.0 lightgreen +0 0.0000 0.5020 0.5020 1.0 DarkCyan +0 0.0078 0.6706 0.9176 1.0 cyan +0 0.6275 1.0000 1.0000 1.0 lightcyan +0 0.5020 0.0000 0.5020 1.0 darkmagenta +0 0.9490 0.0314 0.5176 1.0 magenta +0 0.9412 0.6275 0.9412 1.0 lightmagenta +0 0.5020 0.2510 0.2510 1.0 brown +0 0.9882 0.9529 0.0196 1.0 yellow +0 1.0000 1.0000 0.6275 1.0 lightyellow +0 0.7333 0.7333 0.0000 1.0 darkyellow +0 0.1804 0.5451 0.3412 1.0 SeaGreen +0 0.9882 0.5020 0.0000 1.0 orange +0 0.6275 0.1255 0.9412 1.0 Purple +0 0.4157 0.3529 0.8039 1.0 SlateBlue +0 0.5529 0.2196 0.7882 1.0 Violet +0 1.0000 0.9804 0.9804 1.0 snow +0 0.9725 0.9725 1.0000 1.0 ghost white +0 0.9725 0.9725 1.0000 1.0 GhostWhite +0 0.9608 0.9608 0.9608 1.0 white smoke +0 0.9608 0.9608 0.9608 1.0 WhiteSmoke +0 0.8627 0.8627 0.8627 1.0 gainsboro +0 1.0000 0.9804 0.9412 1.0 floral white +0 1.0000 0.9804 0.9412 1.0 FloralWhite +0 0.9922 0.9608 0.9020 1.0 old lace +0 0.9922 0.9608 0.9020 1.0 OldLace +0 0.9804 0.9412 0.9020 1.0 linen +0 0.9804 0.9216 0.8431 1.0 antique white +0 0.9804 0.9216 0.8431 1.0 AntiqueWhite +0 1.0000 0.9373 0.8353 1.0 papaya whip +0 1.0000 0.9373 0.8353 1.0 PapayaWhip +0 1.0000 0.9216 0.8039 1.0 blanched almond +0 1.0000 0.9216 0.8039 1.0 BlanchedAlmond +0 1.0000 0.8941 0.7686 1.0 bisque +0 1.0000 0.8549 0.7255 1.0 peach puff +0 1.0000 0.8549 0.7255 1.0 PeachPuff +0 1.0000 0.8706 0.6784 1.0 navajo white +0 1.0000 0.8706 0.6784 1.0 NavajoWhite +0 1.0000 0.8941 0.7098 1.0 moccasin +0 1.0000 0.9725 0.8627 1.0 cornsilk +0 1.0000 1.0000 0.9412 1.0 ivory +0 1.0000 0.9804 0.8039 1.0 lemon chiffon +0 1.0000 0.9804 0.8039 1.0 LemonChiffon +0 1.0000 0.9608 0.9333 1.0 seashell +0 0.9412 1.0000 0.9412 1.0 honeydew +0 0.9608 1.0000 0.9804 1.0 mint cream +0 0.9608 1.0000 0.9804 1.0 MintCream +0 0.9412 1.0000 1.0000 1.0 azure +0 0.9412 0.9725 1.0000 1.0 alice blue +0 0.9412 0.9725 1.0000 1.0 AliceBlue +0 0.9020 0.9020 0.9804 1.0 lavender +0 1.0000 0.9412 0.9608 1.0 lavender blush +0 1.0000 0.9412 0.9608 1.0 LavenderBlush +0 1.0000 0.8941 0.8824 1.0 misty rose +0 1.0000 0.8941 0.8824 1.0 MistyRose +0 1.0000 1.0000 1.0000 1.0 white +0 0.0000 0.0000 0.0000 1.0 black +0 0.1843 0.3098 0.3098 1.0 dark slate gray +0 0.1843 0.3098 0.3098 1.0 DarkSlateGray +0 0.1843 0.3098 0.3098 1.0 dark slate grey +0 0.1843 0.3098 0.3098 1.0 DarkSlateGrey +0 0.4118 0.4118 0.4118 1.0 dim gray +0 0.4118 0.4118 0.4118 1.0 DimGray +0 0.4118 0.4118 0.4118 1.0 dim grey +0 0.4118 0.4118 0.4118 1.0 DimGrey +0 0.4392 0.5020 0.5647 1.0 slate gray +0 0.4392 0.5020 0.5647 1.0 SlateGray +0 0.4392 0.5020 0.5647 1.0 slate grey +0 0.4392 0.5020 0.5647 1.0 SlateGrey +0 0.4667 0.5333 0.6000 1.0 light slate gray +0 0.4667 0.5333 0.6000 1.0 LightSlateGray +0 0.4667 0.5333 0.6000 1.0 light slate grey +0 0.4667 0.5333 0.6000 1.0 LightSlateGrey +0 0.7451 0.7451 0.7451 1.0 gray +0 0.7451 0.7451 0.7451 1.0 grey +0 0.8275 0.8275 0.8275 1.0 light grey +0 0.8275 0.8275 0.8275 1.0 LightGrey +0 0.8275 0.8275 0.8275 1.0 light gray +0 0.8275 0.8275 0.8275 1.0 LightGray +0 0.0980 0.0980 0.4392 1.0 midnight blue +0 0.0980 0.0980 0.4392 1.0 MidnightBlue +0 0.0000 0.0000 0.5020 1.0 navy +0 0.0000 0.0000 0.5020 1.0 navy blue +0 0.0000 0.0000 0.5020 1.0 NavyBlue +0 0.3922 0.5843 0.9294 1.0 cornflower blue +0 0.3922 0.5843 0.9294 1.0 CornflowerBlue +0 0.2824 0.2392 0.5451 1.0 dark slate blue +0 0.2824 0.2392 0.5451 1.0 DarkSlateBlue +0 0.4157 0.3529 0.8039 1.0 slate blue +0 0.4157 0.3529 0.8039 1.0 SlateBlue +0 0.4824 0.4078 0.9333 1.0 medium slate blue +0 0.4824 0.4078 0.9333 1.0 MediumSlateBlue +0 0.5176 0.4392 1.0000 1.0 light slate blue +0 0.5176 0.4392 1.0000 1.0 LightSlateBlue +0 0.0000 0.0000 0.8039 1.0 medium blue +0 0.0000 0.0000 0.8039 1.0 MediumBlue +0 0.2549 0.4118 0.8824 1.0 royal blue +0 0.2549 0.4118 0.8824 1.0 RoyalBlue +0 0.0000 0.0000 1.0000 1.0 blue +0 0.1176 0.5647 1.0000 1.0 dodger blue +0 0.1176 0.5647 1.0000 1.0 DodgerBlue +0 0.0000 0.7490 1.0000 1.0 deep sky blue +0 0.0000 0.7490 1.0000 1.0 DeepSkyBlue +0 0.5294 0.8078 0.9216 1.0 sky blue +0 0.5294 0.8078 0.9216 1.0 SkyBlue +0 0.5294 0.8078 0.9804 1.0 light sky blue +0 0.5294 0.8078 0.9804 1.0 LightSkyBlue +0 0.2745 0.5098 0.7059 1.0 steel blue +0 0.2745 0.5098 0.7059 1.0 SteelBlue +0 0.6902 0.7686 0.8706 1.0 light steel blue +0 0.6902 0.7686 0.8706 1.0 LightSteelBlue +0 0.6784 0.8471 0.9020 1.0 light blue +0 0.6784 0.8471 0.9020 1.0 LightBlue +0 0.6902 0.8784 0.9020 1.0 powder blue +0 0.6902 0.8784 0.9020 1.0 PowderBlue +0 0.6863 0.9333 0.9333 1.0 pale turquoise +0 0.6863 0.9333 0.9333 1.0 PaleTurquoise +0 0.0000 0.8078 0.8196 1.0 dark turquoise +0 0.0000 0.8078 0.8196 1.0 DarkTurquoise +0 0.2824 0.8196 0.8000 1.0 medium turquoise +0 0.2824 0.8196 0.8000 1.0 MediumTurquoise +0 0.2510 0.8784 0.8157 1.0 turquoise +0 0.0000 1.0000 1.0000 1.0 cyan +0 0.8784 1.0000 1.0000 1.0 light cyan +0 0.8784 1.0000 1.0000 1.0 LightCyan +0 0.3725 0.6196 0.6275 1.0 cadet blue +0 0.3725 0.6196 0.6275 1.0 CadetBlue +0 0.4000 0.8039 0.6667 1.0 medium aquamarine +0 0.4000 0.8039 0.6667 1.0 MediumAquamarine +0 0.4980 1.0000 0.8314 1.0 aquamarine +0 0.0000 0.3922 0.0000 1.0 dark green +0 0.0000 0.3922 0.0000 1.0 DarkGreen +0 0.3333 0.4196 0.1843 1.0 dark olive green +0 0.3333 0.4196 0.1843 1.0 DarkOliveGreen +0 0.5608 0.7373 0.5608 1.0 dark sea green +0 0.5608 0.7373 0.5608 1.0 DarkSeaGreen +0 0.1804 0.5451 0.3412 1.0 sea green +0 0.1804 0.5451 0.3412 1.0 SeaGreen +0 0.2353 0.7020 0.4431 1.0 medium sea green +0 0.2353 0.7020 0.4431 1.0 MediumSeaGreen +0 0.1255 0.6980 0.6667 1.0 light sea green +0 0.1255 0.6980 0.6667 1.0 LightSeaGreen +0 0.5961 0.9843 0.5961 1.0 pale green +0 0.5961 0.9843 0.5961 1.0 PaleGreen +0 0.0000 1.0000 0.4980 1.0 spring green +0 0.0000 1.0000 0.4980 1.0 SpringGreen +0 0.4863 0.9882 0.0000 1.0 lawn green +0 0.4863 0.9882 0.0000 1.0 LawnGreen +0 0.0000 1.0000 0.0000 1.0 green +0 0.4980 1.0000 0.0000 1.0 chartreuse +0 0.0000 0.9804 0.6039 1.0 medium spring green +0 0.0000 0.9804 0.6039 1.0 MediumSpringGreen +0 0.6784 1.0000 0.1843 1.0 green yellow +0 0.6784 1.0000 0.1843 1.0 GreenYellow +0 0.1961 0.8039 0.1961 1.0 lime green +0 0.1961 0.8039 0.1961 1.0 LimeGreen +0 0.6039 0.8039 0.1961 1.0 yellow green +0 0.6039 0.8039 0.1961 1.0 YellowGreen +0 0.1333 0.5451 0.1333 1.0 forest green +0 0.1333 0.5451 0.1333 1.0 ForestGreen +0 0.4196 0.5569 0.1373 1.0 olive drab +0 0.4196 0.5569 0.1373 1.0 OliveDrab +0 0.7412 0.7176 0.4196 1.0 dark khaki +0 0.7412 0.7176 0.4196 1.0 DarkKhaki +0 0.9412 0.9020 0.5490 1.0 khaki +0 0.9333 0.9098 0.6667 1.0 pale goldenrod +0 0.9333 0.9098 0.6667 1.0 PaleGoldenrod +0 0.9804 0.9804 0.8235 1.0 light goldenrod yellow +0 0.9804 0.9804 0.8235 1.0 LightGoldenrodYellow +0 1.0000 1.0000 0.8784 1.0 light yellow +0 1.0000 1.0000 0.8784 1.0 LightYellow +0 1.0000 1.0000 0.0000 1.0 yellow +0 1.0000 0.8431 0.0000 1.0 gold +0 0.9333 0.8667 0.5098 1.0 light goldenrod +0 0.9333 0.8667 0.5098 1.0 LightGoldenrod +0 0.8549 0.6471 0.1255 1.0 goldenrod +0 0.7216 0.5255 0.0431 1.0 dark goldenrod +0 0.7216 0.5255 0.0431 1.0 DarkGoldenrod +0 0.7373 0.5608 0.5608 1.0 rosy brown +0 0.7373 0.5608 0.5608 1.0 RosyBrown +0 0.8039 0.3608 0.3608 1.0 indian red +0 0.8039 0.3608 0.3608 1.0 IndianRed +0 0.5451 0.2706 0.0745 1.0 saddle brown +0 0.5451 0.2706 0.0745 1.0 SaddleBrown +0 0.6275 0.3216 0.1765 1.0 sienna +0 0.8039 0.5216 0.2471 1.0 peru +0 0.8706 0.7216 0.5294 1.0 burlywood +0 0.9608 0.9608 0.8627 1.0 beige +0 0.9608 0.8706 0.7020 1.0 wheat +0 0.9569 0.6431 0.3765 1.0 sandy brown +0 0.9569 0.6431 0.3765 1.0 SandyBrown +0 0.8235 0.7059 0.5490 1.0 tan +0 0.8235 0.4118 0.1176 1.0 chocolate +0 0.6980 0.1333 0.1333 1.0 firebrick +0 0.6471 0.1647 0.1647 1.0 brown +0 0.9137 0.5882 0.4784 1.0 dark salmon +0 0.9137 0.5882 0.4784 1.0 DarkSalmon +0 0.9804 0.5020 0.4471 1.0 salmon +0 1.0000 0.6275 0.4784 1.0 light salmon +0 1.0000 0.6275 0.4784 1.0 LightSalmon +0 1.0000 0.6471 0.0000 1.0 orange +0 1.0000 0.5490 0.0000 1.0 dark orange +0 1.0000 0.5490 0.0000 1.0 DarkOrange +0 1.0000 0.4980 0.3137 1.0 coral +0 0.9412 0.5020 0.5020 1.0 light coral +0 0.9412 0.5020 0.5020 1.0 LightCoral +0 1.0000 0.3882 0.2784 1.0 tomato +0 1.0000 0.2706 0.0000 1.0 orange red +0 1.0000 0.2706 0.0000 1.0 OrangeRed +0 1.0000 0.0000 0.0000 1.0 red +0 1.0000 0.4118 0.7059 1.0 hot pink +0 1.0000 0.4118 0.7059 1.0 HotPink +0 1.0000 0.0784 0.5765 1.0 deep pink +0 1.0000 0.0784 0.5765 1.0 DeepPink +0 1.0000 0.7529 0.7961 1.0 pink +0 1.0000 0.7137 0.7569 1.0 light pink +0 1.0000 0.7137 0.7569 1.0 LightPink +0 0.8588 0.4392 0.5765 1.0 pale violet red +0 0.8588 0.4392 0.5765 1.0 PaleVioletRed +0 0.6902 0.1882 0.3765 1.0 maroon +0 0.7804 0.0824 0.5216 1.0 medium violet red +0 0.7804 0.0824 0.5216 1.0 MediumVioletRed +0 0.8157 0.1255 0.5647 1.0 violet red +0 0.8157 0.1255 0.5647 1.0 VioletRed +0 1.0000 0.0000 1.0000 1.0 magenta +0 0.9333 0.5098 0.9333 1.0 violet +0 0.8667 0.6275 0.8667 1.0 plum +0 0.8549 0.4392 0.8392 1.0 orchid +0 0.7294 0.3333 0.8275 1.0 medium orchid +0 0.7294 0.3333 0.8275 1.0 MediumOrchid +0 0.6000 0.1961 0.8000 1.0 dark orchid +0 0.6000 0.1961 0.8000 1.0 DarkOrchid +0 0.5804 0.0000 0.8275 1.0 dark violet +0 0.5804 0.0000 0.8275 1.0 DarkViolet +0 0.5412 0.1686 0.8863 1.0 blue violet +0 0.5412 0.1686 0.8863 1.0 BlueViolet +0 0.6275 0.1255 0.9412 1.0 purple +0 0.5765 0.4392 0.8588 1.0 medium purple +0 0.5765 0.4392 0.8588 1.0 MediumPurple +0 0.8471 0.7490 0.8471 1.0 thistle +0 1.0000 0.9804 0.9804 1.0 snow1 +0 0.9333 0.9137 0.9137 1.0 snow2 +0 0.8039 0.7882 0.7882 1.0 snow3 +0 0.5451 0.5373 0.5373 1.0 snow4 +0 1.0000 0.9608 0.9333 1.0 seashell1 +0 0.9333 0.8980 0.8706 1.0 seashell2 +0 0.8039 0.7725 0.7490 1.0 seashell3 +0 0.5451 0.5255 0.5098 1.0 seashell4 +0 1.0000 0.9373 0.8588 1.0 AntiqueWhite1 +0 0.9333 0.8745 0.8000 1.0 AntiqueWhite2 +0 0.8039 0.7529 0.6902 1.0 AntiqueWhite3 +0 0.5451 0.5137 0.4706 1.0 AntiqueWhite4 +0 1.0000 0.8941 0.7686 1.0 bisque1 +0 0.9333 0.8353 0.7176 1.0 bisque2 +0 0.8039 0.7176 0.6196 1.0 bisque3 +0 0.5451 0.4902 0.4196 1.0 bisque4 +0 1.0000 0.8549 0.7255 1.0 PeachPuff1 +0 0.9333 0.7961 0.6784 1.0 PeachPuff2 +0 0.8039 0.6863 0.5843 1.0 PeachPuff3 +0 0.5451 0.4667 0.3961 1.0 PeachPuff4 +0 1.0000 0.8706 0.6784 1.0 NavajoWhite1 +0 0.9333 0.8118 0.6314 1.0 NavajoWhite2 +0 0.8039 0.7020 0.5451 1.0 NavajoWhite3 +0 0.5451 0.4745 0.3686 1.0 NavajoWhite4 +0 1.0000 0.9804 0.8039 1.0 LemonChiffon1 +0 0.9333 0.9137 0.7490 1.0 LemonChiffon2 +0 0.8039 0.7882 0.6471 1.0 LemonChiffon3 +0 0.5451 0.5373 0.4392 1.0 LemonChiffon4 +0 1.0000 0.9725 0.8627 1.0 cornsilk1 +0 0.9333 0.9098 0.8039 1.0 cornsilk2 +0 0.8039 0.7843 0.6941 1.0 cornsilk3 +0 0.5451 0.5333 0.4706 1.0 cornsilk4 +0 1.0000 1.0000 0.9412 1.0 ivory1 +0 0.9333 0.9333 0.8784 1.0 ivory2 +0 0.8039 0.8039 0.7569 1.0 ivory3 +0 0.5451 0.5451 0.5137 1.0 ivory4 +0 0.9412 1.0000 0.9412 1.0 honeydew1 +0 0.8784 0.9333 0.8784 1.0 honeydew2 +0 0.7569 0.8039 0.7569 1.0 honeydew3 +0 0.5137 0.5451 0.5137 1.0 honeydew4 +0 1.0000 0.9412 0.9608 1.0 LavenderBlush1 +0 0.9333 0.8784 0.8980 1.0 LavenderBlush2 +0 0.8039 0.7569 0.7725 1.0 LavenderBlush3 +0 0.5451 0.5137 0.5255 1.0 LavenderBlush4 +0 1.0000 0.8941 0.8824 1.0 MistyRose1 +0 0.9333 0.8353 0.8235 1.0 MistyRose2 +0 0.8039 0.7176 0.7098 1.0 MistyRose3 +0 0.5451 0.4902 0.4824 1.0 MistyRose4 +0 0.9412 1.0000 1.0000 1.0 azure1 +0 0.8784 0.9333 0.9333 1.0 azure2 +0 0.7569 0.8039 0.8039 1.0 azure3 +0 0.5137 0.5451 0.5451 1.0 azure4 +0 0.5137 0.4353 1.0000 1.0 SlateBlue1 +0 0.4784 0.4039 0.9333 1.0 SlateBlue2 +0 0.4118 0.3490 0.8039 1.0 SlateBlue3 +0 0.2784 0.2353 0.5451 1.0 SlateBlue4 +0 0.2824 0.4627 1.0000 1.0 RoyalBlue1 +0 0.2627 0.4314 0.9333 1.0 RoyalBlue2 +0 0.2275 0.3725 0.8039 1.0 RoyalBlue3 +0 0.1529 0.2510 0.5451 1.0 RoyalBlue4 +0 0.0000 0.0000 1.0000 1.0 blue1 +0 0.0000 0.0000 0.9333 1.0 blue2 +0 0.0000 0.0000 0.8039 1.0 blue3 +0 0.0000 0.0000 0.5451 1.0 blue4 +0 0.1176 0.5647 1.0000 1.0 DodgerBlue1 +0 0.1098 0.5255 0.9333 1.0 DodgerBlue2 +0 0.0941 0.4549 0.8039 1.0 DodgerBlue3 +0 0.0627 0.3059 0.5451 1.0 DodgerBlue4 +0 0.3882 0.7216 1.0000 1.0 SteelBlue1 +0 0.3608 0.6745 0.9333 1.0 SteelBlue2 +0 0.3098 0.5804 0.8039 1.0 SteelBlue3 +0 0.2118 0.3922 0.5451 1.0 SteelBlue4 +0 0.0000 0.7490 1.0000 1.0 DeepSkyBlue1 +0 0.0000 0.6980 0.9333 1.0 DeepSkyBlue2 +0 0.0000 0.6039 0.8039 1.0 DeepSkyBlue3 +0 0.0000 0.4078 0.5451 1.0 DeepSkyBlue4 +0 0.5294 0.8078 1.0000 1.0 SkyBlue1 +0 0.4941 0.7529 0.9333 1.0 SkyBlue2 +0 0.4235 0.6510 0.8039 1.0 SkyBlue3 +0 0.2902 0.4392 0.5451 1.0 SkyBlue4 +0 0.6902 0.8863 1.0000 1.0 LightSkyBlue1 +0 0.6431 0.8275 0.9333 1.0 LightSkyBlue2 +0 0.5529 0.7137 0.8039 1.0 LightSkyBlue3 +0 0.3765 0.4824 0.5451 1.0 LightSkyBlue4 +0 0.7765 0.8863 1.0000 1.0 SlateGray1 +0 0.7255 0.8275 0.9333 1.0 SlateGray2 +0 0.6235 0.7137 0.8039 1.0 SlateGray3 +0 0.4235 0.4824 0.5451 1.0 SlateGray4 +0 0.7922 0.8824 1.0000 1.0 LightSteelBlue1 +0 0.7373 0.8235 0.9333 1.0 LightSteelBlue2 +0 0.6353 0.7098 0.8039 1.0 LightSteelBlue3 +0 0.4314 0.4824 0.5451 1.0 LightSteelBlue4 +0 0.7490 0.9373 1.0000 1.0 LightBlue1 +0 0.6980 0.8745 0.9333 1.0 LightBlue2 +0 0.6039 0.7529 0.8039 1.0 LightBlue3 +0 0.4078 0.5137 0.5451 1.0 LightBlue4 +0 0.8784 1.0000 1.0000 1.0 LightCyan1 +0 0.8196 0.9333 0.9333 1.0 LightCyan2 +0 0.7059 0.8039 0.8039 1.0 LightCyan3 +0 0.4784 0.5451 0.5451 1.0 LightCyan4 +0 0.7333 1.0000 1.0000 1.0 PaleTurquoise1 +0 0.6824 0.9333 0.9333 1.0 PaleTurquoise2 +0 0.5882 0.8039 0.8039 1.0 PaleTurquoise3 +0 0.4000 0.5451 0.5451 1.0 PaleTurquoise4 +0 0.5961 0.9608 1.0000 1.0 CadetBlue1 +0 0.5569 0.8980 0.9333 1.0 CadetBlue2 +0 0.4784 0.7725 0.8039 1.0 CadetBlue3 +0 0.3255 0.5255 0.5451 1.0 CadetBlue4 +0 0.0000 0.9608 1.0000 1.0 turquoise1 +0 0.0000 0.8980 0.9333 1.0 turquoise2 +0 0.0000 0.7725 0.8039 1.0 turquoise3 +0 0.0000 0.5255 0.5451 1.0 turquoise4 +0 0.0000 1.0000 1.0000 1.0 cyan1 +0 0.0000 0.9333 0.9333 1.0 cyan2 +0 0.0000 0.8039 0.8039 1.0 cyan3 +0 0.0000 0.5451 0.5451 1.0 cyan4 +0 0.5922 1.0000 1.0000 1.0 DarkSlateGray1 +0 0.5529 0.9333 0.9333 1.0 DarkSlateGray2 +0 0.4745 0.8039 0.8039 1.0 DarkSlateGray3 +0 0.3216 0.5451 0.5451 1.0 DarkSlateGray4 +0 0.4980 1.0000 0.8314 1.0 aquamarine1 +0 0.4627 0.9333 0.7765 1.0 aquamarine2 +0 0.4000 0.8039 0.6667 1.0 aquamarine3 +0 0.2706 0.5451 0.4549 1.0 aquamarine4 +0 0.7569 1.0000 0.7569 1.0 DarkSeaGreen1 +0 0.7059 0.9333 0.7059 1.0 DarkSeaGreen2 +0 0.6078 0.8039 0.6078 1.0 DarkSeaGreen3 +0 0.4118 0.5451 0.4118 1.0 DarkSeaGreen4 +0 0.3294 1.0000 0.6235 1.0 SeaGreen1 +0 0.3059 0.9333 0.5804 1.0 SeaGreen2 +0 0.2627 0.8039 0.5020 1.0 SeaGreen3 +0 0.1804 0.5451 0.3412 1.0 SeaGreen4 +0 0.6039 1.0000 0.6039 1.0 PaleGreen1 +0 0.5647 0.9333 0.5647 1.0 PaleGreen2 +0 0.4863 0.8039 0.4863 1.0 PaleGreen3 +0 0.3294 0.5451 0.3294 1.0 PaleGreen4 +0 0.0000 1.0000 0.4980 1.0 SpringGreen1 +0 0.0000 0.9333 0.4627 1.0 SpringGreen2 +0 0.0000 0.8039 0.4000 1.0 SpringGreen3 +0 0.0000 0.5451 0.2706 1.0 SpringGreen4 +0 0.0000 1.0000 0.0000 1.0 green1 +0 0.0000 0.9333 0.0000 1.0 green2 +0 0.0000 0.8039 0.0000 1.0 green3 +0 0.0000 0.5451 0.0000 1.0 green4 +0 0.4980 1.0000 0.0000 1.0 chartreuse1 +0 0.4627 0.9333 0.0000 1.0 chartreuse2 +0 0.4000 0.8039 0.0000 1.0 chartreuse3 +0 0.2706 0.5451 0.0000 1.0 chartreuse4 +0 0.7529 1.0000 0.2431 1.0 OliveDrab1 +0 0.7020 0.9333 0.2275 1.0 OliveDrab2 +0 0.6039 0.8039 0.1961 1.0 OliveDrab3 +0 0.4118 0.5451 0.1333 1.0 OliveDrab4 +0 0.7922 1.0000 0.4392 1.0 DarkOliveGreen1 +0 0.7373 0.9333 0.4078 1.0 DarkOliveGreen2 +0 0.6353 0.8039 0.3529 1.0 DarkOliveGreen3 +0 0.4314 0.5451 0.2392 1.0 DarkOliveGreen4 +0 1.0000 0.9647 0.5608 1.0 khaki1 +0 0.9333 0.9020 0.5216 1.0 khaki2 +0 0.8039 0.7765 0.4510 1.0 khaki3 +0 0.5451 0.5255 0.3059 1.0 khaki4 +0 1.0000 0.9255 0.5451 1.0 LightGoldenrod1 +0 0.9333 0.8627 0.5098 1.0 LightGoldenrod2 +0 0.8039 0.7451 0.4392 1.0 LightGoldenrod3 +0 0.5451 0.5059 0.2980 1.0 LightGoldenrod4 +0 1.0000 1.0000 0.8784 1.0 LightYellow1 +0 0.9333 0.9333 0.8196 1.0 LightYellow2 +0 0.8039 0.8039 0.7059 1.0 LightYellow3 +0 0.5451 0.5451 0.4784 1.0 LightYellow4 +0 1.0000 1.0000 0.0000 1.0 yellow1 +0 0.9333 0.9333 0.0000 1.0 yellow2 +0 0.8039 0.8039 0.0000 1.0 yellow3 +0 0.5451 0.5451 0.0000 1.0 yellow4 +0 1.0000 0.8431 0.0000 1.0 gold1 +0 0.9333 0.7882 0.0000 1.0 gold2 +0 0.8039 0.6784 0.0000 1.0 gold3 +0 0.5451 0.4588 0.0000 1.0 gold4 +0 1.0000 0.7569 0.1451 1.0 goldenrod1 +0 0.9333 0.7059 0.1333 1.0 goldenrod2 +0 0.8039 0.6078 0.1137 1.0 goldenrod3 +0 0.5451 0.4118 0.0784 1.0 goldenrod4 +0 1.0000 0.7255 0.0588 1.0 DarkGoldenrod1 +0 0.9333 0.6784 0.0549 1.0 DarkGoldenrod2 +0 0.8039 0.5843 0.0471 1.0 DarkGoldenrod3 +0 0.5451 0.3961 0.0314 1.0 DarkGoldenrod4 +0 1.0000 0.7569 0.7569 1.0 RosyBrown1 +0 0.9333 0.7059 0.7059 1.0 RosyBrown2 +0 0.8039 0.6078 0.6078 1.0 RosyBrown3 +0 0.5451 0.4118 0.4118 1.0 RosyBrown4 +0 1.0000 0.4157 0.4157 1.0 IndianRed1 +0 0.9333 0.3882 0.3882 1.0 IndianRed2 +0 0.8039 0.3333 0.3333 1.0 IndianRed3 +0 0.5451 0.2275 0.2275 1.0 IndianRed4 +0 1.0000 0.5098 0.2784 1.0 sienna1 +0 0.9333 0.4745 0.2588 1.0 sienna2 +0 0.8039 0.4078 0.2235 1.0 sienna3 +0 0.5451 0.2784 0.1490 1.0 sienna4 +0 1.0000 0.8275 0.6078 1.0 burlywood1 +0 0.9333 0.7725 0.5686 1.0 burlywood2 +0 0.8039 0.6667 0.4902 1.0 burlywood3 +0 0.5451 0.4510 0.3333 1.0 burlywood4 +0 1.0000 0.9059 0.7294 1.0 wheat1 +0 0.9333 0.8471 0.6824 1.0 wheat2 +0 0.8039 0.7294 0.5882 1.0 wheat3 +0 0.5451 0.4941 0.4000 1.0 wheat4 +0 1.0000 0.6471 0.3098 1.0 tan1 +0 0.9333 0.6039 0.2863 1.0 tan2 +0 0.8039 0.5216 0.2471 1.0 tan3 +0 0.5451 0.3529 0.1686 1.0 tan4 +0 1.0000 0.4980 0.1412 1.0 chocolate1 +0 0.9333 0.4627 0.1294 1.0 chocolate2 +0 0.8039 0.4000 0.1137 1.0 chocolate3 +0 0.5451 0.2706 0.0745 1.0 chocolate4 +0 1.0000 0.1882 0.1882 1.0 firebrick1 +0 0.9333 0.1725 0.1725 1.0 firebrick2 +0 0.8039 0.1490 0.1490 1.0 firebrick3 +0 0.5451 0.1020 0.1020 1.0 firebrick4 +0 1.0000 0.2510 0.2510 1.0 brown1 +0 0.9333 0.2314 0.2314 1.0 brown2 +0 0.8039 0.2000 0.2000 1.0 brown3 +0 0.5451 0.1373 0.1373 1.0 brown4 +0 1.0000 0.5490 0.4118 1.0 salmon1 +0 0.9333 0.5098 0.3843 1.0 salmon2 +0 0.8039 0.4392 0.3294 1.0 salmon3 +0 0.5451 0.2980 0.2235 1.0 salmon4 +0 1.0000 0.6275 0.4784 1.0 LightSalmon1 +0 0.9333 0.5843 0.4471 1.0 LightSalmon2 +0 0.8039 0.5059 0.3843 1.0 LightSalmon3 +0 0.5451 0.3412 0.2588 1.0 LightSalmon4 +0 1.0000 0.6471 0.0000 1.0 orange1 +0 0.9333 0.6039 0.0000 1.0 orange2 +0 0.8039 0.5216 0.0000 1.0 orange3 +0 0.5451 0.3529 0.0000 1.0 orange4 +0 1.0000 0.4980 0.0000 1.0 DarkOrange1 +0 0.9333 0.4627 0.0000 1.0 DarkOrange2 +0 0.8039 0.4000 0.0000 1.0 DarkOrange3 +0 0.5451 0.2706 0.0000 1.0 DarkOrange4 +0 1.0000 0.4471 0.3373 1.0 coral1 +0 0.9333 0.4157 0.3137 1.0 coral2 +0 0.8039 0.3569 0.2706 1.0 coral3 +0 0.5451 0.2431 0.1843 1.0 coral4 +0 1.0000 0.3882 0.2784 1.0 tomato1 +0 0.9333 0.3608 0.2588 1.0 tomato2 +0 0.8039 0.3098 0.2235 1.0 tomato3 +0 0.5451 0.2118 0.1490 1.0 tomato4 +0 1.0000 0.2706 0.0000 1.0 OrangeRed1 +0 0.9333 0.2510 0.0000 1.0 OrangeRed2 +0 0.8039 0.2157 0.0000 1.0 OrangeRed3 +0 0.5451 0.1451 0.0000 1.0 OrangeRed4 +0 1.0000 0.0000 0.0000 1.0 red1 +0 0.9333 0.0000 0.0000 1.0 red2 +0 0.8039 0.0000 0.0000 1.0 red3 +0 0.5451 0.0000 0.0000 1.0 red4 +0 1.0000 0.0784 0.5765 1.0 DeepPink1 +0 0.9333 0.0706 0.5373 1.0 DeepPink2 +0 0.8039 0.0627 0.4627 1.0 DeepPink3 +0 0.5451 0.0392 0.3137 1.0 DeepPink4 +0 1.0000 0.4314 0.7059 1.0 HotPink1 +0 0.9333 0.4157 0.6549 1.0 HotPink2 +0 0.8039 0.3765 0.5647 1.0 HotPink3 +0 0.5451 0.2275 0.3843 1.0 HotPink4 +0 1.0000 0.7098 0.7725 1.0 pink1 +0 0.9333 0.6627 0.7216 1.0 pink2 +0 0.8039 0.5686 0.6196 1.0 pink3 +0 0.5451 0.3882 0.4235 1.0 pink4 +0 1.0000 0.6824 0.7255 1.0 LightPink1 +0 0.9333 0.6353 0.6784 1.0 LightPink2 +0 0.8039 0.5490 0.5843 1.0 LightPink3 +0 0.5451 0.3725 0.3961 1.0 LightPink4 +0 1.0000 0.5098 0.6706 1.0 PaleVioletRed1 +0 0.9333 0.4745 0.6235 1.0 PaleVioletRed2 +0 0.8039 0.4078 0.5373 1.0 PaleVioletRed3 +0 0.5451 0.2784 0.3647 1.0 PaleVioletRed4 +0 1.0000 0.2039 0.7020 1.0 maroon1 +0 0.9333 0.1882 0.6549 1.0 maroon2 +0 0.8039 0.1608 0.5647 1.0 maroon3 +0 0.5451 0.1098 0.3843 1.0 maroon4 +0 1.0000 0.2431 0.5882 1.0 VioletRed1 +0 0.9333 0.2275 0.5490 1.0 VioletRed2 +0 0.8039 0.1961 0.4706 1.0 VioletRed3 +0 0.5451 0.1333 0.3216 1.0 VioletRed4 +0 1.0000 0.0000 1.0000 1.0 magenta1 +0 0.9333 0.0000 0.9333 1.0 magenta2 +0 0.8039 0.0000 0.8039 1.0 magenta3 +0 0.5451 0.0000 0.5451 1.0 magenta4 +0 1.0000 0.5137 0.9804 1.0 orchid1 +0 0.9333 0.4784 0.9137 1.0 orchid2 +0 0.8039 0.4118 0.7882 1.0 orchid3 +0 0.5451 0.2784 0.5373 1.0 orchid4 +0 1.0000 0.7333 1.0000 1.0 plum1 +0 0.9333 0.6824 0.9333 1.0 plum2 +0 0.8039 0.5882 0.8039 1.0 plum3 +0 0.5451 0.4000 0.5451 1.0 plum4 +0 0.8784 0.4000 1.0000 1.0 MediumOrchid1 +0 0.8196 0.3725 0.9333 1.0 MediumOrchid2 +0 0.7059 0.3216 0.8039 1.0 MediumOrchid3 +0 0.4784 0.2157 0.5451 1.0 MediumOrchid4 +0 0.7490 0.2431 1.0000 1.0 DarkOrchid1 +0 0.6980 0.2275 0.9333 1.0 DarkOrchid2 +0 0.6039 0.1961 0.8039 1.0 DarkOrchid3 +0 0.4078 0.1333 0.5451 1.0 DarkOrchid4 +0 0.6078 0.1882 1.0000 1.0 purple1 +0 0.5686 0.1725 0.9333 1.0 purple2 +0 0.4902 0.1490 0.8039 1.0 purple3 +0 0.3333 0.1020 0.5451 1.0 purple4 +0 0.6706 0.5098 1.0000 1.0 MediumPurple1 +0 0.6235 0.4745 0.9333 1.0 MediumPurple2 +0 0.5373 0.4078 0.8039 1.0 MediumPurple3 +0 0.3647 0.2784 0.5451 1.0 MediumPurple4 +0 1.0000 0.8824 1.0000 1.0 thistle1 +0 0.9333 0.8235 0.9333 1.0 thistle2 +0 0.8039 0.7098 0.8039 1.0 thistle3 +0 0.5451 0.4824 0.5451 1.0 thistle4 +0 0.0000 0.0000 0.0000 1.0 gray0 +0 0.0000 0.0000 0.0000 1.0 grey0 +0 0.0118 0.0118 0.0118 1.0 gray1 +0 0.0118 0.0118 0.0118 1.0 grey1 +0 0.0196 0.0196 0.0196 1.0 gray2 +0 0.0196 0.0196 0.0196 1.0 grey2 +0 0.0314 0.0314 0.0314 1.0 gray3 +0 0.0314 0.0314 0.0314 1.0 grey3 +0 0.0392 0.0392 0.0392 1.0 gray4 +0 0.0392 0.0392 0.0392 1.0 grey4 +0 0.0510 0.0510 0.0510 1.0 gray5 +0 0.0510 0.0510 0.0510 1.0 grey5 +0 0.0588 0.0588 0.0588 1.0 gray6 +0 0.0588 0.0588 0.0588 1.0 grey6 +0 0.0706 0.0706 0.0706 1.0 gray7 +0 0.0706 0.0706 0.0706 1.0 grey7 +0 0.0784 0.0784 0.0784 1.0 gray8 +0 0.0784 0.0784 0.0784 1.0 grey8 +0 0.0902 0.0902 0.0902 1.0 gray9 +0 0.0902 0.0902 0.0902 1.0 grey9 +0 0.1020 0.1020 0.1020 1.0 gray10 +0 0.1020 0.1020 0.1020 1.0 grey10 +0 0.1098 0.1098 0.1098 1.0 gray11 +0 0.1098 0.1098 0.1098 1.0 grey11 +0 0.1216 0.1216 0.1216 1.0 gray12 +0 0.1216 0.1216 0.1216 1.0 grey12 +0 0.1294 0.1294 0.1294 1.0 gray13 +0 0.1294 0.1294 0.1294 1.0 grey13 +0 0.1412 0.1412 0.1412 1.0 gray14 +0 0.1412 0.1412 0.1412 1.0 grey14 +0 0.1490 0.1490 0.1490 1.0 gray15 +0 0.1490 0.1490 0.1490 1.0 grey15 +0 0.1608 0.1608 0.1608 1.0 gray16 +0 0.1608 0.1608 0.1608 1.0 grey16 +0 0.1686 0.1686 0.1686 1.0 gray17 +0 0.1686 0.1686 0.1686 1.0 grey17 +0 0.1804 0.1804 0.1804 1.0 gray18 +0 0.1804 0.1804 0.1804 1.0 grey18 +0 0.1882 0.1882 0.1882 1.0 gray19 +0 0.1882 0.1882 0.1882 1.0 grey19 +0 0.2000 0.2000 0.2000 1.0 gray20 +0 0.2000 0.2000 0.2000 1.0 grey20 +0 0.2118 0.2118 0.2118 1.0 gray21 +0 0.2118 0.2118 0.2118 1.0 grey21 +0 0.2196 0.2196 0.2196 1.0 gray22 +0 0.2196 0.2196 0.2196 1.0 grey22 +0 0.2314 0.2314 0.2314 1.0 gray23 +0 0.2314 0.2314 0.2314 1.0 grey23 +0 0.2392 0.2392 0.2392 1.0 gray24 +0 0.2392 0.2392 0.2392 1.0 grey24 +0 0.2510 0.2510 0.2510 1.0 gray25 +0 0.2510 0.2510 0.2510 1.0 grey25 +0 0.2588 0.2588 0.2588 1.0 gray26 +0 0.2588 0.2588 0.2588 1.0 grey26 +0 0.2706 0.2706 0.2706 1.0 gray27 +0 0.2706 0.2706 0.2706 1.0 grey27 +0 0.2784 0.2784 0.2784 1.0 gray28 +0 0.2784 0.2784 0.2784 1.0 grey28 +0 0.2902 0.2902 0.2902 1.0 gray29 +0 0.2902 0.2902 0.2902 1.0 grey29 +0 0.3020 0.3020 0.3020 1.0 gray30 +0 0.3020 0.3020 0.3020 1.0 grey30 +0 0.3098 0.3098 0.3098 1.0 gray31 +0 0.3098 0.3098 0.3098 1.0 grey31 +0 0.3216 0.3216 0.3216 1.0 gray32 +0 0.3216 0.3216 0.3216 1.0 grey32 +0 0.3294 0.3294 0.3294 1.0 gray33 +0 0.3294 0.3294 0.3294 1.0 grey33 +0 0.3412 0.3412 0.3412 1.0 gray34 +0 0.3412 0.3412 0.3412 1.0 grey34 +0 0.3490 0.3490 0.3490 1.0 gray35 +0 0.3490 0.3490 0.3490 1.0 grey35 +0 0.3608 0.3608 0.3608 1.0 gray36 +0 0.3608 0.3608 0.3608 1.0 grey36 +0 0.3686 0.3686 0.3686 1.0 gray37 +0 0.3686 0.3686 0.3686 1.0 grey37 +0 0.3804 0.3804 0.3804 1.0 gray38 +0 0.3804 0.3804 0.3804 1.0 grey38 +0 0.3882 0.3882 0.3882 1.0 gray39 +0 0.3882 0.3882 0.3882 1.0 grey39 +0 0.4000 0.4000 0.4000 1.0 gray40 +0 0.4000 0.4000 0.4000 1.0 grey40 +0 0.4118 0.4118 0.4118 1.0 gray41 +0 0.4118 0.4118 0.4118 1.0 grey41 +0 0.4196 0.4196 0.4196 1.0 gray42 +0 0.4196 0.4196 0.4196 1.0 grey42 +0 0.4314 0.4314 0.4314 1.0 gray43 +0 0.4314 0.4314 0.4314 1.0 grey43 +0 0.4392 0.4392 0.4392 1.0 gray44 +0 0.4392 0.4392 0.4392 1.0 grey44 +0 0.4510 0.4510 0.4510 1.0 gray45 +0 0.4510 0.4510 0.4510 1.0 grey45 +0 0.4588 0.4588 0.4588 1.0 gray46 +0 0.4588 0.4588 0.4588 1.0 grey46 +0 0.4706 0.4706 0.4706 1.0 gray47 +0 0.4706 0.4706 0.4706 1.0 grey47 +0 0.4784 0.4784 0.4784 1.0 gray48 +0 0.4784 0.4784 0.4784 1.0 grey48 +0 0.4902 0.4902 0.4902 1.0 gray49 +0 0.4902 0.4902 0.4902 1.0 grey49 +0 0.4980 0.4980 0.4980 1.0 gray50 +0 0.4980 0.4980 0.4980 1.0 grey50 +0 0.5098 0.5098 0.5098 1.0 gray51 +0 0.5098 0.5098 0.5098 1.0 grey51 +0 0.5216 0.5216 0.5216 1.0 gray52 +0 0.5216 0.5216 0.5216 1.0 grey52 +0 0.5294 0.5294 0.5294 1.0 gray53 +0 0.5294 0.5294 0.5294 1.0 grey53 +0 0.5412 0.5412 0.5412 1.0 gray54 +0 0.5412 0.5412 0.5412 1.0 grey54 +0 0.5490 0.5490 0.5490 1.0 gray55 +0 0.5490 0.5490 0.5490 1.0 grey55 +0 0.5608 0.5608 0.5608 1.0 gray56 +0 0.5608 0.5608 0.5608 1.0 grey56 +0 0.5686 0.5686 0.5686 1.0 gray57 +0 0.5686 0.5686 0.5686 1.0 grey57 +0 0.5804 0.5804 0.5804 1.0 gray58 +0 0.5804 0.5804 0.5804 1.0 grey58 +0 0.5882 0.5882 0.5882 1.0 gray59 +0 0.5882 0.5882 0.5882 1.0 grey59 +0 0.6000 0.6000 0.6000 1.0 gray60 +0 0.6000 0.6000 0.6000 1.0 grey60 +0 0.6118 0.6118 0.6118 1.0 gray61 +0 0.6118 0.6118 0.6118 1.0 grey61 +0 0.6196 0.6196 0.6196 1.0 gray62 +0 0.6196 0.6196 0.6196 1.0 grey62 +0 0.6314 0.6314 0.6314 1.0 gray63 +0 0.6314 0.6314 0.6314 1.0 grey63 +0 0.6392 0.6392 0.6392 1.0 gray64 +0 0.6392 0.6392 0.6392 1.0 grey64 +0 0.6510 0.6510 0.6510 1.0 gray65 +0 0.6510 0.6510 0.6510 1.0 grey65 +0 0.6588 0.6588 0.6588 1.0 gray66 +0 0.6588 0.6588 0.6588 1.0 grey66 +0 0.6706 0.6706 0.6706 1.0 gray67 +0 0.6706 0.6706 0.6706 1.0 grey67 +0 0.6784 0.6784 0.6784 1.0 gray68 +0 0.6784 0.6784 0.6784 1.0 grey68 +0 0.6902 0.6902 0.6902 1.0 gray69 +0 0.6902 0.6902 0.6902 1.0 grey69 +0 0.7020 0.7020 0.7020 1.0 gray70 +0 0.7020 0.7020 0.7020 1.0 grey70 +0 0.7098 0.7098 0.7098 1.0 gray71 +0 0.7098 0.7098 0.7098 1.0 grey71 +0 0.7216 0.7216 0.7216 1.0 gray72 +0 0.7216 0.7216 0.7216 1.0 grey72 +0 0.7294 0.7294 0.7294 1.0 gray73 +0 0.7294 0.7294 0.7294 1.0 grey73 +0 0.7412 0.7412 0.7412 1.0 gray74 +0 0.7412 0.7412 0.7412 1.0 grey74 +0 0.7490 0.7490 0.7490 1.0 gray75 +0 0.7490 0.7490 0.7490 1.0 grey75 +0 0.7608 0.7608 0.7608 1.0 gray76 +0 0.7608 0.7608 0.7608 1.0 grey76 +0 0.7686 0.7686 0.7686 1.0 gray77 +0 0.7686 0.7686 0.7686 1.0 grey77 +0 0.7804 0.7804 0.7804 1.0 gray78 +0 0.7804 0.7804 0.7804 1.0 grey78 +0 0.7882 0.7882 0.7882 1.0 gray79 +0 0.7882 0.7882 0.7882 1.0 grey79 +0 0.8000 0.8000 0.8000 1.0 gray80 +0 0.8000 0.8000 0.8000 1.0 grey80 +0 0.8118 0.8118 0.8118 1.0 gray81 +0 0.8118 0.8118 0.8118 1.0 grey81 +0 0.8196 0.8196 0.8196 1.0 gray82 +0 0.8196 0.8196 0.8196 1.0 grey82 +0 0.8314 0.8314 0.8314 1.0 gray83 +0 0.8314 0.8314 0.8314 1.0 grey83 +0 0.8392 0.8392 0.8392 1.0 gray84 +0 0.8392 0.8392 0.8392 1.0 grey84 +0 0.8510 0.8510 0.8510 1.0 gray85 +0 0.8510 0.8510 0.8510 1.0 grey85 +0 0.8588 0.8588 0.8588 1.0 gray86 +0 0.8588 0.8588 0.8588 1.0 grey86 +0 0.8706 0.8706 0.8706 1.0 gray87 +0 0.8706 0.8706 0.8706 1.0 grey87 +0 0.8784 0.8784 0.8784 1.0 gray88 +0 0.8784 0.8784 0.8784 1.0 grey88 +0 0.8902 0.8902 0.8902 1.0 gray89 +0 0.8902 0.8902 0.8902 1.0 grey89 +0 0.8980 0.8980 0.8980 1.0 gray90 +0 0.8980 0.8980 0.8980 1.0 grey90 +0 0.9098 0.9098 0.9098 1.0 gray91 +0 0.9098 0.9098 0.9098 1.0 grey91 +0 0.9216 0.9216 0.9216 1.0 gray92 +0 0.9216 0.9216 0.9216 1.0 grey92 +0 0.9294 0.9294 0.9294 1.0 gray93 +0 0.9294 0.9294 0.9294 1.0 grey93 +0 0.9412 0.9412 0.9412 1.0 gray94 +0 0.9412 0.9412 0.9412 1.0 grey94 +0 0.9490 0.9490 0.9490 1.0 gray95 +0 0.9490 0.9490 0.9490 1.0 grey95 +0 0.9608 0.9608 0.9608 1.0 gray96 +0 0.9608 0.9608 0.9608 1.0 grey96 +0 0.9686 0.9686 0.9686 1.0 gray97 +0 0.9686 0.9686 0.9686 1.0 grey97 +0 0.9804 0.9804 0.9804 1.0 gray98 +0 0.9804 0.9804 0.9804 1.0 grey98 +0 0.9882 0.9882 0.9882 1.0 gray99 +0 0.9882 0.9882 0.9882 1.0 grey99 +0 1.0000 1.0000 1.0000 1.0 gray100 +0 1.0000 1.0000 1.0000 1.0 grey100 +0 0.6627 0.6627 0.6627 1.0 dark grey +0 0.6627 0.6627 0.6627 1.0 DarkGrey +0 0.6627 0.6627 0.6627 1.0 dark gray +0 0.6627 0.6627 0.6627 1.0 DarkGray +0 0.0000 0.0000 0.5451 1.0 dark blue +0 0.0000 0.0000 0.5451 1.0 DarkBlue +0 0.0000 0.5451 0.5451 1.0 dark cyan +0 0.0000 0.5451 0.5451 1.0 DarkCyan +0 0.5451 0.0000 0.5451 1.0 dark magenta +0 0.5451 0.0000 0.5451 1.0 DarkMagenta +0 0.5451 0.0000 0.0000 1.0 dark red +0 0.5451 0.0000 0.0000 1.0 DarkRed +0 0.5647 0.9333 0.5647 1.0 light green +0 0.5647 0.9333 0.5647 1.0 LightGreen diff --git a/doc-bm-c.icns b/doc-bm-c.icns new file mode 100644 index 0000000000000000000000000000000000000000..335f8bfa3f7420f5f89618c8b108a7728a5d1873 GIT binary patch literal 39682 zcmeI52S60p+Wu!NEQlxyih`OL>@kVv#)jsmc-5#$?ibTE-WXGj#uSa%nb|@IL7D|r zY)BEj3RDx_TVhIu61V*cXpW*C9EGH2{X;qzvSauwNG0WkQ{0*fvhrk#Wb#Mr8 zr&d*#5*WR)0d#PTR$EhD39(Hrq*P-=eO)zV(b9%ttyoKQb5mm-l-owMGF!-_hBMgc zs%F@uYKA?kW@y-1HC0qKLqo_|RyFt$H-wrRqN=Hu!y&vGGc-h1Q$6zzjG~O`HFuD&7fmx^z+;%c^br0IpM#Fq zbRBnu&h2^J;XS>_`Hqf-y^c5ZI{vWd@ry0Jjz5Ou7u^MR^mifN^MNQ!h{CeiJ&H;q`-Chi2AcJ5 zu)pB;&8yCy4}+m7ZwRu=C33KAA`9ybBc9Jj8786rNJw}R8y$K7ZlJ{5&Bf___@g@z z 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 Kly0|u-~Rz``Z@0a literal 0 HcmV?d00001 diff --git a/doc-bm-html.icns b/doc-bm-html.icns new file mode 100644 index 0000000000000000000000000000000000000000..4b15485ad0e5f3b4a40b6b1fc7ac751a5bf796e4 GIT binary patch literal 40619 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 literal 0 HcmV?d00001 diff --git a/doc-bm-pl.icns b/doc-bm-pl.icns new file mode 100644 index 0000000000000000000000000000000000000000..5d09ccca6b0f2114b89bad07586bef29590b7083 GIT binary patch literal 39845 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 literal 0 HcmV?d00001 diff --git a/doc-bm-txt.icns b/doc-bm-txt.icns new file mode 100644 index 0000000000000000000000000000000000000000..2219e2ce99a31bcd9c4c7b9e0b3c8bd3033b6d36 GIT binary patch literal 40106 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%0A4b?85|D zmAdT1Q~NXA=Rih%2-~o(+%}9R4`mx>SR)M(83Cp3Zx>eWrnE1B&J^ZYY{E)%n=lBe zfY1mytlS*(G~m$8?CxVkyqjA!Cb-Ez^jNWcpVKXE9wd!33;`hj*#{^ zyMmPvZ4Gt>n{9sUgR#1T4`A}TmWGrJFnNVuP#U8vcqZivhE`8M2jumXHZ;G}6+9a9 zx{$e!as|T|n6AO(^%wZz^)Zmwg-j*N6}%c+x}S0d!w+M11vAlf$`y=TO}T>MJ2J=O z3Wl%O#I9fiW%vQRf)B$F1G<7qa2XHp3PxP4J<}2n3o;r{#m{ehM;FT|jRGHrG3GU{uU@xxj&s{b9ao6}&rf9N)R^X`v zS%KkI+Q>b?(+2ba3y|ix*ngSoDynGg_TNP-HGA5BWq_4mN2~4fMi1iutp@+^)Wtph zzlspntktX@{$C@&x;_2Bu*HFkb(H?!{}f@x#$RJ7oZrj%dlF;K;k>^m;TZ#ae|Z2_ z`S4fJ3YPRPunKxDlp&ObzpEI$(2Yv?>zLuoN&v3*1*`ul`>*0ubrkkrV*t_r?e^cH zs45+(>VK{Mmq%HK6}A744yumW{o5O=K704?e(KAx{|=jR?;DNIWOG#2CuwL*9{Ei} zLt~P_|+@ony09i2I|XJ}1PS5acp$5H^iP*t9! z)${AKNBnb3sbs^*#Kfhw@z%$6NPyx>(zaj-Zll%%4@NDu^+wq7F zrOzn;hzodD`JsRj9m$?q{*IOr74YoxcQk#DdtjIsr_V5dN7KgHQ#h=l3wW0KJE|7V z)KF#)`QrGQ=I^-ug0|YwBk*kVH@!PolQU!oJlp&o7Z*(*x&xkZ{g>NT|HhZ+Ou`>X8tnG0+rQ~m9gU$@ zfM=cmy%m3L{>>}r{-y2T^4I5|tTeR|6e=*Ci;J(|NqMM zcVhlc%)g2GH~0&HXMO&exc(-tzlrN_;`;lmUjI+5KNIWE#QHO_{!FYt1NXqh`44~o zYaBlRG|*?F;IWDQXJY@E*ncMWpMh6j@WWG|Kb=^A23bDG{P4v3JF)&wtiKcM@5K5$ za1TuEKNIKwiPt}4_WuleP8r$fKmOAE&8 z^c@>snhl?S8+`wT??ef>(*sy8ymMvSy>$YXf z=1m*kczyYNE%l*ofinNGj_%TzUR^o9w^v_Us;i?l2|j>5#Pq|jKu6)f9)VGNuFmY4 z+M4Rh!+Zc87cdI{`S4D4Y*1I_ut(qyr_mTp7Msmh8s8fzvPR~Pr{NoY{BM+QzjNRJ E0WqikivR!s literal 0 HcmV?d00001 diff --git a/doc-bm.icns b/doc-bm.icns new file mode 100644 index 0000000000000000000000000000000000000000..984d11d0473483bec2d9f13d06296b21e82e8714 GIT binary patch literal 42287 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 pgHVUlXz +#import "MMBackend.h" +#import "MacVim.h" +#import "vim.h" + + + +// -- Initialization -------------------------------------------------------- + +/* + * Parse the GUI related command-line arguments. Any arguments used are + * deleted from argv, and *argc is decremented accordingly. This is called + * when vim is started, whether or not the GUI has been started. + */ + void +gui_mch_prepare(int *argc, char **argv) +{ + //NSLog(@"gui_mch_prepare(argc=%d)", *argc); + + // Set environment variables $VIM and $VIMRUNTIME + // NOTE! If vim_getenv is called with one of these as parameters before + // they have been set here, they will most likely end up with the wrong + // values! + // + // TODO: + // - ensure this is called first to avoid above problem + // - encoding + + NSString *path = [[[NSBundle mainBundle] resourcePath] + stringByAppendingPathComponent:@"vim"]; + vim_setenv((char_u*)"VIM", (char_u*)[path UTF8String]); + + path = [path stringByAppendingPathComponent:@"runtime"]; + vim_setenv((char_u*)"VIMRUNTIME", (char_u*)[path UTF8String]); +} + + +/* + * Check if the GUI can be started. Called before gvimrc is sourced. + * Return OK or FAIL. + */ + int +gui_mch_init_check(void) +{ + //NSLog(@"gui_mch_init_check()"); + return OK; +} + + +/* + * Initialise the GUI. Create all the windows, set up all the call-backs etc. + * Returns OK for success, FAIL when the GUI can't be started. + */ + int +gui_mch_init(void) +{ + //NSLog(@"gui_mch_init()"); + + if (![[MMBackend sharedInstance] checkin]) + return FAIL; + + // HACK! Force the 'termencoding to utf-8. For the moment also force + // 'encoding', although this will change in the future. The user can still + // change 'encoding'; doing so WILL crash the program. + set_option_value((char_u *)"termencoding", 0L, (char_u *)"utf-8", 0); + set_option_value((char_u *)"encoding", 0L, (char_u *)"utf-8", 0); + + // Set values so that pixels and characters are in one-to-one + // correspondence (assuming all characters have the same dimensions). + gui.scrollbar_width = gui.scrollbar_height = 0; + + gui.char_height = 1; + gui.char_width = 1; + gui.char_ascent = 0; + + // Default foreground and background colors are black and white. + gui.def_norm_pixel = gui.norm_pixel = 0; + gui.def_back_pixel = gui.back_pixel = 0xffffff; + + [[MMBackend sharedInstance] + setDefaultColorsBackground:gui.back_pixel foreground:gui.norm_pixel]; + [[MMBackend sharedInstance] setBackgroundColor:gui.back_pixel]; + [[MMBackend sharedInstance] setForegroundColor:gui.norm_pixel]; + + // NOTE: If this call is left out the cursor is opaque. + highlight_gui_started(); + + return OK; +} + + + + void +gui_mch_exit(int rc) +{ + //NSLog(@"gui_mch_exit(rc=%d)", rc); + + [[MMBackend sharedInstance] exit]; +} + + +/* + * Open the GUI window which was created by a call to gui_mch_init(). + */ + int +gui_mch_open(void) +{ + //NSLog(@"gui_mch_open()"); + + return [[MMBackend sharedInstance] + openVimWindowWithRows:gui.num_rows columns:gui.num_cols]; +} + + +// -- Updating -------------------------------------------------------------- + + +/* + * Catch up with any queued X events. This may put keyboard input into the + * input buffer, call resize call-backs, trigger timers etc. If there is + * nothing in the X event queue (& no timers pending), then we return + * immediately. + */ + void +gui_mch_update(void) +{ + // HACK! Nothing to do here since we tend to the run loop (which holds + // incoming events) in gui_mch_wait_for_chars(). +} + + +/* Flush any output to the screen */ + void +gui_mch_flush(void) +{ + // HACK! This function is called so often that draw performance suffers. + // Instead of actually flushing the output it is placed on a queue and + // flushed in gui_mch_wait_for_chars(), which makes the program feel much + // more responsive. This might have unintended side effects though; if + // so, another solution might have to be found. + + //[[MMBackend sharedInstance] flush]; +} + + +/* + * GUI input routine called by gui_wait_for_chars(). Waits for a character + * from the keyboard. + * wtime == -1 Wait forever. + * wtime == 0 This should never happen. + * wtime > 0 Wait wtime milliseconds for a character. + * Returns OK if a character was found to be available within the given time, + * or FAIL otherwise. + */ + int +gui_mch_wait_for_chars(int wtime) +{ + // HACK! See comment in gui_mch_flush(). + [[MMBackend sharedInstance] flushQueue]; + + return [[MMBackend sharedInstance] waitForInput:wtime]; +} + + +// -- Drawing --------------------------------------------------------------- + + +/* + * Clear the whole text window. + */ + void +gui_mch_clear_all(void) +{ + [[MMBackend sharedInstance] clearAll]; +} + + +/* + * Clear a rectangular region of the screen from text pos (row1, col1) to + * (row2, col2) inclusive. + */ + void +gui_mch_clear_block(int row1, int col1, int row2, int col2) +{ + [[MMBackend sharedInstance] clearBlockFromRow:row1 column:col1 + toRow:row2 column:col2]; +} + + +/* + * Delete the given number of lines from the given row, scrolling up any + * text further down within the scroll region. + */ + void +gui_mch_delete_lines(int row, int num_lines) +{ + [[MMBackend sharedInstance] deleteLinesFromRow:row count:num_lines + scrollBottom:gui.scroll_region_bot + left:gui.scroll_region_left + right:gui.scroll_region_right]; +} + + + void +gui_mch_draw_string(int row, int col, char_u *s, int len, int flags) +{ + [[MMBackend sharedInstance] replaceString:(char*)s length:len + row:row column:col flags:flags]; +} + + + int +gui_macvim_draw_string(int row, int col, char_u *s, int len, int flags) +{ +#if 0 + NSString *string = [[NSString alloc] + initWithBytesNoCopy:(void*)s + length:len + encoding:NSUTF8StringEncoding + freeWhenDone:NO]; + int cells = [string length]; + [string release]; + + NSLog(@"gui_macvim_draw_string(row=%d, col=%d, len=%d, cells=%d, flags=%d)", + row, col, len, cells, flags); + + [[MMBackend sharedInstance] replaceString:(char*)s length:len + row:row column:col flags:flags]; + + return cells; +#elif 0 + int c; + int cn; + int cl; + int i; + BOOL wide = NO; + int start = 0; + int endcol = col; + int startcol = col; + MMBackend *backend = [MMBackend sharedInstance]; + + for (i = 0; i < len; i += cl) { + c = utf_ptr2char(s + i); + cl = utf_ptr2len(s + i); + cn = utf_char2cells(c); + comping = utf_iscomposing(c); + + if (!comping) + endcol += cn; + + if (cn > 1 && !wide) { + // Start of wide characters. + wide = YES; + + // Output non-wide characters. + if (start > i) { + NSLog(@"Outputting %d non-wide chars (%d bytes)", + endcol-startcol, start-i); + [backend replaceString:(char*)(s+start) length:start-i + row:row column:startcol flags:flags]; + startcol = endcol; + start = i; + } + } else if (cn <= 1 && !comping && wide) { + // End of wide characters. + wide = NO; + + // Output wide characters. + if (start > i) { + NSLog(@"Outputting %d wide chars (%d bytes)", + endcol-startcol, start-i); + [backend replaceString:(char*)(s+start) length:start-i + row:row column:startcol flags:(flags|0x80)]; + startcol = endcol; + start = i; + } + } + } + + // Output remaining characters. + flags = wide ? flags|0x80 : flags; + NSLog(@"Outputting %d %s chars (%d bytes)", endcol-startcol, wide ? "wide" + : "non-wide", len-start); + [backend replaceString:(char*)(s+start) length:len-start + row:row column:startcol flags:flags]; + + return endcol - col; +#elif 1 + // + // Output chars until a wide char found. If a wide char is found, output a + // zero-width space after it so that a wide char looks like two chars to + // MMTextStorage. This way 1 char corresponds to 1 column. + // + + int c; + int cn; + int cl; + int i; + int start = 0; + int endcol = col; + int startcol = col; + BOOL outPad = NO; + MMBackend *backend = [MMBackend sharedInstance]; + static char ZeroWidthSpace[] = { 0xe2, 0x80, 0x8b }; + + for (i = 0; i < len; i += cl) { + c = utf_ptr2char(s + i); + cl = utf_ptr2len(s + i); + cn = utf_char2cells(c); + + if (!utf_iscomposing(c)) { + if (outPad) { + outPad = NO; +#if 0 + NSString *string = [[NSString alloc] + initWithBytesNoCopy:(void*)(s+start) + length:i-start + encoding:NSUTF8StringEncoding + freeWhenDone:NO]; + NSLog(@"Flushing string=%@ len=%d row=%d col=%d end=%d", + string, i-start, row, startcol, endcol); + [string release]; +#endif + [backend replaceString:(char*)(s+start) length:i-start + row:row column:startcol flags:flags]; + start = i; + startcol = endcol; +#if 0 + NSLog(@"Padding len=%d row=%d col=%d", sizeof(ZeroWidthSpace), + row, endcol-1); +#endif + [backend replaceString:ZeroWidthSpace + length:sizeof(ZeroWidthSpace) + row:row column:endcol-1 flags:flags]; + } + + endcol += cn; + } + + if (cn > 1) { +#if 0 + NSLog(@"Wide char detected! (char=%C hex=%x cells=%d)", c, c, cn); +#endif + outPad = YES; + } + } + +#if 0 + if (row < 1) { + NSString *string = [[NSString alloc] + initWithBytesNoCopy:(void*)(s+start) + length:len-start + encoding:NSUTF8StringEncoding + freeWhenDone:NO]; + NSLog(@"Output string=%@ len=%d row=%d col=%d", string, len-start, row, + startcol); + [string release]; + } +#endif + + // Output remaining characters. + [backend replaceString:(char*)(s+start) length:len-start + row:row column:startcol flags:flags]; + + if (outPad) { +#if 0 + NSLog(@"Padding len=%d row=%d col=%d", sizeof(ZeroWidthSpace), row, + endcol-1); +#endif + [backend replaceString:ZeroWidthSpace + length:sizeof(ZeroWidthSpace) + row:row column:endcol-1 flags:flags]; + } + + return endcol - col; +#else + // This will fail abysmally when wide or composing characters are used. + [[MMBackend sharedInstance] + replaceString:(char*)s length:len row:row column:col flags:flags]; + + int i, c, cl, cn, cells = 0; + for (i = 0; i < len; i += cl) { + c = utf_ptr2char(s + i); + cl = utf_ptr2len(s + i); + cn = utf_char2cells(c); + + if (!utf_iscomposing(c)) + cells += cn; + } + + return cells; +#endif +} + + +/* + * Insert the given number of lines before the given row, scrolling down any + * following text within the scroll region. + */ + void +gui_mch_insert_lines(int row, int num_lines) +{ + [[MMBackend sharedInstance] insertLinesFromRow:row count:num_lines + scrollBottom:gui.scroll_region_bot + left:gui.scroll_region_left + right:gui.scroll_region_right]; +} + + +// -- Tab line -------------------------------------------------------------- + + +/* + * Set the current tab to "nr". First tab is 1. + */ + void +gui_mch_set_curtab(int nr) +{ + //NSLog(@"gui_mch_set_curtab(nr=%d)", nr); + [[MMBackend sharedInstance] selectTab:nr]; +} + + +/* + * Return TRUE when tabline is displayed. + */ + int +gui_mch_showing_tabline(void) +{ + //NSLog(@"gui_mch_showing_tabline()"); + return [[MMBackend sharedInstance] tabBarVisible]; +} + +/* + * Update the labels of the tabline. + */ + void +gui_mch_update_tabline(void) +{ + //NSLog(@"gui_mch_update_tabline()"); + [[MMBackend sharedInstance] updateTabBar]; +} + +/* + * Show or hide the tabline. + */ + void +gui_mch_show_tabline(int showit) +{ + //NSLog(@"gui_mch_show_tabline(showit=%d)", showit); + [[MMBackend sharedInstance] showTabBar:showit]; +} + + +// -- Clipboard ------------------------------------------------------------- + + + void +clip_mch_lose_selection(VimClipboard *cbd) +{ +} + + + int +clip_mch_own_selection(VimClipboard *cbd) +{ + return 0; +} + + + void +clip_mch_request_selection(VimClipboard *cbd) +{ + NSPasteboard *pb = [NSPasteboard generalPasteboard]; + NSString *type = [pb availableTypeFromArray: + [NSArray arrayWithObject:NSStringPboardType]]; + if (type) { + NSMutableString *string = + [[pb stringForType:NSStringPboardType] mutableCopy]; + + // Replace unrecognized end-of-line sequences with \x0a (line feed). + NSRange range = { 0, [string length] }; + unsigned n = [string replaceOccurrencesOfString:@"\x0d\x0a" + withString:@"\x0a" options:0 + range:range]; + if (0 == n) { + n = [string replaceOccurrencesOfString:@"\x0d" withString:@"\x0a" + options:0 range:range]; + } + + // Scan for newline character to decide whether the string should be + // pasted linewise or characterwise. + int type = MCHAR; + if (0 < n || NSNotFound != [string rangeOfString:@"\n"].location) + type = MLINE; + + const char *utf8chars = [string UTF8String]; + clip_yank_selection(type, (char_u*)utf8chars, strlen(utf8chars), cbd); + } +} + + +/* + * Send the current selection to the clipboard. + */ + void +clip_mch_set_selection(VimClipboard *cbd) +{ + // If the '*' register isn't already filled in, fill it in now. + cbd->owned = TRUE; + clip_get_selection(cbd); + cbd->owned = FALSE; + + // Get the text to put on the pasteboard. + long_u len = 0; char_u *str = 0; + int type = clip_convert_selection(&str, &len, cbd); + if (type < 0) + return; + + NSString *string = [[NSString alloc] initWithBytes:str length:len + encoding:NSUTF8StringEncoding]; + + NSPasteboard *pb = [NSPasteboard generalPasteboard]; + [pb declareTypes:[NSArray arrayWithObject:NSStringPboardType] owner:nil]; + [pb setString:string forType:NSStringPboardType]; + + [string release]; + vim_free(str); +} + + +// -- Menu ------------------------------------------------------------------ + + +/* + * Add a sub menu to the menu bar. + */ + void +gui_mch_add_menu(vimmenu_T *menu, int idx) +{ + //NSLog(@"gui_mch_add_menu(name=%s, idx=%d)", menu->name, idx); + + // HACK! If menu has no parent, then we set the parent tag to the type of + // menu it is. This will not mix up tag and type because pointers can not + // take values close to zero (and the tag is simply the value of the + // pointer). + int parent = (int)menu->parent; + if (!parent) { + parent = menu_is_popup(menu->name) ? MenuPopupType : + menu_is_toolbar(menu->name) ? MenuToolbarType : + MenuMenubarType; + } + + [[MMBackend sharedInstance] + addMenuWithTag:(int)menu parent:parent name:(char*)menu->dname + atIndex:idx]; +} + + +/* + * Add a menu item to a menu + */ + void +gui_mch_add_menu_item(vimmenu_T *menu, int idx) +{ + //NSLog(@"gui_mch_add_menu_item(name=%s, accel=%s idx=%d)", menu->dname, + // menu->actext, idx); + + // NOTE! If 'iconfile' is not set but 'iconidx' is, use the name of the + // menu item. (Should correspond to a stock item.) + char *icon = menu->iconfile ? (char*)menu->iconfile : + menu->iconidx >= 0 ? (char*)menu->dname : + NULL; + char *name = menu_is_separator(menu->name) ? NULL : (char*)menu->dname; + char *tip = menu->strings[MENU_INDEX_TIP] + ? (char*)menu->strings[MENU_INDEX_TIP] : (char*)menu->actext; + + [[MMBackend sharedInstance] + addMenuItemWithTag:(int)menu parent:(int)menu->parent name:name + tip:tip icon:(char*)icon atIndex:idx]; +} + + +/* + * Destroy the machine specific menu widget. + */ + void +gui_mch_destroy_menu(vimmenu_T *menu) +{ + //NSLog(@"gui_mch_destroy_menu(name=%s)", menu->name); + + [[MMBackend sharedInstance] removeMenuItemWithTag:(int)menu]; +} + + +/* + * Make a menu either grey or not grey. + */ + void +gui_mch_menu_grey(vimmenu_T *menu, int grey) +{ + //NSLog(@"gui_mch_menu_grey(name=%s, grey=%d)", menu->name, grey); + [[MMBackend sharedInstance] + enableMenuItemWithTag:(int)menu state:!grey]; +} + + +/* + * Make menu item hidden or not hidden + */ + void +gui_mch_menu_hidden(vimmenu_T *menu, int hidden) +{ + //NSLog(@"gui_mch_menu_hidden(name=%s, hidden=%d)", menu->name, hidden); + + // HACK! There is no (obvious) way to hide a menu item, so simply + // enable/disable it instead. + [[MMBackend sharedInstance] + enableMenuItemWithTag:(int)menu state:!hidden]; +} + + + void +gui_mch_show_popupmenu(vimmenu_T *menu) +{ + //NSLog(@"gui_mch_show_popupmenu(name=%s)", menu->name); +} + + +/* + * This is called after setting all the menus to grey/hidden or not. + */ + void +gui_mch_draw_menubar(void) +{ + // The (main) menu draws itself in Mac OS X. +} + + + void +gui_mch_enable_menu(int flag) +{ + // The (main) menu is always enabled in Mac OS X. +} + + +#if 0 + void +gui_mch_set_menu_pos(int x, int y, int w, int h) +{ + // The (main) menu cannot be moved in Mac OS X. +} +#endif + + + void +gui_mch_show_toolbar(int showit) +{ + int flags = 0; + if (toolbar_flags & TOOLBAR_TEXT) flags |= ToolbarLabelFlag; + if (toolbar_flags & TOOLBAR_ICONS) flags |= ToolbarIconFlag; + if (tbis_flags & (TBIS_MEDIUM|TBIS_LARGE)) flags |= ToolbarSizeRegularFlag; + + //NSLog(@"gui_mch_show_toolbar(showit=%d, flags=%d)", showit, flags); + + [[MMBackend sharedInstance] showToolbar:showit flags:flags]; +} + + + + +// -- Fonts ----------------------------------------------------------------- + + +/* + * If a font is not going to be used, free its structure. + */ + void +gui_mch_free_font(font) + GuiFont font; +{ +#if 0 + static GuiFont last_font = -1; + if (last_font != font) { + NSLog(@"gui_mch_free_font(font=%d)", font); + last_font = font; + } +#endif +} + + +/* + * Get a font structure for highlighting. + */ + GuiFont +gui_mch_get_font(char_u *name, int giveErrorIfMissing) +{ + //NSLog(@"gui_mch_get_font(name=%s, giveErrorIfMissing=%d)", name, + // giveErrorIfMissing); + return 0; +} + + +#if defined(FEAT_EVAL) || defined(PROTO) +/* + * Return the name of font "font" in allocated memory. + * Don't know how to get the actual name, thus use the provided name. + */ + char_u * +gui_mch_get_fontname(GuiFont font, char_u *name) +{ + //NSLog(@"gui_mch_get_fontname(font=%d, name=%s)", font, name); + return 0; +} +#endif + + +/* + * Initialise vim to use the font with the given name. Return FAIL if the font + * could not be loaded, OK otherwise. + */ + int +gui_mch_init_font(char_u *font_name, int fontset) +{ + //NSLog(@"gui_mch_init_font(font_name=%s, fontset=%d)", font_name, fontset); + + // HACK! This gets called whenever the user types :set gfn=fontname, so + // for now we set the font here. + // TODO! Proper font handling, the way Vim expects it. + return [[MMBackend sharedInstance] + setFontWithName:(char*)font_name]; +} + + +/* + * Set the current text font. + */ + void +gui_mch_set_font(GuiFont font) +{ +#if 0 + static GuiFont last_font = -1; + if (last_font != font) { + NSLog(@"gui_mch_set_font(font=%d)", font); + last_font = font; + } +#endif +} + + + + +// -- Scrollbars ------------------------------------------------------------ + + + void +gui_mch_create_scrollbar( + scrollbar_T *sb, + int orient) /* SBAR_VERT or SBAR_HORIZ */ +{ + //NSLog(@"gui_mch_create_scrollbar(id=%d, orient=%d, type=%d)", + // sb->ident, orient, sb->type); + + [[MMBackend sharedInstance] + createScrollbarWithIdentifier:sb->ident type:sb->type]; +} + + + void +gui_mch_destroy_scrollbar(scrollbar_T *sb) +{ + //NSLog(@"gui_mch_destroy_scrollbar(id=%d)", sb->ident); + + [[MMBackend sharedInstance] + destroyScrollbarWithIdentifier:sb->ident]; +} + + + void +gui_mch_enable_scrollbar( + scrollbar_T *sb, + int flag) +{ + //NSLog(@"gui_mch_enable_scrollbar(id=%d, flag=%d)", sb->ident, flag); + + [[MMBackend sharedInstance] + showScrollbarWithIdentifier:sb->ident state:flag]; +} + + + void +gui_mch_set_scrollbar_pos( + scrollbar_T *sb, + int x, + int y, + int w, + int h) +{ + //NSLog(@"gui_mch_set_scrollbar_pos(id=%d, x=%d, y=%d, w=%d, h=%d)", + // sb->ident, x, y, w, h); + + int pos = y; + int len = h; + if (SBAR_BOTTOM == sb->type) { + pos = x; + len = w; + } + + [[MMBackend sharedInstance] + setScrollbarPosition:pos length:len identifier:sb->ident]; +} + + + void +gui_mch_set_scrollbar_thumb( + scrollbar_T *sb, + long val, + long size, + long max) +{ + //NSLog(@"gui_mch_set_scrollbar_thumb(id=%d, val=%d, size=%d, max=%d)", + // sb->ident, val, size, max); + +#if 0 + float value = max-size+1 > 0 ? (float)val/(max-size+1) : 0; + float prop = (float)size/(max+1); + if (value < 0) value = 0; + else if (value > 1.0f) value = 1.0f; + if (prop < 0) prop = 0; + else if (prop > 1.0f) prop = 1.0f; + + [[MMBackend sharedInstance] + setScrollbarThumbValue:value proportion:prop identifier:sb->ident]; +#else + [[MMBackend sharedInstance] + setScrollbarThumbValue:val size:size max:max identifier:sb->ident]; +#endif +} + + + + + +// -- Unsorted -------------------------------------------------------------- + + +/* + * Adjust gui.char_height (after 'linespace' was changed). + */ + int +gui_mch_adjust_charheight(void) +{ + return 0; +} + + + void +gui_mch_beep(void) +{ +} + + + +#ifdef FEAT_BROWSE +/* + * Pop open a file browser and return the file selected, in allocated memory, + * or NULL if Cancel is hit. + * saving - TRUE if the file will be saved to, FALSE if it will be opened. + * title - Title message for the file browser dialog. + * dflt - Default name of file. + * ext - Default extension to be added to files without extensions. + * initdir - directory in which to open the browser (NULL = current dir) + * filter - Filter for matched files to choose from. + * Has a format like this: + * "C Files (*.c)\0*.c\0" + * "All Files\0*.*\0\0" + * If these two strings were concatenated, then a choice of two file + * filters will be selectable to the user. Then only matching files will + * be shown in the browser. If NULL, the default allows all files. + * + * *NOTE* - the filter string must be terminated with TWO nulls. + */ + char_u * +gui_mch_browse( + int saving, + char_u *title, + char_u *dflt, + char_u *ext, + char_u *initdir, + char_u *filter) +{ + //NSLog(@"gui_mch_browse(saving=%d, title=%s, dflt=%s, ext=%s, initdir=%s," + // " filter=%s", saving, title, dflt, ext, initdir, filter); + + char_u *s = (char_u*)[[MMBackend sharedInstance] + browseForFileInDirectory:(char*)initdir title:(char*)title + saving:saving]; + + return s; +} +#endif /* FEAT_BROWSE */ + + + + int +gui_mch_dialog( + int type, + char_u *title, + char_u *message, + char_u *buttons, + int dfltbutton, + char_u *textfield) +{ + return 0; +} + + +/* + * Draw a cursor without focus. + */ + void +gui_mch_draw_hollow_cursor(guicolor_T color) +{ +} + + +/* + * Draw part of a cursor, only w pixels wide, and h pixels high. + */ + void +gui_mch_draw_part_cursor(int w, int h, guicolor_T color) +{ +} + + + void +gui_mch_flash(int msec) +{ +} + + +/* + * Return the Pixel value (color) for the given color name. This routine was + * pretty much taken from example code in the Silicon Graphics OSF/Motif + * Programmer's Guide. + * Return INVALCOLOR when failed. + */ + guicolor_T +gui_mch_get_color(char_u *name) +{ + NSString *key = [NSString stringWithUTF8String:(char*)name]; + return [[MMBackend sharedInstance] lookupColorWithKey:key]; +} + + +/* + * Return the RGB value of a pixel as long. + */ + long_u +gui_mch_get_rgb(guicolor_T pixel) +{ + // This is only implemented so that vim can guess the correct value for + // 'background' (which otherwise defaults to 'dark'); it is not used for + // anything else (as far as I know). + // The implementation is simple since colors are stored in an int as + // "rrggbb". + return pixel; +} + + +/* + * Get the screen dimensions. + * Allow 10 pixels for horizontal borders, 40 for vertical borders. + * Is there no way to find out how wide the borders really are? + * TODO: Add live udate of those value on suspend/resume. + */ + void +gui_mch_get_screen_dimensions(int *screen_w, int *screen_h) +{ + //NSLog(@"gui_mch_get_screen_dimensions()"); + *screen_w = Columns; + *screen_h = Rows; +} + + +/* + * Get the position of the top left corner of the window. + */ + int +gui_mch_get_winpos(int *x, int *y) +{ + *x = *y = 0; + return OK; +} + + +/* + * Get current mouse coordinates in text window. + */ + void +gui_mch_getmouse(int *x, int *y) +{ +} + + +/* + * Return OK if the key with the termcap name "name" is supported. + */ + int +gui_mch_haskey(char_u *name) +{ + NSLog(@"gui_mch_haskey(name=%s)", name); + return 0; +} + + +/* + * Iconify the GUI window. + */ + void +gui_mch_iconify(void) +{ +} + + +/* + * Invert a rectangle from row r, column c, for nr rows and nc columns. + */ + void +gui_mch_invert_rectangle(int r, int c, int nr, int nc) +{ +} + + +/* + * Called when the foreground or background color has been changed. + */ + void +gui_mch_new_colors(void) +{ + gui.def_back_pixel = gui.back_pixel; + gui.def_norm_pixel = gui.norm_pixel; + + //NSLog(@"gui_mch_new_colors(back=%x, norm=%x)", gui.def_back_pixel, + // gui.def_norm_pixel); + + [[MMBackend sharedInstance] + setDefaultColorsBackground:gui.def_back_pixel + foreground:gui.def_norm_pixel]; +} + + +/* + * Set the current text background color. + */ + void +gui_mch_set_bg_color(guicolor_T color) +{ + [[MMBackend sharedInstance] setBackgroundColor:color]; +} + + +/* + * Cursor blink functions. + * + * This is a simple state machine: + * BLINK_NONE not blinking at all + * BLINK_OFF blinking, cursor is not shown + * BLINK_ON blinking, cursor is shown + */ + void +gui_mch_set_blinking(long wait, long on, long off) +{ +} + + +/* + * Set the current text foreground color. + */ + void +gui_mch_set_fg_color(guicolor_T color) +{ + [[MMBackend sharedInstance] setForegroundColor:color]; +} + + +#if defined(FEAT_EVAL) || defined(PROTO) +/* + * Bring the Vim window to the foreground. + */ + void +gui_mch_set_foreground(void) +{ +} +#endif + + + + void +gui_mch_set_shellsize( + int width, + int height, + int min_width, + int min_height, + int base_width, + int base_height, + int direction) +{ + //NSLog(@"gui_mch_set_shellsize(width=%d, height=%d, min_width=%d," + // " min_height=%d, base_width=%d, base_height=%d, direction=%d)", + // width, height, min_width, min_height, base_width, base_height, + // direction); + [[MMBackend sharedInstance] setRows:height columns:width]; +} + + +/* + * Set the current text special color. + */ + void +gui_mch_set_sp_color(guicolor_T color) +{ +} + + + void +gui_mch_set_text_area_pos(int x, int y, int w, int h) +{ +} + +/* + * Set the position of the top left corner of the window to the given + * coordinates. + */ + void +gui_mch_set_winpos(int x, int y) +{ +} + + + void +gui_mch_setmouse(int x, int y) +{ +} + + +#ifdef FEAT_TITLE +/* + * Set the window title and icon. + * (The icon is not taken care of). + */ + void +gui_mch_settitle(char_u *title, char_u *icon) +{ + //NSLog(@"gui_mch_settitle(title=%s, icon=%s)", title, icon); + + [[MMBackend sharedInstance] setVimWindowTitle:(char*)title]; +} +#endif + + +/* + * Start the cursor blinking. If it was already blinking, this restarts the + * waiting time and shows the cursor. + */ + void +gui_mch_start_blink(void) +{ +} + + +/* + * Stop the cursor blinking. Show the cursor if it wasn't shown. + */ + void +gui_mch_stop_blink(void) +{ +} + + + void +gui_mch_toggle_tearoffs(int enable) +{ +} + + + void +mch_set_mouse_shape(int shape) +{ +} diff --git a/main.m b/main.m new file mode 100644 index 0000000000..5d5346169c --- /dev/null +++ b/main.m @@ -0,0 +1,16 @@ +/* vi:set ts=8 sts=4 sw=4 ft=objc: + * + * VIM - Vi IMproved by Bram Moolenaar + * MacVim GUI port by Bjorn Winckler + * + * Do ":help uganda" in Vim to read copying and usage conditions. + * Do ":help credits" in Vim to see a list of people who contributed. + * See README.txt for an overview of the Vim source code. + */ + +#import + +int main(int argc, char *argv[]) +{ + return NSApplicationMain(argc, (const char **) argv); +} diff --git a/vim_gloss.icns b/vim_gloss.icns new file mode 100644 index 0000000000000000000000000000000000000000..f2d922bc94e3936303d941fc6ebe92b9cf3808b1 GIT binary patch literal 55320 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 literal 0 HcmV?d00001 From 84f0068325010b3c9ce80ab2b2af255d2f17fec6 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Wed, 25 Jul 2007 18:57:16 +0000 Subject: [PATCH 0002/1156] Changed build settings to only build for native architecture git-svn-id: http://macvim.googlecode.com/svn/trunk@13 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MacVim.xcodeproj/project.pbxproj | 15 +++------------ MacVim.xcodeproj/winckler.mode1 | 13 +++++++------ MacVim.xcodeproj/winckler.pbxuser | 4 ++-- .../PSMTabBarControl.xcodeproj/project.pbxproj | 10 ++-------- .../PSMTabBarControl.xcodeproj/winckler.mode1 | 7 +++---- .../PSMTabBarControl.xcodeproj/winckler.pbxuser | 4 ++-- 6 files changed, 19 insertions(+), 34 deletions(-) diff --git a/MacVim.xcodeproj/project.pbxproj b/MacVim.xcodeproj/project.pbxproj index 84316bbd38..1c75bb2418 100644 --- a/MacVim.xcodeproj/project.pbxproj +++ b/MacVim.xcodeproj/project.pbxproj @@ -513,10 +513,7 @@ 1DF7D93A0BC05175006CF13F /* My Release */ = { isa = XCBuildConfiguration; buildSettings = { - ARCHS = ( - ppc, - i386, - ); + ARCHS = "$(NATIVE_ARCH)"; COPY_PHASE_STRIP = NO; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", @@ -550,10 +547,7 @@ C01FCF4B08A954540054247B /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - ARCHS = ( - ppc, - i386, - ); + ARCHS = "$(NATIVE_ARCH)"; COPY_PHASE_STRIP = NO; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", @@ -578,10 +572,7 @@ C01FCF4C08A954540054247B /* Release */ = { isa = XCBuildConfiguration; buildSettings = { - ARCHS = ( - ppc, - i386, - ); + ARCHS = "$(NATIVE_ARCH)"; COPY_PHASE_STRIP = YES; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", diff --git a/MacVim.xcodeproj/winckler.mode1 b/MacVim.xcodeproj/winckler.mode1 index d8b9ba9ed1..ce5ec79ef7 100644 --- a/MacVim.xcodeproj/winckler.mode1 +++ b/MacVim.xcodeproj/winckler.mode1 @@ -263,7 +263,7 @@ PBXSmartGroupTreeModuleOutlineStateSelectionKey - 0 + 6 PBXSmartGroupTreeModuleOutlineStateVisibleRectKey @@ -367,9 +367,9 @@ TableOfContents - 1DDE37030C572B47007FB583 + 1DC70EB80C57D44B0079D3C6 1CE0B1FE06471DED0097A5F4 - 1DDE37040C572B47007FB583 + 1DC70EB90C57D44B0079D3C6 1CE0B20306471E060097A5F4 1CE0B20506471E060097A5F4 @@ -504,8 +504,7 @@ WindowOrderList 1D16B9EF0BA33E3800A69B33 - 1C0AD2B3069F1EA900FABCE6 - /Users/winckler/Projects/vim70/src/MacVim/MacVim.xcodeproj + /Users/winckler/Projects/vim7/src/MacVim/MacVim.xcodeproj WindowString 168 349 690 397 0 0 1024 746 @@ -546,6 +545,8 @@ 194pt + BecomeActive + ContentConfiguration PBXProjectModuleGUID @@ -585,7 +586,7 @@ TableOfContents 1D16B9EF0BA33E3800A69B33 - 1DDE37050C572B47007FB583 + 1DC70EB70C57D44A0079D3C6 1CD0528F0623707200166675 XCMainBuildResultsModuleGUID diff --git a/MacVim.xcodeproj/winckler.pbxuser b/MacVim.xcodeproj/winckler.pbxuser index 04c3529812..088bfefa8a 100644 --- a/MacVim.xcodeproj/winckler.pbxuser +++ b/MacVim.xcodeproj/winckler.pbxuser @@ -215,8 +215,8 @@ PBXFileDataSource_Warnings_ColumnID, ); }; - PBXPerProjectTemplateStateSaveDate = 207039262; - PBXWorkspaceStateSaveDate = 207039262; + PBXPerProjectTemplateStateSaveDate = 207082110; + PBXWorkspaceStateSaveDate = 207082110; }; sourceControlManager = 1D16B9DD0BA33BB000A69B33 /* Source Control */; userBuildSettings = { diff --git a/PSMTabBarControl/PSMTabBarControl.xcodeproj/project.pbxproj b/PSMTabBarControl/PSMTabBarControl.xcodeproj/project.pbxproj index 78cf6b6d03..15efd2030f 100644 --- a/PSMTabBarControl/PSMTabBarControl.xcodeproj/project.pbxproj +++ b/PSMTabBarControl/PSMTabBarControl.xcodeproj/project.pbxproj @@ -534,10 +534,7 @@ C056398008A954F8003078D8 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - ARCHS = ( - ppc, - i386, - ); + ARCHS = "$(NATIVE_ARCH)"; COPY_PHASE_STRIP = NO; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; @@ -563,10 +560,7 @@ C056398108A954F8003078D8 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { - ARCHS = ( - ppc, - i386, - ); + ARCHS = "$(NATIVE_ARCH)"; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; FRAMEWORK_VERSION = A; diff --git a/PSMTabBarControl/PSMTabBarControl.xcodeproj/winckler.mode1 b/PSMTabBarControl/PSMTabBarControl.xcodeproj/winckler.mode1 index fc778d781a..524ae0f825 100644 --- a/PSMTabBarControl/PSMTabBarControl.xcodeproj/winckler.mode1 +++ b/PSMTabBarControl/PSMTabBarControl.xcodeproj/winckler.mode1 @@ -367,9 +367,9 @@ TableOfContents - 1D493DC50C5253D100AB718C + 1DC70EA20C57D2650079D3C6 1CE0B1FE06471DED0097A5F4 - 1D493DC60C5253D100AB718C + 1DC70EA30C57D2650079D3C6 1CE0B20306471E060097A5F4 1CE0B20506471E060097A5F4 @@ -503,8 +503,7 @@ 5 WindowOrderList - 1D82C60E0AC093AF00AAD418 - /Users/winckler/Projects/vim70/src/MacVim/PSMTabBarControl/PSMTabBarControl.xcodeproj + /Users/winckler/Projects/vim7/src/MacVim/PSMTabBarControl/PSMTabBarControl.xcodeproj WindowString 160 82 690 397 0 0 1024 746 diff --git a/PSMTabBarControl/PSMTabBarControl.xcodeproj/winckler.pbxuser b/PSMTabBarControl/PSMTabBarControl.xcodeproj/winckler.pbxuser index 745102e89d..1acc84889c 100644 --- a/PSMTabBarControl/PSMTabBarControl.xcodeproj/winckler.pbxuser +++ b/PSMTabBarControl/PSMTabBarControl.xcodeproj/winckler.pbxuser @@ -49,8 +49,8 @@ PBXFileDataSource_Warnings_ColumnID, ); }; - PBXPerProjectTemplateStateSaveDate = 206721719; - PBXWorkspaceStateSaveDate = 206721719; + PBXPerProjectTemplateStateSaveDate = 207082065; + PBXWorkspaceStateSaveDate = 207082065; }; sourceControlManager = 1D82C6100AC093AF00AAD418 /* Source Control */; userBuildSettings = { From 5bd7a8c04b91771a2d26a095688bd403b181e9be Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Thu, 26 Jul 2007 07:17:17 +0000 Subject: [PATCH 0003/1156] Don't wait on SetTextDimensionsMsgID while in live resize. git-svn-id: http://macvim.googlecode.com/svn/trunk@16 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMWindowController.m | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/MMWindowController.m b/MMWindowController.m index efaad4eadd..fa85832de9 100644 --- a/MMWindowController.m +++ b/MMWindowController.m @@ -903,7 +903,9 @@ - (void)placeViews // dim[0], dim[1]); NSData *data = [NSData dataWithBytes:dim length:2*sizeof(int)]; [NSPortMessage sendMessage:SetTextDimensionsMsgID - withSendPort:sendPort data:data wait:YES]; + withSendPort:sendPort + data:data + wait:![textView inLiveResize]]; } [tabView setFrame:textViewRect]; From b3a6a7c442e6026d2664544395d1209ad38f9626 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Thu, 26 Jul 2007 07:19:08 +0000 Subject: [PATCH 0004/1156] Vim runtime is now copied using a 'Copy Files Build Phase' instead of using a shell script. git-svn-id: http://macvim.googlecode.com/svn/trunk@17 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MacVim.xcodeproj/project.pbxproj | 51 +++++++++++++------------------ MacVim.xcodeproj/winckler.mode1 | 15 ++++----- MacVim.xcodeproj/winckler.pbxuser | 4 +-- 3 files changed, 32 insertions(+), 38 deletions(-) diff --git a/MacVim.xcodeproj/project.pbxproj b/MacVim.xcodeproj/project.pbxproj index 1c75bb2418..0b12971704 100644 --- a/MacVim.xcodeproj/project.pbxproj +++ b/MacVim.xcodeproj/project.pbxproj @@ -8,17 +8,11 @@ /* Begin PBXBuildFile section */ 1D0E051C0BA5F83800B6049E /* Colors.plist in Resources */ = {isa = PBXBuildFile; fileRef = 1D0E051B0BA5F83800B6049E /* Colors.plist */; }; - 1D1474970C56703C0038FA2B /* MacVim.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 1D1474950C56703C0038FA2B /* MacVim.h */; }; 1D1474980C56703C0038FA2B /* MacVim.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D1474960C56703C0038FA2B /* MacVim.m */; }; - 1D14749F0C5673AE0038FA2B /* MMAppController.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 1D14749D0C5673AE0038FA2B /* MMAppController.h */; }; 1D1474A00C5673AE0038FA2B /* MMAppController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D14749E0C5673AE0038FA2B /* MMAppController.m */; }; - 1D1474A90C5677450038FA2B /* MMTextStorage.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 1D1474A70C5677450038FA2B /* MMTextStorage.h */; }; 1D1474AA0C5677450038FA2B /* MMTextStorage.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D1474A80C5677450038FA2B /* MMTextStorage.m */; }; - 1D1474AF0C5678370038FA2B /* MMTextView.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 1D1474AD0C5678370038FA2B /* MMTextView.h */; }; 1D1474B00C5678370038FA2B /* MMTextView.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D1474AE0C5678370038FA2B /* MMTextView.m */; }; - 1D1474B50C56796D0038FA2B /* MMVimController.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 1D1474B30C56796D0038FA2B /* MMVimController.h */; }; 1D1474B60C56796D0038FA2B /* MMVimController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D1474B40C56796D0038FA2B /* MMVimController.m */; }; - 1D1474BB0C567A910038FA2B /* MMWindowController.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 1D1474B90C567A910038FA2B /* MMWindowController.h */; }; 1D1474BC0C567A910038FA2B /* MMWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D1474BA0C567A910038FA2B /* MMWindowController.m */; }; 1D16B9EB0BA33E1E00A69B33 /* VimWindow.nib in Resources */ = {isa = PBXBuildFile; fileRef = 1D16B9E90BA33E1E00A69B33 /* VimWindow.nib */; }; 1D493D580C5247BF00AB718C /* Vim in CopyFiles */ = {isa = PBXBuildFile; fileRef = 1D493D570C5247BF00AB718C /* Vim */; }; @@ -37,6 +31,7 @@ 1DD04DEC0C529C5E006CDC2B /* Credits.rtf in Resources */ = {isa = PBXBuildFile; fileRef = 1DD04DEB0C529C5E006CDC2B /* Credits.rtf */; }; 1DD703B90BA9D15D008679E9 /* vim_gloss.icns in Resources */ = {isa = PBXBuildFile; fileRef = 1DD703B80BA9D15D008679E9 /* vim_gloss.icns */; }; 1DD704310BA9F9C2008679E9 /* SpecialKeys.plist in Resources */ = {isa = PBXBuildFile; fileRef = 1DD704300BA9F9C2008679E9 /* SpecialKeys.plist */; }; + 1DE608B40C587FDA0055263D /* runtime in CopyFiles */ = {isa = PBXBuildFile; fileRef = 1DE602470C587FD10055263D /* runtime */; }; 1DEE0D9F0C4E150B008E82B2 /* Attention.png in Resources */ = {isa = PBXBuildFile; fileRef = 1DEE0D8A0C4E150B008E82B2 /* Attention.png */; }; 1DEE0DA00C4E150B008E82B2 /* Copy.png in Resources */ = {isa = PBXBuildFile; fileRef = 1DEE0D8B0C4E150B008E82B2 /* Copy.png */; }; 1DEE0DA10C4E150B008E82B2 /* Cut.png in Resources */ = {isa = PBXBuildFile; fileRef = 1DEE0D8C0C4E150B008E82B2 /* Cut.png */; }; @@ -90,12 +85,6 @@ dstSubfolderSpec = 6; files = ( 1D493D580C5247BF00AB718C /* Vim in CopyFiles */, - 1D1474970C56703C0038FA2B /* MacVim.h in CopyFiles */, - 1D14749F0C5673AE0038FA2B /* MMAppController.h in CopyFiles */, - 1D1474A90C5677450038FA2B /* MMTextStorage.h in CopyFiles */, - 1D1474AF0C5678370038FA2B /* MMTextView.h in CopyFiles */, - 1D1474B50C56796D0038FA2B /* MMVimController.h in CopyFiles */, - 1D1474BB0C567A910038FA2B /* MMWindowController.h in CopyFiles */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -109,6 +98,16 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 1DE608B80C58807F0055263D /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = vim; + dstSubfolderSpec = 7; + files = ( + 1DE608B40C587FDA0055263D /* runtime in CopyFiles */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ @@ -145,6 +144,7 @@ 1DD04DEB0C529C5E006CDC2B /* Credits.rtf */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; path = Credits.rtf; sourceTree = ""; }; 1DD703B80BA9D15D008679E9 /* vim_gloss.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = vim_gloss.icns; sourceTree = ""; }; 1DD704300BA9F9C2008679E9 /* SpecialKeys.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = SpecialKeys.plist; sourceTree = ""; }; + 1DE602470C587FD10055263D /* runtime */ = {isa = PBXFileReference; lastKnownFileType = folder; name = runtime; path = ../../runtime; sourceTree = SOURCE_ROOT; }; 1DEE0D8A0C4E150B008E82B2 /* Attention.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Attention.png; path = Toolbar/Attention.png; sourceTree = ""; }; 1DEE0D8B0C4E150B008E82B2 /* Copy.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Copy.png; path = Toolbar/Copy.png; sourceTree = ""; }; 1DEE0D8C0C4E150B008E82B2 /* Cut.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Cut.png; path = Toolbar/Cut.png; sourceTree = ""; }; @@ -270,6 +270,14 @@ name = Icons; sourceTree = ""; }; + 1DE602460C587F760055263D /* Vim Resources */ = { + isa = PBXGroup; + children = ( + 1DE602470C587FD10055263D /* runtime */, + ); + name = "Vim Resources"; + sourceTree = ""; + }; 1DE9726C0C48050600F96A9F /* Toolbar */ = { isa = PBXGroup; children = ( @@ -304,6 +312,7 @@ 1D493D640C52482B00AB718C /* Executables */, 080E96DDFE201D6D7F000001 /* MacVim Source */, 29B97317FDCFA39411CA2CEA /* Resources */, + 1DE602460C587F760055263D /* Vim Resources */, 29B97323FDCFA39411CA2CEA /* Frameworks */, 19C28FACFE9D520D11CA2CBB /* Products */, ); @@ -348,7 +357,7 @@ 8D11072E0486CEB800E47090 /* Frameworks */, 1D0DCAD80BA3604D00B6CCFA /* CopyFiles */, 1D9EB2840C366D7B0074B739 /* CopyFiles */, - 1D670CC60C493AEC00E9771C /* ShellScript */, + 1DE608B80C58807F0055263D /* CopyFiles */, ); buildRules = ( ); @@ -441,22 +450,6 @@ }; /* End PBXResourcesBuildPhase section */ -/* Begin PBXShellScriptBuildPhase section */ - 1D670CC60C493AEC00E9771C /* ShellScript */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 12; - files = ( - ); - inputPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "mkdir $TARGET_BUILD_DIR/MacVim.app/Contents/Resources/vim\ncp -R ../../runtime/ $TARGET_BUILD_DIR/MacVim.app/Contents/Resources/vim/runtime/"; - }; -/* End PBXShellScriptBuildPhase section */ - /* Begin PBXSourcesBuildPhase section */ 8D11072C0486CEB800E47090 /* Sources */ = { isa = PBXSourcesBuildPhase; diff --git a/MacVim.xcodeproj/winckler.mode1 b/MacVim.xcodeproj/winckler.mode1 index ce5ec79ef7..5226ec00cc 100644 --- a/MacVim.xcodeproj/winckler.mode1 +++ b/MacVim.xcodeproj/winckler.mode1 @@ -263,7 +263,7 @@ PBXSmartGroupTreeModuleOutlineStateSelectionKey - 6 + 0 PBXSmartGroupTreeModuleOutlineStateVisibleRectKey @@ -367,9 +367,9 @@ TableOfContents - 1DC70EB80C57D44B0079D3C6 + 1DE601E10C587E150055263D 1CE0B1FE06471DED0097A5F4 - 1DC70EB90C57D44B0079D3C6 + 1DE601E20C587E150055263D 1CE0B20306471E060097A5F4 1CE0B20506471E060097A5F4 @@ -504,6 +504,7 @@ WindowOrderList 1D16B9EF0BA33E3800A69B33 + 1C0AD2B3069F1EA900FABCE6 /Users/winckler/Projects/vim7/src/MacVim/MacVim.xcodeproj WindowString @@ -586,7 +587,7 @@ TableOfContents 1D16B9EF0BA33E3800A69B33 - 1DC70EB70C57D44A0079D3C6 + 1DE601DB0C587DE80055263D 1CD0528F0623707200166675 XCMainBuildResultsModuleGUID @@ -956,9 +957,9 @@ TableOfContents 1C0AD2B3069F1EA900FABCE6 - 1DDE36F90C572B25007FB583 + 1DE608C20C58821B0055263D 1CD0528B0623707200166675 - 1DDE36FA0C572B25007FB583 + 1DE608C30C58821B0055263D ToolbarConfiguration xcode.toolbar.config.run @@ -967,7 +968,7 @@ WindowToolGUID 1C0AD2B3069F1EA900FABCE6 WindowToolIsVisible - + Identifier diff --git a/MacVim.xcodeproj/winckler.pbxuser b/MacVim.xcodeproj/winckler.pbxuser index 088bfefa8a..7938ee0419 100644 --- a/MacVim.xcodeproj/winckler.pbxuser +++ b/MacVim.xcodeproj/winckler.pbxuser @@ -215,8 +215,8 @@ PBXFileDataSource_Warnings_ColumnID, ); }; - PBXPerProjectTemplateStateSaveDate = 207082110; - PBXWorkspaceStateSaveDate = 207082110; + PBXPerProjectTemplateStateSaveDate = 207125922; + PBXWorkspaceStateSaveDate = 207125922; }; sourceControlManager = 1D16B9DD0BA33BB000A69B33 /* Source Control */; userBuildSettings = { From 0f60f1a41607d2a85e406404c0ffe583926973c1 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Fri, 27 Jul 2007 06:24:00 +0000 Subject: [PATCH 0005/1156] Changed the misnomer 'emptyColumn*' to 'emptyRow*'. git-svn-id: http://macvim.googlecode.com/svn/trunk@19 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMTextStorage.h | 5 ++--- MMTextStorage.m | 22 +++++++++++----------- 2 files changed, 13 insertions(+), 14 deletions(-) diff --git a/MMTextStorage.h b/MMTextStorage.h index 61034ccba1..922e0bb8fd 100644 --- a/MMTextStorage.h +++ b/MMTextStorage.h @@ -15,8 +15,7 @@ @interface MMTextStorage : NSTextStorage { NSMutableAttributedString *attribString; int maxRows, maxColumns; - // TODO! Rename to emptyRowString - NSAttributedString *emptyColumnString; + NSAttributedString *emptyRowString; NSFont *font; //NSMutableParagraphStyle *paragraphStyle; } @@ -46,7 +45,7 @@ - (void)clearAllWithColor:(NSColor *)color; - (void)setFont:(NSFont*)newFont; - (NSFont*)font; -- (float)widthOfEmptyColumn; +- (float)widthOfEmptyRow; - (NSSize)size; - (NSSize)calculateAverageFontSize; - (NSRect)rectForRowsInRange:(NSRange)range; diff --git a/MMTextStorage.m b/MMTextStorage.m index 4e5b4459c5..d4fd08ac72 100644 --- a/MMTextStorage.m +++ b/MMTextStorage.m @@ -54,7 +54,7 @@ - (id)init - (void)dealloc { - [emptyColumnString release]; + [emptyRowString release]; //[paragraphStyle release]; [font release]; [attribString release]; @@ -132,8 +132,8 @@ - (void)setMaxRows:(int)rows columns:(int)cols font, NSFontAttributeName, nil]; - [emptyColumnString release]; - emptyColumnString = [[NSAttributedString alloc] + [emptyRowString release]; + emptyRowString = [[NSAttributedString alloc] initWithString:[NSString stringWithFormat:fmt, ' '] attributes:dict]; @@ -141,7 +141,7 @@ - (void)setMaxRows:(int)rows columns:(int)cols attribString = [[NSMutableAttributedString alloc] init]; int i; for (i=0; i 0 ? [self widthOfEmptyColumn]/maxColumns : 0; + size.width = maxColumns > 0 ? [self widthOfEmptyRow]/maxColumns : 0; if (size.height < 1.0f) size.height = 1.0f; if (size.width < 1.0f) size.width = 1.0f; @@ -447,7 +447,7 @@ - (NSRect)rectForColumnsInRange:(NSRange)range { NSRect rect = { 0, 0, 0, 0 }; float fontWidth = maxColumns > 0 - ? [self widthOfEmptyColumn]/maxColumns : 0; + ? [self widthOfEmptyRow]/maxColumns : 0; rect.origin.x = fontWidth * range.location; rect.size.width = fontWidth * range.length; @@ -538,7 +538,7 @@ - (NSSize)fitToSize:(NSSize)size rows:(int *)rows columns:(int *)columns } if (size.width != curSize.width) { - float fw = maxColumns > 0 ? [self widthOfEmptyColumn]/maxColumns : 0; + float fw = maxColumns > 0 ? [self widthOfEmptyRow]/maxColumns : 0; if (fw < 1.0f) fw = 1.0f; fitCols = floor(size.width/fw); From 2bb270f60c4d565203bc916b67b3b613312f31f9 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sat, 28 Jul 2007 20:19:20 +0000 Subject: [PATCH 0006/1156] - Added support for Distributed Objects, as an alternative to NSPortMessage for communicating between processes (MM_USE_DO=0 to disable in MacVim.h) - MMWindowController, MMTextView does not communicate directly with backend anymore, instead they have to go through MMVimController sendMessage:data:wait:. - If window is closed by clicking the red button, Vim now displays a message if a buffer has been modified. git-svn-id: http://macvim.googlecode.com/svn/trunk@20 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMAppController.h | 7 +- MMAppController.m | 71 ++++++++++++- MMBackend.h | 14 ++- MMBackend.m | 240 ++++++++++++++++++++++++++++++++----------- MMTextStorage.m | 2 + MMTextView.h | 6 -- MMTextView.m | 97 ++++------------- MMVimController.h | 19 +++- MMVimController.m | 123 +++++++++++++++++----- MMWindowController.h | 7 +- MMWindowController.m | 91 +++++++--------- MacVim.h | 27 +++++ 12 files changed, 477 insertions(+), 227 deletions(-) diff --git a/MMAppController.h b/MMAppController.h index 5bcbf1ea48..680330882e 100644 --- a/MMAppController.h +++ b/MMAppController.h @@ -9,10 +9,15 @@ */ #import +#import "MacVim.h" -@interface MMAppController : NSObject { +@interface MMAppController : NSObject +#if MM_USE_DO + +#endif +{ NSPort *receivePort; NSMutableArray *vimControllers; unsigned terminateNowCount; diff --git a/MMAppController.m b/MMAppController.m index 08c1e9c199..83bfe49afb 100644 --- a/MMAppController.m +++ b/MMAppController.m @@ -10,7 +10,6 @@ #import "MMAppController.h" #import "MMVimController.h" -#import "MacVim.h" @@ -21,6 +20,20 @@ - (id)init if ((self = [super init])) { vimControllers = [NSMutableArray new]; +#if MM_USE_DO + // NOTE! If the name of the connection changes here it must also be + // updated in MMBackend.m. + NSConnection *connection = [NSConnection defaultConnection]; + NSString *name = [NSString stringWithFormat:@"%@-connection", + [[NSBundle mainBundle] bundleIdentifier]]; + //NSLog(@"Registering connection with name '%@'", name); + if ([connection registerName:name]) { + [connection setRootObject:self]; + } else { + NSLog(@"WARNING: Failed to register connection with name '%@'", + name); + } +#else // Init named port for VimTasks to connect to receivePort = [NSMachPort new]; [receivePort setDelegate:self]; @@ -37,6 +50,7 @@ - (id)init name:portName]) { NSLog(@"WARNING: Failed to start mach bootstrap server"); } +#endif } return self; @@ -46,7 +60,9 @@ - (void)dealloc { //NSLog(@"MMAppController dealloc"); +#if !MM_USE_DO [receivePort release]; +#endif [vimControllers release]; [super dealloc]; @@ -86,6 +102,38 @@ - (void)application:(NSApplication *)sender openFiles:(NSArray *)filenames - (NSApplicationTerminateReply)applicationShouldTerminate: (NSApplication *)sender { +#if MM_USE_DO + int reply = NSTerminateNow; + BOOL modifiedBuffers = NO; + + unsigned i, count = [vimControllers count]; + for (i = 0; i < count; ++i) { + MMVimController *controller = [vimControllers objectAtIndex:i]; + id proxy = [controller backendProxy]; + if (proxy && [proxy checkForModifiedBuffers]) { + modifiedBuffers = YES; + break; + } + } + + if (modifiedBuffers) { + NSAlert *alert = [[NSAlert alloc] init]; + [alert addButtonWithTitle:@"Quit"]; + [alert addButtonWithTitle:@"Cancel"]; + [alert setMessageText:@"Quit without saving?"]; + [alert setInformativeText:@"There are modified buffers, " + " if you quit now all changes will be lost. Quit anyway?"]; + [alert setAlertStyle:NSWarningAlertStyle]; + + if ([alert runModal] != NSAlertFirstButtonReturn) { + reply = NSTerminateCancel; + } + + [alert release]; + } + + return reply; +#else int reply = NSTerminateNow; // HACK! Send message to all vim tasks asking if they have modified @@ -136,6 +184,7 @@ - (NSApplicationTerminateReply)applicationShouldTerminate: } return reply; +#endif } - (void)applicationWillTerminate:(NSNotification *)aNotification @@ -145,6 +194,7 @@ - (void)applicationWillTerminate:(NSNotification *)aNotification [self autorelease]; } +#if !MM_USE_DO - (void)handlePortMessage:(NSPortMessage *)portMessage { unsigned msgid = [portMessage msgid]; @@ -163,6 +213,7 @@ - (void)handlePortMessage:(NSPortMessage *)portMessage NSLog(@"WARNING: Unknown message received (msgid=%d)", msgid); } } +#endif - (void)removeVimController:(id)controller { @@ -179,4 +230,22 @@ - (IBAction)newVimWindow:(id)sender [NSTask launchedTaskWithLaunchPath:path arguments:args]; } +#if MM_USE_DO +- (byref id )connectBackend: + (byref in id )backend; +{ + //NSLog(@"Frontend got connection request from backend...adding new " + // "MMVimController"); + + [(NSDistantObject*)backend + setProtocolForProxy:@protocol(MMBackendProtocol)]; + + MMVimController *wc = [[[MMVimController alloc] initWithBackend:backend] + autorelease]; + [vimControllers addObject:wc]; + + return wc; +} +#endif + @end diff --git a/MMBackend.h b/MMBackend.h index 5f2aa7265d..5e28c6b525 100644 --- a/MMBackend.h +++ b/MMBackend.h @@ -9,15 +9,25 @@ */ #import +#import "MacVim.h" -@interface MMBackend : NSObject { +@interface MMBackend : NSObject +#if MM_USE_DO + +#endif +{ NSMutableArray *queue; NSMutableData *drawData; - NSData *replyData; +#if MM_USE_DO + NSConnection *connection; + id frontendProxy; +#else NSPort *sendPort; NSPort *receivePort; + NSData *replyData; +#endif NSDictionary *colorDict; BOOL inputReceived; BOOL receivedKillTaskMsg; diff --git a/MMBackend.m b/MMBackend.m index 50c809f39b..2456ff1d4b 100644 --- a/MMBackend.m +++ b/MMBackend.m @@ -9,7 +9,6 @@ */ #import "MMBackend.h" -#import "MacVim.h" #import "vim.h" @@ -21,9 +20,13 @@ @interface MMBackend (Private) +- (void)handleMessage:(int)msgid data:(NSData *)data; + (NSDictionary *)specialKeys; - (void)handleKeyDown:(NSString *)key modifiers:(int)mods; - (void)queueMessage:(int)msgid data:(NSData *)data; +#if MM_USE_DO +- (void)connectionDidDie:(NSNotification *)notification; +#endif @end @@ -51,10 +54,17 @@ - (id)init - (void)dealloc { + [[NSNotificationCenter defaultCenter] removeObserver:self]; + [queue release]; [drawData release]; +#if MM_USE_DO + [frontendProxy release]; + [connection release]; +#else [sendPort release]; [receivePort release]; +#endif [colorDict release]; [super dealloc]; @@ -78,6 +88,14 @@ - (void)setDefaultColorsBackground:(int)bg foreground:(int)fg - (BOOL)checkin { +#if MM_USE_DO + // NOTE! If the name of the connection changes here it must also be + // updated in MMAppController.m. + NSString *name = [NSString stringWithFormat:@"%@-connection", + [[NSBundle mainBundle] bundleIdentifier]]; + connection = [NSConnection connectionWithRegisteredName:name host:nil]; + if (!connection) +#else // NOTE! If the name of the port changes here it must also be updated in // MMAppController.m. NSString *portName = [NSString stringWithFormat:@"%@-taskport", @@ -85,7 +103,9 @@ - (BOOL)checkin NSPort *port = [[[NSMachBootstrapServer sharedInstance] portForName:portName host:nil] retain]; - if (!port) { + if (!port) +#endif + { #if 0 NSString *path = [[NSBundle mainBundle] bundlePath]; if (![[NSWorkspace sharedWorkspace] launchApplication:path]) { @@ -113,20 +133,52 @@ - (BOOL)checkin // returns a valid port. Also set a time-out date so that we don't get // stuck doing this forever. NSDate *timeOutDate = [NSDate dateWithTimeIntervalSinceNow:15]; - while (!port && - NSOrderedDescending == [timeOutDate compare:[NSDate date]]) { + while ( +#if MM_USE_DO + !connection +#else + !port +#endif + && NSOrderedDescending == [timeOutDate compare:[NSDate date]]) + { [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:1]]; - port = [[NSMachBootstrapServer sharedInstance] portForName:portName]; +#if MM_USE_DO + connection = [NSConnection connectionWithRegisteredName:name + host:nil]; +#else + port = [[NSMachBootstrapServer sharedInstance] + portForName:portName]; +#endif } - if (!port) { +#if MM_USE_DO + if (!connection) +#else + if (!port) +#endif + { NSLog(@"WARNING: Timed-out waiting for GUI to launch."); return NO; } } +#if MM_USE_DO + id proxy = [connection rootProxy]; + [proxy setProtocolForProxy:@protocol(MMAppProtocol)]; + + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(connectionDidDie:) + name:NSConnectionDidDieNotification object:connection]; + + frontendProxy = [(NSDistantObject*)[proxy connectBackend:self] retain]; + if (frontendProxy) { + [frontendProxy setProtocolForProxy:@protocol(MMAppProtocol)]; + } + + return connection && frontendProxy; +#else receivePort = [NSMachPort new]; [receivePort setDelegate:self]; @@ -137,10 +189,12 @@ - (BOOL)checkin receivePort:receivePort wait:YES]; return YES; +#endif } - (BOOL)openVimWindowWithRows:(int)rows columns:(int)cols { +#if !MM_USE_DO if (!sendPort) { #if 0 // TODO: Wait until connected---maybe time out at some point? @@ -165,6 +219,7 @@ - (BOOL)openVimWindowWithRows:(int)rows columns:(int)cols } #endif } +#endif // !MM_USE_DO NSMutableData *data = [NSMutableData data]; @@ -276,19 +331,25 @@ - (void)flushQueue // TODO: Come up with a better way to handle the insertion point. [self updateInsertionPoint]; +#if MM_USE_DO + [frontendProxy processCommandQueue:queue]; +#else [NSPortMessage sendMessage:FlushQueueMsgID withSendPort:sendPort components:queue wait:YES]; +#endif [queue removeAllObjects]; } } - (BOOL)waitForInput:(int)milliseconds { +#if !MM_USE_DO if (![receivePort isValid]) { // This should only happen if the GUI crashes. NSLog(@"ERROR: The receive port is no longer valid, quitting..."); getout(0); } +#endif NSDate *date = milliseconds > 0 ? [NSDate dateWithTimeIntervalSinceNow:.001*milliseconds] : @@ -308,10 +369,18 @@ - (BOOL)waitForInput:(int)milliseconds - (void)exit { +#if MM_USE_DO + // By invalidating the NSConnection the MMWindowController immediately + // finds out that the connection is down and as a result + // [MMWindowController connectionDidDie:] is invoked. + [[NSNotificationCenter defaultCenter] removeObserver:self]; + [connection invalidate]; +#else if (!receivedKillTaskMsg) { [NSPortMessage sendMessage:TaskExitedMsgID withSendPort:sendPort receivePort:receivePort wait:YES]; } +#endif } - (void)selectTab:(int)index @@ -388,6 +457,9 @@ - (void)setVimWindowTitle:(char *)title - (char *)browseForFileInDirectory:(char *)dir title:(char *)title saving:(int)saving { +#if MM_USE_DO + return nil; +#else //NSLog(@"browseForFileInDirectory:%s title:%s saving:%d", dir, title, // saving); @@ -430,6 +502,7 @@ - (char *)browseForFileInDirectory:(char *)dir title:(char *)title [replyData release]; replyData = nil; return (char*)s; +#endif // MM_USE_DO } - (void)updateInsertionPoint @@ -665,6 +738,27 @@ - (int)lookupColorWithKey:(NSString *)key return INVALCOLOR; } +#if MM_USE_DO +- (oneway void)processInput:(int)msgid data:(in NSData *)data +{ + [self handleMessage:msgid data:data]; + inputReceived = YES; +} + +- (BOOL)checkForModifiedBuffers +{ + buf_T *buf; + for (buf = firstbuf; buf != NULL; buf = buf->b_next) { + if (bufIsChanged(buf)) { + return YES; + } + } + + return NO; +} + +#else // MM_USE_DO + - (void)handlePortMessage:(NSPortMessage *)portMessage { unsigned msgid = [portMessage msgid]; @@ -672,17 +766,48 @@ - (void)handlePortMessage:(NSPortMessage *)portMessage if (ConnectedMsgID == msgid) { sendPort = [[portMessage sendPort] retain]; //NSLog(@"VimTask connected to MMVimController."); - } else if (KillTaskMsgID == msgid) { + } else if (TaskShouldTerminateMsgID == msgid) { + int reply = TerminateReplyYesMsgID; + buf_T *buf; + for (buf = firstbuf; buf != NULL; buf = buf->b_next) { + if (bufIsChanged(buf)) { + reply = TerminateReplyNoMsgID; + break; + } + } + + //NSLog(@"TaskShouldTerminateMsgID = %s", + // reply == TerminateReplyYesMsgID ? "YES" : "NO"); + + [NSPortMessage sendMessage:reply withSendPort:[portMessage sendPort] + wait:YES]; + } else { + NSArray *components = [portMessage components]; + NSData *data = [components count] > 0 ? + [components objectAtIndex:0] : nil; + [self handleMessage:msgid data:data]; + } +} +#endif // MM_USE_DO + +@end // MMBackend + + + +@implementation MMBackend (Private) + +- (void)handleMessage:(int)msgid data:(NSData *)data +{ + if (KillTaskMsgID == msgid) { //NSLog(@"VimTask received kill message; exiting now."); // Set this flag here so that exit does not send TaskExitedMsgID back // to MMVimController. receivedKillTaskMsg = YES; getout(0); } else if (InsertTextMsgID == msgid) { - if (![[portMessage components] count]) return; - NSString *key = [[NSString alloc] - initWithData:[[portMessage components] objectAtIndex:0] - encoding:NSUTF8StringEncoding]; + if (!data) return; + NSString *key = [[NSString alloc] initWithData:data + encoding:NSUTF8StringEncoding]; //NSLog(@"insert text: %@ (hex=%x)", key, [key characterAtIndex:0]); add_to_input_buf((char_u*)[key UTF8String], [key lengthOfBytesUsingEncoding:NSUTF8StringEncoding]); @@ -690,8 +815,8 @@ - (void)handlePortMessage:(NSPortMessage *)portMessage inputReceived = YES; } else if (KeyDownMsgID == msgid || CmdKeyMsgID == msgid) { - if (![[portMessage components] count]) return; - const void *bytes = [[[portMessage components] objectAtIndex:0] bytes]; + if (!data) return; + const void *bytes = [data bytes]; int mods = *((int*)bytes); bytes += sizeof(int); int len = *((int*)bytes); bytes += sizeof(int); NSString *key = [[NSString alloc] initWithBytes:bytes length:len @@ -703,15 +828,15 @@ - (void)handlePortMessage:(NSPortMessage *)portMessage [key release]; inputReceived = YES; } else if (SelectTabMsgID == msgid) { - if (![[portMessage components] count]) return; - const void *bytes = [[[portMessage components] objectAtIndex:0] bytes]; + if (!data) return; + const void *bytes = [data bytes]; int idx = *((int*)bytes) + 1; //NSLog(@"Selecting tab %d", idx); send_tabline_event(idx); inputReceived = YES; } else if (CloseTabMsgID == msgid) { - if (![[portMessage components] count]) return; - const void *bytes = [[[portMessage components] objectAtIndex:0] bytes]; + if (!data) return; + const void *bytes = [data bytes]; int idx = *((int*)bytes) + 1; //NSLog(@"Closing tab %d", idx); send_tabline_menu_event(idx, TABLINE_MENU_CLOSE); @@ -721,8 +846,8 @@ - (void)handlePortMessage:(NSPortMessage *)portMessage send_tabline_menu_event(0, TABLINE_MENU_NEW); inputReceived = YES; } else if (DraggedTabMsgID == msgid) { - if (![[portMessage components] count]) return; - const void *bytes = [[[portMessage components] objectAtIndex:0] bytes]; + if (!data) return; + const void *bytes = [data bytes]; // NOTE! The destination index is 0 based, so do not add 1 to make it 1 // based. int idx = *((int*)bytes); @@ -743,8 +868,8 @@ - (void)handlePortMessage:(NSPortMessage *)portMessage tabpage_move(idx); #endif } else if (ScrollWheelMsgID == msgid) { - if (![[portMessage components] count]) return; - const void *bytes = [[[portMessage components] objectAtIndex:0] bytes]; + if (!data) return; + const void *bytes = [data bytes]; int row = *((int*)bytes); bytes += sizeof(int); int col = *((int*)bytes); bytes += sizeof(int); @@ -759,8 +884,8 @@ - (void)handlePortMessage:(NSPortMessage *)portMessage gui_send_mouse_event(button, col, row, NO, flags); inputReceived = YES; } else if (MouseDownMsgID == msgid) { - if (![[portMessage components] count]) return; - const void *bytes = [[[portMessage components] objectAtIndex:0] bytes]; + if (!data) return; + const void *bytes = [data bytes]; int row = *((int*)bytes); bytes += sizeof(int); int col = *((int*)bytes); bytes += sizeof(int); @@ -775,8 +900,8 @@ - (void)handlePortMessage:(NSPortMessage *)portMessage inputReceived = YES; } else if (MouseUpMsgID == msgid) { - if (![[portMessage components] count]) return; - const void *bytes = [[[portMessage components] objectAtIndex:0] bytes]; + if (!data) return; + const void *bytes = [data bytes]; int row = *((int*)bytes); bytes += sizeof(int); int col = *((int*)bytes); bytes += sizeof(int); @@ -787,8 +912,8 @@ - (void)handlePortMessage:(NSPortMessage *)portMessage gui_send_mouse_event(MOUSE_RELEASE, col, row, NO, flags); inputReceived = YES; } else if (MouseDraggedMsgID == msgid) { - if (![[portMessage components] count]) return; - const void *bytes = [[[portMessage components] objectAtIndex:0] bytes]; + if (!data) return; + const void *bytes = [data bytes]; int row = *((int*)bytes); bytes += sizeof(int); int col = *((int*)bytes); bytes += sizeof(int); @@ -798,21 +923,25 @@ - (void)handlePortMessage:(NSPortMessage *)portMessage gui_send_mouse_event(MOUSE_DRAG, col, row, NO, flags); inputReceived = YES; - } else if (BrowseForFileReplyMsgID == msgid) { - if (![[portMessage components] count]) return; + } +#if !MM_USE_DO + else if (BrowseForFileReplyMsgID == msgid) { + if (!data) return; [replyData release]; - replyData = [[[portMessage components] objectAtIndex:0] copy]; - } else if (SetTextDimensionsMsgID == msgid) { - if (![[portMessage components] count]) return; - const void *bytes = [[[portMessage components] objectAtIndex:0] bytes]; + replyData = [data copy]; + } +#endif + else if (SetTextDimensionsMsgID == msgid) { + if (!data) return; + const void *bytes = [data bytes]; int rows = *((int*)bytes); bytes += sizeof(int); int cols = *((int*)bytes); bytes += sizeof(int); //NSLog(@"[VimTask] Resizing shell to %dx%d.", cols, rows); gui_resize_shell(cols, rows); } else if (ExecuteMenuMsgID == msgid) { - if (![[portMessage components] count]) return; - const void *bytes = [[[portMessage components] objectAtIndex:0] bytes]; + if (!data) return; + const void *bytes = [data bytes]; int tag = *((int*)bytes); bytes += sizeof(int); vimmenu_T *menu = (vimmenu_T*)tag; @@ -821,24 +950,9 @@ - (void)handlePortMessage:(NSPortMessage *)portMessage gui_menu_cb(menu); inputReceived = YES; } - } else if (TaskShouldTerminateMsgID == msgid) { - int reply = TerminateReplyYesMsgID; - buf_T *buf; - for (buf = firstbuf; buf != NULL; buf = buf->b_next) { - if (bufIsChanged(buf)) { - reply = TerminateReplyNoMsgID; - break; - } - } - - //NSLog(@"TaskShouldTerminateMsgID = %s", - // reply == TerminateReplyYesMsgID ? "YES" : "NO"); - - [NSPortMessage sendMessage:reply withSendPort:[portMessage sendPort] - wait:YES]; } else if (ScrollbarEventMsgID == msgid) { - if (![[portMessage components] count]) return; - const void *bytes = [[[portMessage components] objectAtIndex:0] bytes]; + if (!data) return; + const void *bytes = [data bytes]; long ident = *((long*)bytes); bytes += sizeof(long); int hitPart = *((int*)bytes); bytes += sizeof(int); float fval = *((float*)bytes); bytes += sizeof(float); @@ -900,18 +1014,13 @@ - (void)handlePortMessage:(NSPortMessage *)portMessage inputReceived = YES; } + } else if (VimShouldCloseMsgID == msgid) { + gui_shell_closed(); } else { NSLog(@"WARNING: Unknown message received (msgid=%d)", msgid); } } - -@end // MMBackend - - - -@implementation MMBackend (Private) - + (NSDictionary *)specialKeys { static NSDictionary *specialKeys = nil; @@ -1002,6 +1111,19 @@ - (void)queueMessage:(int)msgid data:(NSData *)data [queue addObject:[NSData data]]; } +#if MM_USE_DO +- (void)connectionDidDie:(NSNotification *)notification +{ + // If the main connection to MacVim is lost this means that MacVim was + // either quit (by the user chosing Quit on the MacVim menu), or it has + // crashed. In either case our only option is to quit now. + // TODO: Write backup file? + + //NSLog(@"A Vim process lots its connection to MacVim; quitting."); + getout(0); +} +#endif // MM_USE_DO + @end // MMBackend (Private) diff --git a/MMTextStorage.m b/MMTextStorage.m index d4fd08ac72..13315018ef 100644 --- a/MMTextStorage.m +++ b/MMTextStorage.m @@ -54,6 +54,8 @@ - (id)init - (void)dealloc { + //NSLog(@"%@ %s", [self className], _cmd); + [emptyRowString release]; //[paragraphStyle release]; [font release]; diff --git a/MMTextView.h b/MMTextView.h index 04905f1d26..6acdb8843b 100644 --- a/MMTextView.h +++ b/MMTextView.h @@ -12,15 +12,9 @@ @interface MMTextView : NSTextView { - BOOL ownsTextStorage; - int tabpageIdx; - NSPort *sendPort; BOOL shouldDrawInsertionPoint; } -- (id)initWithPort:(NSPort *)port frame:(NSRect)frame - textContainer:(NSTextContainer *)tc; -- (MMTextView *)initWithFrame:(NSRect)frame port:(NSPort *)port; - (void)setShouldDrawInsertionPoint:(BOOL)enable; @end diff --git a/MMTextView.m b/MMTextView.m index 4c990489fa..fbe3990c77 100644 --- a/MMTextView.m +++ b/MMTextView.m @@ -10,80 +10,22 @@ #import "MMTextView.h" #import "MMTextStorage.h" -#import "MacVim.h" #import "MMWindowController.h" +#import "MMVimController.h" +#import "MacVim.h" @interface MMTextView (Private) - (BOOL)convertPoint:(NSPoint)point toRow:(int *)row column:(int *)column; - (void)dispatchKeyEvent:(NSEvent *)event; +- (MMVimController *)vimController; @end @implementation MMTextView -- (id)initWithPort:(NSPort *)port frame:(NSRect)frame - textContainer:(NSTextContainer *)tc -{ - if ((self = [super initWithFrame:frame textContainer:tc])) { - sendPort = [port retain]; - } - - return self; -} - -- (MMTextView *)initWithFrame:(NSRect)frame port:(NSPort *)port -{ - MMTextStorage *ts = [[MMTextStorage alloc] init]; - NSLayoutManager *lm = [[NSLayoutManager alloc] init]; - NSTextContainer *tc = [[NSTextContainer alloc] initWithContainerSize: - NSMakeSize(1.0e7,1.0e7)]; - - [tc setWidthTracksTextView:NO]; - [tc setHeightTracksTextView:NO]; - [tc setLineFragmentPadding:0]; - - [ts addLayoutManager:lm]; - [lm addTextContainer:tc]; - - [tc release]; - [lm release]; - - // HACK! Where should i get these values from? - // TODO: get values from frame - [ts setMaxRows:24 columns:80]; - - if ((self = [super initWithFrame:frame textContainer:tc])) { - ownsTextStorage = YES; - //[self setRichText:NO]; - sendPort = [port retain]; - } else { - ownsTextStorage = NO; - [ts release]; - } - - return self; -} - - -- (void)dealloc -{ - // BUG! The reference count of the text view will never reach 0 unless - // release is explicitly called on the text storage; so this code is - // meaningless. - if (ownsTextStorage) { - [[self textContainer] setTextView:nil]; - [[self textStorage] release]; - ownsTextStorage = NO; - } - - [sendPort release]; - - [super dealloc]; -} - - (void)setShouldDrawInsertionPoint:(BOOL)enable { shouldDrawInsertionPoint = enable; @@ -122,9 +64,9 @@ - (void)insertText:(id)string [NSCursor setHiddenUntilMouseMoves:YES]; - [NSPortMessage sendMessage:InsertTextMsgID withSendPort:sendPort - data:[string dataUsingEncoding:NSUTF8StringEncoding] - wait:NO]; + [[self vimController] sendMessage:InsertTextMsgID + data:[string dataUsingEncoding:NSUTF8StringEncoding] + wait:NO]; } @@ -174,8 +116,7 @@ - (BOOL)performKeyEquivalent:(NSEvent *)event [data appendBytes:&len length:sizeof(int)]; [data appendBytes:[string UTF8String] length:len]; - [NSPortMessage sendMessage:CmdKeyMsgID withSendPort:sendPort data:data - wait:NO]; + [[self vimController] sendMessage:CmdKeyMsgID data:data wait:NO]; return YES; } @@ -220,8 +161,7 @@ - (void)scrollWheel:(NSEvent *)event [data appendBytes:&flags length:sizeof(int)]; [data appendBytes:&dy length:sizeof(float)]; - [NSPortMessage sendMessage:ScrollWheelMsgID withSendPort:sendPort - data:data wait:NO]; + [[self vimController] sendMessage:ScrollWheelMsgID data:data wait:NO]; } - (void)mouseDown:(NSEvent *)event @@ -242,8 +182,7 @@ - (void)mouseDown:(NSEvent *)event [data appendBytes:&flags length:sizeof(int)]; [data appendBytes:&count length:sizeof(int)]; - [NSPortMessage sendMessage:MouseDownMsgID withSendPort:sendPort - data:data wait:NO]; + [[self vimController] sendMessage:MouseDownMsgID data:data wait:NO]; } - (void)rightMouseDown:(NSEvent *)event @@ -270,8 +209,7 @@ - (void)mouseUp:(NSEvent *)event [data appendBytes:&col length:sizeof(int)]; [data appendBytes:&flags length:sizeof(int)]; - [NSPortMessage sendMessage:MouseUpMsgID withSendPort:sendPort - data:data wait:NO]; + [[self vimController] sendMessage:MouseUpMsgID data:data wait:NO]; } - (void)rightMouseUp:(NSEvent *)event @@ -298,8 +236,7 @@ - (void)mouseDragged:(NSEvent *)event [data appendBytes:&col length:sizeof(int)]; [data appendBytes:&flags length:sizeof(int)]; - [NSPortMessage sendMessage:MouseDraggedMsgID withSendPort:sendPort - data:data wait:NO]; + [[self vimController] sendMessage:MouseDraggedMsgID data:data wait:NO]; } - (void)rightMouseDragged:(NSEvent *)event @@ -393,9 +330,17 @@ - (void)dispatchKeyEvent:(NSEvent *)event [NSCursor setHiddenUntilMouseMoves:YES]; - [NSPortMessage sendMessage:KeyDownMsgID withSendPort:sendPort data:data - wait:NO]; + [[self vimController] sendMessage:KeyDownMsgID data:data wait:NO]; } } +- (MMVimController *)vimController +{ + id windowController = [[self window] windowController]; + + // TODO: Make sure 'windowController' is a MMWindowController before type + // casting. + return [(MMWindowController*)windowController vimController]; +} + @end // MMTextView (Private) diff --git a/MMVimController.h b/MMVimController.h index 19da37f264..5917d474ff 100644 --- a/MMVimController.h +++ b/MMVimController.h @@ -9,15 +9,24 @@ */ #import +#import "MacVim.h" @class MMWindowController; -@interface MMVimController : NSObject { +@interface MMVimController : NSObject +#if MM_USE_DO + +#endif +{ MMWindowController *windowController; +#if MM_USE_DO + id backendProxy; +#else NSPort *sendPort; NSPort *receivePort; +#endif NSMutableArray *mainMenuItems; BOOL shouldUpdateMainMenu; //NSMutableArray *popupMenus; @@ -25,9 +34,15 @@ NSMutableDictionary *toolbarItemDict; } +#if MM_USE_DO +- (id)initWithBackend:(id)backend; +- (id)backendProxy; +#else - (id)initWithPort:(NSPort *)port; -- (void)windowWillClose:(NSNotification *)notification; - (NSPort *)sendPort; +#endif +- (void)windowWillClose:(NSNotification *)notification; +- (void)sendMessage:(int)msgid data:(NSData *)data wait:(BOOL)wait; @end diff --git a/MMVimController.m b/MMVimController.m index cd7e44451c..54045efb19 100644 --- a/MMVimController.m +++ b/MMVimController.m @@ -10,7 +10,6 @@ #import "MMVimController.h" #import "MMWindowController.h" -#import "MacVim.h" #import "MMAppController.h" #import "MMTextView.h" #import "MMTextStorage.h" @@ -32,6 +31,7 @@ - (NSToolbarItem *)toolbarItemForTag:(int)tag index:(int *)index; - (IBAction)toolbarAction:(id)sender; - (void)addToolbarItemToDictionaryWithTag:(int)tag label:(NSString *)title toolTip:(NSString *)tip icon:(NSString *)icon; +- (void)connectionDidDie:(NSNotification *)notification; @end @@ -67,10 +67,40 @@ + (NSColor *)colorWithRgbInt:(int)rgb; @implementation MMVimController +#if MM_USE_DO +- (id)initWithBackend:(id)backend +#else - (id)initWithPort:(NSPort *)port +#endif { if ((self = [super init])) { - windowController = [[MMWindowController alloc] initWithPort:port]; + windowController = + [[MMWindowController alloc] initWithVimController:self]; +#if MM_USE_DO + backendProxy = [backend retain]; + + NSConnection *connection = [backendProxy connectionForProxy]; + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(connectionDidDie:) + name:NSConnectionDidDieNotification object:connection]; +#else + sendPort = [port retain]; + + // Init receive port and send connected message to VimTask + receivePort = [NSMachPort new]; + [receivePort setDelegate:self]; + + // Add to the default run loop mode as well as the event tracking mode; + // the latter ensures that updates from the VimTask reaches + // MMVimController whilst the user resizes a window with the mouse. + [[NSRunLoop currentRunLoop] addPort:receivePort + forMode:NSDefaultRunLoopMode]; + [[NSRunLoop currentRunLoop] addPort:receivePort + forMode:NSEventTrackingRunLoopMode]; + + [NSPortMessage sendMessage:ConnectedMsgID withSendPort:sendPort + receivePort:receivePort wait:YES]; +#endif mainMenuItems = [[NSMutableArray alloc] init]; @@ -90,22 +120,6 @@ - (id)initWithPort:(NSPort *)port name:NSWindowDidBecomeMainNotification object:[windowController window]]; - sendPort = [port retain]; - - // Init receive port and send connected message to VimTask - receivePort = [NSMachPort new]; - [receivePort setDelegate:self]; - - // Add to the default run loop mode as well as the event tracking mode; - // the latter ensures that updates from the VimTask reaches - // MMVimController whilst the user resizes a window with the mouse. - [[NSRunLoop currentRunLoop] addPort:receivePort - forMode:NSDefaultRunLoopMode]; - [[NSRunLoop currentRunLoop] addPort:receivePort - forMode:NSEventTrackingRunLoopMode]; - - [NSPortMessage sendMessage:ConnectedMsgID withSendPort:sendPort - receivePort:receivePort wait:YES]; } return self; @@ -113,24 +127,67 @@ - (id)initWithPort:(NSPort *)port - (void)dealloc { + //NSLog(@"%@ %s", [self className], _cmd); + + [[NSNotificationCenter defaultCenter] removeObserver:self]; + +#if MM_USE_DO + [backendProxy release]; +#else if (sendPort) { // Kill task immediately [NSPortMessage sendMessage:KillTaskMsgID withSendPort:sendPort receivePort:receivePort wait:NO]; } - [[NSNotificationCenter defaultCenter] removeObserver:self]; + [sendPort release]; + [receivePort release]; +#endif [toolbarItemDict release]; [toolbar release]; [mainMenuItems release]; [windowController release]; - [sendPort release]; - [receivePort release]; [super dealloc]; } +- (id)backendProxy +{ + return backendProxy; +} + +- (void)sendMessage:(int)msgid data:(NSData *)data wait:(BOOL)wait +{ +#if MM_USE_DO + // TODO: Decrease reply/request timeouts if 'wait' is off. + [backendProxy processInput:msgid data:data]; +#else + [NSPortMessage sendMessage:msgid withSendPort:sendPort data:data + wait:wait]; +#endif +} + +#if MM_USE_DO +- (oneway void)processCommandQueue:(in NSArray *)queue +{ + unsigned i, count = [queue count]; + if (count % 2) { + NSLog(@"WARNING: Uneven number of components (%d) in flush queue " + "message; ignoring this message.", count); + return; + } + + for (i = 0; i < count; i += 2) { + NSData *value = [queue objectAtIndex:i]; + NSData *data = [queue objectAtIndex:i+1]; + + [self handleMessage:*((int*)[value bytes]) data:data]; + } +} + +#else // MM_USE_DO + - (NSPort *)sendPort { return sendPort; @@ -138,6 +195,8 @@ - (NSPort *)sendPort - (void)handlePortMessage:(NSPortMessage *)portMessage { + //NSLog(@"%@ %s %@", [self className], _cmd, portMessage); + NSArray *components = [portMessage components]; unsigned msgid = [portMessage msgid]; @@ -168,6 +227,7 @@ - (void)handlePortMessage:(NSPortMessage *)portMessage if (shouldUpdateMainMenu) [self updateMainMenu]; } +#endif // MM_USE_DO - (void)windowWillClose:(NSNotification *)notification { @@ -216,6 +276,8 @@ @implementation MMVimController (Private) - (void)handleMessage:(int)msgid data:(NSData *)data { + //NSLog(@"%@ %s", [self className], _cmd); + if (OpenVimWindowMsgID == msgid) { const void *bytes = [data bytes]; int rows = *((int*)bytes); bytes += sizeof(int); @@ -225,7 +287,9 @@ - (void)handleMessage:(int)msgid data:(NSData *)data // cols, rows); [windowController openWindowWithRows:rows columns:cols]; - } else if (TaskExitedMsgID == msgid) { + } +#if !MM_USE_DO + else if (TaskExitedMsgID == msgid) { //NSLog(@"Received task exited message from VimTask; closing window."); // Release sendPort immediately to avoid dealloc trying to send a 'kill @@ -237,7 +301,9 @@ - (void)handleMessage:(int)msgid data:(NSData *)data // HACK! Make sure no menu updating is done, we're about to close. shouldUpdateMainMenu = NO; - } else if (BatchDrawMsgID == msgid) { + } +#endif // !MM_USE_DO + else if (BatchDrawMsgID == msgid) { //NSLog(@"Received batch draw message from VimTask."); [self performBatchDrawWithData:data]; @@ -673,6 +739,7 @@ - (void)performBatchDrawWithData:(NSData *)data - (void)panelDidEnd:(NSSavePanel *)panel code:(int)code context:(void *)context { +#if !MM_USE_DO NSMutableData *data = [NSMutableData data]; int ok = (code == NSOKButton); NSString *filename = [panel filename]; @@ -690,6 +757,7 @@ - (void)panelDidEnd:(NSSavePanel *)panel code:(int)code context:(void *)context } [windowController setStatusText:@""]; +#endif // !MM_USE_DO } - (NSMenuItem *)menuItemForTag:(int)tag @@ -801,6 +869,15 @@ - (void)addToolbarItemToDictionaryWithTag:(int)tag label:(NSString *)title [item release]; } +#if MM_USE_DO +- (void)connectionDidDie:(NSNotification *)notification +{ + //NSLog(@"A MMVimController lost its connection to the backend; " + // "closing the controller."); + [windowController close]; +} +#endif // MM_USE_DO + @end // MMVimController (Private) diff --git a/MMWindowController.h b/MMWindowController.h index 8afa6df892..fbe82d2803 100644 --- a/MMWindowController.h +++ b/MMWindowController.h @@ -13,6 +13,7 @@ @class PSMTabBarControl; @class MMTextView; @class MMTextStorage; +@class MMVimController; @interface MMWindowController : NSWindowController @@ -20,7 +21,8 @@ IBOutlet PSMTabBarControl *tabBarControl; IBOutlet NSTabView *tabView; IBOutlet NSTextField *statusTextField; - NSPort *sendPort; + + MMVimController *vimController; BOOL vimTaskSelectedTab; NSTimer *statusTimer; MMTextView *textView; @@ -29,7 +31,8 @@ BOOL setupDone; } -- (id)initWithPort:(NSPort *)port; +- (id)initWithVimController:(MMVimController *)controller; +- (MMVimController *)vimController; - (MMTextView *)textView; - (MMTextStorage *)textStorage; - (void)openWindowWithRows:(int)rows columns:(int)cols; diff --git a/MMWindowController.m b/MMWindowController.m index fa85832de9..fdfdc23fd4 100644 --- a/MMWindowController.m +++ b/MMWindowController.m @@ -12,6 +12,7 @@ #import #import "MMTextView.h" #import "MMTextStorage.h" +#import "MMVimController.h" #import "MacVim.h" @@ -93,10 +94,10 @@ - (void)placeViews; @implementation MMWindowController -- (id)initWithPort:(NSPort *)port +- (id)initWithVimController:(MMVimController *)controller { if ((self = [super initWithWindowNibName:@"VimWindow"])) { - sendPort = [port retain]; + vimController = controller; scrollbars = [[NSMutableArray alloc] init]; textStorage = [[MMTextStorage alloc] init]; } @@ -106,8 +107,12 @@ - (id)initWithPort:(NSPort *)port - (void)dealloc { + //NSLog(@"%@ %s", [self className], _cmd); + // TODO: release tabBarControl and tabView? + vimController = nil; + [tabBarControl setDelegate:nil]; [[self window] setDelegate:nil]; @@ -116,11 +121,15 @@ - (void)dealloc [scrollbars release]; [textView release]; [textStorage release]; - [sendPort release]; [super dealloc]; } +- (MMVimController *)vimController +{ + return vimController; +} + - (void)windowDidLoad { // Called after window nib file is loaded. @@ -223,39 +232,6 @@ - (MMTextStorage *)textStorage - (void)openWindowWithRows:(int)rows columns:(int)cols { -#if 0 - // Make sure window nib file is loaded. - [self window]; - - // Set up text system - textStorage = [[MMTextStorage alloc] init]; - NSLayoutManager *lm = [[NSLayoutManager alloc] init]; - NSTextContainer *tc = [[NSTextContainer alloc] initWithContainerSize: - NSMakeSize(1.0e7,1.0e7)]; - - [tc setWidthTracksTextView:NO]; - [tc setHeightTracksTextView:NO]; - [tc setLineFragmentPadding:0]; - - [textStorage setMaxRows:rows columns:cols]; - [textStorage addLayoutManager:lm]; - [lm addTextContainer:tc]; - //[[lm typesetter] setUsesFontLeading:NO]; - - textView = [[MMTextView alloc] initWithPort:sendPort frame:[tabView frame] - textContainer:tc]; - [[self window] makeFirstResponder:textView]; - - // Keep track of when the layout has changed. - [[textView layoutManager] setDelegate:self]; - - // The text storage retains the layout manager which in turn retains the - // text container. - [tc release]; - [lm release]; - - [self addNewTabViewItem]; -#else // Setup a complete text system. NSLayoutManager *lm = [[NSLayoutManager alloc] init]; NSTextContainer *tc = [[NSTextContainer alloc] initWithContainerSize: @@ -269,8 +245,8 @@ - (void)openWindowWithRows:(int)rows columns:(int)cols [textStorage addLayoutManager:lm]; [lm addTextContainer:tc]; - textView = [[MMTextView alloc] initWithPort:sendPort frame:[tabView frame] - textContainer:tc]; + textView = [[MMTextView alloc] initWithFrame:[tabView frame] + textContainer:tc]; [[self window] makeFirstResponder:textView]; @@ -283,7 +259,6 @@ - (void)openWindowWithRows:(int)rows columns:(int)cols [lm release]; [self addNewTabViewItem]; -#endif // NOTE! This flag is set once the entire text system is set up. setupDone = YES; @@ -409,7 +384,7 @@ - (void)flashStatusText:(NSString *)text - (IBAction)addNewTab:(id)sender { - [NSPortMessage sendMessage:AddNewTabMsgID withSendPort:sendPort wait:NO]; + [vimController sendMessage:AddNewTabMsgID data:nil wait:NO]; } - (IBAction)showTabBar:(id)sender @@ -446,8 +421,7 @@ - (void)tabView:(NSTabView *)theTabView didSelectTabViewItem: // Propagate the selection message to the VimTask. int idx = [self representedIndexOfTabViewItem:tabViewItem]; NSData *data = [NSData dataWithBytes:&idx length:sizeof(int)]; - [NSPortMessage sendMessage:SelectTabMsgID withSendPort:sendPort - data:data wait:YES]; + [vimController sendMessage:SelectTabMsgID data:data wait:YES]; } } @@ -460,8 +434,7 @@ - (BOOL)tabView:(NSTabView *)theTabView shouldCloseTabViewItem: int idx = [self representedIndexOfTabViewItem:tabViewItem]; //NSLog(@"Closing tab with index %d", idx); NSData *data = [NSData dataWithBytes:&idx length:sizeof(int)]; - [NSPortMessage sendMessage:CloseTabMsgID withSendPort:sendPort - data:data wait:YES]; + [vimController sendMessage:CloseTabMsgID data:data wait:YES]; return NO; } @@ -472,8 +445,7 @@ - (void)tabView:(NSTabView *)theTabView didDragTabViewItem: NSMutableData *data = [NSMutableData data]; [data appendBytes:&idx length:sizeof(int)]; - [NSPortMessage sendMessage:DraggedTabMsgID withSendPort:sendPort - data:data wait:YES]; + [vimController sendMessage:DraggedTabMsgID data:data wait:YES]; } @@ -524,11 +496,24 @@ - (void)layoutManager:(NSLayoutManager *)aLayoutManager // -- NSWindow delegate ------------------------------------------------------ -#if 0 +- (BOOL)windowShouldClose:(id)sender +{ + [vimController sendMessage:VimShouldCloseMsgID data:nil wait:YES]; + return NO; +} + - (void)windowWillClose:(NSNotification *)notification { + //NSLog(@"%@ %s", [self className], _cmd); + + // NOTE! There is a bug in PSMTabBarControl in that it retains the delegate + // (which is the MMWindowController) so reset the delegate here, otherwise + // the MMWindowController never gets released resulting in a pretty serious + // memory leak. + [tabBarControl setDelegate:nil]; } +#if 0 - (NSSize)windowWillResize:(NSWindow *)sender toSize:(NSSize)proposedFrameSize { //NSLog(@"%s (%.2f,%.2f)", _cmd, proposedFrameSize.width, @@ -725,8 +710,7 @@ - (IBAction)vimMenuItemAction:(id)sender NSMutableData *data = [NSMutableData data]; [data appendBytes:&tag length:sizeof(int)]; - [NSPortMessage sendMessage:ExecuteMenuMsgID withSendPort:sendPort - data:data wait:NO]; + [vimController sendMessage:ExecuteMenuMsgID data:data wait:NO]; } - (MMScroller *)scrollbarForIdentifier:(long)ident index:(unsigned *)idx @@ -871,8 +855,7 @@ - (void)scroll:(id)sender [data appendBytes:&hitPart length:sizeof(int)]; [data appendBytes:&value length:sizeof(float)]; - [NSPortMessage sendMessage:ScrollbarEventMsgID withSendPort:sendPort - data:data wait:YES]; + [vimController sendMessage:ScrollbarEventMsgID data:data wait:YES]; } - (void)fitWindowToScrollbars:(id)sender @@ -902,10 +885,8 @@ - (void)placeViews //NSLog(@"Notify Vim that text storage dimensions changed to %dx%d", // dim[0], dim[1]); NSData *data = [NSData dataWithBytes:dim length:2*sizeof(int)]; - [NSPortMessage sendMessage:SetTextDimensionsMsgID - withSendPort:sendPort - data:data - wait:![textView inLiveResize]]; + [vimController sendMessage:SetTextDimensionsMsgID data:data + wait:![textView inLiveResize]]; } [tabView setFrame:textViewRect]; diff --git a/MacVim.h b/MacVim.h index cd28046690..2945850216 100644 --- a/MacVim.h +++ b/MacVim.h @@ -11,6 +11,30 @@ #import +#define MM_USE_DO 1 + + + +#if MM_USE_DO + +@protocol MMBackendProtocol +- (oneway void)processInput:(int)msgid data:(in NSData *)data; +- (BOOL)checkForModifiedBuffers; +@end + +@protocol MMFrontendProtocol +- (oneway void)processCommandQueue:(in NSArray *)queue; +@end + +@protocol MMAppProtocol +- (byref id )connectBackend: + (byref in id )backend; +@end + +#endif + + + enum { CheckinMsgID = 1, ConnectedMsgID, @@ -44,9 +68,11 @@ enum { EnableMenuItemMsgID, ExecuteMenuMsgID, ShowToolbarMsgID, +#if !MM_USE_DO TaskShouldTerminateMsgID, TerminateReplyYesMsgID, TerminateReplyNoMsgID, +#endif CreateScrollbarMsgID, DestroyScrollbarMsgID, ShowScrollbarMsgID, @@ -54,6 +80,7 @@ enum { SetScrollbarThumbMsgID, ScrollbarEventMsgID, SetFontMsgID, + VimShouldCloseMsgID, }; From 0fd41065f9a9d0676ec7ce0fa2b11e1dcfc19a52 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sat, 28 Jul 2007 20:21:18 +0000 Subject: [PATCH 0007/1156] More bugs... git-svn-id: http://macvim.googlecode.com/svn/trunk@21 96c4425d-ca35-0410-94e5-3396d5c13a8f --- TODO | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/TODO b/TODO index 94559a0894..1eb387673c 100644 --- a/TODO +++ b/TODO @@ -1,5 +1,6 @@ Active: +- :colorscheme elflord, :set lines+=3 --> colors are not updated properly - proper font handling - font selection dialog (:set gfn=*) - check for memory leaks @@ -25,8 +26,6 @@ Active: - hide baseline separator when tabbar is visible (and make sure clicking the hide/show toolbar button in the top right of the corner does not show it again) -- use DO to communicate between GUI and Vim (only for two-way communication, - one-way communication should still use mach ports) - window title is never set when starting with terminal vim and typing :gui - forking doesn't work with :gui (i think) - make sure [NSMutableData appendByte:length:] is never called with 0 length @@ -48,10 +47,20 @@ Active: - got this error when clicking to close second last tab: 2007-07-23 08:19:29.398 MacVim[335] *** Assertion failure in -[PSMTabBarControl lockFocus], AppKit.subproj/NSView.m:3248 2007-07-23 08:19:29.410 MacVim[335] lockFocus sent to a view whose window is deferred and does not yet have a corresponding platform window +- got this error on Cmd-N with no other windows open: + 2007-07-27 22:00:17.680 MacVim[454] *** -[NSToolbarView frameDidChange:]: selector not recognized [self = 0x39ba80] + 2007-07-27 22:00:17.690 MacVim[454] Exception raised during posting of notification. Ignored. exception: *** -[NSToolbarView frameDidChange:]: selector not recognized [self = 0x39ba80] + Pending: +- use DO to communicate between GUI and Vim (only for two-way communication, + one-way communication should still use mach ports) + + +Done: + - make scrollbar inactive if it is too small to display properly - make vertical scrollbars cover command line as well - setting font in .gvimrc has no effect since textStorage has not been init'ed @@ -66,10 +75,6 @@ Pending: (figure out how to pass '-nowindow yes' option when launching GUI) - support using VimTask as a standalone terminal app, with support for :gui - path is set to / when not starting from command line, set it to $HOME instead - - -Done: - - input of wide characters does not work - tab completion doesn't work on iMac - close icons on tabs don't appear on iMac From a1011f566a2cb8a2c2ead4323e19c87ea34b84d8 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sun, 29 Jul 2007 10:24:42 +0000 Subject: [PATCH 0008/1156] Added support for 'wait' flag in sendMessage:data:wait:. git-svn-id: http://macvim.googlecode.com/svn/trunk@24 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMVimController.m | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/MMVimController.m b/MMVimController.m index 54045efb19..85864b62c7 100644 --- a/MMVimController.m +++ b/MMVimController.m @@ -160,8 +160,19 @@ - (id)backendProxy - (void)sendMessage:(int)msgid data:(NSData *)data wait:(BOOL)wait { #if MM_USE_DO - // TODO: Decrease reply/request timeouts if 'wait' is off. - [backendProxy processInput:msgid data:data]; + if (wait) { + [backendProxy processInput:msgid data:data]; + } else { + // Do not wait for the message to be sent, i.e. drop the message if it + // can't be delivered immediately. + NSConnection *connection = [backendProxy connectionForProxy]; + if (connection) { + NSTimeInterval req = [connection requestTimeout]; + [connection setRequestTimeout:0]; + [backendProxy processInput:msgid data:data]; + [connection setRequestTimeout:req]; + } + } #else [NSPortMessage sendMessage:msgid withSendPort:sendPort data:data wait:wait]; From e70a969683aae29ff359d46860af954d97b8c50f Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sun, 29 Jul 2007 10:25:33 +0000 Subject: [PATCH 0009/1156] Added connection to event tracking mode so that live resize works for DO. git-svn-id: http://macvim.googlecode.com/svn/trunk@25 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMAppController.m | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/MMAppController.m b/MMAppController.m index 83bfe49afb..43ec804862 100644 --- a/MMAppController.m +++ b/MMAppController.m @@ -29,6 +29,11 @@ - (id)init //NSLog(@"Registering connection with name '%@'", name); if ([connection registerName:name]) { [connection setRootObject:self]; + + // NOTE: When the user is resizing the window the AppKit puts the + // run loop in event tracking mode. Unless the connection listens + // to request in this mode, live resizing won't work. + [connection addRequestMode:NSEventTrackingRunLoopMode]; } else { NSLog(@"WARNING: Failed to register connection with name '%@'", name); From c10ae3882e8ebba755dc59bc52c659bb18cf0d8a Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sun, 29 Jul 2007 10:27:18 +0000 Subject: [PATCH 0010/1156] - Tabs no longer uses 'size to fit'. - Added some cautionary comments to certain sendMessage:data:wait: calls. git-svn-id: http://macvim.googlecode.com/svn/trunk@26 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMWindowController.m | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/MMWindowController.m b/MMWindowController.m index fdfdc23fd4..9d6b3ce309 100644 --- a/MMWindowController.m +++ b/MMWindowController.m @@ -135,7 +135,10 @@ - (void)windowDidLoad // Called after window nib file is loaded. [tabBarControl setHidden:YES]; - [tabBarControl setSizeCellsToFit:YES]; + // NOTE: Size to fit looks good, but not many tabs will fit and there are + // quite a few drawing bugs in this code, so it is disabled for now. + //[tabBarControl setSizeCellsToFit:YES]; + [tabBarControl setCellMinWidth:64]; [tabBarControl setAllowsDragBetweenWindows:NO]; [tabBarControl setShowAddTabButton:YES]; [[tabBarControl addTabButton] setTarget:self]; @@ -384,6 +387,9 @@ - (void)flashStatusText:(NSString *)text - (IBAction)addNewTab:(id)sender { + // NOTE! This can get called a lot if the user holds down the key + // equivalent for this action, which causes the ports to fill up. If we + // wait for the message to be sent then the app might become unresponsive. [vimController sendMessage:AddNewTabMsgID data:nil wait:NO]; } @@ -855,6 +861,9 @@ - (void)scroll:(id)sender [data appendBytes:&hitPart length:sizeof(int)]; [data appendBytes:&value length:sizeof(float)]; + // TODO: Should this message wait or not? If there are problems with + // MacVim locking up when the user scrolls violently, then it should be + // changed to NO. [vimController sendMessage:ScrollbarEventMsgID data:data wait:YES]; } @@ -885,6 +894,10 @@ - (void)placeViews //NSLog(@"Notify Vim that text storage dimensions changed to %dx%d", // dim[0], dim[1]); NSData *data = [NSData dataWithBytes:dim length:2*sizeof(int)]; + + // NOTE! This can get called a lot when in live resize, which causes + // the ports to fill up. If we wait for the message to be sent then + // the app might become unresponsive. [vimController sendMessage:SetTextDimensionsMsgID data:data wait:![textView inLiveResize]]; } From 5381551a053dcf58797eeeec1f4ef7952a5d8920 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sun, 29 Jul 2007 11:10:45 +0000 Subject: [PATCH 0011/1156] colorscheme now works (even after resizing window). git-svn-id: http://macvim.googlecode.com/svn/trunk@27 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMBackend.m | 7 +++++++ MMTextStorage.h | 3 +++ MMTextStorage.m | 40 ++++++++++++++++++++++++++++++++++++---- MMVimController.m | 11 +++++++++++ MacVim.h | 1 + gui_macvim.m | 13 ++++++++++--- 6 files changed, 68 insertions(+), 7 deletions(-) diff --git a/MMBackend.m b/MMBackend.m index 2456ff1d4b..d1b4959119 100644 --- a/MMBackend.m +++ b/MMBackend.m @@ -84,6 +84,13 @@ - (void)setDefaultColorsBackground:(int)bg foreground:(int)fg { defaultBackgroundColor = bg; defaultForegroundColor = fg; + + NSMutableData *data = [NSMutableData data]; + + [data appendBytes:&bg length:sizeof(int)]; + [data appendBytes:&fg length:sizeof(int)]; + + [self queueMessage:SetDefaultColorsMsgID data:data]; } - (BOOL)checkin diff --git a/MMTextStorage.h b/MMTextStorage.h index 922e0bb8fd..db2b863f8f 100644 --- a/MMTextStorage.h +++ b/MMTextStorage.h @@ -17,6 +17,7 @@ int maxRows, maxColumns; NSAttributedString *emptyRowString; NSFont *font; + NSColor *defaultBackgroundColor; //NSMutableParagraphStyle *paragraphStyle; } @@ -43,6 +44,8 @@ - (void)clearBlockFromRow:(int)row1 column:(int)col1 toRow:(int)row2 column:(int)col2 color:(NSColor *)color; - (void)clearAllWithColor:(NSColor *)color; +- (void)setDefaultColorsBackground:(NSColor *)bgColor + foreground:(NSColor *)fgColor; - (void)setFont:(NSFont*)newFont; - (NSFont*)font; - (float)widthOfEmptyRow; diff --git a/MMTextStorage.m b/MMTextStorage.m index 13315018ef..2bb207b28f 100644 --- a/MMTextStorage.m +++ b/MMTextStorage.m @@ -59,6 +59,7 @@ - (void)dealloc [emptyRowString release]; //[paragraphStyle release]; [font release]; + [defaultBackgroundColor release]; [attribString release]; [super dealloc]; } @@ -130,9 +131,15 @@ - (void)setMaxRows:(int)rows columns:(int)cols NSString *fmt = [NSString stringWithFormat:@"%%%dc\%C", maxColumns, NSLineSeparatorCharacter]; - NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys: - font, NSFontAttributeName, - nil]; + NSDictionary *dict; + if (defaultBackgroundColor) { + dict = [NSDictionary dictionaryWithObjectsAndKeys: + font, NSFontAttributeName, + defaultBackgroundColor, NSBackgroundColorAttributeName, nil]; + } else { + dict = [NSDictionary dictionaryWithObjectsAndKeys: + font, NSFontAttributeName, nil]; + } [emptyRowString release]; emptyRowString = [[NSAttributedString alloc] @@ -359,6 +366,31 @@ - (void)clearAllWithColor:(NSColor *)color [self edited:NSTextStorageEditedAttributes range:range changeInLength:0]; } +- (void)setDefaultColorsBackground:(NSColor *)bgColor + foreground:(NSColor *)fgColor +{ + // NOTE: Foreground color is ignored. + [defaultBackgroundColor release]; + +#if 0 + if (bgColor) { + defaultBackgroundColor = [bgColor retain]; +#if 1 + NSMutableAttributedString *string = [emptyRowString mutableCopy]; + [string addAttribute:NSBackgroundColorAttributeName value:bgColor + range:NSMakeRange(0, [emptyRowString length])]; + [emptyRowString release]; + emptyRowString = string; +#endif + [self clearAllWithColor:bgColor]; + } else { + defaultBackgroundColor = nil; + } +#else + defaultBackgroundColor = bgColor ? [bgColor retain] : nil; +#endif +} + - (void)setFont:(NSFont*)newFont { #if 0 @@ -374,7 +406,7 @@ - (void)setFont:(NSFont*)newFont changeInLength:0]; } #else - if (font != newFont) { + if (newFont && font != newFont) { //NSLog(@"Setting font %@", newFont); [font release]; font = [newFont retain]; diff --git a/MMVimController.m b/MMVimController.m index 85864b62c7..fe84934d57 100644 --- a/MMVimController.m +++ b/MMVimController.m @@ -650,6 +650,17 @@ - (void)handleMessage:(int)msgid data:(NSData *)data } [name release]; + } else if (SetDefaultColorsMsgID == msgid) { + const void *bytes = [data bytes]; + int bg = *((int*)bytes); bytes += sizeof(int); + int fg = *((int*)bytes); bytes += sizeof(int); + + MMTextStorage *textStorage = [windowController textStorage]; + if (textStorage) { + [textStorage + setDefaultColorsBackground:[NSColor colorWithRgbInt:bg] + foreground:[NSColor colorWithRgbInt:fg]]; + } } else { NSLog(@"WARNING: Unknown message received (msgid=%d)", msgid); } diff --git a/MacVim.h b/MacVim.h index 2945850216..a984419c48 100644 --- a/MacVim.h +++ b/MacVim.h @@ -81,6 +81,7 @@ enum { ScrollbarEventMsgID, SetFontMsgID, VimShouldCloseMsgID, + SetDefaultColorsMsgID, }; diff --git a/gui_macvim.m b/gui_macvim.m index 21bf4cf8f9..0f78d5fab9 100644 --- a/gui_macvim.m +++ b/gui_macvim.m @@ -83,9 +83,7 @@ gui.char_width = 1; gui.char_ascent = 0; - // Default foreground and background colors are black and white. - gui.def_norm_pixel = gui.norm_pixel = 0; - gui.def_back_pixel = gui.back_pixel = 0xffffff; + gui_mch_def_colors(); [[MMBackend sharedInstance] setDefaultColorsBackground:gui.back_pixel foreground:gui.norm_pixel]; @@ -1060,6 +1058,15 @@ } + void +gui_mch_def_colors() +{ + // Default foreground and background colors are black and white. + gui.def_norm_pixel = gui.norm_pixel = 0; + gui.def_back_pixel = gui.back_pixel = 0xffffff; +} + + /* * Set the current text background color. */ From 2ddd79ba974c11358285d6b1c1bbf367aceaa52a Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sun, 29 Jul 2007 11:58:38 +0000 Subject: [PATCH 0012/1156] Patched up memory leak by balancing two unmatched alloc/release calls. git-svn-id: http://macvim.googlecode.com/svn/trunk@28 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMBackend.m | 1 + MMVimController.m | 1 + 2 files changed, 2 insertions(+) diff --git a/MMBackend.m b/MMBackend.m index d1b4959119..c4705e65a1 100644 --- a/MMBackend.m +++ b/MMBackend.m @@ -505,6 +505,7 @@ - (char *)browseForFileInDirectory:(char *)dir title:(char *)title NSString *name = [[NSString alloc] initWithBytes:(void*)bytes length:len encoding:NSUTF8StringEncoding]; s = vim_strsave((char_u*)[name UTF8String]); + [name release]; } [replyData release]; replyData = nil; diff --git a/MMVimController.m b/MMVimController.m index fe84934d57..864069a8a2 100644 --- a/MMVimController.m +++ b/MMVimController.m @@ -558,6 +558,7 @@ - (void)handleMessage:(int)msgid data:(NSData *)data [title release]; [tip release]; + [icon release]; } else if (RemoveMenuItemMsgID == msgid) { const void *bytes = [data bytes]; int tag = *((int*)bytes); bytes += sizeof(int); From a7d20e4dee9b935e4d783638df7845436f891da2 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sun, 29 Jul 2007 12:40:25 +0000 Subject: [PATCH 0013/1156] Added :browse support for DO. git-svn-id: http://macvim.googlecode.com/svn/trunk@29 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMBackend.h | 1 + MMBackend.m | 33 ++++++++++++++++++++++++++++++--- MMVimController.m | 26 +++++++++++++++++++++++++- MacVim.h | 4 ++++ 4 files changed, 60 insertions(+), 4 deletions(-) diff --git a/MMBackend.h b/MMBackend.h index 5e28c6b525..68d68295ec 100644 --- a/MMBackend.h +++ b/MMBackend.h @@ -23,6 +23,7 @@ #if MM_USE_DO NSConnection *connection; id frontendProxy; + NSString *browseForFileString; #else NSPort *sendPort; NSPort *receivePort; diff --git a/MMBackend.m b/MMBackend.m index c4705e65a1..e02a039408 100644 --- a/MMBackend.m +++ b/MMBackend.m @@ -461,15 +461,42 @@ - (void)setVimWindowTitle:(char *)title [self queueMessage:SetVimWindowTitleMsgID data:data]; } +#if MM_USE_DO +- (oneway void)setBrowseForFileString:(in bycopy NSString *)string +{ + // NOTE: This is called by [MMVimController panelDidEnd:::] to indicate + // that the save/open panel has finished. If 'string == nil' that means + // the user pressed cancel. + browseForFileString = string ? [string copy] : nil; +} +#endif + - (char *)browseForFileInDirectory:(char *)dir title:(char *)title saving:(int)saving { -#if MM_USE_DO - return nil; -#else //NSLog(@"browseForFileInDirectory:%s title:%s saving:%d", dir, title, // saving); +#if MM_USE_DO + NSString *ds = dir + ? [NSString stringWithCString:dir encoding:NSUTF8StringEncoding] + : nil; + NSString *ts = title + ? [NSString stringWithCString:title encoding:NSUTF8StringEncoding] + : nil; + [frontendProxy showSavePanelForDirectory:ds title:ts saving:saving]; + + // Wait until a reply is sent from MMVimController. + [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode + beforeDate:[NSDate distantFuture]]; + if (!browseForFileString) + return nil; + + char_u *s = vim_strsave((char_u*)[browseForFileString UTF8String]); + [browseForFileString release]; browseForFileString = nil; + + return (char *)s; +#else NSMutableData *data = [NSMutableData data]; [data appendBytes:&saving length:sizeof(int)]; diff --git a/MMVimController.m b/MMVimController.m index 864069a8a2..08cc5f1598 100644 --- a/MMVimController.m +++ b/MMVimController.m @@ -180,6 +180,27 @@ - (void)sendMessage:(int)msgid data:(NSData *)data wait:(BOOL)wait } #if MM_USE_DO +- (oneway void)showSavePanelForDirectory:(in bycopy NSString *)dir + title:(in bycopy NSString *)title + saving:(int)saving +{ + if (saving) { + [[NSSavePanel savePanel] beginSheetForDirectory:dir file:nil + modalForWindow:[windowController window] + modalDelegate:self + didEndSelector:@selector(panelDidEnd:code:context:) + contextInfo:NULL]; + } else { + NSOpenPanel *panel = [NSOpenPanel openPanel]; + [panel setAllowsMultipleSelection:NO]; + [panel beginSheetForDirectory:dir file:nil types:nil + modalForWindow:[windowController window] + modalDelegate:self + didEndSelector:@selector(panelDidEnd:code:context:) + contextInfo:NULL]; + } +} + - (oneway void)processCommandQueue:(in NSArray *)queue { unsigned i, count = [queue count]; @@ -762,7 +783,10 @@ - (void)performBatchDrawWithData:(NSData *)data - (void)panelDidEnd:(NSSavePanel *)panel code:(int)code context:(void *)context { -#if !MM_USE_DO +#if MM_USE_DO + NSString *string = (code == NSOKButton) ? [panel filename] : nil; + [backendProxy setBrowseForFileString:string]; +#else NSMutableData *data = [NSMutableData data]; int ok = (code == NSOKButton); NSString *filename = [panel filename]; diff --git a/MacVim.h b/MacVim.h index a984419c48..39a0c0e608 100644 --- a/MacVim.h +++ b/MacVim.h @@ -20,10 +20,14 @@ @protocol MMBackendProtocol - (oneway void)processInput:(int)msgid data:(in NSData *)data; - (BOOL)checkForModifiedBuffers; +- (oneway void)setBrowseForFileString:(in bycopy NSString *)string; @end @protocol MMFrontendProtocol - (oneway void)processCommandQueue:(in NSArray *)queue; +- (oneway void)showSavePanelForDirectory:(in bycopy NSString *)dir + title:(in bycopy NSString *)title + saving:(int)saving; @end @protocol MMAppProtocol From 26a06f581fd1b8bc55ecba51f631867a470182c7 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sun, 29 Jul 2007 14:55:37 +0000 Subject: [PATCH 0014/1156] - Status line shows 'title' text on :browse - Status line shows dimensions when user drags/zooms the window git-svn-id: http://macvim.googlecode.com/svn/trunk@30 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMVimController.m | 4 ++++ MMWindowController.m | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/MMVimController.m b/MMVimController.m index 08cc5f1598..4c811b2022 100644 --- a/MMVimController.m +++ b/MMVimController.m @@ -184,6 +184,8 @@ - (oneway void)showSavePanelForDirectory:(in bycopy NSString *)dir title:(in bycopy NSString *)title saving:(int)saving { + [windowController setStatusText:title]; + if (saving) { [[NSSavePanel savePanel] beginSheetForDirectory:dir file:nil modalForWindow:[windowController window] @@ -784,6 +786,8 @@ - (void)performBatchDrawWithData:(NSData *)data - (void)panelDidEnd:(NSSavePanel *)panel code:(int)code context:(void *)context { #if MM_USE_DO + [windowController setStatusText:@""]; + NSString *string = (code == NSOKButton) ? [panel filename] : nil; [backendProxy setBrowseForFileString:string]; #else diff --git a/MMWindowController.m b/MMWindowController.m index 9d6b3ce309..06a0f25653 100644 --- a/MMWindowController.m +++ b/MMWindowController.m @@ -891,6 +891,10 @@ - (void)placeViews // Text storage dimensions changed, notify the VimTask. int dim[2]; [textStorage getMaxRows:&dim[0] columns:&dim[1]]; + + NSString *sdim = [NSString stringWithFormat:@"%dx%d", dim[1], dim[0]]; + [self flashStatusText:sdim]; + //NSLog(@"Notify Vim that text storage dimensions changed to %dx%d", // dim[0], dim[1]); NSData *data = [NSData dataWithBytes:dim length:2*sizeof(int)]; From cc7e1b9b116da9efd74b82d89e41ca14aa714cbb Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sun, 29 Jul 2007 15:01:17 +0000 Subject: [PATCH 0015/1156] Active & pending changed git-svn-id: http://macvim.googlecode.com/svn/trunk@31 96c4425d-ca35-0410-94e5-3396d5c13a8f --- TODO | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/TODO b/TODO index 1eb387673c..6a7084c1c6 100644 --- a/TODO +++ b/TODO @@ -1,6 +1,7 @@ Active: -- :colorscheme elflord, :set lines+=3 --> colors are not updated properly +- add user default for min/max tab size +- should ignore action message if is called too often (e.g. in addNewTab:) - proper font handling - font selection dialog (:set gfn=*) - check for memory leaks @@ -55,6 +56,7 @@ Active: Pending: +- :colorscheme elflord, :set lines+=3 --> colors are not updated properly - use DO to communicate between GUI and Vim (only for two-way communication, one-way communication should still use mach ports) From 44c6ee46ee4b1ba49bcaa289452c265167f93d03 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sun, 29 Jul 2007 15:20:26 +0000 Subject: [PATCH 0016/1156] Don't wait on ScrollbarEventMsgID. git-svn-id: http://macvim.googlecode.com/svn/trunk@32 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMWindowController.m | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/MMWindowController.m b/MMWindowController.m index 06a0f25653..542e042a40 100644 --- a/MMWindowController.m +++ b/MMWindowController.m @@ -861,10 +861,7 @@ - (void)scroll:(id)sender [data appendBytes:&hitPart length:sizeof(int)]; [data appendBytes:&value length:sizeof(float)]; - // TODO: Should this message wait or not? If there are problems with - // MacVim locking up when the user scrolls violently, then it should be - // changed to NO. - [vimController sendMessage:ScrollbarEventMsgID data:data wait:YES]; + [vimController sendMessage:ScrollbarEventMsgID data:data wait:NO]; } - (void)fitWindowToScrollbars:(id)sender From 3e1b8d1c0d8880150b1345a5b0d5381307f1dd1b Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sun, 29 Jul 2007 15:21:52 +0000 Subject: [PATCH 0017/1156] Added exception handling to deal with time-outs in sendMessage::: git-svn-id: http://macvim.googlecode.com/svn/trunk@33 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMVimController.m | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/MMVimController.m b/MMVimController.m index 4c811b2022..d301bd0a7e 100644 --- a/MMVimController.m +++ b/MMVimController.m @@ -169,8 +169,16 @@ - (void)sendMessage:(int)msgid data:(NSData *)data wait:(BOOL)wait if (connection) { NSTimeInterval req = [connection requestTimeout]; [connection setRequestTimeout:0]; - [backendProxy processInput:msgid data:data]; - [connection setRequestTimeout:req]; + @try { + [backendProxy processInput:msgid data:data]; + } + @catch (NSException *e) { + // Connection timed out, just ignore this. + //NSLog(@"WARNING! Connection timed out in %s", _cmd); + } + @finally { + [connection setRequestTimeout:req]; + } } } #else From a2405dbee995f7a5af2f418b498cfadb7198c296 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sun, 29 Jul 2007 15:22:12 +0000 Subject: [PATCH 0018/1156] Enabled native exception handling. git-svn-id: http://macvim.googlecode.com/svn/trunk@34 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MacVim.xcodeproj/project.pbxproj | 3 +++ MacVim.xcodeproj/winckler.mode1 | 9 ++++----- MacVim.xcodeproj/winckler.pbxuser | 4 ++-- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/MacVim.xcodeproj/project.pbxproj b/MacVim.xcodeproj/project.pbxproj index 0b12971704..4b1b77fd56 100644 --- a/MacVim.xcodeproj/project.pbxproj +++ b/MacVim.xcodeproj/project.pbxproj @@ -516,6 +516,7 @@ ); FRAMEWORK_SEARCH_PATHS_QUOTED_1 = "\"$(SRCROOT)/../../../../Library/Frameworks\""; GCC_DYNAMIC_NO_PIC = NO; + GCC_ENABLE_OBJC_EXCEPTIONS = YES; GCC_GENERATE_DEBUGGING_SYMBOLS = YES; GCC_MODEL_TUNING = G5; GCC_OPTIMIZATION_LEVEL = 0; @@ -551,6 +552,7 @@ FRAMEWORK_SEARCH_PATHS_QUOTED_1 = "\"$(SRCROOT)/../../../../Library/Frameworks\""; GCC_DYNAMIC_NO_PIC = NO; GCC_ENABLE_FIX_AND_CONTINUE = YES; + GCC_ENABLE_OBJC_EXCEPTIONS = YES; GCC_MODEL_TUNING = G5; GCC_OPTIMIZATION_LEVEL = 0; HEADER_SEARCH_PATHS = PSMTabBarControl/source/; @@ -575,6 +577,7 @@ ); FRAMEWORK_SEARCH_PATHS_QUOTED_1 = "\"$(SRCROOT)/../../../../Library/Frameworks\""; GCC_DYNAMIC_NO_PIC = YES; + GCC_ENABLE_OBJC_EXCEPTIONS = YES; GCC_GENERATE_DEBUGGING_SYMBOLS = NO; GCC_MODEL_TUNING = G5; GCC_OPTIMIZATION_LEVEL = s; diff --git a/MacVim.xcodeproj/winckler.mode1 b/MacVim.xcodeproj/winckler.mode1 index 5226ec00cc..e76c7a0842 100644 --- a/MacVim.xcodeproj/winckler.mode1 +++ b/MacVim.xcodeproj/winckler.mode1 @@ -367,9 +367,9 @@ TableOfContents - 1DE601E10C587E150055263D + 1DBA03650C5CE38900B05DE3 1CE0B1FE06471DED0097A5F4 - 1DE601E20C587E150055263D + 1DBA03660C5CE38900B05DE3 1CE0B20306471E060097A5F4 1CE0B20506471E060097A5F4 @@ -503,7 +503,6 @@ 5 WindowOrderList - 1D16B9EF0BA33E3800A69B33 1C0AD2B3069F1EA900FABCE6 /Users/winckler/Projects/vim7/src/MacVim/MacVim.xcodeproj @@ -957,9 +956,9 @@ TableOfContents 1C0AD2B3069F1EA900FABCE6 - 1DE608C20C58821B0055263D + 1DBA03670C5CE38900B05DE3 1CD0528B0623707200166675 - 1DE608C30C58821B0055263D + 1DBA03680C5CE38900B05DE3 ToolbarConfiguration xcode.toolbar.config.run diff --git a/MacVim.xcodeproj/winckler.pbxuser b/MacVim.xcodeproj/winckler.pbxuser index 7938ee0419..df6ca6a127 100644 --- a/MacVim.xcodeproj/winckler.pbxuser +++ b/MacVim.xcodeproj/winckler.pbxuser @@ -215,8 +215,8 @@ PBXFileDataSource_Warnings_ColumnID, ); }; - PBXPerProjectTemplateStateSaveDate = 207125922; - PBXWorkspaceStateSaveDate = 207125922; + PBXPerProjectTemplateStateSaveDate = 207414117; + PBXWorkspaceStateSaveDate = 207414117; }; sourceControlManager = 1D16B9DD0BA33BB000A69B33 /* Source Control */; userBuildSettings = { From c2b80619a062ca2d3261a84712d21beb4391f13f Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sun, 29 Jul 2007 17:10:05 +0000 Subject: [PATCH 0019/1156] - The range is clipped to maxRows in rectForRowsInRange: - The range is clipped to maxColumns in rectForColumnsInRange: git-svn-id: http://macvim.googlecode.com/svn/trunk@35 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMTextStorage.m | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/MMTextStorage.m b/MMTextStorage.m index 2bb207b28f..4e72145f15 100644 --- a/MMTextStorage.m +++ b/MMTextStorage.m @@ -471,8 +471,13 @@ - (NSRect)rectForRowsInRange:(NSRange)range NSLayoutManager *lm = [[self layoutManagers] objectAtIndex:0]; float fontHeight = [lm defaultLineHeightForFont:font]; - rect.origin.y = fontHeight * range.location; - rect.size.height = fontHeight * range.length; + unsigned start = range.location > maxRows ? maxRows : range.location; + unsigned length = range.length; + if (start+length > maxRows) + length = maxRows - start; + + rect.origin.y = fontHeight * start; + rect.size.height = fontHeight * length; return rect; } @@ -483,8 +488,13 @@ - (NSRect)rectForColumnsInRange:(NSRange)range float fontWidth = maxColumns > 0 ? [self widthOfEmptyRow]/maxColumns : 0; - rect.origin.x = fontWidth * range.location; - rect.size.width = fontWidth * range.length; + unsigned start = range.location > maxColumns ? maxColumns : range.location; + unsigned length = range.length; + if (start+length > maxColumns) + length = maxColumns - start; + + rect.origin.x = fontWidth * start; + rect.size.width = fontWidth * length; return rect; } From 37a8aa26612607c5551561909c0c91e92e5c9a59 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sun, 29 Jul 2007 17:11:01 +0000 Subject: [PATCH 0020/1156] - The leftmost horizontal scrollbar is stretced to cover the tab view - Scrollbars are clipped to fit the tab view git-svn-id: http://macvim.googlecode.com/svn/trunk@36 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMWindowController.m | 42 ++++++++++++++++++++++++++++++++++++++---- 1 file changed, 38 insertions(+), 4 deletions(-) diff --git a/MMWindowController.m b/MMWindowController.m index 542e042a40..08187e2e02 100644 --- a/MMWindowController.m +++ b/MMWindowController.m @@ -25,7 +25,7 @@ // TODO! Implement hiding/showing of status line. static float StatusLineHeight = 16.0f; -static BOOL statusLineIsVisible = YES; // NO is _not_ supported at the moment! +static BOOL statusLineIsVisible = NO; // NO is _not_ supported at the moment! // TODO: Move! @@ -777,11 +777,12 @@ - (void)placeScrollbars NSView *contentView = [[self window] contentView]; BOOL lsbVisible = [self leftScrollbarVisible]; - // HACK! Find the lowest left&right vertical scrollbars. This hack - // continues further down. + // HACK! Find the lowest left&right vertical scrollbars, as well as the + // leftmost horizontal scrollbar. This hack continues further down. unsigned lowestLeftSbIdx = (unsigned)-1; unsigned lowestRightSbIdx = (unsigned)-1; - unsigned rowMaxLeft = 0, rowMaxRight = 0; + unsigned leftmostSbIdx = (unsigned)-1; + unsigned rowMaxLeft = 0, rowMaxRight = 0, colMax = 0; unsigned i, count = [scrollbars count]; for (i = 0; i < count; ++i) { MMScroller *scroller = [scrollbars objectAtIndex:i]; @@ -795,6 +796,10 @@ - (void)placeScrollbars && range.location >= rowMaxRight) { rowMaxRight = range.location; lowestRightSbIdx = i; + } else if ([scroller type] == MMScrollerTypeBottom + && range.location >= colMax) { + colMax = range.location; + leftmostSbIdx = i; } } } @@ -813,6 +818,25 @@ - (void)placeScrollbars rect.origin.y += StatusLineHeight; if (lsbVisible) rect.origin.x += [NSScroller scrollerWidth]; + + // HACK! Make sure the leftmost horizontal scrollbar covers the + // text view all the way to the right, otherwise it looks ugly when + // the user drags the window to resize. + if (i == leftmostSbIdx) { + float w = NSMaxX(tabViewFrame) - NSMaxX(rect); + if (w > 0) + rect.size.width += w; + } + + // Make sure scrollbar rect is bounded by the tab view frame. + if (rect.origin.x < tabViewFrame.origin.x) + rect.origin.x = tabViewFrame.origin.x; + else if (rect.origin.x > NSMaxX(tabViewFrame)) + rect.origin.x = NSMaxX(tabViewFrame); + if (NSMaxX(rect) > NSMaxX(tabViewFrame)) + rect.size.width -= NSMaxX(rect) - NSMaxX(tabViewFrame); + if (rect.size.width < 0) + rect.size.width = 0; } else { rect = [textStorage rectForRowsInRange:[scroller range]]; // Adjust for the fact that text layout is flipped. @@ -836,6 +860,16 @@ - (void)placeScrollbars rect.size.height = h; } } + + // Make sure scrollbar rect is bounded by the tab view frame. + if (rect.origin.y < tabViewFrame.origin.y) + rect.origin.y = tabViewFrame.origin.y; + else if (rect.origin.y > NSMaxY(tabViewFrame)) + rect.origin.y = NSMaxY(tabViewFrame); + if (NSMaxY(rect) > NSMaxY(tabViewFrame)) + rect.size.height -= NSMaxY(rect) - NSMaxY(tabViewFrame); + if (rect.size.height < 0) + rect.size.height = 0; } //NSLog(@"set scroller #%d frame = %@", i, NSStringFromRect(rect)); From a02a149dc26a380f5ee09dcaf08bd5e72922a6a5 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sun, 29 Jul 2007 18:01:14 +0000 Subject: [PATCH 0021/1156] - Added registering of user defaults, supported defaults: nowindow, tabminwidth, tabmaxwidth, taboptimumwidth, statuslineoff - Implemented hiding of status line via user default 'statuslineoff' git-svn-id: http://macvim.googlecode.com/svn/trunk@37 96c4425d-ca35-0410-94e5-3396d5c13a8f --- English.lproj/VimWindow.nib/classes.nib | 1 + English.lproj/VimWindow.nib/keyedobjects.nib | Bin 5460 -> 5543 bytes MMAppController.h | 8 ++++++ MMAppController.m | 24 ++++++++++++++++- MMWindowController.h | 1 + MMWindowController.m | 27 +++++++++++++------ 6 files changed, 52 insertions(+), 9 deletions(-) diff --git a/English.lproj/VimWindow.nib/classes.nib b/English.lproj/VimWindow.nib/classes.nib index 368d0f93b8..0757bf563a 100644 --- a/English.lproj/VimWindow.nib/classes.nib +++ b/English.lproj/VimWindow.nib/classes.nib @@ -6,6 +6,7 @@ CLASS = MMWindowController; LANGUAGE = ObjC; OUTLETS = { + statusSeparator = NSBox; statusTextField = NSTextField; tabBarControl = PSMTabBarControl; tabView = NSTabView; diff --git a/English.lproj/VimWindow.nib/keyedobjects.nib b/English.lproj/VimWindow.nib/keyedobjects.nib index ff924b86caca5a11881e053d123e1d3dbc10f7ce..a6dd7448112ba750159d19ccf8d7ed6eba928b47 100644 GIT binary patch delta 3369 zcmZ8i3tW{|5}!HW`+ZQs3=t4fM8%6GqKKxOuZUNO_(DMe!B7m*?4kEizEUyurWI>t zNNQ$jYUZ}-TB&6|Qbe&bU#XF)Yb?1v7Tt62#jL*jyZ4^&oHH~3nfcF5ZS?vs%L?5~ zzyK3sp(n&aUr2-jFbL9N6qG<2%z`=KhG$^`EQAVp5&jOZ!CI(>H{fk}2R6fY*a825 zJ@5(ag+p){zJOy;11I5Y_zyI~Pw+GRiij<-HMYeNY=@!P6}w>%ybt5BH}=B;_>dcu zFcU}M7|g+3%)=rq#pzgxW%xMG!YA-adbya+M6&0hQcs-2$JAoNQM+hWg3fO=`4d~vMe@=jbYi0*1{u@0YNYvGGPQ{dHySO z=`tF|z*xwJaWEcoAQvX^^NElL`B1<=g;2!Tk3um_fvKKkaZ|kab}qj&4Pu}arn49Z zEQvWa(2sAZJ5o7FYwlARbo3D{J8uc-7;QLk&OB7jJ@{?RKasH<_P=ST`wZ8{Tt2nX*|J(bpvx=uZAv+~wcT zERA(y!HoF2J{N5iW6ym*G38hwtGE`~X+s8eHdjzX3l&gXcl@_+&58 zn@~BD2c~FhUdiL$NPG7_flBYvoAuuyt(tq;1h?Qe_pm!lWP=$!?I#uz6i|d*lu$+m zf>1@xN3E@BqJ=g(NHG9gK)t72D+zAJ8H9l>*2^F-ExlB0f+oC|=g`pm28Urdw#Nvr zrvpY}N9+Ve*cqd-3!0t@`oz0A#u)70oa0k^SfVe-c)vHt17m@O90&hSFYivWE6f!W z@A5s~Ltjj>4<=M&0`|p3PfsJJdw+bO8XxcnKQkp`V9BgHKSCUcGRKqX^$G_;9uC2w zILx!chz)HwA#7vu*ikwoJDnvutzwHI*-iDFV3HoTb6&fncTt! zKAt7A;a;ANr_S`U+_D+dhv&~K8(frMoOkzXCRXsPUY3mDR|nrcxQ#3LK_(~8NPeK# z!XNCv=o2Aq^j}3*`^*kzW4&gxc|i=!E&W@`)Uwi&;=7ugu*!F>I~(V{_B*k}vE@^O0I@i;gue=|^YlUm^%I*8Jc`n<;g>J#0&3lWB z@bYRl?-e}G1+f-S;7P2*Q}`u*g*nmZuB|HJw!Zre-)A=Ni?{O-CikWZe6`5a2-)5zBj zcmP)N*~BBt=Z|+5`9nZ>_{Q+Ll+Gtp6!&S6w_|kXG1h!h_Q!;XJ`+SDGEs<1G@=uO zn8YGBaR?;=qy=e7T9H5!L|T)3NE^=}8aaL*o6i=o9GXab(cUzKhSPQwX;0dh_Mwq9 zfp(zx(>NMW+tLUcO2d3k5*MVcVbs6A@2-<1u6fNz3+YYzRFOWOk7!hfIFOorW$aL}~Sx8oqYO*5WuL2MLnia(3Lh`)(V;%&EtQVXe-6eQgv z-77^%9i=EKT1t?HNW-KgDOpODMoSZ=$7aC2`a(J;U6C53 z+p;DbvL!omfZS3Jl-tQsatBg}}lze5TGFzFeR46Ny z7nD`X%gQ=sv$9>;rR-OZD0Rvi(%Y*ZuOvg zLOriuR4=Rb>J{~>dflzwP#e@n^%wOwwMn~23)P~uSnWQouhvf+qNQn%Xv4J;+DL7* zwpe>f+oFQS9dx3LdZ6A~Z=(n6A$kve zsGh19>r7vwuhL)F-_}3SKh$^Yd-RX>z4`&&eOSMsU(_$__4*Y949lQK3nSF%W^^~= zjR8i6kz-6UrWsEdZez8v&e&jVG&UJ;8(WO6#&+YNan<*d+Bm^Zh!g6BI}uK#6XOhWhB(8V zBq!NPb<&*-C)3GtMmb}gY^T7P?YNzC=UHc-v%q=IS?p9e&pXQ3q77E}~25Qo4+;pfAu>^d(wJSJPMN8d^oG={mZBZls&&J9G=(O1IM; zbSM3Qen@xIJ@jL`m+q(iKck=1L-YteO24FE(bM!2y-e%rkFCr I`3(s8Klrne>Hq)$ delta 3321 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 D=-Q4g diff --git a/MMAppController.h b/MMAppController.h index 680330882e..20161306a2 100644 --- a/MMAppController.h +++ b/MMAppController.h @@ -12,6 +12,14 @@ #import "MacVim.h" +// NSUserDefaults keys +extern NSString *MMNoWindowKey; +extern NSString *MMTabMinWidthKey; +extern NSString *MMTabMaxWidthKey; +extern NSString *MMTabOptimumWidthKey; +extern NSString *MMStatuslineOffKey; + + @interface MMAppController : NSObject #if MM_USE_DO diff --git a/MMAppController.m b/MMAppController.m index 43ec804862..8a3e82f6d8 100644 --- a/MMAppController.m +++ b/MMAppController.m @@ -13,8 +13,30 @@ +// NSUserDefaults keys +NSString *MMNoWindowKey = @"nowindow"; +NSString *MMTabMinWidthKey = @"tabminwidth"; +NSString *MMTabMaxWidthKey = @"tabmaxwidth"; +NSString *MMTabOptimumWidthKey = @"taboptimumwidth"; +NSString *MMStatuslineOffKey = @"statuslineoff"; + + + @implementation MMAppController ++ (void)initialize +{ + NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys: + [NSNumber numberWithBool:NO], MMNoWindowKey, + [NSNumber numberWithInt:64], MMTabMinWidthKey, + [NSNumber numberWithInt:6*64], MMTabMaxWidthKey, + [NSNumber numberWithInt:132], MMTabOptimumWidthKey, + [NSNumber numberWithBool:NO], MMStatuslineOffKey, + nil]; + + [[NSUserDefaults standardUserDefaults] registerDefaults:dict]; +} + - (id)init { if ((self = [super init])) { @@ -77,7 +99,7 @@ - (BOOL)applicationShouldOpenUntitledFile:(NSApplication *)sender { // NOTE! This way it possible to start the app with the command-line // argument '-nowindow yes' and no window will be opened by default. - return ![[NSUserDefaults standardUserDefaults] boolForKey:@"nowindow"]; + return ![[NSUserDefaults standardUserDefaults] boolForKey:MMNoWindowKey]; } - (BOOL)applicationOpenUntitledFile:(NSApplication *)sender diff --git a/MMWindowController.h b/MMWindowController.h index fbe82d2803..81945d26f5 100644 --- a/MMWindowController.h +++ b/MMWindowController.h @@ -21,6 +21,7 @@ IBOutlet PSMTabBarControl *tabBarControl; IBOutlet NSTabView *tabView; IBOutlet NSTextField *statusTextField; + IBOutlet NSBox *statusSeparator; MMVimController *vimController; BOOL vimTaskSelectedTab; diff --git a/MMWindowController.m b/MMWindowController.m index 08187e2e02..214be880a0 100644 --- a/MMWindowController.m +++ b/MMWindowController.m @@ -14,6 +14,7 @@ #import "MMTextStorage.h" #import "MMVimController.h" #import "MacVim.h" +#import "MMAppController.h" // Scroller type; these must match SBAR_* in gui.h @@ -23,9 +24,9 @@ MMScrollerTypeBottom }; -// TODO! Implement hiding/showing of status line. +// NOTE! This value must match the actual position of the status line +// separator in VimWindow.nib. static float StatusLineHeight = 16.0f; -static BOOL statusLineIsVisible = NO; // NO is _not_ supported at the moment! // TODO: Move! @@ -138,7 +139,10 @@ - (void)windowDidLoad // NOTE: Size to fit looks good, but not many tabs will fit and there are // quite a few drawing bugs in this code, so it is disabled for now. //[tabBarControl setSizeCellsToFit:YES]; - [tabBarControl setCellMinWidth:64]; + NSUserDefaults *ud = [NSUserDefaults standardUserDefaults]; + [tabBarControl setCellMinWidth:[ud integerForKey:MMTabMinWidthKey]]; + [tabBarControl setCellMaxWidth:[ud integerForKey:MMTabMaxWidthKey]]; + [tabBarControl setCellOptimumWidth:[ud integerForKey:MMTabOptimumWidthKey]]; [tabBarControl setAllowsDragBetweenWindows:NO]; [tabBarControl setShowAddTabButton:YES]; [[tabBarControl addTabButton] setTarget:self]; @@ -276,7 +280,10 @@ - (void)openWindowWithRows:(int)rows columns:(int)cols [[self window] makeKeyAndOrderFront:self]; - [statusTextField setHidden:!statusLineIsVisible]; + BOOL statusOff = [[NSUserDefaults standardUserDefaults] + boolForKey:MMStatuslineOffKey]; + [statusTextField setHidden:statusOff]; + [statusSeparator setHidden:statusOff]; [self flashStatusText:@"Welcome to MacVim!"]; } @@ -369,7 +376,8 @@ - (void)setStatusText:(NSString *)text - (void)flashStatusText:(NSString *)text { - if (!statusLineIsVisible) return; + if ([[NSUserDefaults standardUserDefaults] boolForKey:MMStatuslineOffKey]) + return; [self setStatusText:text]; @@ -577,7 +585,7 @@ - (NSSize)contentSizeForTextViewSize:(NSSize)textViewSize if (![tabBarControl isHidden]) size.height += [tabBarControl frame].size.height; - if (statusLineIsVisible) + if (![[NSUserDefaults standardUserDefaults] boolForKey:MMStatuslineOffKey]) size.height += StatusLineHeight; if ([self bottomScrollbarVisible]) @@ -596,7 +604,8 @@ - (NSRect)textViewRectForContentSize:(NSSize)contentSize if (![tabBarControl isHidden]) rect.size.height -= [tabBarControl frame].size.height; - if (statusLineIsVisible) { + if (![[NSUserDefaults standardUserDefaults] + boolForKey:MMStatuslineOffKey]) { rect.size.height -= StatusLineHeight; rect.origin.y += StatusLineHeight; } @@ -776,6 +785,8 @@ - (void)placeScrollbars NSRect tabViewFrame = [tabView frame]; NSView *contentView = [[self window] contentView]; BOOL lsbVisible = [self leftScrollbarVisible]; + BOOL statusVisible = ![[NSUserDefaults standardUserDefaults] + boolForKey:MMStatuslineOffKey]; // HACK! Find the lowest left&right vertical scrollbars, as well as the // leftmost horizontal scrollbar. This hack continues further down. @@ -814,7 +825,7 @@ - (void)placeScrollbars if ([scroller type] == MMScrollerTypeBottom) { rect = [textStorage rectForColumnsInRange:[scroller range]]; rect.size.height = [NSScroller scrollerWidth]; - if (statusLineIsVisible) + if (statusVisible) rect.origin.y += StatusLineHeight; if (lsbVisible) rect.origin.x += [NSScroller scrollerWidth]; From b45f1d37c630bfa35d25209a6161a5200c383523 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sun, 29 Jul 2007 18:03:33 +0000 Subject: [PATCH 0022/1156] Active & Pending git-svn-id: http://macvim.googlecode.com/svn/trunk@38 96c4425d-ca35-0410-94e5-3396d5c13a8f --- TODO | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TODO b/TODO index 6a7084c1c6..0fa7b98da9 100644 --- a/TODO +++ b/TODO @@ -1,6 +1,5 @@ Active: -- add user default for min/max tab size - should ignore action message if is called too often (e.g. in addNewTab:) - proper font handling - font selection dialog (:set gfn=*) @@ -56,6 +55,7 @@ Active: Pending: +- add user default for min/max tab size - :colorscheme elflord, :set lines+=3 --> colors are not updated properly - use DO to communicate between GUI and Vim (only for two-way communication, one-way communication should still use mach ports) From 13808e78e5c2d8f9cef464c2932d2782e0e81d8f Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Mon, 30 Jul 2007 17:03:24 +0000 Subject: [PATCH 0023/1156] - Added ex_action command (uses support file Actions.plist which defines all allowable actions). - Added selectNextWindow: and selectPreviousWindow: actions to MMAppController git-svn-id: http://macvim.googlecode.com/svn/trunk@39 96c4425d-ca35-0410-94e5-3396d5c13a8f --- Actions.plist | 36 +++++++++++++++++ MMAppController.h | 2 + MMAppController.m | 67 +++++++++++++++++++++++++++++++ MMBackend.h | 1 + MMBackend.m | 14 +++++++ MMVimController.h | 1 + MMVimController.m | 60 ++++++++++++++++++++++++++- MacVim.h | 1 + MacVim.xcodeproj/project.pbxproj | 4 ++ MacVim.xcodeproj/winckler.mode1 | 45 ++++++++++++--------- MacVim.xcodeproj/winckler.pbxuser | 31 +++++++++++--- TODO | 2 + gui_macvim.m | 34 ++++++++++++++++ 13 files changed, 272 insertions(+), 26 deletions(-) create mode 100644 Actions.plist diff --git a/Actions.plist b/Actions.plist new file mode 100644 index 0000000000..22c4c7012f --- /dev/null +++ b/Actions.plist @@ -0,0 +1,36 @@ + + + + + addNewTab: + + arrangeInFront: + + hide: + + hideOtherApplications: + + miniaturizeAll: + + newVimWindow: + + orderFrontCharacterPalette: + + performClose: + + performMiniaturize: + + performZoom: + + selectNextWindow: + + selectPreviousWindow: + + terminate: + + unhide: + + unhideAllApplications: + + + diff --git a/MMAppController.h b/MMAppController.h index 20161306a2..c95efe2d96 100644 --- a/MMAppController.h +++ b/MMAppController.h @@ -34,5 +34,7 @@ extern NSString *MMStatuslineOffKey; - (void)removeVimController:(id)controller; - (IBAction)newVimWindow:(id)sender; +- (IBAction)selectNextWindow:(id)sender; +- (IBAction)selectPreviousWindow:(id)sender; @end diff --git a/MMAppController.m b/MMAppController.m index 8a3e82f6d8..35db3c0314 100644 --- a/MMAppController.m +++ b/MMAppController.m @@ -257,6 +257,73 @@ - (IBAction)newVimWindow:(id)sender [NSTask launchedTaskWithLaunchPath:path arguments:args]; } +- (IBAction)selectNextWindow:(id)sender +{ +#if 0 + NSArray *windows = [NSApp orderedWindows]; + unsigned idx = [windows indexOfObject:[NSApp keyWindow]]; + if (NSNotFound != idx) { + if (++idx >= [windows count]) + idx = 0; + [[windows objectAtIndex:idx] makeKeyAndOrderFront:self]; + } +#else + unsigned i, count = [vimControllers count]; + if (!count) return; + + NSWindow *keyWindow = [NSApp keyWindow]; + for (i = 0; i < count; ++i) { + MMWindowController *vc = [vimControllers objectAtIndex:i]; + if ([[[vc windowController] window] isEqual:keyWindow]) + break; + } + + if (i < count) { + if (++i >= count) + i = 0; + MMWindowController *vc = [vimControllers objectAtIndex:i]; + [[vc windowController] showWindow:self]; + } +#endif +} + +- (IBAction)selectPreviousWindow:(id)sender +{ +#if 0 + NSArray *windows = [NSApp orderedWindows]; + unsigned idx = [windows indexOfObject:[NSApp keyWindow]]; + if (NSNotFound != idx) { + if (idx > 0) { + --idx; + } else { + idx = [windows count] - 1; + } + [[windows objectAtIndex:idx] makeKeyAndOrderFront:self]; + } +#else + unsigned i, count = [vimControllers count]; + if (!count) return; + + NSWindow *keyWindow = [NSApp keyWindow]; + for (i = 0; i < count; ++i) { + MMWindowController *vc = [vimControllers objectAtIndex:i]; + if ([[[vc windowController] window] isEqual:keyWindow]) + break; + } + + if (i < count) { + if (i > 0) { + --i; + } else { + i = count - 1; + } + MMWindowController *vc = [vimControllers objectAtIndex:i]; + [[vc windowController] showWindow:self]; + } +#endif +} + + #if MM_USE_DO - (byref id )connectBackend: (byref in id )backend; diff --git a/MMBackend.h b/MMBackend.h index 68d68295ec..dfa1222208 100644 --- a/MMBackend.h +++ b/MMBackend.h @@ -83,6 +83,7 @@ - (void)setScrollbarThumbValue:(long)val size:(long)size max:(long)max identifier:(long)ident; - (BOOL)setFontWithName:(char *)name; +- (void)executeActionWithName:(NSString *)name; - (int)lookupColorWithKey:(NSString *)key; diff --git a/MMBackend.m b/MMBackend.m index e02a039408..3a938bf0e4 100644 --- a/MMBackend.m +++ b/MMBackend.m @@ -739,6 +739,20 @@ - (BOOL)setFontWithName:(char *)name return NO; } +- (void)executeActionWithName:(NSString *)name +{ + int len = [name lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; + + if (len > 0) { + NSMutableData *data = [NSMutableData data]; + + [data appendBytes:&len length:sizeof(int)]; + [data appendBytes:[name UTF8String] length:len]; + + [self queueMessage:ExecuteActionMsgID data:data]; + } +} + - (int)lookupColorWithKey:(NSString *)key { if (!(key && [key length] > 0)) diff --git a/MMVimController.h b/MMVimController.h index 5917d474ff..63ef780f59 100644 --- a/MMVimController.h +++ b/MMVimController.h @@ -41,6 +41,7 @@ - (id)initWithPort:(NSPort *)port; - (NSPort *)sendPort; #endif +- (MMWindowController *)windowController; - (void)windowWillClose:(NSNotification *)notification; - (void)sendMessage:(int)msgid data:(NSData *)data wait:(BOOL)wait; diff --git a/MMVimController.m b/MMVimController.m index d301bd0a7e..2b0b9e39cc 100644 --- a/MMVimController.m +++ b/MMVimController.m @@ -31,7 +31,10 @@ - (NSToolbarItem *)toolbarItemForTag:(int)tag index:(int *)index; - (IBAction)toolbarAction:(id)sender; - (void)addToolbarItemToDictionaryWithTag:(int)tag label:(NSString *)title toolTip:(NSString *)tip icon:(NSString *)icon; +#if MM_USE_DO - (void)connectionDidDie:(NSNotification *)notification; +#endif +- (BOOL)executeActionWithName:(NSString *)name; @end @@ -152,9 +155,9 @@ - (void)dealloc [super dealloc]; } -- (id)backendProxy +- (MMWindowController *)windowController { - return backendProxy; + return windowController; } - (void)sendMessage:(int)msgid data:(NSData *)data wait:(BOOL)wait @@ -188,6 +191,11 @@ - (void)sendMessage:(int)msgid data:(NSData *)data wait:(BOOL)wait } #if MM_USE_DO +- (id)backendProxy +{ + return backendProxy; +} + - (oneway void)showSavePanelForDirectory:(in bycopy NSString *)dir title:(in bycopy NSString *)title saving:(int)saving @@ -693,6 +701,19 @@ - (void)handleMessage:(int)msgid data:(NSData *)data setDefaultColorsBackground:[NSColor colorWithRgbInt:bg] foreground:[NSColor colorWithRgbInt:fg]]; } + } else if (ExecuteActionMsgID == msgid) { + const void *bytes = [data bytes]; + int len = *((int*)bytes); bytes += sizeof(int); + NSString *actionName = [[NSString alloc] + initWithBytesNoCopy:(void*)bytes + length:len + encoding:NSUTF8StringEncoding + freeWhenDone:NO]; + + SEL sel = NSSelectorFromString(actionName); + [NSApp sendAction:sel to:nil from:self]; + + [actionName release]; } else { NSLog(@"WARNING: Unknown message received (msgid=%d)", msgid); } @@ -937,6 +958,41 @@ - (void)connectionDidDie:(NSNotification *)notification } #endif // MM_USE_DO +- (BOOL)executeActionWithName:(NSString *)name +{ +#if 0 + static NSDictionary *actionDict = nil; + + if (!actionDict) { + NSBundle *mainBundle = [NSBundle mainBundle]; + NSString *path = [mainBundle pathForResource:@"Actions" + ofType:@"plist"]; + if (path) { + actionDict = [[NSDictionary alloc] initWithContentsOfFile:path]; + NSLog(@"Actions = %@", actionDict); + } else { + NSLog(@"WARNING: Failed to load dictionary of actions " + "(Actions.plist)."); + return NO; + } + } + + if ([actionDict objectForKey:name]) { + NSLog(@"Executing action %@", name); + SEL sel = NSSelectorFromString(name); + + if ([NSApp sendAction:sel to:nil from:self]) + return YES; + + NSLog(@"WARNING: Failed to send action"); + } else { + NSLog(@"WARNING: Action with name '%@' cannot be executed.", name); + } + +#endif + return NO; +} + @end // MMVimController (Private) diff --git a/MacVim.h b/MacVim.h index 39a0c0e608..15ddebacae 100644 --- a/MacVim.h +++ b/MacVim.h @@ -86,6 +86,7 @@ enum { SetFontMsgID, VimShouldCloseMsgID, SetDefaultColorsMsgID, + ExecuteActionMsgID, }; diff --git a/MacVim.xcodeproj/project.pbxproj b/MacVim.xcodeproj/project.pbxproj index 4b1b77fd56..78a6e0f175 100644 --- a/MacVim.xcodeproj/project.pbxproj +++ b/MacVim.xcodeproj/project.pbxproj @@ -32,6 +32,7 @@ 1DD703B90BA9D15D008679E9 /* vim_gloss.icns in Resources */ = {isa = PBXBuildFile; fileRef = 1DD703B80BA9D15D008679E9 /* vim_gloss.icns */; }; 1DD704310BA9F9C2008679E9 /* SpecialKeys.plist in Resources */ = {isa = PBXBuildFile; fileRef = 1DD704300BA9F9C2008679E9 /* SpecialKeys.plist */; }; 1DE608B40C587FDA0055263D /* runtime in CopyFiles */ = {isa = PBXBuildFile; fileRef = 1DE602470C587FD10055263D /* runtime */; }; + 1DE8CC620C5E2AAD003F56E3 /* Actions.plist in Resources */ = {isa = PBXBuildFile; fileRef = 1DE8CC610C5E2AAD003F56E3 /* Actions.plist */; }; 1DEE0D9F0C4E150B008E82B2 /* Attention.png in Resources */ = {isa = PBXBuildFile; fileRef = 1DEE0D8A0C4E150B008E82B2 /* Attention.png */; }; 1DEE0DA00C4E150B008E82B2 /* Copy.png in Resources */ = {isa = PBXBuildFile; fileRef = 1DEE0D8B0C4E150B008E82B2 /* Copy.png */; }; 1DEE0DA10C4E150B008E82B2 /* Cut.png in Resources */ = {isa = PBXBuildFile; fileRef = 1DEE0D8C0C4E150B008E82B2 /* Cut.png */; }; @@ -145,6 +146,7 @@ 1DD703B80BA9D15D008679E9 /* vim_gloss.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = vim_gloss.icns; sourceTree = ""; }; 1DD704300BA9F9C2008679E9 /* SpecialKeys.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = SpecialKeys.plist; sourceTree = ""; }; 1DE602470C587FD10055263D /* runtime */ = {isa = PBXFileReference; lastKnownFileType = folder; name = runtime; path = ../../runtime; sourceTree = SOURCE_ROOT; }; + 1DE8CC610C5E2AAD003F56E3 /* Actions.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = Actions.plist; sourceTree = ""; }; 1DEE0D8A0C4E150B008E82B2 /* Attention.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Attention.png; path = Toolbar/Attention.png; sourceTree = ""; }; 1DEE0D8B0C4E150B008E82B2 /* Copy.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Copy.png; path = Toolbar/Copy.png; sourceTree = ""; }; 1DEE0D8C0C4E150B008E82B2 /* Cut.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Cut.png; path = Toolbar/Cut.png; sourceTree = ""; }; @@ -322,6 +324,7 @@ 29B97317FDCFA39411CA2CEA /* Resources */ = { isa = PBXGroup; children = ( + 1DE8CC610C5E2AAD003F56E3 /* Actions.plist */, 1DD04DEB0C529C5E006CDC2B /* Credits.rtf */, 1DE9726C0C48050600F96A9F /* Toolbar */, 1DCE78490C460C6C006305A6 /* Icons */, @@ -445,6 +448,7 @@ 1DEE0DB20C4E150B008E82B2 /* TagJump.png in Resources */, 1DEE0DB30C4E150B008E82B2 /* Undo.png in Resources */, 1DD04DEC0C529C5E006CDC2B /* Credits.rtf in Resources */, + 1DE8CC620C5E2AAD003F56E3 /* Actions.plist in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/MacVim.xcodeproj/winckler.mode1 b/MacVim.xcodeproj/winckler.mode1 index e76c7a0842..309ecb685e 100644 --- a/MacVim.xcodeproj/winckler.mode1 +++ b/MacVim.xcodeproj/winckler.mode1 @@ -258,6 +258,7 @@ 29B97314FDCFA39411CA2CEA 1C37FBAC04509CD000000102 + 1C37FAAC04509CD000000102 1C37FABC05509CD000000102 PBXSmartGroupTreeModuleOutlineStateSelectionKey @@ -367,9 +368,9 @@ TableOfContents - 1DBA03650C5CE38900B05DE3 + 1DE8CC400C5E2483003F56E3 1CE0B1FE06471DED0097A5F4 - 1DBA03660C5CE38900B05DE3 + 1DE8CC410C5E2483003F56E3 1CE0B20306471E060097A5F4 1CE0B20506471E060097A5F4 @@ -503,6 +504,12 @@ 5 WindowOrderList + 1DE8CC540C5E24D6003F56E3 + 1DE8CC550C5E24D6003F56E3 + 1DE444730BA4445100C4C77A + 1CD10A99069EF8BA00B06720 + 1DE8CC520C5E24CD003F56E3 + 1D16B9EF0BA33E3800A69B33 1C0AD2B3069F1EA900FABCE6 /Users/winckler/Projects/vim7/src/MacVim/MacVim.xcodeproj @@ -523,12 +530,14 @@ Dock + BecomeActive + ContentConfiguration PBXProjectModuleGUID 1CD0528F0623707200166675 PBXProjectModuleLabel - + MMAppController.m StatusBarVisibility @@ -545,8 +554,6 @@ 194pt - BecomeActive - ContentConfiguration PBXProjectModuleGUID @@ -586,7 +593,7 @@ TableOfContents 1D16B9EF0BA33E3800A69B33 - 1DE601DB0C587DE80055263D + 1DE8CC420C5E2483003F56E3 1CD0528F0623707200166675 XCMainBuildResultsModuleGUID @@ -628,8 +635,8 @@ yes sizes - {{0, 0}, {411, 339}} - {{411, 0}, {613, 339}} + {{0, 0}, {409, 339}} + {{409, 0}, {615, 339}} VerticalSplitView @@ -692,14 +699,14 @@ TableOfContents 1CD10A99069EF8BA00B06720 - 1D14746A0C566C890038FA2B + 1DE8CC4C0C5E24CD003F56E3 1C162984064C10D400B95A72 - 1D14746B0C566C890038FA2B - 1D14746C0C566C890038FA2B - 1D14746D0C566C890038FA2B - 1D14746E0C566C890038FA2B - 1D14746F0C566C890038FA2B - 1D1474700C566C890038FA2B + 1DE8CC4D0C5E24CD003F56E3 + 1DE8CC4E0C5E24CD003F56E3 + 1DE8CC4F0C5E24CD003F56E3 + 1DE8CC500C5E24CD003F56E3 + 1DE8CC510C5E24CD003F56E3 + 1DE8CC520C5E24CD003F56E3 ToolbarConfiguration xcode.toolbar.config.debug @@ -861,7 +868,7 @@ TableOfContents 1DE444730BA4445100C4C77A - 1D1474710C566C890038FA2B + 1DE8CC530C5E24CD003F56E3 1C78EAAC065D492600B07095 WindowString @@ -956,9 +963,9 @@ TableOfContents 1C0AD2B3069F1EA900FABCE6 - 1DBA03670C5CE38900B05DE3 + 1DE8CC430C5E2483003F56E3 1CD0528B0623707200166675 - 1DBA03680C5CE38900B05DE3 + 1DE8CC440C5E2483003F56E3 ToolbarConfiguration xcode.toolbar.config.run @@ -967,7 +974,7 @@ WindowToolGUID 1C0AD2B3069F1EA900FABCE6 WindowToolIsVisible - + Identifier diff --git a/MacVim.xcodeproj/winckler.pbxuser b/MacVim.xcodeproj/winckler.pbxuser index df6ca6a127..3f54797410 100644 --- a/MacVim.xcodeproj/winckler.pbxuser +++ b/MacVim.xcodeproj/winckler.pbxuser @@ -16,14 +16,36 @@ path = /Users/winckler/Projects/vim70/src/MacVim/VimWindowController.m; sourceTree = ""; }; + 1D14749E0C5673AE0038FA2B /* MMAppController.m */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {795, 4880}}"; + sepNavSelRange = "{9716, 0}"; + sepNavVisRect = "{{0, 4183}, {795, 162}}"; + }; + }; + 1D1474B40C56796D0038FA2B /* MMVimController.m */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {795, 16112}}"; + sepNavSelRange = "{35098, 0}"; + sepNavVisRect = "{{0, 11239}, {795, 162}}"; + }; + }; 1D16B9CF0BA33BAE00A69B33 /* MacVim */ = { isa = PBXExecutable; activeArgIndex = 2147483647; activeArgIndices = ( NO, + NO, + NO, + NO, + NO, ); argumentStrings = ( + "-tabmaxwidth 384", + "-taboptimumwidth 132", + "-statuslineoff 1", "-nowindow 1", + "-tabminwidth 32", ); autoAttachOnCrash = 1; configStateDict = { @@ -67,7 +89,7 @@ delayBeforeContinue = 0; hitCount = 1; location = Foundation; - modificationTime = 206990469.69439; + modificationTime = 207496396.974839; state = 1; symbolName = "[NSException raise]"; }; @@ -90,8 +112,7 @@ functionName = "-windowDidResize:"; hitCount = 1; lineNumber = 539; - location = VimWindowController.ob; - modificationTime = 206990476.954509; + modificationTime = 207496396.974762; state = 1; }; 1DE445650BA493EC00C4C77A /* XCBreakpointsBucket */ = { @@ -215,8 +236,8 @@ PBXFileDataSource_Warnings_ColumnID, ); }; - PBXPerProjectTemplateStateSaveDate = 207414117; - PBXWorkspaceStateSaveDate = 207414117; + PBXPerProjectTemplateStateSaveDate = 207496274; + PBXWorkspaceStateSaveDate = 207496274; }; sourceControlManager = 1D16B9DD0BA33BB000A69B33 /* Source Control */; userBuildSettings = { diff --git a/TODO b/TODO index 0fa7b98da9..576775b78a 100644 --- a/TODO +++ b/TODO @@ -1,5 +1,7 @@ Active: +- need E??? numbers for vim errors +- tab-completion for :action command - should ignore action message if is called too often (e.g. in addNewTab:) - proper font handling - font selection dialog (:set gfn=*) diff --git a/gui_macvim.m b/gui_macvim.m index 0f78d5fab9..1282d9ac97 100644 --- a/gui_macvim.m +++ b/gui_macvim.m @@ -852,6 +852,40 @@ // -- Unsorted -------------------------------------------------------------- + void +ex_action(eap) + exarg_T *eap; +{ + static NSDictionary *actionDict = nil; + + if (!gui.in_use) { + EMSG(_("E???: Command only available in GUI mode")); + return; + } + + if (!actionDict) { + NSBundle *mainBundle = [NSBundle mainBundle]; + NSString *path = [mainBundle pathForResource:@"Actions" + ofType:@"plist"]; + if (path) { + actionDict = [[NSDictionary alloc] initWithContentsOfFile:path]; + } else { + // Allocate bogus dictionary so that error only pops up once. + actionDict = [NSDictionary new]; + EMSG(_("E???: Failed to load action dictionary")); + } + } + + NSString *name = [NSString stringWithCString:(char*)eap->arg + encoding:NSUTF8StringEncoding]; + if ([actionDict objectForKey:name]) { + [[MMBackend sharedInstance] executeActionWithName:name]; + } else { + EMSG2(_("E???: \"%s\" is not a valid action"), eap->arg); + } +} + + /* * Adjust gui.char_height (after 'linespace' was changed). */ From 4e595ed2db5107ff27865697b56bd91dc306b109 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Tue, 31 Jul 2007 11:40:43 +0000 Subject: [PATCH 0024/1156] Code cleanup. git-svn-id: http://macvim.googlecode.com/svn/trunk@40 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMAppController.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/MMAppController.h b/MMAppController.h index c95efe2d96..1241726fad 100644 --- a/MMAppController.h +++ b/MMAppController.h @@ -26,10 +26,12 @@ extern NSString *MMStatuslineOffKey; #endif { - NSPort *receivePort; NSMutableArray *vimControllers; +#if !MM_USE_DO + NSPort *receivePort; unsigned terminateNowCount; BOOL abortTermination; +#endif } - (void)removeVimController:(id)controller; From 55f25ba6df0efa177fd87ac83b21ef0efa68b32d Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Tue, 31 Jul 2007 11:40:57 +0000 Subject: [PATCH 0025/1156] Active git-svn-id: http://macvim.googlecode.com/svn/trunk@41 96c4425d-ca35-0410-94e5-3396d5c13a8f --- TODO | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/TODO b/TODO index 576775b78a..0ef94d7bb8 100644 --- a/TODO +++ b/TODO @@ -1,5 +1,12 @@ Active: +- application:openFiles: should open in tabs in current window instead of in a + new window +- don't clear the text storage on setMaxRows:: so that display does not go + blank when dragging to resize +- zoom&resize broken +- toolbar drawing bug +- offset text away from left edge - need E??? numbers for vim errors - tab-completion for :action command - should ignore action message if is called too often (e.g. in addNewTab:) @@ -9,8 +16,6 @@ Active: - startup is a bit flakey (up until openWindowWithRows:columns:) - i8n - services menu -- don't clear the text storage on setMaxRows:: so that display does not go - blank when dragging to resize - gui dialogs (FEAT_GUI_DIALOG) - find/replace toolbar item (FIND_REPLACE_DIALOG) - main menu From d1d6ab73822a8eb2eef92ee7ce55d4df9b861265 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Wed, 1 Aug 2007 06:45:32 +0000 Subject: [PATCH 0026/1156] - Simpler size calculations, which don't use NSLayoutManager - Lazy resizing - Width calculations based on cellWidth instead of widthOfEmptyRow git-svn-id: http://macvim.googlecode.com/svn/trunk@42 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMTextStorage.h | 7 +- MMTextStorage.m | 197 ++++++++++++++++++++++++++++++++---------------- 2 files changed, 140 insertions(+), 64 deletions(-) diff --git a/MMTextStorage.h b/MMTextStorage.h index db2b863f8f..f609b38239 100644 --- a/MMTextStorage.h +++ b/MMTextStorage.h @@ -11,10 +11,15 @@ #import +#define MM_TS_LAZY_SET 1 + @interface MMTextStorage : NSTextStorage { NSMutableAttributedString *attribString; int maxRows, maxColumns; +#if MM_TS_LAZY_SET + int actualRows, actualColumns; +#endif NSAttributedString *emptyRowString; NSFont *font; NSColor *defaultBackgroundColor; @@ -48,7 +53,6 @@ foreground:(NSColor *)fgColor; - (void)setFont:(NSFont*)newFont; - (NSFont*)font; -- (float)widthOfEmptyRow; - (NSSize)size; - (NSSize)calculateAverageFontSize; - (NSRect)rectForRowsInRange:(NSRange)range; @@ -56,6 +60,7 @@ - (unsigned)offsetFromRow:(int)row column:(int)col; - (BOOL)resizeToFitSize:(NSSize)size; - (NSSize)fitToSize:(NSSize)size; +- (NSSize)fitToSize:(NSSize)size rows:(int *)rows columns:(int *)columns; @end diff --git a/MMTextStorage.m b/MMTextStorage.m index 4e72145f15..720a5b2ff9 100644 --- a/MMTextStorage.m +++ b/MMTextStorage.m @@ -23,10 +23,20 @@ //static float LINEHEIGHT = 30.0f; +#define MM_SIMPLE_TS_CALC 1 + +#if MM_TS_LAZY_SET +# define MM_SIMPLE_TS_CALC 1 +#endif @interface MMTextStorage (Private) -- (NSSize)fitToSize:(NSSize)size rows:(int *)rows columns:(int *)columns; +#if MM_TS_LAZY_SET +- (void)doSetMaxRows:(int)rows columns:(int)cols; +- (void)lazyResize; +#endif +- (float)cellWidth; +- (float)widthOfEmptyRow; @end @@ -119,43 +129,12 @@ - (void)getMaxRows:(int*)rows columns:(int*)cols - (void)setMaxRows:(int)rows columns:(int)cols { - // Do nothing if the dimensions are already right. - if (maxRows == rows && maxColumns == cols) - return; - - NSRange oldRange = NSMakeRange(0, maxRows*(maxColumns+1)); - +#if MM_TS_LAZY_SET maxRows = rows; maxColumns = cols; - //NSLog(@"setMaxRows:%d columns:%d", maxRows, maxColumns); - - NSString *fmt = [NSString stringWithFormat:@"%%%dc\%C", maxColumns, - NSLineSeparatorCharacter]; - NSDictionary *dict; - if (defaultBackgroundColor) { - dict = [NSDictionary dictionaryWithObjectsAndKeys: - font, NSFontAttributeName, - defaultBackgroundColor, NSBackgroundColorAttributeName, nil]; - } else { - dict = [NSDictionary dictionaryWithObjectsAndKeys: - font, NSFontAttributeName, nil]; - } - - [emptyRowString release]; - emptyRowString = [[NSAttributedString alloc] - initWithString:[NSString stringWithFormat:fmt, ' '] - attributes:dict]; - - [attribString release]; - attribString = [[NSMutableAttributedString alloc] init]; - int i; - for (i=0; i= maxRows || col < 0 || col >= maxColumns || col+[string length] > maxColumns) { @@ -241,10 +221,11 @@ - (void)deleteLinesFromRow:(int)row lineCount:(int)count color:(NSColor *)color { //NSLog(@"deleteLinesFromRow:%d lineCount:%d", row, count); + [self lazyResize]; if (row < 0 || row+count > maxRows) { - NSLog(@"[%s] WARNING : out of range, row=%d (%d) count=%d", _cmd, row, - maxRows, count); + //NSLog(@"[%s] WARNING : out of range, row=%d (%d) count=%d", _cmd, row, + // maxRows, count); return; } @@ -288,10 +269,11 @@ - (void)insertLinesAtRow:(int)row lineCount:(int)count color:(NSColor *)color { //NSLog(@"insertLinesAtRow:%d lineCount:%d", row, count); + [self lazyResize]; if (row < 0 || row+count > maxRows) { - NSLog(@"[%s] WARNING : out of range, row=%d (%d) count=%d", _cmd, row, - maxRows, count); + //NSLog(@"[%s] WARNING : out of range, row=%d (%d) count=%d", _cmd, row, + // maxRows, count); return; } @@ -331,11 +313,12 @@ - (void)clearBlockFromRow:(int)row1 column:(int)col1 toRow:(int)row2 { //NSLog(@"clearBlockFromRow:%d column:%d toRow:%d column:%d", row1, col1, // row2, col2); + [self lazyResize]; if (row1 < 0 || row2 >= maxRows || col1 < 0 || col2 > maxColumns) { - NSLog(@"[%s] WARNING : out of range, row1=%d row2=%d (%d) col1=%d " - "col2=%d (%d)", _cmd, row1, row2, maxRows, col1, col2, - maxColumns); + //NSLog(@"[%s] WARNING : out of range, row1=%d row2=%d (%d) col1=%d " + // "col2=%d (%d)", _cmd, row1, row2, maxRows, col1, col2, + // maxColumns); return; } @@ -357,6 +340,8 @@ - (void)clearBlockFromRow:(int)row1 column:(int)col1 toRow:(int)row2 - (void)clearAllWithColor:(NSColor *)color { + //NSLog(@"%s%@", _cmd, color); + NSRange range = { 0, [attribString length] }; NSDictionary *attribs = [NSDictionary dictionaryWithObjectsAndKeys: font, NSFontAttributeName, @@ -420,16 +405,15 @@ - (NSFont*)font return font; } -- (float)widthOfEmptyRow -{ - return [font widthOfString:[emptyRowString string]]; -} - - (NSSize)size { if (![[self layoutManagers] count]) return NSZeroSize; NSLayoutManager *lm = [[self layoutManagers] objectAtIndex:0]; +#if MM_SIMPLE_TS_CALC + float h = [lm defaultLineHeightForFont:font]; + NSSize size = NSMakeSize([self cellWidth]*maxColumns, h*maxRows); +#else if (![[lm textContainers] count]) return NSZeroSize; NSTextContainer *tc = [[lm textContainers] objectAtIndex:0]; @@ -443,6 +427,7 @@ - (NSSize)size //NSLog(@"size=(%.2f,%.2f) rows=%d cols=%d layoutManager size=(%.2f,%.2f)", // size.width, size.height, maxRows, maxColumns, rect.size.width, // rect.size.height); +#endif return size; } @@ -454,7 +439,7 @@ - (NSSize)calculateAverageFontSize NSSize size; NSLayoutManager *lm = [[self layoutManagers] objectAtIndex:0]; size.height = [lm defaultLineHeightForFont:font]; - size.width = maxColumns > 0 ? [self widthOfEmptyRow]/maxColumns : 0; + size.width = [self cellWidth]; if (size.height < 1.0f) size.height = 1.0f; if (size.width < 1.0f) size.width = 1.0f; @@ -485,8 +470,7 @@ - (NSRect)rectForRowsInRange:(NSRange)range - (NSRect)rectForColumnsInRange:(NSRange)range { NSRect rect = { 0, 0, 0, 0 }; - float fontWidth = maxColumns > 0 - ? [self widthOfEmptyRow]/maxColumns : 0; + float fontWidth = [self cellWidth]; unsigned start = range.location > maxColumns ? maxColumns : range.location; unsigned length = range.length; @@ -530,20 +514,15 @@ - (NSSize)fitToSize:(NSSize)size return [self fitToSize:size rows:NULL columns:NULL]; } -@end // MMTextStorage - - - - -@implementation MMTextStorage (Private) - - (NSSize)fitToSize:(NSSize)size rows:(int *)rows columns:(int *)columns { if (![[self layoutManagers] count]) return size; NSLayoutManager *lm = [[self layoutManagers] objectAtIndex:0]; +#if !MM_SIMPLE_TS_CALC if (![[lm textContainers] count]) return size; NSTextContainer *tc = [[lm textContainers] objectAtIndex:0]; +#endif NSSize curSize = [self size]; NSSize fitSize = curSize; @@ -556,21 +535,36 @@ - (NSSize)fitToSize:(NSSize)size rows:(int *)rows columns:(int *)columns // text storage. (Why 3? It seem Vim never allows less than 3 lines.) // // TODO: Use binary search instead of the current linear one. +#if MM_TS_LAZY_SET + int rowCount = maxRows; + int rowsToRemove; + for (rowsToRemove = 0; rowsToRemove < maxRows-3; ++rowsToRemove) { + float height = [lm defaultLineHeightForFont:font]*rowCount; + + if (height <= size.height) { + fitSize.height = height; + break; + } + + --rowCount; + } +#else NSRange charRange = { 0, maxRows*(maxColumns+1) }; int rowsToRemove; for (rowsToRemove = 0; rowsToRemove < maxRows-3; ++rowsToRemove) { NSRange glyphRange = [lm glyphRangeForCharacterRange:charRange actualCharacterRange:nil]; - NSRect rect = [lm boundingRectForGlyphRange:glyphRange - inTextContainer:tc]; + float height = [lm boundingRectForGlyphRange:glyphRange + inTextContainer:tc].size.height; - if (rect.size.height <= size.height) { - fitSize.height = rect.size.height; + if (height <= size.height) { + fitSize.height = height; break; } charRange.length -= (maxColumns+1); } +#endif fitRows -= rowsToRemove; } else if (size.height > curSize.height) { @@ -582,7 +576,7 @@ - (NSSize)fitToSize:(NSSize)size rows:(int *)rows columns:(int *)columns } if (size.width != curSize.width) { - float fw = maxColumns > 0 ? [self widthOfEmptyRow]/maxColumns : 0; + float fw = [self cellWidth]; if (fw < 1.0f) fw = 1.0f; fitCols = floor(size.width/fw); @@ -595,4 +589,81 @@ - (NSSize)fitToSize:(NSSize)size rows:(int *)rows columns:(int *)columns return fitSize; } +@end // MMTextStorage + + + + +@implementation MMTextStorage (Private) +#if MM_TS_LAZY_SET +- (void)lazyResize +{ + if (actualRows != maxRows || actualColumns != maxColumns) { + [self doSetMaxRows:maxRows columns:maxColumns]; + } +} +#endif // MM_TS_LAZY_SET + +- (void)doSetMaxRows:(int)rows columns:(int)cols +{ +#if MM_TS_LAZY_SET + // Do nothing if the dimensions are already right. + if (actualRows == rows && actualColumns == cols) + return; + + NSRange oldRange = NSMakeRange(0, actualRows*(actualColumns+1)); +#else + // Do nothing if the dimensions are already right. + if (maxRows == rows && maxColumns == cols) + return; + + NSRange oldRange = NSMakeRange(0, maxRows*(maxColumns+1)); +#endif + + maxRows = rows; + maxColumns = cols; + + NSString *fmt = [NSString stringWithFormat:@"%%%dc\%C", maxColumns, + NSLineSeparatorCharacter]; + NSDictionary *dict; + if (defaultBackgroundColor) { + dict = [NSDictionary dictionaryWithObjectsAndKeys: + font, NSFontAttributeName, + defaultBackgroundColor, NSBackgroundColorAttributeName, nil]; + } else { + dict = [NSDictionary dictionaryWithObjectsAndKeys: + font, NSFontAttributeName, nil]; + } + + [emptyRowString release]; + emptyRowString = [[NSAttributedString alloc] + initWithString:[NSString stringWithFormat:fmt, ' '] + attributes:dict]; + + [attribString release]; + attribString = [[NSMutableAttributedString alloc] init]; + int i; + for (i=0; i Date: Wed, 1 Aug 2007 06:46:40 +0000 Subject: [PATCH 0027/1156] Added debug strings for message enum. git-svn-id: http://macvim.googlecode.com/svn/trunk@43 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MacVim.h | 3 +++ MacVim.m | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+) diff --git a/MacVim.h b/MacVim.h index 15ddebacae..187ab7af9d 100644 --- a/MacVim.h +++ b/MacVim.h @@ -12,6 +12,7 @@ #define MM_USE_DO 1 +#define MM_DELAY_SEND_IN_PROCESS_CMD_QUEUE 1 @@ -38,6 +39,8 @@ #endif +// NOTE! This array must be updated whenever the enum below changes! +extern char *MessageStrings[]; enum { CheckinMsgID = 1, diff --git a/MacVim.m b/MacVim.m index 3727ea60bc..2955d00f44 100644 --- a/MacVim.m +++ b/MacVim.m @@ -10,6 +10,57 @@ #import "MacVim.h" +char *MessageStrings[] = +{ + "BadMsgID", + "CheckinMsgID", + "ConnectedMsgID", + "KillTaskMsgID", + "TaskExitedMsgID", + "OpenVimWindowMsgID", + "InsertTextMsgID", + "KeyDownMsgID", + "CmdKeyMsgID", + "BatchDrawMsgID", + "SelectTabMsgID", + "CloseTabMsgID", + "AddNewTabMsgID", + "DraggedTabMsgID", + "UpdateTabBarMsgID", + "ShowTabBarMsgID", + "HideTabBarMsgID", + "SetTextDimensionsMsgID", + "SetVimWindowTitleMsgID", + "ScrollWheelMsgID", + "MouseDownMsgID", + "MouseUpMsgID", + "MouseDraggedMsgID", + "BrowseForFileMsgID", + "BrowseForFileReplyMsgID", + "FlushQueueMsgID", + "UpdateInsertionPointMsgID", + "AddMenuMsgID", + "AddMenuItemMsgID", + "RemoveMenuItemMsgID", + "EnableMenuItemMsgID", + "ExecuteMenuMsgID", + "ShowToolbarMsgID", +#if !MM_USE_DO + "TaskShouldTerminateMsgID", + "TerminateReplyYesMsgID", + "TerminateReplyNoMsgID", +#endif + "CreateScrollbarMsgID", + "DestroyScrollbarMsgID", + "ShowScrollbarMsgID", + "SetScrollbarPositionMsgID", + "SetScrollbarThumbMsgID", + "ScrollbarEventMsgID", + "SetFontMsgID", + "VimShouldCloseMsgID", + "SetDefaultColorsMsgID", + "ExecuteActionMsgID", +}; @implementation NSPortMessage (MacVim) From bce6dd3d6097fd2577a127a33f7b978e7e7c7c5a Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Wed, 1 Aug 2007 06:48:05 +0000 Subject: [PATCH 0028/1156] Notifying MacVim when SetTextDimensionsMsgID received. git-svn-id: http://macvim.googlecode.com/svn/trunk@44 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMBackend.m | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/MMBackend.m b/MMBackend.m index 3a938bf0e4..18b61e6b46 100644 --- a/MMBackend.m +++ b/MMBackend.m @@ -986,6 +986,12 @@ - (void)handleMessage:(int)msgid data:(NSData *)data int rows = *((int*)bytes); bytes += sizeof(int); int cols = *((int*)bytes); bytes += sizeof(int); + // NOTE! Vim doesn't call gui_mch_set_shellsize() after + // gui_resize_shell(), so we have to manually set the rows and columns + // here. (MacVim doesn't change the rows and columns to avoid + // inconsistent states between Vim and MacVim.) + [self setRows:rows columns:cols]; + //NSLog(@"[VimTask] Resizing shell to %dx%d.", cols, rows); gui_resize_shell(cols, rows); } else if (ExecuteMenuMsgID == msgid) { From f830df220f72b18e564579e690b8c3a0096ceebd Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Wed, 1 Aug 2007 06:52:38 +0000 Subject: [PATCH 0029/1156] - When in processCommandQueue: no input is sent to Vim; instead it is put on a queue and sent when done processing. - Lets MMWindowController handle setFont: and setDefaultColorsBackground::. - Resizing of text storage moved from performBatchDrawWithData: to SetTextDimensionsMsgID. git-svn-id: http://macvim.googlecode.com/svn/trunk@45 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMVimController.h | 4 +++ MMVimController.m | 74 ++++++++++++++++++++++++++++++++++++++++------- 2 files changed, 68 insertions(+), 10 deletions(-) diff --git a/MMVimController.h b/MMVimController.h index 63ef780f59..1c7782666a 100644 --- a/MMVimController.h +++ b/MMVimController.h @@ -23,6 +23,10 @@ MMWindowController *windowController; #if MM_USE_DO id backendProxy; +# if MM_DELAY_SEND_IN_PROCESS_CMD_QUEUE + BOOL inProcessCommandQueue; + NSMutableArray *sendQueue; +# endif #else NSPort *sendPort; NSPort *receivePort; diff --git a/MMVimController.m b/MMVimController.m index 2b0b9e39cc..19b952873d 100644 --- a/MMVimController.m +++ b/MMVimController.m @@ -81,6 +81,9 @@ - (id)initWithPort:(NSPort *)port [[MMWindowController alloc] initWithVimController:self]; #if MM_USE_DO backendProxy = [backend retain]; +# if MM_DELAY_SEND_IN_PROCESS_CMD_QUEUE + sendQueue = [NSMutableArray new]; +# endif NSConnection *connection = [backendProxy connectionForProxy]; [[NSNotificationCenter defaultCenter] addObserver:self @@ -136,6 +139,9 @@ - (void)dealloc #if MM_USE_DO [backendProxy release]; +# if MM_DELAY_SEND_IN_PROCESS_CMD_QUEUE + [sendQueue release]; +# endif #else if (sendPort) { // Kill task immediately @@ -163,6 +169,17 @@ - (MMWindowController *)windowController - (void)sendMessage:(int)msgid data:(NSData *)data wait:(BOOL)wait { #if MM_USE_DO +# if MM_DELAY_SEND_IN_PROCESS_CMD_QUEUE + if (inProcessCommandQueue) { + //NSLog(@"In process command queue; delaying message send."); + [sendQueue addObject:[NSNumber numberWithInt:msgid]]; + if (data) + [sendQueue addObject:data]; + else + [sendQueue addObject:[NSNull null]]; + return; + } +# endif if (wait) { [backendProxy processInput:msgid data:data]; } else { @@ -228,12 +245,48 @@ - (oneway void)processCommandQueue:(in NSArray *)queue return; } +#if MM_DELAY_SEND_IN_PROCESS_CMD_QUEUE + inProcessCommandQueue = YES; +#endif + + //NSLog(@"======== %s BEGIN ========", _cmd); for (i = 0; i < count; i += 2) { NSData *value = [queue objectAtIndex:i]; NSData *data = [queue objectAtIndex:i+1]; - [self handleMessage:*((int*)[value bytes]) data:data]; + int msgid = *((int*)[value bytes]); +#if 0 + if (msgid != EnableMenuItemMsgID && msgid != AddMenuItemMsgID + && msgid != AddMenuMsgID) { + NSLog(@"%s%s", _cmd, MessageStrings[msgid]); + } +#endif + + [self handleMessage:msgid data:data]; + } + //NSLog(@"======== %s END ========", _cmd); + +#if MM_DELAY_SEND_IN_PROCESS_CMD_QUEUE + inProcessCommandQueue = NO; + + count = [sendQueue count]; + if (count > 0) { + if (count % 2 == 0) { + //NSLog(@"%s Sending %d queued messages", _cmd, count/2); + + for (i = 0; i < count; i += 2) { + int msgid = [[sendQueue objectAtIndex:i] intValue]; + id data = [sendQueue objectAtIndex:i+1]; + if ([data isEqual:[NSNull null]]) + data = nil; + + [backendProxy processInput:msgid data:data]; + } + } + + [sendQueue removeAllObjects]; } +#endif } #else // MM_USE_DO @@ -685,22 +738,18 @@ - (void)handleMessage:(int)msgid data:(NSData *)data encoding:NSUTF8StringEncoding]; NSFont *font = [NSFont fontWithName:name size:size]; - if (font && [windowController textStorage]) { - [[windowController textStorage] setFont:font]; - } + if (font) + [windowController setFont:font]; [name release]; } else if (SetDefaultColorsMsgID == msgid) { const void *bytes = [data bytes]; int bg = *((int*)bytes); bytes += sizeof(int); int fg = *((int*)bytes); bytes += sizeof(int); + NSColor *back = [NSColor colorWithRgbInt:bg]; + NSColor *fore = [NSColor colorWithRgbInt:fg]; - MMTextStorage *textStorage = [windowController textStorage]; - if (textStorage) { - [textStorage - setDefaultColorsBackground:[NSColor colorWithRgbInt:bg] - foreground:[NSColor colorWithRgbInt:fg]]; - } + [windowController setDefaultColorsBackground:back foreground:fore]; } else if (ExecuteActionMsgID == msgid) { const void *bytes = [data bytes]; int len = *((int*)bytes); bytes += sizeof(int); @@ -740,12 +789,17 @@ - (void)performBatchDrawWithData:(NSData *)data int rows = *((int*)bytes); bytes += sizeof(int); int cols = *((int*)bytes); bytes += sizeof(int); +#if 0 if (ClearAllDrawType != type) { // All draw types except clear all rely on the text storage have // the appropriate dimensions, so set it before attempting to // modify the text storage. [textStorage setMaxRows:rows columns:cols]; } +#else + // Avoid 'unused var' warning. + rows; cols; +#endif if (ClearAllDrawType == type) { int color = *((int*)bytes); bytes += sizeof(int); From aedb944c55f518be3317386240acbc36f36178c2 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Wed, 1 Aug 2007 07:09:46 +0000 Subject: [PATCH 0030/1156] - Handles setFont: and setDefaultColorsBackground::. - Text storage dimensions now set in setTextDimensionsWithRows::. - No longer responds to NSLayoutManager delegate messages. - Zooming now defaults to height-only zoom. - Fixed bug in window resizing code, where views were not placed properly if the window didn't change size (but views still needed placing) - Text storage no longer resized in placeViews; if text storage dimensions need to change Vim is notified and dimensions change as soon as setTextDimensionsWithRows:: is called. git-svn-id: http://macvim.googlecode.com/svn/trunk@46 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMWindowController.h | 2 + MMWindowController.m | 96 ++++++++++++++++++++++++-------------------- 2 files changed, 55 insertions(+), 43 deletions(-) diff --git a/MMWindowController.h b/MMWindowController.h index 81945d26f5..446048c02e 100644 --- a/MMWindowController.h +++ b/MMWindowController.h @@ -48,6 +48,8 @@ - (void)setScrollbarPosition:(int)pos length:(int)len identifier:(long)ident; - (void)setScrollbarThumbValue:(float)val proportion:(float)prop identifier:(long)ident; +- (void)setDefaultColorsBackground:(NSColor *)back foreground:(NSColor *)fore; +- (void)setFont:(NSFont *)font; - (IBAction)addNewTab:(id)sender; - (IBAction)showTabBar:(id)sender; diff --git a/MMWindowController.m b/MMWindowController.m index 214be880a0..4f8deeb8d9 100644 --- a/MMWindowController.m +++ b/MMWindowController.m @@ -51,7 +51,7 @@ - (void)setRange:(NSRange)newRange; @interface MMWindowController (Private) - (NSSize)contentSizeForTextViewSize:(NSSize)textViewSize; - (NSRect)textViewRectForContentSize:(NSSize)contentSize; -- (void)fitWindowToTextStorage; +- (void)resizeWindowToFit:(id)sender; - (NSRect)fitWindowToFrame:(NSRect)frame; - (void)updateResizeIncrements; - (NSTabViewItem *)addNewTabViewItem; @@ -64,7 +64,6 @@ - (BOOL)leftScrollbarVisible; - (BOOL)rightScrollbarVisible; - (void)placeScrollbars; - (void)scroll:(id)sender; -- (void)fitWindowToScrollbars:(id)sender; - (void)placeViews; @end @@ -179,8 +178,8 @@ - (void)destroyScrollbarWithIdentifier:(long)ident if (![scroller isHidden]) { // A visible scroller was removed, so the window must resize to // fit. - // TODO! See comment in fitWindowToScrollbars:. - [self performSelectorOnMainThread:@selector(fitWindowToScrollbars:) + // TODO! Should only do this once per update. + [self performSelectorOnMainThread:@selector(resizeWindowToFit:) withObject:self waitUntilDone:NO]; } } @@ -199,8 +198,8 @@ - (void)showScrollbarWithIdentifier:(long)ident state:(BOOL)visible if (wasVisible != visible) { // A scroller was hidden or shown, so the window must resize to fit. //NSLog(@"%s scroller %d", visible ? "Show" : "Hide", ident); - // TODO! See comment in fitWindowToScrollbars:. - [self performSelectorOnMainThread:@selector(fitWindowToScrollbars:) + // TODO! Should only do this once per update. + [self performSelectorOnMainThread:@selector(resizeWindowToFit:) withObject:self waitUntilDone:NO]; } } @@ -213,7 +212,7 @@ - (void)setScrollbarPosition:(int)pos length:(int)len identifier:(long)ident //NSLog(@"Set range %@ for scroller %d", // NSStringFromRange(range), ident); [scroller setRange:range]; - // TODO! See comment in fitWindowToScrollbars:. + // TODO! Should only do this once per update. [self placeScrollbars]; } } @@ -227,6 +226,18 @@ - (void)setScrollbarThumbValue:(float)val proportion:(float)prop [scroller setFloatValue:val knobProportion:prop]; } +- (void)setDefaultColorsBackground:(NSColor *)back foreground:(NSColor *)fore +{ + [textStorage setDefaultColorsBackground:back foreground:fore]; + [textView setBackgroundColor:back]; +} + +- (void)setFont:(NSFont *)font +{ + [textStorage setFont:font]; + [self updateResizeIncrements]; +} + - (MMTextView *)textView { return textView; @@ -270,7 +281,8 @@ - (void)openWindowWithRows:(int)rows columns:(int)cols // NOTE! This flag is set once the entire text system is set up. setupDone = YES; - [self fitWindowToTextStorage]; + [self updateResizeIncrements]; + [self resizeWindowToFit:self]; // HACK! The GUI does not get activated if Vim is launched by MMBackend in // checkin:. I have not been able to figure out any other way to get it to @@ -362,8 +374,10 @@ - (void)setTextDimensionsWithRows:(int)rows columns:(int)cols { //NSLog(@"setTextDimensionsWithRows:%d columns:%d", rows, cols); - // HACK! Dimensions are set by [MMVimController performBatchDrawWithData:]. - //[textStorage setMaxRows:rows columns:cols]; + [textStorage setMaxRows:rows columns:cols]; + + if (setupDone && ![textView inLiveResize]) + [self resizeWindowToFit:self]; } - (void)setStatusText:(NSString *)text @@ -405,14 +419,14 @@ - (IBAction)showTabBar:(id)sender { [tabBarControl setHidden:NO]; if (setupDone) - [self fitWindowToTextStorage]; + [self resizeWindowToFit:self]; } - (IBAction)hideTabBar:(id)sender { [tabBarControl setHidden:YES]; if (setupDone) - [self fitWindowToTextStorage]; + [self resizeWindowToFit:self]; } @@ -466,6 +480,7 @@ - (void)tabView:(NSTabView *)theTabView didDragTabViewItem: // -- NSLayoutManager delegate ----------------------------------------------- +#if 0 - (void)layoutManager:(NSLayoutManager *)aLayoutManager didCompleteLayoutForTextContainer:(NSTextContainer *)aTextContainer atEnd:(BOOL)flag @@ -492,10 +507,10 @@ - (void)layoutManager:(NSLayoutManager *)aLayoutManager // (This way the text storage size can change however/whenever it wants // and the window will update to fit it.) if (!NSEqualSizes([tabView frame].size, [textStorage size])) { - [self fitWindowToTextStorage]; + [self resizeWindowToFit:self]; if (!NSEqualSizes([tabView frame].size, [textStorage size])) { // NOTE! If the window is the same size after - // fitWindowToTextStorage, we place the views manually + // resizeWindowToFit:, we place the views manually // (normally windowDidResize: takes care of that) in case the // text view changed size (which can happen e.g. after a ':set // lines' command). @@ -505,6 +520,7 @@ - (void)layoutManager:(NSLayoutManager *)aLayoutManager } } } +#endif // -- NSWindow delegate ------------------------------------------------------ @@ -527,15 +543,6 @@ - (void)windowWillClose:(NSNotification *)notification [tabBarControl setDelegate:nil]; } -#if 0 -- (NSSize)windowWillResize:(NSWindow *)sender toSize:(NSSize)proposedFrameSize -{ - //NSLog(@"%s (%.2f,%.2f)", _cmd, proposedFrameSize.width, - // proposedFrameSize.height); - return proposedFrameSize; -} -#endif - - (void)windowDidResize:(id)sender { if (!setupDone) return; @@ -555,7 +562,7 @@ - (NSRect)windowWillUseStandardFrame:(NSWindow *)win // increase 'frame' so that their tops align. Really, 'frame' should // already have its top at least as high as the current window frame, but // for some reason this is not always the case. - // (See fitWindowToTextStorage for a similar hack.) + // (See resizeWindowToFit: for a similar hack.) NSRect cur = [win frame]; if (NSMaxY(cur) > NSMaxY(frame)) { frame.size.height = cur.origin.y - frame.origin.y + cur.size.height; @@ -563,8 +570,9 @@ - (NSRect)windowWillUseStandardFrame:(NSWindow *)win frame = [self fitWindowToFrame:frame]; - // Keep old width and horizontal position if the Command key is held down. - if ([[NSApp currentEvent] modifierFlags] & NSCommandKeyMask) { + // Keep old width and horizontal position unless the Command key is held + // down. + if (!([[NSApp currentEvent] modifierFlags] & NSCommandKeyMask)) { NSRect currentFrame = [win frame]; frame.size.width = currentFrame.size.width; frame.origin.x = currentFrame.origin.x; @@ -624,7 +632,7 @@ - (NSRect)textViewRectForContentSize:(NSSize)contentSize return rect; } -- (void)fitWindowToTextStorage +- (void)resizeWindowToFit:(id)sender { if (!setupDone) return; @@ -649,15 +657,21 @@ - (void)fitWindowToTextStorage + frame.size.height; } - if (NSEqualRects(maxFrame, frame)) { - // The new window frame fits on the screen, so resize the window. - [win setFrame:frame display:YES]; - } else { + if (!NSEqualRects(maxFrame, frame)) { // The new window frame is too big to fit on the screen, so fit the // text storage to the biggest frame which will fit on the screen. //NSLog(@"Proposed window frame does not fit on the screen!"); + frame = [self fitWindowToFrame:maxFrame]; + } - [win setFrame:[self fitWindowToFrame:maxFrame] display:YES]; + // HACK! If the window does resize, then windowDidResize is called which in + // turn calls placeViews. In case the computed new size of the window is + // no different from the current size, then we need to call placeViews + // manually. + if (NSEqualRects(frame, [win frame])) { + [self placeViews]; + } else { + [win setFrame:frame display:YES]; } } @@ -909,16 +923,6 @@ - (void)scroll:(id)sender [vimController sendMessage:ScrollbarEventMsgID data:data wait:NO]; } -- (void)fitWindowToScrollbars:(id)sender -{ - // TODO! Make sure this only gets called once per update (e.g. in case - // several scrollbars were hidden). Could do this by setting a flag and - // then checking for this flag at appropriate places and then calling this - // method. - [self fitWindowToTextStorage]; - [self placeScrollbars]; -} - - (void)placeViews { if (!setupDone) return; @@ -929,11 +933,17 @@ - (void)placeViews NSWindow *win = [self window]; NSRect contentRect = [win contentRectForFrameRect:[win frame]]; NSRect textViewRect = [self textViewRectForContentSize:contentRect.size]; +#if 0 if ([textStorage resizeToFitSize:textViewRect.size]) { // Text storage dimensions changed, notify the VimTask. int dim[2]; [textStorage getMaxRows:&dim[0] columns:&dim[1]]; - +#else + int dim[2], rows, cols; + [textStorage getMaxRows:&rows columns:&cols]; + [textStorage fitToSize:textViewRect.size rows:&dim[0] columns:&dim[1]]; + if (dim[0] != rows || dim[1] != cols) { +#endif NSString *sdim = [NSString stringWithFormat:@"%dx%d", dim[1], dim[0]]; [self flashStatusText:sdim]; From f21b4dcc337d5b00e0299c3947e0bc0202613d76 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Wed, 1 Aug 2007 07:24:00 +0000 Subject: [PATCH 0031/1156] Rows & columns no longer sent with draw messages. git-svn-id: http://macvim.googlecode.com/svn/trunk@47 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMBackend.m | 10 ---------- MMVimController.m | 14 -------------- 2 files changed, 24 deletions(-) diff --git a/MMBackend.m b/MMBackend.m index 18b61e6b46..98e5853201 100644 --- a/MMBackend.m +++ b/MMBackend.m @@ -248,8 +248,6 @@ - (void)clearAll [drawData setLength:0]; [drawData appendBytes:&type length:sizeof(int)]; - [drawData appendBytes:&Rows length:sizeof(int)]; - [drawData appendBytes:&Columns length:sizeof(int)]; [drawData appendBytes:&defaultBackgroundColor length:sizeof(int)]; } @@ -260,8 +258,6 @@ - (void)clearBlockFromRow:(int)row1 column:(int)col1 int type = ClearBlockDrawType; [drawData appendBytes:&type length:sizeof(int)]; - [drawData appendBytes:&Rows length:sizeof(int)]; - [drawData appendBytes:&Columns length:sizeof(int)]; [drawData appendBytes:&defaultBackgroundColor length:sizeof(int)]; [drawData appendBytes:&row1 length:sizeof(int)]; @@ -276,8 +272,6 @@ - (void)deleteLinesFromRow:(int)row count:(int)count int type = DeleteLinesDrawType; [drawData appendBytes:&type length:sizeof(int)]; - [drawData appendBytes:&Rows length:sizeof(int)]; - [drawData appendBytes:&Columns length:sizeof(int)]; [drawData appendBytes:&defaultBackgroundColor length:sizeof(int)]; [drawData appendBytes:&row length:sizeof(int)]; @@ -293,8 +287,6 @@ - (void)replaceString:(char*)s length:(int)len row:(int)row column:(int)col int type = ReplaceStringDrawType; [drawData appendBytes:&type length:sizeof(int)]; - [drawData appendBytes:&Rows length:sizeof(int)]; - [drawData appendBytes:&Columns length:sizeof(int)]; [drawData appendBytes:&backgroundColor length:sizeof(int)]; [drawData appendBytes:&foregroundColor length:sizeof(int)]; @@ -311,8 +303,6 @@ - (void)insertLinesFromRow:(int)row count:(int)count int type = InsertLinesDrawType; [drawData appendBytes:&type length:sizeof(int)]; - [drawData appendBytes:&Rows length:sizeof(int)]; - [drawData appendBytes:&Columns length:sizeof(int)]; [drawData appendBytes:&defaultBackgroundColor length:sizeof(int)]; [drawData appendBytes:&row length:sizeof(int)]; diff --git a/MMVimController.m b/MMVimController.m index 19b952873d..528e0481e8 100644 --- a/MMVimController.m +++ b/MMVimController.m @@ -786,20 +786,6 @@ - (void)performBatchDrawWithData:(NSData *)data while (bytes < end) { int type = *((int*)bytes); bytes += sizeof(int); - int rows = *((int*)bytes); bytes += sizeof(int); - int cols = *((int*)bytes); bytes += sizeof(int); - -#if 0 - if (ClearAllDrawType != type) { - // All draw types except clear all rely on the text storage have - // the appropriate dimensions, so set it before attempting to - // modify the text storage. - [textStorage setMaxRows:rows columns:cols]; - } -#else - // Avoid 'unused var' warning. - rows; cols; -#endif if (ClearAllDrawType == type) { int color = *((int*)bytes); bytes += sizeof(int); From e8a4e1095f133295dbcebbc1c70ae545d2da3436 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Wed, 1 Aug 2007 07:40:30 +0000 Subject: [PATCH 0032/1156] Open window no longer has rows&columns as paramters. git-svn-id: http://macvim.googlecode.com/svn/trunk@48 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMBackend.h | 2 +- MMBackend.m | 10 ++-------- gui_macvim.m | 3 +-- 3 files changed, 4 insertions(+), 11 deletions(-) diff --git a/MMBackend.h b/MMBackend.h index dfa1222208..1a7f0e826a 100644 --- a/MMBackend.h +++ b/MMBackend.h @@ -46,7 +46,7 @@ - (void)setDefaultColorsBackground:(int)bg foreground:(int)fg; - (BOOL)checkin; -- (BOOL)openVimWindowWithRows:(int)rows columns:(int)cols; +- (BOOL)openVimWindow; - (void)clearAll; - (void)clearBlockFromRow:(int)row1 column:(int)col1 toRow:(int)row2 column:(int)col2; diff --git a/MMBackend.m b/MMBackend.m index 98e5853201..a2a1a4567d 100644 --- a/MMBackend.m +++ b/MMBackend.m @@ -199,7 +199,7 @@ - (BOOL)checkin #endif } -- (BOOL)openVimWindowWithRows:(int)rows columns:(int)cols +- (BOOL)openVimWindow { #if !MM_USE_DO if (!sendPort) { @@ -228,13 +228,7 @@ - (BOOL)openVimWindowWithRows:(int)rows columns:(int)cols } #endif // !MM_USE_DO - NSMutableData *data = [NSMutableData data]; - - [data appendBytes:&rows length:sizeof(int)]; - [data appendBytes:&cols length:sizeof(int)]; - - [self queueMessage:OpenVimWindowMsgID data:data]; - + [self queueMessage:OpenVimWindowMsgID data:nil]; return YES; } diff --git a/gui_macvim.m b/gui_macvim.m index 1282d9ac97..34911e613c 100644 --- a/gui_macvim.m +++ b/gui_macvim.m @@ -115,8 +115,7 @@ { //NSLog(@"gui_mch_open()"); - return [[MMBackend sharedInstance] - openVimWindowWithRows:gui.num_rows columns:gui.num_cols]; + return [[MMBackend sharedInstance] openVimWindow]; } From ef4c73ed056fb45a2f601cad302de499ff97b759 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Wed, 1 Aug 2007 07:41:21 +0000 Subject: [PATCH 0033/1156] OpenVimWindowMsgID no longer has rows&columns as parameters. git-svn-id: http://macvim.googlecode.com/svn/trunk@49 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMVimController.m | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/MMVimController.m b/MMVimController.m index 528e0481e8..2a8726a203 100644 --- a/MMVimController.m +++ b/MMVimController.m @@ -382,14 +382,7 @@ - (void)handleMessage:(int)msgid data:(NSData *)data //NSLog(@"%@ %s", [self className], _cmd); if (OpenVimWindowMsgID == msgid) { - const void *bytes = [data bytes]; - int rows = *((int*)bytes); bytes += sizeof(int); - int cols = *((int*)bytes); bytes += sizeof(int); - - //NSLog(@"Received open VimWindow (%dx%d) message from VimTask.", - // cols, rows); - - [windowController openWindowWithRows:rows columns:cols]; + [windowController openWindow]; } #if !MM_USE_DO else if (TaskExitedMsgID == msgid) { From 5a32d86fbaf9f4ed4b5e711ba2ac5538989336cc Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Wed, 1 Aug 2007 07:43:31 +0000 Subject: [PATCH 0034/1156] - Text system set up in awakeFromNib instead of open window (fixing bug where the background color wouldn't get set properly since textView was nil) - Open window no longer has rows&columns as parameters git-svn-id: http://macvim.googlecode.com/svn/trunk@50 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMWindowController.h | 2 +- MMWindowController.m | 226 +++++++++++++++++++++---------------------- 2 files changed, 114 insertions(+), 114 deletions(-) diff --git a/MMWindowController.h b/MMWindowController.h index 446048c02e..ae03db20f1 100644 --- a/MMWindowController.h +++ b/MMWindowController.h @@ -36,7 +36,7 @@ - (MMVimController *)vimController; - (MMTextView *)textView; - (MMTextStorage *)textStorage; -- (void)openWindowWithRows:(int)rows columns:(int)cols; +- (void)openWindow; - (void)updateTabsWithData:(NSData *)data; - (void)selectTabWithIndex:(int)idx; - (void)setTextDimensionsWithRows:(int)rows columns:(int)cols; diff --git a/MMWindowController.m b/MMWindowController.m index 4f8deeb8d9..6a7f12444c 100644 --- a/MMWindowController.m +++ b/MMWindowController.m @@ -99,7 +99,9 @@ - (id)initWithVimController:(MMVimController *)controller if ((self = [super initWithWindowNibName:@"VimWindow"])) { vimController = controller; scrollbars = [[NSMutableArray alloc] init]; +#if 0 textStorage = [[MMTextStorage alloc] init]; +#endif } return self; @@ -125,9 +127,28 @@ - (void)dealloc [super dealloc]; } -- (MMVimController *)vimController +- (void)awakeFromNib { - return vimController; + // Setup a complete text system. + textStorage = [[MMTextStorage alloc] init]; + NSLayoutManager *lm = [[NSLayoutManager alloc] init]; + NSTextContainer *tc = [[NSTextContainer alloc] initWithContainerSize: + NSMakeSize(1.0e7,1.0e7)]; + + [tc setWidthTracksTextView:NO]; + [tc setHeightTracksTextView:NO]; + [tc setLineFragmentPadding:0]; + + [textStorage addLayoutManager:lm]; + [lm addTextContainer:tc]; + + textView = [[MMTextView alloc] initWithFrame:NSZeroRect + textContainer:tc]; + + // The text storage retains the layout manager which in turn retains the + // text container. + [tc release]; + [lm release]; } - (void)windowDidLoad @@ -151,91 +172,9 @@ - (void)windowDidLoad [tabView removeAllTabViewItems]; } -- (void)createScrollbarWithIdentifier:(long)ident type:(int)type -{ - //NSLog(@"Create scroller %d of type %d", ident, type); - - MMScroller *scroller = [[MMScroller alloc] initWithIdentifier:ident - type:type]; - [scroller setTarget:self]; - [scroller setAction:@selector(scroll:)]; - - [[[self window] contentView] addSubview:scroller]; - [scrollbars addObject:scroller]; - [scroller release]; -} - -- (void)destroyScrollbarWithIdentifier:(long)ident -{ - //NSLog(@"Destroy scroller %d", ident); - - unsigned idx = 0; - MMScroller *scroller = [self scrollbarForIdentifier:ident index:&idx]; - if (scroller) { - [scroller removeFromSuperview]; - [scrollbars removeObjectAtIndex:idx]; - - if (![scroller isHidden]) { - // A visible scroller was removed, so the window must resize to - // fit. - // TODO! Should only do this once per update. - [self performSelectorOnMainThread:@selector(resizeWindowToFit:) - withObject:self waitUntilDone:NO]; - } - } -} - -- (void)showScrollbarWithIdentifier:(long)ident state:(BOOL)visible -{ - MMScroller *scroller = [self scrollbarForIdentifier:ident index:NULL]; - if (!scroller) return; - - BOOL wasVisible = ![scroller isHidden]; - //NSLog(@"%s scroller %d (was %svisible)", visible ? "Show" : "Hide", - // ident, wasVisible ? "" : "in"); - [scroller setHidden:!visible]; - - if (wasVisible != visible) { - // A scroller was hidden or shown, so the window must resize to fit. - //NSLog(@"%s scroller %d", visible ? "Show" : "Hide", ident); - // TODO! Should only do this once per update. - [self performSelectorOnMainThread:@selector(resizeWindowToFit:) - withObject:self waitUntilDone:NO]; - } -} - -- (void)setScrollbarPosition:(int)pos length:(int)len identifier:(long)ident -{ - MMScroller *scroller = [self scrollbarForIdentifier:ident index:NULL]; - NSRange range = NSMakeRange(pos, len); - if (!NSEqualRanges(range, [scroller range])) { - //NSLog(@"Set range %@ for scroller %d", - // NSStringFromRange(range), ident); - [scroller setRange:range]; - // TODO! Should only do this once per update. - [self placeScrollbars]; - } -} - -- (void)setScrollbarThumbValue:(float)val proportion:(float)prop - identifier:(long)ident -{ - MMScroller *scroller = [self scrollbarForIdentifier:ident index:NULL]; - //NSLog(@"Set thumb value %.2f proportion %.2f for scroller %d", - // val, prop, ident); - [scroller setFloatValue:val knobProportion:prop]; -} - -- (void)setDefaultColorsBackground:(NSColor *)back foreground:(NSColor *)fore -{ - [textStorage setDefaultColorsBackground:back foreground:fore]; - [textView setBackgroundColor:back]; -} - -- (void)setFont:(NSFont *)font +- (MMVimController *)vimController { - [textStorage setFont:font]; - [self updateResizeIncrements]; + return vimController; } - (MMTextView *)textView @@ -248,34 +187,8 @@ - (MMTextStorage *)textStorage return textStorage; } -- (void)openWindowWithRows:(int)rows columns:(int)cols +- (void)openWindow { - // Setup a complete text system. - NSLayoutManager *lm = [[NSLayoutManager alloc] init]; - NSTextContainer *tc = [[NSTextContainer alloc] initWithContainerSize: - NSMakeSize(1.0e7,1.0e7)]; - - [tc setWidthTracksTextView:NO]; - [tc setHeightTracksTextView:NO]; - [tc setLineFragmentPadding:0]; - - [textStorage setMaxRows:rows columns:cols]; - [textStorage addLayoutManager:lm]; - [lm addTextContainer:tc]; - - textView = [[MMTextView alloc] initWithFrame:[tabView frame] - textContainer:tc]; - - [[self window] makeFirstResponder:textView]; - - // Keep track of when the layout has changed. - [[textView layoutManager] setDelegate:self]; - - // The text storage retains the layout manager which in turn retains the - // text container. - [tc release]; - [lm release]; - [self addNewTabViewItem]; // NOTE! This flag is set once the entire text system is set up. @@ -407,6 +320,93 @@ - (void)flashStatusText:(NSString *)text repeats:NO] retain]; } +- (void)createScrollbarWithIdentifier:(long)ident type:(int)type +{ + //NSLog(@"Create scroller %d of type %d", ident, type); + + MMScroller *scroller = [[MMScroller alloc] initWithIdentifier:ident + type:type]; + [scroller setTarget:self]; + [scroller setAction:@selector(scroll:)]; + + [[[self window] contentView] addSubview:scroller]; + [scrollbars addObject:scroller]; + [scroller release]; +} + +- (void)destroyScrollbarWithIdentifier:(long)ident +{ + //NSLog(@"Destroy scroller %d", ident); + + unsigned idx = 0; + MMScroller *scroller = [self scrollbarForIdentifier:ident index:&idx]; + if (scroller) { + [scroller removeFromSuperview]; + [scrollbars removeObjectAtIndex:idx]; + + if (![scroller isHidden]) { + // A visible scroller was removed, so the window must resize to + // fit. + // TODO! Should only do this once per update. + [self performSelectorOnMainThread:@selector(resizeWindowToFit:) + withObject:self waitUntilDone:NO]; + } + } +} + +- (void)showScrollbarWithIdentifier:(long)ident state:(BOOL)visible +{ + MMScroller *scroller = [self scrollbarForIdentifier:ident index:NULL]; + if (!scroller) return; + + BOOL wasVisible = ![scroller isHidden]; + //NSLog(@"%s scroller %d (was %svisible)", visible ? "Show" : "Hide", + // ident, wasVisible ? "" : "in"); + [scroller setHidden:!visible]; + + if (wasVisible != visible) { + // A scroller was hidden or shown, so the window must resize to fit. + //NSLog(@"%s scroller %d", visible ? "Show" : "Hide", ident); + // TODO! Should only do this once per update. + [self performSelectorOnMainThread:@selector(resizeWindowToFit:) + withObject:self waitUntilDone:NO]; + } +} + +- (void)setScrollbarPosition:(int)pos length:(int)len identifier:(long)ident +{ + MMScroller *scroller = [self scrollbarForIdentifier:ident index:NULL]; + NSRange range = NSMakeRange(pos, len); + if (!NSEqualRanges(range, [scroller range])) { + //NSLog(@"Set range %@ for scroller %d", + // NSStringFromRange(range), ident); + [scroller setRange:range]; + // TODO! Should only do this once per update. + [self placeScrollbars]; + } +} + +- (void)setScrollbarThumbValue:(float)val proportion:(float)prop + identifier:(long)ident +{ + MMScroller *scroller = [self scrollbarForIdentifier:ident index:NULL]; + //NSLog(@"Set thumb value %.2f proportion %.2f for scroller %d", + // val, prop, ident); + [scroller setFloatValue:val knobProportion:prop]; +} + +- (void)setDefaultColorsBackground:(NSColor *)back foreground:(NSColor *)fore +{ + [textStorage setDefaultColorsBackground:back foreground:fore]; + [textView setBackgroundColor:back]; +} + +- (void)setFont:(NSFont *)font +{ + [textStorage setFont:font]; + [self updateResizeIncrements]; +} + - (IBAction)addNewTab:(id)sender { // NOTE! This can get called a lot if the user holds down the key From b6ec24bf15bc13b9800f364576e09e07572484d7 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Wed, 1 Aug 2007 07:55:21 +0000 Subject: [PATCH 0035/1156] More to read and to do. git-svn-id: http://macvim.googlecode.com/svn/trunk@51 96c4425d-ca35-0410-94e5-3396d5c13a8f --- README | 49 +++++++++++++++++++++++++++++++++++-------------- TODO | 33 ++++++++++++++++++--------------- 2 files changed, 53 insertions(+), 29 deletions(-) diff --git a/README b/README index 3cc2a23ba5..27b18e40ba 100644 --- a/README +++ b/README @@ -1,12 +1,9 @@ Compiling: - To build the project: - + open terminal, directory vimXX/src: type 'make' - this builds the Vim executable - + open MacVim.xcodeproj, choose 'Release' on pull-down menu 'Active Build - Configuration', click Build - this builds the PSMTabBarFramework, then MacVim.app (which can be found in - MacVim/build/Release) + + patch vim7 src with MacVim patch + + make vim7 src with --enable-gui=macvim + + build MacVim.xcodeproj - To install: + copy MacVim.app to /Applications (or anywhere you want it) + in ~/.profile add this line: @@ -18,7 +15,8 @@ Compiling: + in terminal mode of Vim, type :gui and MacVim will start - Technical notes: + to build a universal binary, the compiler AND linker needs the flags - '-isysroot /Developer/SDKs/MacOSX10.4u.sdk -arch ppc -arch i386' + '-isysroot /Developer/SDKs/MacOSX10.4u.sdk -arch ppc -arch i386'; also, + make needs argument --with-mac-arch=both + vim runtime files are copied to 'MacVim.app/Contents/Resources/vim/runtime/' @@ -58,26 +56,49 @@ Weirdness: - The MMVimController is added to the NSEventTrackingRunLoopMode, otherwise updates from Vim would not reach the MMVimController while the user resizes the window using the mouse. +- It seems that (oneway void) DO messages can arrive when another such message + is being processed. For this reason, no input is sent to Vim whilst in + processCommandQueue:. Instead, messages are queued and sent when + processCommandQueue: has finished. Otherwise the invariant that all Vim + messages must appear in the same order they were issued will be violated. +- Text storage dimensions are not ever directly modified, instead a message is + sent to Vim asking it to change the "shell size". Otherwise, a message + asking Vim to change the shell size might get lost and Vim and MacVim will + have inconsistent states. +- gui_mch_browse() is a blocking call, but you can't put up dialogs in Cocoa + which block until the user dismisses them (it uses callbacks). This + complicates the browsing somewhat. Design decisions: - Output is queued and sent to the MMVimController only when [MMBackend flushQueue] is called in order to minimize the amount of - messages sent back and forth between the task and gui. (This does not apply - to all messages sent to the gui though.) + messages sent back and forth between the task and gui. Also, this makes sure + that commands reach MacVim in the same order they were issued by Vim. - Drawing commands are stored in a buffer (drawData) and put on the output queue whenever [MMBackend flush] is called. This buffer might no longer be needed now that there is a general output queue. However, the existing code works, so why change it? -- The gui listens for tasks on a named port whose name is derived from - CFBundleIdentifier (which is defined inside Info.plist of the app bundle). - In order to run two different copies of MacVim at the same time, they need to - have differing bundle identifiers; otherwise one copy will not be able to - create the named listening port and all tasks will connect to the first copy. +- [obsolete] The gui listens for tasks on a named port whose name is derived + from CFBundleIdentifier (which is defined inside Info.plist of the app + bundle). In order to run two different copies of MacVim at the same time, + they need to have differing bundle identifiers; otherwise one copy will not + be able to create the named listening port and all tasks will connect to the + first copy. +- The gui creates a named NSConnection which vends the MMAppController object. - All tabs share one text view and its associated text storage. There used to be one text view per tab, but this only complicated the code since Vim has no concept of different views (as in NSView). +- Vim holds the actual state. MacVim should never change Vim related states + directly, instead it must ask Vim to change the state and wait for Vim to + reply with an actual state change command. +- If MacVim wants to change the state of Vim it must go through + processInput:data:, this is an asynchronous call. +- MacVim can query state information synchronously by adding a suitable message + to MMBackendProtocol, however this must not change the state of Vim! +- If MacVim or Vim dies, the NSConnection is invalidated and connectionDidDie: + is invoked. Keyboard stuff: diff --git a/TODO b/TODO index 0ef94d7bb8..d36b8a0776 100644 --- a/TODO +++ b/TODO @@ -1,30 +1,27 @@ Active: +- drag and drop inside view (FEAT_GUI_DND, gui_handle_drop()) +- offset text away from left edge +- main menu +- menu key equivalents +- add menu options with key equiv: + Cmd+Option+Left/Right to change tab, Cmd+x/c/v cut/copy/paste, + Cmd+z/Z undo/redo, Cmd+o open, Cmd+w/W close tab/window, + Cmd+Option+T special characters, + etc. - application:openFiles: should open in tabs in current window instead of in a - new window -- don't clear the text storage on setMaxRows:: so that display does not go - blank when dragging to resize -- zoom&resize broken + new window, only if user default is set - toolbar drawing bug -- offset text away from left edge - need E??? numbers for vim errors -- tab-completion for :action command +- tab-completion for :action command? - should ignore action message if is called too often (e.g. in addNewTab:) - proper font handling - font selection dialog (:set gfn=*) - check for memory leaks -- startup is a bit flakey (up until openWindowWithRows:columns:) - i8n - services menu - gui dialogs (FEAT_GUI_DIALOG) - find/replace toolbar item (FIND_REPLACE_DIALOG) -- main menu -- menu key equivalents -- add menu options with key equiv: - Cmd+Option+Left/Right to change tab, Cmd+x/c/v cut/copy/paste, - Cmd+z/Z undo/redo, Cmd+o open, Cmd+w/W close tab/window, - Cmd+Option+T special characters, - etc. - popup menus - encoding -- convert strings from vim to utf-8 - change building procedure so that the Makefile compiles and links VimTask and @@ -39,7 +36,6 @@ Active: (this will lead to a crash) - wide characters are badly supported: they render as too wide - update speed whilst resizing with mouse is excruciatingly slow -- drag and drop inside view (FEAT_GUI_DND, gui_handle_drop()) - window count should be typeset nicely in tab - put marked text in status line (?) - track pad scrolling is jerky @@ -62,6 +58,13 @@ Active: Pending: +- startup is a bit flakey (up until openWindowWithRows:columns:) +- background color of text view doesn't get set if :colorscheme is in .gvimrc, + since textView=nil when setDefaultColorsBackground:foreground: is called +- resize window on font change +- don't clear the text storage on setMaxRows:: so that display does not go + blank when dragging to resize +- zoom&resize broken - add user default for min/max tab size - :colorscheme elflord, :set lines+=3 --> colors are not updated properly - use DO to communicate between GUI and Vim (only for two-way communication, From 853caf4272293a8af13bf927b5607e0fa7ff7187 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Wed, 1 Aug 2007 14:17:23 +0000 Subject: [PATCH 0036/1156] Added support for key equivalents on menu items. git-svn-id: http://macvim.googlecode.com/svn/trunk@52 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMBackend.h | 3 +- MMBackend.m | 91 ++++++++++++++++++++++++++++++++++++++++++++++- MMVimController.m | 11 ++++++ gui_macvim.m | 10 ++++-- 4 files changed, 111 insertions(+), 4 deletions(-) diff --git a/MMBackend.h b/MMBackend.h index 1a7f0e826a..aa5db08907 100644 --- a/MMBackend.h +++ b/MMBackend.h @@ -72,7 +72,8 @@ - (void)addMenuWithTag:(int)tag parent:(int)parentTag name:(char *)name atIndex:(int)index; - (void)addMenuItemWithTag:(int)tag parent:(int)parentTag name:(char *)name - tip:(char *)tip icon:(char *)icon atIndex:(int)index; + tip:(char *)tip icon:(char *)icon + keyEquivalent:(int)key modifiers:(int)mods atIndex:(int)index; - (void)removeMenuItemWithTag:(int)tag; - (void)enableMenuItemWithTag:(int)tag state:(int)enabled; - (void)showToolbar:(int)enable flags:(int)flags; diff --git a/MMBackend.m b/MMBackend.m index a2a1a4567d..64b0b44513 100644 --- a/MMBackend.m +++ b/MMBackend.m @@ -15,8 +15,10 @@ // TODO: Move to separate file. static int eventModifierFlagsToVimModMask(int modifierFlags); +static int vimModMaskToEventModifierFlags(int mods); static int eventModifierFlagsToVimMouseModMask(int modifierFlags); static int eventButtonNumberToVimMouseButton(int buttonNumber); +static int specialKeyToNSKey(int key); @interface MMBackend (Private) @@ -558,7 +560,8 @@ - (void)addMenuWithTag:(int)tag parent:(int)parentTag name:(char *)name } - (void)addMenuItemWithTag:(int)tag parent:(int)parentTag name:(char *)name - tip:(char *)tip icon:(char *)icon atIndex:(int)index + tip:(char *)tip icon:(char *)icon + keyEquivalent:(int)key modifiers:(int)mods atIndex:(int)index { //NSLog(@"addMenuItemWithTag:%d parent:%d name:%s tip:%s atIndex:%d", tag, // parentTag, name, tip, index); @@ -566,8 +569,11 @@ - (void)addMenuItemWithTag:(int)tag parent:(int)parentTag name:(char *)name int namelen = name ? strlen(name) : 0; int tiplen = tip ? strlen(tip) : 0; int iconlen = icon ? strlen(icon) : 0; + int eventFlags = vimModMaskToEventModifierFlags(mods); NSMutableData *data = [NSMutableData data]; + key = specialKeyToNSKey(key); + [data appendBytes:&tag length:sizeof(int)]; [data appendBytes:&parentTag length:sizeof(int)]; [data appendBytes:&namelen length:sizeof(int)]; @@ -577,6 +583,8 @@ - (void)addMenuItemWithTag:(int)tag parent:(int)parentTag name:(char *)name [data appendBytes:&iconlen length:sizeof(int)]; if (iconlen > 0) [data appendBytes:icon length:iconlen]; [data appendBytes:&index length:sizeof(int)]; + [data appendBytes:&key length:sizeof(int)]; + [data appendBytes:&eventFlags length:sizeof(int)]; [self queueMessage:AddMenuItemMsgID data:data]; } @@ -1184,6 +1192,22 @@ static int eventModifierFlagsToVimModMask(int modifierFlags) return modMask; } +static int vimModMaskToEventModifierFlags(int mods) +{ + int flags = 0; + + if (mods & MOD_MASK_SHIFT) + flags |= NSShiftKeyMask; + if (mods & MOD_MASK_CTRL) + flags |= NSControlKeyMask; + if (mods & MOD_MASK_ALT) + flags |= NSAlternateKeyMask; + if (mods & MOD_MASK_CMD) + flags |= NSCommandKeyMask; + + return flags; +} + static int eventModifierFlagsToVimMouseModMask(int modifierFlags) { int modMask = 0; @@ -1205,3 +1229,68 @@ static int eventButtonNumberToVimMouseButton(int buttonNumber) return mouseButton[buttonNumber < 5 ? buttonNumber : 0]; } + +static int specialKeyToNSKey(int key) +{ + if (!IS_SPECIAL(key)) + return key; + + static struct { + int special; + int nskey; + } sp2ns[] = { + { K_UP, NSUpArrowFunctionKey }, + { K_DOWN, NSDownArrowFunctionKey }, + { K_LEFT, NSLeftArrowFunctionKey }, + { K_RIGHT, NSRightArrowFunctionKey }, + { K_F1, NSF1FunctionKey }, + { K_F2, NSF2FunctionKey }, + { K_F3, NSF3FunctionKey }, + { K_F4, NSF4FunctionKey }, + { K_F5, NSF5FunctionKey }, + { K_F6, NSF6FunctionKey }, + { K_F7, NSF7FunctionKey }, + { K_F8, NSF8FunctionKey }, + { K_F9, NSF9FunctionKey }, + { K_F10, NSF10FunctionKey }, + { K_F11, NSF11FunctionKey }, + { K_F12, NSF12FunctionKey }, + { K_F13, NSF13FunctionKey }, + { K_F14, NSF14FunctionKey }, + { K_F15, NSF15FunctionKey }, + { K_F16, NSF16FunctionKey }, + { K_F17, NSF17FunctionKey }, + { K_F18, NSF18FunctionKey }, + { K_F19, NSF19FunctionKey }, + { K_F20, NSF20FunctionKey }, + { K_F21, NSF21FunctionKey }, + { K_F22, NSF22FunctionKey }, + { K_F23, NSF23FunctionKey }, + { K_F24, NSF24FunctionKey }, + { K_F25, NSF25FunctionKey }, + { K_F26, NSF26FunctionKey }, + { K_F27, NSF27FunctionKey }, + { K_F28, NSF28FunctionKey }, + { K_F29, NSF29FunctionKey }, + { K_F30, NSF30FunctionKey }, + { K_F31, NSF31FunctionKey }, + { K_F32, NSF32FunctionKey }, + { K_F33, NSF33FunctionKey }, + { K_F34, NSF34FunctionKey }, + { K_F35, NSF35FunctionKey }, + { K_DEL, NSBackspaceCharacter }, + { K_BS, NSDeleteCharacter }, + { K_HOME, NSHomeFunctionKey }, + { K_END, NSEndFunctionKey }, + { K_PAGEUP, NSPageUpFunctionKey }, + { K_PAGEDOWN, NSPageDownFunctionKey } + }; + + int i; + for (i = 0; i < sizeof(sp2ns)/sizeof(sp2ns[0]); ++i) { + if (sp2ns[i].special == key) + return sp2ns[i].nskey; + } + + return 0; +} diff --git a/MMVimController.m b/MMVimController.m index 2a8726a203..2e3e4a4af2 100644 --- a/MMVimController.m +++ b/MMVimController.m @@ -605,6 +605,8 @@ - (void)handleMessage:(int)msgid data:(NSData *)data } int idx = *((int*)bytes); bytes += sizeof(int); if (idx < 0) idx = 0; + int key = *((int*)bytes); bytes += sizeof(int); + int mask = *((int*)bytes); bytes += sizeof(int); NSString *ident = [NSString stringWithFormat:@"%d.%d", (int)self, parentTag]; @@ -629,6 +631,15 @@ - (void)handleMessage:(int)msgid data:(NSData *)data [item setTitle:title]; [item setAction:@selector(vimMenuItemAction:)]; if (tip) [item setToolTip:tip]; + + if (key != 0) { + NSString *keyString = + [NSString stringWithFormat:@"%C", key]; + //NSLog(@"Set key equivalent %@ (code=0x%x, mods=%d)", + // keyString, key, mask); + [item setKeyEquivalent:keyString]; + [item setKeyEquivalentModifierMask:mask]; + } } else { item = [NSMenuItem separatorItem]; } diff --git a/gui_macvim.m b/gui_macvim.m index 34911e613c..93bc130792 100644 --- a/gui_macvim.m +++ b/gui_macvim.m @@ -583,8 +583,14 @@ ? (char*)menu->strings[MENU_INDEX_TIP] : (char*)menu->actext; [[MMBackend sharedInstance] - addMenuItemWithTag:(int)menu parent:(int)menu->parent name:name - tip:tip icon:(char*)icon atIndex:idx]; + addMenuItemWithTag:(int)menu + parent:(int)menu->parent + name:name + tip:tip + icon:(char*)icon + keyEquivalent:menu->ke_key + modifiers:menu->ke_mods + atIndex:idx]; } From 97e7df18509209579fea8bc8b995060554e9e188 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Wed, 1 Aug 2007 17:56:18 +0000 Subject: [PATCH 0037/1156] Added system gvimrc file to project. git-svn-id: http://macvim.googlecode.com/svn/trunk@54 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MacVim.xcodeproj/project.pbxproj | 4 ++++ MacVim.xcodeproj/winckler.mode1 | 21 +++++++-------------- MacVim.xcodeproj/winckler.pbxuser | 4 ++-- gvimrc | 26 ++++++++++++++++++++++++++ 4 files changed, 39 insertions(+), 16 deletions(-) create mode 100644 gvimrc diff --git a/MacVim.xcodeproj/project.pbxproj b/MacVim.xcodeproj/project.pbxproj index 78a6e0f175..33c4e7df69 100644 --- a/MacVim.xcodeproj/project.pbxproj +++ b/MacVim.xcodeproj/project.pbxproj @@ -29,6 +29,7 @@ 1D71ACBD0BC702AC002F2B60 /* doc-bm-xml.icns in Resources */ = {isa = PBXBuildFile; fileRef = 1D71ACB20BC702AB002F2B60 /* doc-bm-xml.icns */; }; 1D71ACBE0BC702AC002F2B60 /* doc-bm.icns in Resources */ = {isa = PBXBuildFile; fileRef = 1D71ACB30BC702AB002F2B60 /* doc-bm.icns */; }; 1DD04DEC0C529C5E006CDC2B /* Credits.rtf in Resources */ = {isa = PBXBuildFile; fileRef = 1DD04DEB0C529C5E006CDC2B /* Credits.rtf */; }; + 1DD0C20C0C60FFB4008CD84A /* gvimrc in CopyFiles */ = {isa = PBXBuildFile; fileRef = 1DD0C20A0C60FF9A008CD84A /* gvimrc */; }; 1DD703B90BA9D15D008679E9 /* vim_gloss.icns in Resources */ = {isa = PBXBuildFile; fileRef = 1DD703B80BA9D15D008679E9 /* vim_gloss.icns */; }; 1DD704310BA9F9C2008679E9 /* SpecialKeys.plist in Resources */ = {isa = PBXBuildFile; fileRef = 1DD704300BA9F9C2008679E9 /* SpecialKeys.plist */; }; 1DE608B40C587FDA0055263D /* runtime in CopyFiles */ = {isa = PBXBuildFile; fileRef = 1DE602470C587FD10055263D /* runtime */; }; @@ -105,6 +106,7 @@ dstPath = vim; dstSubfolderSpec = 7; files = ( + 1DD0C20C0C60FFB4008CD84A /* gvimrc in CopyFiles */, 1DE608B40C587FDA0055263D /* runtime in CopyFiles */, ); runOnlyForDeploymentPostprocessing = 0; @@ -143,6 +145,7 @@ 1D71ACB20BC702AB002F2B60 /* doc-bm-xml.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = "doc-bm-xml.icns"; sourceTree = ""; }; 1D71ACB30BC702AB002F2B60 /* doc-bm.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = "doc-bm.icns"; sourceTree = ""; }; 1DD04DEB0C529C5E006CDC2B /* Credits.rtf */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; path = Credits.rtf; sourceTree = ""; }; + 1DD0C20A0C60FF9A008CD84A /* gvimrc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = gvimrc; sourceTree = ""; }; 1DD703B80BA9D15D008679E9 /* vim_gloss.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = vim_gloss.icns; sourceTree = ""; }; 1DD704300BA9F9C2008679E9 /* SpecialKeys.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = SpecialKeys.plist; sourceTree = ""; }; 1DE602470C587FD10055263D /* runtime */ = {isa = PBXFileReference; lastKnownFileType = folder; name = runtime; path = ../../runtime; sourceTree = SOURCE_ROOT; }; @@ -275,6 +278,7 @@ 1DE602460C587F760055263D /* Vim Resources */ = { isa = PBXGroup; children = ( + 1DD0C20A0C60FF9A008CD84A /* gvimrc */, 1DE602470C587FD10055263D /* runtime */, ); name = "Vim Resources"; diff --git a/MacVim.xcodeproj/winckler.mode1 b/MacVim.xcodeproj/winckler.mode1 index 309ecb685e..e0662ffb2e 100644 --- a/MacVim.xcodeproj/winckler.mode1 +++ b/MacVim.xcodeproj/winckler.mode1 @@ -368,9 +368,9 @@ TableOfContents - 1DE8CC400C5E2483003F56E3 + 1DD0C2170C610087008CD84A 1CE0B1FE06471DED0097A5F4 - 1DE8CC410C5E2483003F56E3 + 1DD0C2180C610087008CD84A 1CE0B20306471E060097A5F4 1CE0B20506471E060097A5F4 @@ -504,13 +504,8 @@ 5 WindowOrderList - 1DE8CC540C5E24D6003F56E3 - 1DE8CC550C5E24D6003F56E3 - 1DE444730BA4445100C4C77A - 1CD10A99069EF8BA00B06720 - 1DE8CC520C5E24CD003F56E3 - 1D16B9EF0BA33E3800A69B33 1C0AD2B3069F1EA900FABCE6 + 1D16B9EF0BA33E3800A69B33 /Users/winckler/Projects/vim7/src/MacVim/MacVim.xcodeproj WindowString @@ -530,14 +525,12 @@ Dock - BecomeActive - ContentConfiguration PBXProjectModuleGUID 1CD0528F0623707200166675 PBXProjectModuleLabel - MMAppController.m + StatusBarVisibility @@ -593,7 +586,7 @@ TableOfContents 1D16B9EF0BA33E3800A69B33 - 1DE8CC420C5E2483003F56E3 + 1DD0C2120C610078008CD84A 1CD0528F0623707200166675 XCMainBuildResultsModuleGUID @@ -963,9 +956,9 @@ TableOfContents 1C0AD2B3069F1EA900FABCE6 - 1DE8CC430C5E2483003F56E3 + 1DD0C2130C610078008CD84A 1CD0528B0623707200166675 - 1DE8CC440C5E2483003F56E3 + 1DD0C2140C610078008CD84A ToolbarConfiguration xcode.toolbar.config.run diff --git a/MacVim.xcodeproj/winckler.pbxuser b/MacVim.xcodeproj/winckler.pbxuser index 3f54797410..628ab7ff45 100644 --- a/MacVim.xcodeproj/winckler.pbxuser +++ b/MacVim.xcodeproj/winckler.pbxuser @@ -236,8 +236,8 @@ PBXFileDataSource_Warnings_ColumnID, ); }; - PBXPerProjectTemplateStateSaveDate = 207496274; - PBXWorkspaceStateSaveDate = 207496274; + PBXPerProjectTemplateStateSaveDate = 207683433; + PBXWorkspaceStateSaveDate = 207683433; }; sourceControlManager = 1D16B9DD0BA33BB000A69B33 /* Source Control */; userBuildSettings = { diff --git a/gvimrc b/gvimrc new file mode 100644 index 0000000000..7e4222ab50 --- /dev/null +++ b/gvimrc @@ -0,0 +1,26 @@ +map :tabn +map :tabp + +map :action selectPreviousWindow: +map :action selectNextWindow: + +menukeyequiv File.Open\.\.\. +menukeyequiv File.Open\ Tab\.\.\. +"menukeyequiv File.New +"menukeyequiv File.Close +menukeyequiv File.Save +menukeyequiv File.Save\ As\.\.\. +menukeyequiv File.Exit + +menukeyequiv Edit.Undo +menukeyequiv Edit.Redo +menukeyequiv Edit.Cut +menukeyequiv Edit.Copy +menukeyequiv Edit.Paste +menukeyequiv Edit.Select\ All + +menukeyequiv Tools.Make +menukeyequiv Tools.List\ Errors +menukeyequiv Tools.List\ Messages +menukeyequiv Tools.Next\ Error +menukeyequiv Tools.Previous\ Error From f3ffb6bd7646113430d4597a779c6752a1019e02 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Wed, 1 Aug 2007 18:35:47 +0000 Subject: [PATCH 0038/1156] App will terminate when last window closes (because of menu problems). git-svn-id: http://macvim.googlecode.com/svn/trunk@55 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMAppController.m | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/MMAppController.m b/MMAppController.m index 35db3c0314..9fbd33387e 100644 --- a/MMAppController.m +++ b/MMAppController.m @@ -126,6 +126,15 @@ - (void)application:(NSApplication *)sender openFiles:(NSArray *)filenames // NSApplicationDelegateReplyFailure = 2 } +- (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)sender +{ + // HACK! If there is no open Vim nobody will handle the menus (in + // particual, 'New Vim Window' is not handled, so no new windows can be + // opened). Until I figure out a way to deal with the menus this method + // will return YES. + return YES; +} + - (NSApplicationTerminateReply)applicationShouldTerminate: (NSApplication *)sender { From a182287130f00e2c8061007edeab3217ebc24e88 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Wed, 1 Aug 2007 18:37:30 +0000 Subject: [PATCH 0039/1156] Window menu changed, had to update hard coding as to where it is placed. git-svn-id: http://macvim.googlecode.com/svn/trunk@56 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMVimController.m | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/MMVimController.m b/MMVimController.m index 2e3e4a4af2..0c289d536d 100644 --- a/MMVimController.m +++ b/MMVimController.m @@ -906,7 +906,7 @@ - (void)updateMainMenu { shouldUpdateMainMenu = NO; - // HACK! Add the vim menu named 'Window' as the submenu with index 5 of an + // HACK! Add the vim menu named 'Window' as the submenu with index 3 of an // already existing menu with the same name. The 'Window' menu is set up // in Interface Builder. NSMenu *mainMenu = [NSApp mainMenu]; @@ -929,11 +929,11 @@ - (void)updateMainMenu for (i = 0; i < count; ++i) { NSMenuItem *item = [mainMenuItems objectAtIndex:i]; - if (windowMenu && [windowMenu numberOfItems] > 6 + if (windowMenu && [windowMenu numberOfItems] > 4 && [[item title] isEqual:@"Window"]) { - // Item 5 of the Window menu is replaced with vim's Window menu. - [windowMenu removeItemAtIndex:5]; - [windowMenu insertItem:item atIndex:5]; + // Item 3 of the Window menu is replaced with vim's Window menu. + [windowMenu removeItemAtIndex:3]; + [windowMenu insertItem:item atIndex:3]; } else { [mainMenu insertItem:item atIndex:i+1]; } From 215d49a7321b9c7956f73fbda9a5d29e0de5ed4d Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Wed, 1 Aug 2007 18:38:29 +0000 Subject: [PATCH 0040/1156] Removed "New Window" and "New Tab" menu items. git-svn-id: http://macvim.googlecode.com/svn/trunk@57 96c4425d-ca35-0410-94e5-3396d5c13a8f --- English.lproj/MainMenu.nib/keyedobjects.nib | Bin 7901 -> 7524 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/English.lproj/MainMenu.nib/keyedobjects.nib b/English.lproj/MainMenu.nib/keyedobjects.nib index f0b2eac405714621560847aace435767a35f75b9..e54b9abc0818ffcb9bf7f581e2113a7f5f50476d 100644 GIT binary patch literal 7524 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 Date: Wed, 1 Aug 2007 18:39:12 +0000 Subject: [PATCH 0041/1156] Added menu items "New Vim Window", "New Tab", "Close Tab" with key equivalents. git-svn-id: http://macvim.googlecode.com/svn/trunk@58 96c4425d-ca35-0410-94e5-3396d5c13a8f --- gvimrc | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/gvimrc b/gvimrc index 7e4222ab50..88abfa0f78 100644 --- a/gvimrc +++ b/gvimrc @@ -1,9 +1,41 @@ +" System gvimrc file for MacVim +" Author: Björn Winckler +" Last Change: Wed Aug 1 20:03:43 CEST 2007 +" +" This is a work in progress. If you feel so inclined, please help me improve +" this file. +" + +" +" Extra menus +" + +an 10.290 File.New\ Vim\ Window :action newVimWindow: +an 10.300 File.-SEP0- +an 10.326 File.New\ Tab :tabnew +an 10.331 File.Close\ Tab :tabclose + + +" +" Keyboard mappings +" + map :tabn map :tabp map :action selectPreviousWindow: map :action selectNextWindow: + + +" +" Menu key equivalents (these should always have the 'D' modifier set) +" + +menukeyequiv File.New\ Vim\ Window +menukeyequiv File.New\ Tab +menukeyequiv File.Close\ Tab + menukeyequiv File.Open\.\.\. menukeyequiv File.Open\ Tab\.\.\. "menukeyequiv File.New From 3e62aa74cda548f7b05c33deb74a1feb3004cd6c Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Wed, 1 Aug 2007 18:53:27 +0000 Subject: [PATCH 0042/1156] Added "Special Characters..." menu item with key equivalent. git-svn-id: http://macvim.googlecode.com/svn/trunk@59 96c4425d-ca35-0410-94e5-3396d5c13a8f --- gvimrc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/gvimrc b/gvimrc index 88abfa0f78..e263959e26 100644 --- a/gvimrc +++ b/gvimrc @@ -15,6 +15,9 @@ an 10.300 File.-SEP0- an 10.326 File.New\ Tab :tabnew an 10.331 File.Close\ Tab :tabclose +an 20.460 Edit.-SEP4- +an 20.470 Edit.Special\ Characters\.\.\. :action orderFrontCharacterPalette: + " " Keyboard mappings @@ -50,6 +53,7 @@ menukeyequiv Edit.Cut menukeyequiv Edit.Copy menukeyequiv Edit.Paste menukeyequiv Edit.Select\ All +menukeyequiv Edit.Special\ Characters\.\.\. menukeyequiv Tools.Make menukeyequiv Tools.List\ Errors From 18737386cd72edfcc0294532afaaf1c5fba70276 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Wed, 1 Aug 2007 18:56:17 +0000 Subject: [PATCH 0043/1156] Less active, more pending. git-svn-id: http://macvim.googlecode.com/svn/trunk@60 96c4425d-ca35-0410-94e5-3396d5c13a8f --- TODO | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/TODO b/TODO index d36b8a0776..043bcc5349 100644 --- a/TODO +++ b/TODO @@ -2,13 +2,7 @@ Active: - drag and drop inside view (FEAT_GUI_DND, gui_handle_drop()) - offset text away from left edge -- main menu -- menu key equivalents -- add menu options with key equiv: - Cmd+Option+Left/Right to change tab, Cmd+x/c/v cut/copy/paste, - Cmd+z/Z undo/redo, Cmd+o open, Cmd+w/W close tab/window, - Cmd+Option+T special characters, - etc. +- main menu (buffers menu, window menu) - application:openFiles: should open in tabs in current window instead of in a new window, only if user default is set - toolbar drawing bug @@ -58,6 +52,12 @@ Active: Pending: +- add menu options with key equiv: + Cmd+Option+Left/Right to change tab, Cmd+x/c/v cut/copy/paste, + Cmd+z/Z undo/redo, Cmd+o open, Cmd+w/W close tab/window, + Cmd+Option+T special characters, + etc. +- menu key equivalents - startup is a bit flakey (up until openWindowWithRows:columns:) - background color of text view doesn't get set if :colorscheme is in .gvimrc, since textView=nil when setDefaultColorsBackground:foreground: is called From 2fb4387bdc7aed103f5f45e95e5c4c7f19b2eff6 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Thu, 2 Aug 2007 06:19:18 +0000 Subject: [PATCH 0044/1156] - Text view now drawn with inset - Added user defaults to control text view inset -inset[left|right|top|bottom] git-svn-id: http://macvim.googlecode.com/svn/trunk@61 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMAppController.h | 4 ++++ MMAppController.m | 8 ++++++++ MMWindowController.m | 49 +++++++++++++++++++++++++++++++++++--------- 3 files changed, 51 insertions(+), 10 deletions(-) diff --git a/MMAppController.h b/MMAppController.h index 1241726fad..685c08210f 100644 --- a/MMAppController.h +++ b/MMAppController.h @@ -18,6 +18,10 @@ extern NSString *MMTabMinWidthKey; extern NSString *MMTabMaxWidthKey; extern NSString *MMTabOptimumWidthKey; extern NSString *MMStatuslineOffKey; +extern NSString *MMTextInsetLeft; +extern NSString *MMTextInsetRight; +extern NSString *MMTextInsetTop; +extern NSString *MMTextInsetBottom; diff --git a/MMAppController.m b/MMAppController.m index 9fbd33387e..4e7a944d32 100644 --- a/MMAppController.m +++ b/MMAppController.m @@ -19,6 +19,10 @@ NSString *MMTabMaxWidthKey = @"tabmaxwidth"; NSString *MMTabOptimumWidthKey = @"taboptimumwidth"; NSString *MMStatuslineOffKey = @"statuslineoff"; +NSString *MMTextInsetLeft = @"insetleft"; +NSString *MMTextInsetRight = @"insetright"; +NSString *MMTextInsetTop = @"insettop"; +NSString *MMTextInsetBottom = @"insetbottom"; @@ -32,6 +36,10 @@ + (void)initialize [NSNumber numberWithInt:6*64], MMTabMaxWidthKey, [NSNumber numberWithInt:132], MMTabOptimumWidthKey, [NSNumber numberWithBool:NO], MMStatuslineOffKey, + [NSNumber numberWithInt:2], MMTextInsetLeft, + [NSNumber numberWithInt:1], MMTextInsetRight, + [NSNumber numberWithInt:1], MMTextInsetTop, + [NSNumber numberWithInt:1], MMTextInsetBottom, nil]; [[NSUserDefaults standardUserDefaults] registerDefaults:dict]; diff --git a/MMWindowController.m b/MMWindowController.m index 6a7f12444c..d12e741ece 100644 --- a/MMWindowController.m +++ b/MMWindowController.m @@ -49,8 +49,9 @@ - (void)setRange:(NSRange)newRange; @end @interface MMWindowController (Private) -- (NSSize)contentSizeForTextViewSize:(NSSize)textViewSize; +- (NSSize)contentSizeForTextStorageSize:(NSSize)textViewSize; - (NSRect)textViewRectForContentSize:(NSSize)contentSize; +- (NSSize)textStorageSizeForTextViewSize:(NSSize)textViewSize; - (void)resizeWindowToFit:(id)sender; - (NSRect)fitWindowToFrame:(NSRect)frame; - (void)updateResizeIncrements; @@ -145,6 +146,11 @@ - (void)awakeFromNib textView = [[MMTextView alloc] initWithFrame:NSZeroRect textContainer:tc]; + NSUserDefaults *ud = [NSUserDefaults standardUserDefaults]; + int left = [ud integerForKey:MMTextInsetLeft]; + int top = [ud integerForKey:MMTextInsetTop]; + [textView setTextContainerInset:NSMakeSize(left, top)]; + // The text storage retains the layout manager which in turn retains the // text container. [tc release]; @@ -587,10 +593,17 @@ - (NSRect)windowWillUseStandardFrame:(NSWindow *)win @implementation MMWindowController (Private) -- (NSSize)contentSizeForTextViewSize:(NSSize)textViewSize +- (NSSize)contentSizeForTextStorageSize:(NSSize)textViewSize { NSSize size = textViewSize; + NSUserDefaults *ud = [NSUserDefaults standardUserDefaults]; + int right = [ud integerForKey:MMTextInsetRight]; + int bot = [ud integerForKey:MMTextInsetBottom]; + + size.width += [textView textContainerOrigin].x + right; + size.height += [textView textContainerOrigin].y + bot; + if (![tabBarControl isHidden]) size.height += [tabBarControl frame].size.height; if (![[NSUserDefaults standardUserDefaults] boolForKey:MMStatuslineOffKey]) @@ -632,6 +645,20 @@ - (NSRect)textViewRectForContentSize:(NSSize)contentSize return rect; } +- (NSSize)textStorageSizeForTextViewSize:(NSSize)textViewSize +{ + NSSize size = textViewSize; + + NSUserDefaults *ud = [NSUserDefaults standardUserDefaults]; + int right = [ud integerForKey:MMTextInsetRight]; + int bot = [ud integerForKey:MMTextInsetBottom]; + + size.width -= [textView textContainerOrigin].x + right; + size.height -= [textView textContainerOrigin].y + bot; + + return size; +} + - (void)resizeWindowToFit:(id)sender { if (!setupDone) return; @@ -639,7 +666,7 @@ - (void)resizeWindowToFit:(id)sender NSWindow *win = [self window]; NSRect frame = [win frame]; NSRect contentRect = [win contentRectForFrameRect:frame]; - NSSize newSize = [self contentSizeForTextViewSize:[textStorage size]]; + NSSize newSize = [self contentSizeForTextStorageSize:[textStorage size]]; // Keep top-left corner of the window fixed when resizing. contentRect.origin.y -= newSize.height - contentRect.size.height; @@ -681,13 +708,14 @@ - (NSRect)fitWindowToFrame:(NSRect)frame NSWindow *win = [self window]; NSRect contentRect = [win contentRectForFrameRect:frame]; - NSRect textViewRect = [self textViewRectForContentSize:contentRect.size]; - NSSize fitSize = [textStorage fitToSize:textViewRect.size]; - NSSize newSize = [self contentSizeForTextViewSize:fitSize]; + NSSize size = [self textViewRectForContentSize:contentRect.size].size; + size = [self textStorageSizeForTextViewSize:size]; + size = [textStorage fitToSize:size]; + size = [self contentSizeForTextStorageSize:size]; // Keep top-left corner of 'frame' fixed. - contentRect.origin.y -= newSize.height - contentRect.size.height; - contentRect.size = newSize; + contentRect.origin.y -= size.height - contentRect.size.height; + contentRect.size = size; return [win frameRectForContentRect:contentRect]; } @@ -933,15 +961,16 @@ - (void)placeViews NSWindow *win = [self window]; NSRect contentRect = [win contentRectForFrameRect:[win frame]]; NSRect textViewRect = [self textViewRectForContentSize:contentRect.size]; + NSSize tsSize = [self textStorageSizeForTextViewSize:textViewRect.size]; #if 0 - if ([textStorage resizeToFitSize:textViewRect.size]) { + if ([textStorage resizeToFitSize:tsSize]) { // Text storage dimensions changed, notify the VimTask. int dim[2]; [textStorage getMaxRows:&dim[0] columns:&dim[1]]; #else int dim[2], rows, cols; [textStorage getMaxRows:&rows columns:&cols]; - [textStorage fitToSize:textViewRect.size rows:&dim[0] columns:&dim[1]]; + [textStorage fitToSize:tsSize rows:&dim[0] columns:&dim[1]]; if (dim[0] != rows || dim[1] != cols) { #endif NSString *sdim = [NSString stringWithFormat:@"%dx%d", dim[1], dim[0]]; From 4fd52452a9b42c57d6541538b2d9e26268e26d28 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Thu, 2 Aug 2007 06:22:43 +0000 Subject: [PATCH 0045/1156] Added -inset[left|right|top|bottom] command line arguments. git-svn-id: http://macvim.googlecode.com/svn/trunk@62 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MacVim.xcodeproj/winckler.mode1 | 10 +++++----- MacVim.xcodeproj/winckler.pbxuser | 12 ++++++++++-- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/MacVim.xcodeproj/winckler.mode1 b/MacVim.xcodeproj/winckler.mode1 index e0662ffb2e..46c3831785 100644 --- a/MacVim.xcodeproj/winckler.mode1 +++ b/MacVim.xcodeproj/winckler.mode1 @@ -368,9 +368,9 @@ TableOfContents - 1DD0C2170C610087008CD84A + 1D8FA20B0C61AF48009406B2 1CE0B1FE06471DED0097A5F4 - 1DD0C2180C610087008CD84A + 1D8FA20C0C61AF48009406B2 1CE0B20306471E060097A5F4 1CE0B20506471E060097A5F4 @@ -586,7 +586,7 @@ TableOfContents 1D16B9EF0BA33E3800A69B33 - 1DD0C2120C610078008CD84A + 1D8FA20D0C61AF48009406B2 1CD0528F0623707200166675 XCMainBuildResultsModuleGUID @@ -956,9 +956,9 @@ TableOfContents 1C0AD2B3069F1EA900FABCE6 - 1DD0C2130C610078008CD84A + 1D8FA20E0C61AF48009406B2 1CD0528B0623707200166675 - 1DD0C2140C610078008CD84A + 1D8FA20F0C61AF48009406B2 ToolbarConfiguration xcode.toolbar.config.run diff --git a/MacVim.xcodeproj/winckler.pbxuser b/MacVim.xcodeproj/winckler.pbxuser index 628ab7ff45..eb808ef241 100644 --- a/MacVim.xcodeproj/winckler.pbxuser +++ b/MacVim.xcodeproj/winckler.pbxuser @@ -39,8 +39,16 @@ NO, NO, NO, + NO, + NO, + NO, + NO, ); argumentStrings = ( + "-insetleft 2", + "-insetright 1", + "-insettop 1", + "-insetbottom 1", "-tabmaxwidth 384", "-taboptimumwidth 132", "-statuslineoff 1", @@ -236,8 +244,8 @@ PBXFileDataSource_Warnings_ColumnID, ); }; - PBXPerProjectTemplateStateSaveDate = 207683433; - PBXWorkspaceStateSaveDate = 207683433; + PBXPerProjectTemplateStateSaveDate = 207728380; + PBXWorkspaceStateSaveDate = 207728380; }; sourceControlManager = 1D16B9DD0BA33BB000A69B33 /* Source Control */; userBuildSettings = { From 0dfd3cad43d6ffa1f71a3b44fec8775e1fddce7c Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Thu, 2 Aug 2007 06:35:51 +0000 Subject: [PATCH 0046/1156] Ensure that vertical scrollbars do not cover the resize corner (Cocoa never lets them do it anyway, but there were drawing artifacts, so now there is an explicit check). git-svn-id: http://macvim.googlecode.com/svn/trunk@63 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMWindowController.m | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/MMWindowController.m b/MMWindowController.m index d12e741ece..2952507c0e 100644 --- a/MMWindowController.m +++ b/MMWindowController.m @@ -832,6 +832,9 @@ - (void)placeScrollbars // HACK! Find the lowest left&right vertical scrollbars, as well as the // leftmost horizontal scrollbar. This hack continues further down. + // + // TODO! Can there be no more than one horizontal scrollbar? If so, the + // code can be simplified. unsigned lowestLeftSbIdx = (unsigned)-1; unsigned lowestRightSbIdx = (unsigned)-1; unsigned leftmostSbIdx = (unsigned)-1; @@ -914,10 +917,18 @@ - (void)placeScrollbars } } + // Vertical scrollers must not cover the resize box in the + // bottom-right corner of the window. + if (rect.origin.y < [NSScroller scrollerWidth]) { + rect.size.height -= [NSScroller scrollerWidth] - rect.origin.y; + rect.origin.y = [NSScroller scrollerWidth]; + } + // Make sure scrollbar rect is bounded by the tab view frame. - if (rect.origin.y < tabViewFrame.origin.y) + if (rect.origin.y < tabViewFrame.origin.y) { + rect.size.height -= tabViewFrame.origin.y - rect.origin.y; rect.origin.y = tabViewFrame.origin.y; - else if (rect.origin.y > NSMaxY(tabViewFrame)) + } else if (rect.origin.y > NSMaxY(tabViewFrame)) rect.origin.y = NSMaxY(tabViewFrame); if (NSMaxY(rect) > NSMaxY(tabViewFrame)) rect.size.height -= NSMaxY(rect) - NSMaxY(tabViewFrame); From 15eb437c2daff1d62db604cb61401f21c290b15f Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Thu, 2 Aug 2007 07:07:06 +0000 Subject: [PATCH 0047/1156] Pending: text inset, scrollbars do not cover resize box git-svn-id: http://macvim.googlecode.com/svn/trunk@64 96c4425d-ca35-0410-94e5-3396d5c13a8f --- TODO | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/TODO b/TODO index 043bcc5349..4b975cd761 100644 --- a/TODO +++ b/TODO @@ -1,7 +1,6 @@ Active: - drag and drop inside view (FEAT_GUI_DND, gui_handle_drop()) -- offset text away from left edge - main menu (buffers menu, window menu) - application:openFiles: should open in tabs in current window instead of in a new window, only if user default is set @@ -52,6 +51,8 @@ Active: Pending: +- scrollbars not positioned over resize box +- offset text away from left edge - add menu options with key equiv: Cmd+Option+Left/Right to change tab, Cmd+x/c/v cut/copy/paste, Cmd+z/Z undo/redo, Cmd+o open, Cmd+w/W close tab/window, From 086084781449c1a571e4c7c4f0e6574ab8803c62 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Thu, 2 Aug 2007 08:34:00 +0000 Subject: [PATCH 0048/1156] Modified tab/window selection keyboard mappings. git-svn-id: http://macvim.googlecode.com/svn/trunk@65 96c4425d-ca35-0410-94e5-3396d5c13a8f --- gvimrc | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/gvimrc b/gvimrc index e263959e26..54dde6d4a5 100644 --- a/gvimrc +++ b/gvimrc @@ -23,11 +23,23 @@ an 20.470 Edit.Special\ Characters\.\.\. :action orderFrontCharacterPalette:< " Keyboard mappings " -map :tabn -map :tabp +" TODO: Do these mappings have to be this complicated? Is it possible to have +" each tab 'remembering' which mode it was in? +map :tabn +imap :tabn +vmap :tabn -map :action selectPreviousWindow: -map :action selectNextWindow: +map :tabp +imap :tabp +vmap :tabp + +map :action selectPreviousWindow: +imap :action selectPreviousWindow: +vmap :action selectPreviousWindow: + +map :action selectNextWindow: +imap :action selectNextWindow: +vmap :action selectNextWindow: From 53d930bf5ea77b2e839d4019734a3afad93faaaf Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Fri, 3 Aug 2007 10:29:43 +0000 Subject: [PATCH 0049/1156] - Cleanup of menu add code - Buffers menu gets updated now - Main menu update changed; Vim now in control of entire menu, menu named "Window" is set to be the Window menu. git-svn-id: http://macvim.googlecode.com/svn/trunk@66 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMVimController.m | 215 +++++++++++++++++++++++++++------------------- 1 file changed, 128 insertions(+), 87 deletions(-) diff --git a/MMVimController.m b/MMVimController.m index 0c289d536d..b63ccf1950 100644 --- a/MMVimController.m +++ b/MMVimController.m @@ -26,11 +26,19 @@ - (void)panelDidEnd:(NSSavePanel *)panel code:(int)code context:(void *)context; - (NSMenuItem *)menuItemForTag:(int)tag; - (NSMenu *)menuForTag:(int)tag; +- (void)addMenuWithTag:(int)tag parent:(NSMenu *)parent title:(NSString *)title + atIndex:(int)idx; +- (void)addMenuItemWithTag:(int)tag parent:(NSMenu *)parent + title:(NSString *)title tip:(NSString *)tip + keyEquivalent:(int)key modifiers:(int)mask atIndex:(int)idx; - (void)updateMainMenu; - (NSToolbarItem *)toolbarItemForTag:(int)tag index:(int *)index; - (IBAction)toolbarAction:(id)sender; - (void)addToolbarItemToDictionaryWithTag:(int)tag label:(NSString *)title toolTip:(NSString *)tip icon:(NSString *)icon; +- (void)addToolbarItemWithTag:(int)tag label:(NSString *)label + tip:(NSString *)tip icon:(NSString *)icon + atIndex:(int)idx; #if MM_USE_DO - (void)connectionDidDie:(NSNotification *)notification; #endif @@ -266,6 +274,10 @@ - (oneway void)processCommandQueue:(in NSArray *)queue } //NSLog(@"======== %s END ========", _cmd); + if (shouldUpdateMainMenu) { + [self updateMainMenu]; + } + #if MM_DELAY_SEND_IN_PROCESS_CMD_QUEUE inProcessCommandQueue = NO; @@ -327,8 +339,9 @@ - (void)handlePortMessage:(NSPortMessage *)portMessage [self handleMessage:msgid data:data]; } - if (shouldUpdateMainMenu) + if (shouldUpdateMainMenu) { [self updateMainMenu]; + } } #endif // MM_USE_DO @@ -550,33 +563,8 @@ - (void)handleMessage:(int)msgid data:(NSData *)data } else if (MenuPopupType == parentTag) { // TODO! } else if (title) { - NSMenuItem *item = [[NSMenuItem alloc] init]; - NSMenu *menu = [[NSMenu alloc] initWithTitle:title]; - - [menu setAutoenablesItems:NO]; - [item setTag:tag]; - [item setTitle:title]; - [item setSubmenu:menu]; - NSMenu *parent = [self menuForTag:parentTag]; - if (parent) { - if ([parent numberOfItems] <= idx) { - [parent addItem:item]; - } else { - [parent insertItem:item atIndex:idx]; - } - } else { - if ([mainMenuItems count] <= idx) { - [mainMenuItems addObject:item]; - } else { - [mainMenuItems insertObject:item atIndex:idx]; - } - - shouldUpdateMainMenu = YES; - } - - [item release]; - [menu release]; + [self addMenuWithTag:tag parent:parent title:title atIndex:idx]; } [title release]; @@ -611,45 +599,12 @@ - (void)handleMessage:(int)msgid data:(NSData *)data NSString *ident = [NSString stringWithFormat:@"%d.%d", (int)self, parentTag]; if (toolbar && [[toolbar identifier] isEqual:ident]) { - //NSLog(@"Toolbar add: title=%@ icon=%@ tip=%@", title, icon, tip); - [self addToolbarItemToDictionaryWithTag:tag label:title toolTip:tip - icon:icon]; - - int maxIdx = [[toolbar items] count]; - if (maxIdx < idx) idx = maxIdx; - - // If 'title' is nul, insert a separator. - if (!title) title = NSToolbarSeparatorItemIdentifier; - [toolbar insertItemWithItemIdentifier:title atIndex:idx]; + [self addToolbarItemWithTag:tag label:title tip:tip icon:icon + atIndex:idx]; } else { NSMenu *parent = [self menuForTag:parentTag]; - if (parent) { - NSMenuItem *item = nil; - if (title) { - item = [[[NSMenuItem alloc] init] autorelease]; - [item setTag:tag]; - [item setTitle:title]; - [item setAction:@selector(vimMenuItemAction:)]; - if (tip) [item setToolTip:tip]; - - if (key != 0) { - NSString *keyString = - [NSString stringWithFormat:@"%C", key]; - //NSLog(@"Set key equivalent %@ (code=0x%x, mods=%d)", - // keyString, key, mask); - [item setKeyEquivalent:keyString]; - [item setKeyEquivalentModifierMask:mask]; - } - } else { - item = [NSMenuItem separatorItem]; - } - - if ([parent numberOfItems] <= idx) { - [parent addItem:item]; - } else { - [parent insertItem:item atIndex:idx]; - } - } + [self addMenuItemWithTag:tag parent:parent title:title tip:tip + keyEquivalent:key modifiers:mask atIndex:idx]; } [title release]; @@ -666,6 +621,7 @@ - (void)handleMessage:(int)msgid data:(NSData *)data [toolbar removeItemAtIndex:idx]; } else if ((item = [self menuItemForTag:tag])) { if ([item menu] == [NSApp mainMenu]) { + NSLog(@"Removing menu: %@", item); [mainMenuItems removeObject:item]; } [[item menu] removeItem:item]; @@ -902,42 +858,111 @@ - (NSMenu *)menuForTag:(int)tag return [[self menuItemForTag:tag] submenu]; } -- (void)updateMainMenu +- (void)addMenuWithTag:(int)tag parent:(NSMenu *)parent title:(NSString *)title + atIndex:(int)idx { - shouldUpdateMainMenu = NO; + NSMenuItem *item = [[NSMenuItem alloc] init]; + NSMenu *menu = [[NSMenu alloc] initWithTitle:title]; - // HACK! Add the vim menu named 'Window' as the submenu with index 3 of an - // already existing menu with the same name. The 'Window' menu is set up - // in Interface Builder. + [menu setAutoenablesItems:NO]; + [item setTag:tag]; + [item setTitle:title]; + [item setSubmenu:menu]; + + if (parent) { + if ([parent numberOfItems] <= idx) { + [parent addItem:item]; + } else { + [parent insertItem:item atIndex:idx]; + } + } else { + if ([mainMenuItems count] <= idx) { + [mainMenuItems addObject:item]; + } else { + [mainMenuItems insertObject:item atIndex:idx]; + } + + shouldUpdateMainMenu = YES; + } + + [item release]; + [menu release]; +} + +- (void)addMenuItemWithTag:(int)tag parent:(NSMenu *)parent + title:(NSString *)title tip:(NSString *)tip + keyEquivalent:(int)key modifiers:(int)mask atIndex:(int)idx +{ + if (parent) { + NSMenuItem *item = nil; + if (title) { + item = [[[NSMenuItem alloc] init] autorelease]; + [item setTitle:title]; + [item setAction:@selector(vimMenuItemAction:)]; + if (tip) [item setToolTip:tip]; + + if (key != 0) { + NSString *keyString = + [NSString stringWithFormat:@"%C", key]; + //NSLog(@"Set key equivalent %@ (code=0x%x, mods=%d)", + // keyString, key, mask); + [item setKeyEquivalent:keyString]; + [item setKeyEquivalentModifierMask:mask]; + } + } else { + item = [NSMenuItem separatorItem]; + } + + // NOTE! The tag is used to idenfity which menu items were + // added by Vim (tag != 0) and which were added by the AppKit + // (tag == 0). + [item setTag:tag]; + + if ([parent numberOfItems] <= idx) { + [parent addItem:item]; + } else { + [parent insertItem:item atIndex:idx]; + } + } +} + +- (void)updateMainMenu +{ NSMenu *mainMenu = [NSApp mainMenu]; - NSMenu *windowMenu = nil; - // Remove all existing menus, except for 'Window'. + // Stop NSApp from updating the Window menu. + [NSApp setWindowsMenu:nil]; + + // Remove all menus from main menu (except the MacVim menu). int i, count = [mainMenu numberOfItems]; for (i = count-1; i > 0; --i) { - NSMenuItem *item = [mainMenu itemAtIndex:i]; - NSMenu *submenu = [item submenu]; - if ([[submenu title] isEqual:@"Window"]) { - windowMenu = submenu; - } else { - [mainMenu removeItem:item]; - } + [mainMenu removeItemAtIndex:i]; } - // Add menus from 'mainMenuItems' + // Add menus from 'mainMenuItems' to main menu. count = [mainMenuItems count]; for (i = 0; i < count; ++i) { - NSMenuItem *item = [mainMenuItems objectAtIndex:i]; + [mainMenu addItem:[mainMenuItems objectAtIndex:i]]; + } - if (windowMenu && [windowMenu numberOfItems] > 4 - && [[item title] isEqual:@"Window"]) { - // Item 3 of the Window menu is replaced with vim's Window menu. - [windowMenu removeItemAtIndex:3]; - [windowMenu insertItem:item atIndex:3]; - } else { - [mainMenu insertItem:item atIndex:i+1]; + // Set the new Window menu. + // TODO! Need to look for 'Window' in all localized languages. + NSMenu *windowMenu = [[mainMenu itemWithTitle:@"Window"] submenu]; + if (windowMenu) { + // Remove all AppKit owned menu items (tag == 0); they will be added + // again when setWindowsMenu: is called. + count = [windowMenu numberOfItems]; + for (i = count-1; i >= 0; --i) { + NSMenuItem *item = [windowMenu itemAtIndex:i]; + if (![item tag]) { + [windowMenu removeItem:item]; + } } + + [NSApp setWindowsMenu:windowMenu]; } + + shouldUpdateMainMenu = NO; } - (NSToolbarItem *)toolbarItemForTag:(int)tag index:(int *)index @@ -993,6 +1018,22 @@ - (void)addToolbarItemToDictionaryWithTag:(int)tag label:(NSString *)title [item release]; } +- (void)addToolbarItemWithTag:(int)tag label:(NSString *)label tip:(NSString + *)tip icon:(NSString *)icon atIndex:(int)idx +{ + if (!toolbar) return; + + [self addToolbarItemToDictionaryWithTag:tag label:label toolTip:tip + icon:icon]; + + int maxIdx = [[toolbar items] count]; + if (maxIdx < idx) idx = maxIdx; + + // If 'label' is nul, insert a separator. + if (!label) label = NSToolbarSeparatorItemIdentifier; + [toolbar insertItemWithItemIdentifier:label atIndex:idx]; +} + #if MM_USE_DO - (void)connectionDidDie:(NSNotification *)notification { From 80036f94e54822d4b6b73d186b0246354cc0afd2 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Fri, 3 Aug 2007 10:30:31 +0000 Subject: [PATCH 0050/1156] Changed File and Window menus to follow Apple HIG more closely. git-svn-id: http://macvim.googlecode.com/svn/trunk@67 96c4425d-ca35-0410-94e5-3396d5c13a8f --- gvimrc | 52 ++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 40 insertions(+), 12 deletions(-) diff --git a/gvimrc b/gvimrc index 54dde6d4a5..14aefe7b38 100644 --- a/gvimrc +++ b/gvimrc @@ -10,28 +10,50 @@ " Extra menus " -an 10.290 File.New\ Vim\ Window :action newVimWindow: -an 10.300 File.-SEP0- -an 10.326 File.New\ Tab :tabnew +" File menu. + +aunmenu File.New +aunmenu File.Close +aunmenu File.-SEP4- +aunmenu File.Exit +aunmenu File.Save-Exit + +an 10.290 File.New\ Window :action newVimWindow: +an 10.295 File.New\ Tab :tabnew +an 10.328 File.-SEP0- +an 10.330 File.Close\ Window :confirm qa an 10.331 File.Close\ Tab :tabclose an 20.460 Edit.-SEP4- an 20.470 Edit.Special\ Characters\.\.\. :action orderFrontCharacterPalette: +" Try to make Window menu follow Apple HIG. +aunmenu Window + +an 70.300 Window.Minimize :action performMiniaturize: +an 70.310 Window.Zoom :action performZoom: +an 70.320 Window.-SEP1- +" TODO! Grey out if no tabs are visible. +an 70.330 Window.Previous\ Tab :tabnext +an 70.340 Window.Next\ Tab :tabprevious +an 70.350 Window.-SEP2- +an 70.360 Window.Bring\ All\ To\ Front :action arrangeInFront: + + " " Keyboard mappings " " TODO: Do these mappings have to be this complicated? Is it possible to have " each tab 'remembering' which mode it was in? -map :tabn -imap :tabn -vmap :tabn +"map :tabn +"imap :tabn +"vmap :tabn -map :tabp -imap :tabp -vmap :tabp +"map :tabp +"imap :tabp +"vmap :tabp map :action selectPreviousWindow: imap :action selectPreviousWindow: @@ -47,17 +69,18 @@ vmap :action selectNextWindow: " Menu key equivalents (these should always have the 'D' modifier set) " -menukeyequiv File.New\ Vim\ Window +menukeyequiv File.New\ Window menukeyequiv File.New\ Tab menukeyequiv File.Close\ Tab menukeyequiv File.Open\.\.\. menukeyequiv File.Open\ Tab\.\.\. "menukeyequiv File.New -"menukeyequiv File.Close +menukeyequiv File.Close\ Window menukeyequiv File.Save menukeyequiv File.Save\ As\.\.\. -menukeyequiv File.Exit +"menukeyequiv File.Exit +menukeyequiv File.Print menukeyequiv Edit.Undo menukeyequiv Edit.Redo @@ -72,3 +95,8 @@ menukeyequiv Tools.List\ Errors menukeyequiv Tools.List\ Messages menukeyequiv Tools.Next\ Error menukeyequiv Tools.Previous\ Error + +menukeyequiv Window.Minimize +"menukeyequiv Window.Zoom +menukeyequiv Window.Previous\ Tab +menukeyequiv Window.Next\ Tab From b0d1020fcabcbd32526fd168574299c8bcc68492 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Fri, 3 Aug 2007 10:30:58 +0000 Subject: [PATCH 0051/1156] Added menu related todos. git-svn-id: http://macvim.googlecode.com/svn/trunk@68 96c4425d-ca35-0410-94e5-3396d5c13a8f --- TODO | 2 ++ 1 file changed, 2 insertions(+) diff --git a/TODO b/TODO index 4b975cd761..f23e7dff2d 100644 --- a/TODO +++ b/TODO @@ -1,5 +1,7 @@ Active: +- grey out menus which can't be used: Tab Next/Prev/Close, Undo/Redo, etc. +- when only one tab open make close window - drag and drop inside view (FEAT_GUI_DND, gui_handle_drop()) - main menu (buffers menu, window menu) - application:openFiles: should open in tabs in current window instead of in a From e9232cd96a0220999d8422d1e36bbcdbebf89fc1 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sat, 4 Aug 2007 10:29:32 +0000 Subject: [PATCH 0052/1156] Removed log messages git-svn-id: http://macvim.googlecode.com/svn/trunk@69 96c4425d-ca35-0410-94e5-3396d5c13a8f --- PSMTabBarControl/source/PSMAquaTabStyle.m | 2 -- PSMTabBarControl/source/PSMUnifiedTabStyle.m | 2 -- 2 files changed, 4 deletions(-) diff --git a/PSMTabBarControl/source/PSMAquaTabStyle.m b/PSMTabBarControl/source/PSMAquaTabStyle.m index 7235c4c6b4..849c072599 100644 --- a/PSMTabBarControl/source/PSMAquaTabStyle.m +++ b/PSMTabBarControl/source/PSMAquaTabStyle.m @@ -34,8 +34,6 @@ - (id) init - (void) loadImages { - NSLog(@"PSMAquaTabStyle loadImages"); - // Aqua Tabs Images aquaTabBg = [[NSImage alloc] initByReferencingFile:[[PSMTabBarControl bundle] pathForImageResource:@"AquaTabsBackground"]]; [aquaTabBg setFlipped:YES]; diff --git a/PSMTabBarControl/source/PSMUnifiedTabStyle.m b/PSMTabBarControl/source/PSMUnifiedTabStyle.m index ea2910c6e2..3a5a35fe87 100644 --- a/PSMTabBarControl/source/PSMUnifiedTabStyle.m +++ b/PSMTabBarControl/source/PSMUnifiedTabStyle.m @@ -32,8 +32,6 @@ - (id) init { if((self = [super init])) { - NSLog(@"PSMUnifiedTabStyle init"); - unifiedCloseButton = [[NSImage alloc] initByReferencingFile:[[PSMTabBarControl bundle] pathForImageResource:@"AquaTabClose_Front"]]; unifiedCloseButtonDown = [[NSImage alloc] initByReferencingFile:[[PSMTabBarControl bundle] pathForImageResource:@"AquaTabClose_Front_Pressed"]]; unifiedCloseButtonOver = [[NSImage alloc] initByReferencingFile:[[PSMTabBarControl bundle] pathForImageResource:@"AquaTabClose_Front_Rollover"]]; From a4e7da905c9a12088072eecd5a3bcc52b65071a5 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sat, 4 Aug 2007 10:31:00 +0000 Subject: [PATCH 0053/1156] Tab next/previous were mixed up. git-svn-id: http://macvim.googlecode.com/svn/trunk@70 96c4425d-ca35-0410-94e5-3396d5c13a8f --- gvimrc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gvimrc b/gvimrc index 14aefe7b38..ee3ddc98af 100644 --- a/gvimrc +++ b/gvimrc @@ -35,8 +35,8 @@ an 70.300 Window.Minimize :action performMiniaturize: an 70.310 Window.Zoom :action performZoom: an 70.320 Window.-SEP1- " TODO! Grey out if no tabs are visible. -an 70.330 Window.Previous\ Tab :tabnext -an 70.340 Window.Next\ Tab :tabprevious +an 70.330 Window.Previous\ Tab :tabprevious +an 70.340 Window.Next\ Tab :tabnext an 70.350 Window.-SEP2- an 70.360 Window.Bring\ All\ To\ Front :action arrangeInFront: From 4098680553702440710f8ccf3a164eebe84e3094 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sat, 4 Aug 2007 10:58:19 +0000 Subject: [PATCH 0054/1156] When launching MacVim from [MMBackend checkin], use CFBundleExecutable in Info.plist to determine the name of the MacVim executable. git-svn-id: http://macvim.googlecode.com/svn/trunk@71 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMBackend.m | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/MMBackend.m b/MMBackend.m index 64b0b44513..ab32a31142 100644 --- a/MMBackend.m +++ b/MMBackend.m @@ -97,18 +97,20 @@ - (void)setDefaultColorsBackground:(int)bg foreground:(int)fg - (BOOL)checkin { + NSBundle *mainBundle = [NSBundle mainBundle]; + #if MM_USE_DO // NOTE! If the name of the connection changes here it must also be // updated in MMAppController.m. NSString *name = [NSString stringWithFormat:@"%@-connection", - [[NSBundle mainBundle] bundleIdentifier]]; + [mainBundle bundleIdentifier]]; connection = [NSConnection connectionWithRegisteredName:name host:nil]; if (!connection) #else // NOTE! If the name of the port changes here it must also be updated in // MMAppController.m. NSString *portName = [NSString stringWithFormat:@"%@-taskport", - [[NSBundle mainBundle] bundleIdentifier]]; + [mainBundle bundleIdentifier]]; NSPort *port = [[[NSMachBootstrapServer sharedInstance] portForName:portName host:nil] retain]; @@ -116,7 +118,7 @@ - (BOOL)checkin #endif { #if 0 - NSString *path = [[NSBundle mainBundle] bundlePath]; + NSString *path = [mainBundle bundlePath]; if (![[NSWorkspace sharedWorkspace] launchApplication:path]) { NSLog(@"WARNING: Failed to launch GUI with path %@", path); return NO; @@ -132,8 +134,14 @@ - (BOOL)checkin // opened. NSMutableArray *args = [NSMutableArray arrayWithObjects:@"-nowindow", @"yes", nil]; - NSString *path = [[NSBundle mainBundle] - pathForAuxiliaryExecutable:@"MacVim"]; + NSString *exeName = [[mainBundle infoDictionary] + objectForKey:@"CFBundleExecutable"]; + NSString *path = [mainBundle pathForAuxiliaryExecutable:exeName]; + if (!path) { + NSLog(@"ERROR: Could not find MacVim executable in bundle"); + return NO; + } + [NSTask launchedTaskWithLaunchPath:path arguments:args]; #endif From 35d1d0be993986663518da833dc86489c2321e80 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sat, 4 Aug 2007 17:17:36 +0000 Subject: [PATCH 0055/1156] - Added user default 'terminateafterlastwindowclosed' - Autoenabling of menu items is turned on when last window is closed git-svn-id: http://macvim.googlecode.com/svn/trunk@72 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMAppController.h | 1 + MMAppController.m | 62 ++++++++++++++++++++++++++++++++++++----------- 2 files changed, 49 insertions(+), 14 deletions(-) diff --git a/MMAppController.h b/MMAppController.h index 685c08210f..0ddf90b3dc 100644 --- a/MMAppController.h +++ b/MMAppController.h @@ -22,6 +22,7 @@ extern NSString *MMTextInsetLeft; extern NSString *MMTextInsetRight; extern NSString *MMTextInsetTop; extern NSString *MMTextInsetBottom; +extern NSString *MMTerminateAfterLastWindowClosed; diff --git a/MMAppController.m b/MMAppController.m index 4e7a944d32..ecfcfa2be6 100644 --- a/MMAppController.m +++ b/MMAppController.m @@ -14,18 +14,24 @@ // NSUserDefaults keys -NSString *MMNoWindowKey = @"nowindow"; -NSString *MMTabMinWidthKey = @"tabminwidth"; -NSString *MMTabMaxWidthKey = @"tabmaxwidth"; -NSString *MMTabOptimumWidthKey = @"taboptimumwidth"; -NSString *MMStatuslineOffKey = @"statuslineoff"; -NSString *MMTextInsetLeft = @"insetleft"; -NSString *MMTextInsetRight = @"insetright"; -NSString *MMTextInsetTop = @"insettop"; -NSString *MMTextInsetBottom = @"insetbottom"; +NSString *MMNoWindowKey = @"nowindow"; +NSString *MMTabMinWidthKey = @"tabminwidth"; +NSString *MMTabMaxWidthKey = @"tabmaxwidth"; +NSString *MMTabOptimumWidthKey = @"taboptimumwidth"; +NSString *MMStatuslineOffKey = @"statuslineoff"; +NSString *MMTextInsetLeft = @"insetleft"; +NSString *MMTextInsetRight = @"insetright"; +NSString *MMTextInsetTop = @"insettop"; +NSString *MMTextInsetBottom = @"insetbottom"; +NSString *MMTerminateAfterLastWindowClosed = @"terminateafterlastwindowclosed"; +@interface NSMenu (MMExtras) +- (void)recurseSetAutoenablesItems:(BOOL)on; +@end + + @implementation MMAppController + (void)initialize @@ -40,6 +46,7 @@ + (void)initialize [NSNumber numberWithInt:1], MMTextInsetRight, [NSNumber numberWithInt:1], MMTextInsetTop, [NSNumber numberWithInt:1], MMTextInsetBottom, + [NSNumber numberWithBool:NO], MMTerminateAfterLastWindowClosed, nil]; [[NSUserDefaults standardUserDefaults] registerDefaults:dict]; @@ -136,11 +143,8 @@ - (void)application:(NSApplication *)sender openFiles:(NSArray *)filenames - (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)sender { - // HACK! If there is no open Vim nobody will handle the menus (in - // particual, 'New Vim Window' is not handled, so no new windows can be - // opened). Until I figure out a way to deal with the menus this method - // will return YES. - return YES; + return [[NSUserDefaults standardUserDefaults] + boolForKey:MMTerminateAfterLastWindowClosed]; } - (NSApplicationTerminateReply)applicationShouldTerminate: @@ -262,6 +266,17 @@ - (void)handlePortMessage:(NSPortMessage *)portMessage - (void)removeVimController:(id)controller { [vimControllers removeObject:controller]; + + if (![vimControllers count]) { + // Turn on autoenabling of menus (because no Vim is open to handle it), + // but do not touch the MacVim menu. + NSMenu *mainMenu = [NSApp mainMenu]; + int i, count = [mainMenu numberOfItems]; + for (i = 1; i < count; ++i) { + NSMenu *submenu = [[mainMenu itemAtIndex:i] submenu]; + [submenu recurseSetAutoenablesItems:YES]; + } + } } - (IBAction)newVimWindow:(id)sender @@ -360,3 +375,22 @@ - (IBAction)selectPreviousWindow:(id)sender #endif @end + + + +@implementation NSMenu (MMExtras) + +- (void)recurseSetAutoenablesItems:(BOOL)on +{ + [self setAutoenablesItems:on]; + + int i, count = [self numberOfItems]; + for (i = 0; i < count; ++i) { + NSMenu *submenu = [[self itemAtIndex:i] submenu]; + if (submenu) { + [submenu recurseSetAutoenablesItems:on]; + } + } +} + +@end From f57a0e3d61633787df856dc2c0f60976807900a4 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sat, 4 Aug 2007 17:19:44 +0000 Subject: [PATCH 0056/1156] If a menu item is bound to ':action', the corresponding NSMenuItem has that action set as its action message (instead of the default 'vimMenuItemAction:'). git-svn-id: http://macvim.googlecode.com/svn/trunk@73 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMBackend.h | 3 ++- MMBackend.m | 6 ++++- MMVimController.m | 26 ++++++++++++++------ gui_macvim.m | 62 +++++++++++++++++++++++++++++++++++------------ 4 files changed, 72 insertions(+), 25 deletions(-) diff --git a/MMBackend.h b/MMBackend.h index aa5db08907..6a15f2ea50 100644 --- a/MMBackend.h +++ b/MMBackend.h @@ -73,7 +73,8 @@ atIndex:(int)index; - (void)addMenuItemWithTag:(int)tag parent:(int)parentTag name:(char *)name tip:(char *)tip icon:(char *)icon - keyEquivalent:(int)key modifiers:(int)mods atIndex:(int)index; + keyEquivalent:(int)key modifiers:(int)mods + action:(NSString *)action atIndex:(int)index; - (void)removeMenuItemWithTag:(int)tag; - (void)enableMenuItemWithTag:(int)tag state:(int)enabled; - (void)showToolbar:(int)enable flags:(int)flags; diff --git a/MMBackend.m b/MMBackend.m index ab32a31142..c30214419a 100644 --- a/MMBackend.m +++ b/MMBackend.m @@ -569,7 +569,8 @@ - (void)addMenuWithTag:(int)tag parent:(int)parentTag name:(char *)name - (void)addMenuItemWithTag:(int)tag parent:(int)parentTag name:(char *)name tip:(char *)tip icon:(char *)icon - keyEquivalent:(int)key modifiers:(int)mods atIndex:(int)index + keyEquivalent:(int)key modifiers:(int)mods + action:(NSString *)action atIndex:(int)index { //NSLog(@"addMenuItemWithTag:%d parent:%d name:%s tip:%s atIndex:%d", tag, // parentTag, name, tip, index); @@ -578,6 +579,7 @@ - (void)addMenuItemWithTag:(int)tag parent:(int)parentTag name:(char *)name int tiplen = tip ? strlen(tip) : 0; int iconlen = icon ? strlen(icon) : 0; int eventFlags = vimModMaskToEventModifierFlags(mods); + int actionlen = [action lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; NSMutableData *data = [NSMutableData data]; key = specialKeyToNSKey(key); @@ -590,6 +592,8 @@ - (void)addMenuItemWithTag:(int)tag parent:(int)parentTag name:(char *)name if (tiplen > 0) [data appendBytes:tip length:tiplen]; [data appendBytes:&iconlen length:sizeof(int)]; if (iconlen > 0) [data appendBytes:icon length:iconlen]; + [data appendBytes:&actionlen length:sizeof(int)]; + if (actionlen > 0) [data appendBytes:[action UTF8String] length:actionlen]; [data appendBytes:&index length:sizeof(int)]; [data appendBytes:&key length:sizeof(int)]; [data appendBytes:&eventFlags length:sizeof(int)]; diff --git a/MMVimController.m b/MMVimController.m index b63ccf1950..bdbd7f5c61 100644 --- a/MMVimController.m +++ b/MMVimController.m @@ -30,7 +30,8 @@ - (void)addMenuWithTag:(int)tag parent:(NSMenu *)parent title:(NSString *)title atIndex:(int)idx; - (void)addMenuItemWithTag:(int)tag parent:(NSMenu *)parent title:(NSString *)title tip:(NSString *)tip - keyEquivalent:(int)key modifiers:(int)mask atIndex:(int)idx; + keyEquivalent:(int)key modifiers:(int)mask + action:(NSString *)action atIndex:(int)idx; - (void)updateMainMenu; - (NSToolbarItem *)toolbarItemForTag:(int)tag index:(int *)index; - (IBAction)toolbarAction:(id)sender; @@ -569,7 +570,7 @@ - (void)handleMessage:(int)msgid data:(NSData *)data [title release]; } else if (AddMenuItemMsgID == msgid) { - NSString *title = nil, *tip = nil, *icon = nil; + NSString *title = nil, *tip = nil, *icon = nil, *action = nil; const void *bytes = [data bytes]; int tag = *((int*)bytes); bytes += sizeof(int); int parentTag = *((int*)bytes); bytes += sizeof(int); @@ -591,6 +592,13 @@ - (void)handleMessage:(int)msgid data:(NSData *)data encoding:NSUTF8StringEncoding]; bytes += iconlen; } + int actionlen = *((int*)bytes); bytes += sizeof(int); + if (actionlen > 0) { + action = [[NSString alloc] initWithBytes:(void*)bytes + length:actionlen + encoding:NSUTF8StringEncoding]; + bytes += actionlen; + } int idx = *((int*)bytes); bytes += sizeof(int); if (idx < 0) idx = 0; int key = *((int*)bytes); bytes += sizeof(int); @@ -604,12 +612,14 @@ - (void)handleMessage:(int)msgid data:(NSData *)data } else { NSMenu *parent = [self menuForTag:parentTag]; [self addMenuItemWithTag:tag parent:parent title:title tip:tip - keyEquivalent:key modifiers:mask atIndex:idx]; + keyEquivalent:key modifiers:mask action:action + atIndex:idx]; } [title release]; [tip release]; [icon release]; + [action release]; } else if (RemoveMenuItemMsgID == msgid) { const void *bytes = [data bytes]; int tag = *((int*)bytes); bytes += sizeof(int); @@ -891,21 +901,23 @@ - (void)addMenuWithTag:(int)tag parent:(NSMenu *)parent title:(NSString *)title - (void)addMenuItemWithTag:(int)tag parent:(NSMenu *)parent title:(NSString *)title tip:(NSString *)tip - keyEquivalent:(int)key modifiers:(int)mask atIndex:(int)idx + keyEquivalent:(int)key modifiers:(int)mask + action:(NSString *)action atIndex:(int)idx { if (parent) { NSMenuItem *item = nil; if (title) { item = [[[NSMenuItem alloc] init] autorelease]; [item setTitle:title]; - [item setAction:@selector(vimMenuItemAction:)]; + // TODO: Check that 'action' is a valid action (nothing will happen + // if it isn't, but it would be nice with a warning). + if (action) [item setAction:NSSelectorFromString(action)]; + else [item setAction:@selector(vimMenuItemAction:)]; if (tip) [item setToolTip:tip]; if (key != 0) { NSString *keyString = [NSString stringWithFormat:@"%C", key]; - //NSLog(@"Set key equivalent %@ (code=0x%x, mods=%d)", - // keyString, key, mask); [item setKeyEquivalent:keyString]; [item setKeyEquivalentModifierMask:mask]; } diff --git a/gui_macvim.m b/gui_macvim.m index 93bc130792..e332338d63 100644 --- a/gui_macvim.m +++ b/gui_macvim.m @@ -14,6 +14,8 @@ #import "vim.h" +static BOOL gui_cocoa_is_valid_action(NSString *action); + // -- Initialization -------------------------------------------------------- @@ -582,6 +584,26 @@ char *tip = menu->strings[MENU_INDEX_TIP] ? (char*)menu->strings[MENU_INDEX_TIP] : (char*)menu->actext; + // HACK! Check if menu is mapped to ':action actionName:'; if so, pass the + // action along so that MacVim can bind the menu item to this action. This + // means that if a menu item maps to an action in normal mode, then all + // other modes will also use the same action. + NSString *action = nil; + char_u *map_str = menu->strings[MENU_INDEX_NORMAL]; + if (map_str) { + NSString *mapping = [NSString stringWithCString:(char*)map_str + encoding:NSUTF8StringEncoding]; + NSArray *parts = [mapping componentsSeparatedByString:@" "]; + if ([parts count] >=2 + && [[parts objectAtIndex:0] isEqual:@":action"]) { + action = [parts objectAtIndex:1]; + action = [action stringByTrimmingCharactersInSet: + [NSCharacterSet whitespaceAndNewlineCharacterSet]]; + if (!gui_cocoa_is_valid_action(action)) + action = nil; + } + } + [[MMBackend sharedInstance] addMenuItemWithTag:(int)menu parent:(int)menu->parent @@ -590,6 +612,7 @@ icon:(char*)icon keyEquivalent:menu->ke_key modifiers:menu->ke_mods + action:action atIndex:idx]; } @@ -861,29 +884,14 @@ ex_action(eap) exarg_T *eap; { - static NSDictionary *actionDict = nil; - if (!gui.in_use) { EMSG(_("E???: Command only available in GUI mode")); return; } - if (!actionDict) { - NSBundle *mainBundle = [NSBundle mainBundle]; - NSString *path = [mainBundle pathForResource:@"Actions" - ofType:@"plist"]; - if (path) { - actionDict = [[NSDictionary alloc] initWithContentsOfFile:path]; - } else { - // Allocate bogus dictionary so that error only pops up once. - actionDict = [NSDictionary new]; - EMSG(_("E???: Failed to load action dictionary")); - } - } - NSString *name = [NSString stringWithCString:(char*)eap->arg encoding:NSUTF8StringEncoding]; - if ([actionDict objectForKey:name]) { + if (gui_cocoa_is_valid_action(name)) { [[MMBackend sharedInstance] executeActionWithName:name]; } else { EMSG2(_("E???: \"%s\" is not a valid action"), eap->arg); @@ -1244,3 +1252,25 @@ mch_set_mouse_shape(int shape) { } + + + static BOOL +gui_cocoa_is_valid_action(NSString *action) +{ + static NSDictionary *actionDict = nil; + + if (!actionDict) { + NSBundle *mainBundle = [NSBundle mainBundle]; + NSString *path = [mainBundle pathForResource:@"Actions" + ofType:@"plist"]; + if (path) { + actionDict = [[NSDictionary alloc] initWithContentsOfFile:path]; + } else { + // Allocate bogus dictionary so that error only pops up once. + actionDict = [NSDictionary new]; + EMSG(_("E???: Failed to load action dictionary")); + } + } + + return [actionDict objectForKey:action] != nil; +} From 91d3213c32a3a2407a12a40195279c89e59bd78e Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sat, 4 Aug 2007 17:20:15 +0000 Subject: [PATCH 0057/1156] Added note on binding menus to ':action' git-svn-id: http://macvim.googlecode.com/svn/trunk@74 96c4425d-ca35-0410-94e5-3396d5c13a8f --- README | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README b/README index 27b18e40ba..9fba8cdb17 100644 --- a/README +++ b/README @@ -68,6 +68,10 @@ Weirdness: - gui_mch_browse() is a blocking call, but you can't put up dialogs in Cocoa which block until the user dismisses them (it uses callbacks). This complicates the browsing somewhat. +- When binding menus to :action note that that action will be used for all + modes. The reason for this is that MacVim needs to be able to execute such + menu items even when no windows are open (e.g. newVimWindow:) and the default + menu action relies on Vim to deal with it. Design decisions: From 4d95ec0ab8c1811076471e3893d3c0809f21c562 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sat, 4 Aug 2007 17:30:41 +0000 Subject: [PATCH 0058/1156] Zoom to max only if mouse clicked with Cmd held. git-svn-id: http://macvim.googlecode.com/svn/trunk@75 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMWindowController.m | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/MMWindowController.m b/MMWindowController.m index 2952507c0e..dedcf05f1f 100644 --- a/MMWindowController.m +++ b/MMWindowController.m @@ -576,9 +576,11 @@ - (NSRect)windowWillUseStandardFrame:(NSWindow *)win frame = [self fitWindowToFrame:frame]; - // Keep old width and horizontal position unless the Command key is held - // down. - if (!([[NSApp currentEvent] modifierFlags] & NSCommandKeyMask)) { + // Keep old width and horizontal position unless user clicked with the + // Command key is held down. + NSEvent *event = [NSApp currentEvent]; + if (!([event type] == NSLeftMouseUp + && [event modifierFlags] & NSCommandKeyMask)) { NSRect currentFrame = [win frame]; frame.size.width = currentFrame.size.width; frame.origin.x = currentFrame.origin.x; From 69579423659a5e86578f1ebf3008236050115c9b Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sat, 4 Aug 2007 17:33:16 +0000 Subject: [PATCH 0059/1156] Active: menu validation git-svn-id: http://macvim.googlecode.com/svn/trunk@76 96c4425d-ca35-0410-94e5-3396d5c13a8f --- TODO | 1 + 1 file changed, 1 insertion(+) diff --git a/TODO b/TODO index f23e7dff2d..7072788a15 100644 --- a/TODO +++ b/TODO @@ -1,5 +1,6 @@ Active: +- validate menu actions for when no windows are open (e.g. selectNextWindow:) - grey out menus which can't be used: Tab Next/Prev/Close, Undo/Redo, etc. - when only one tab open make close window - drag and drop inside view (FEAT_GUI_DND, gui_handle_drop()) From def350e3c8b6a03e60cc661fbd5f83749e517458 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sat, 4 Aug 2007 17:39:45 +0000 Subject: [PATCH 0060/1156] Moved activateIgnoringOtherApps: hack from [MMWindowController openWindow] to [MMAppController applicationDidFinishLaunching:]. git-svn-id: http://macvim.googlecode.com/svn/trunk@77 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMAppController.m | 9 +++++++++ MMWindowController.m | 6 ------ 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/MMAppController.m b/MMAppController.m index ecfcfa2be6..05a1b98ba3 100644 --- a/MMAppController.m +++ b/MMAppController.m @@ -110,6 +110,15 @@ - (void)dealloc [super dealloc]; } +- (void)applicationDidFinishLaunching:(NSNotification *)notification +{ + // HACK! The GUI does not get activated if Vim is launched by MMBackend in + // checkin:. I have not been able to figure out any other way to get it to + // activate other than forcing it here. A better solution for launching + // the GUI would be good. + [NSApp activateIgnoringOtherApps:YES]; +} + - (BOOL)applicationShouldOpenUntitledFile:(NSApplication *)sender { // NOTE! This way it possible to start the app with the command-line diff --git a/MMWindowController.m b/MMWindowController.m index dedcf05f1f..9b2f3f14cd 100644 --- a/MMWindowController.m +++ b/MMWindowController.m @@ -203,12 +203,6 @@ - (void)openWindow [self updateResizeIncrements]; [self resizeWindowToFit:self]; - // HACK! The GUI does not get activated if Vim is launched by MMBackend in - // checkin:. I have not been able to figure out any other way to get it to - // activate other than forcing it here. A better solution for launching - // the GUI would be good. - [NSApp activateIgnoringOtherApps:YES]; - [[self window] makeKeyAndOrderFront:self]; BOOL statusOff = [[NSUserDefaults standardUserDefaults] From f84bd2df91f622ae3fb8cac5c49b77084e14be87 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sat, 4 Aug 2007 20:13:09 +0000 Subject: [PATCH 0061/1156] Added a tabline separator (NSBox). git-svn-id: http://macvim.googlecode.com/svn/trunk@78 96c4425d-ca35-0410-94e5-3396d5c13a8f --- English.lproj/VimWindow.nib/classes.nib | 1 + English.lproj/VimWindow.nib/keyedobjects.nib | Bin 5543 -> 5985 bytes 2 files changed, 1 insertion(+) diff --git a/English.lproj/VimWindow.nib/classes.nib b/English.lproj/VimWindow.nib/classes.nib index 0757bf563a..b62898a44c 100644 --- a/English.lproj/VimWindow.nib/classes.nib +++ b/English.lproj/VimWindow.nib/classes.nib @@ -10,6 +10,7 @@ statusTextField = NSTextField; tabBarControl = PSMTabBarControl; tabView = NSTabView; + tablineSeparator = NSBox; }; SUPERCLASS = NSWindowController; }, diff --git a/English.lproj/VimWindow.nib/keyedobjects.nib b/English.lproj/VimWindow.nib/keyedobjects.nib index a6dd7448112ba750159d19ccf8d7ed6eba928b47..6cf2d232fabd662c6f8870dfac29d9d1c126c430 100644 GIT binary patch delta 3976 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 U00O=b`TaNE{|=z~2LS>91H`tzfB*mh From 39e8f87d4a6a9ece0258ca267131f6e8a744dad3 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sat, 4 Aug 2007 20:17:03 +0000 Subject: [PATCH 0062/1156] Toolbar baseline separator always hidden. git-svn-id: http://macvim.googlecode.com/svn/trunk@79 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMVimController.m | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/MMVimController.m b/MMVimController.m index bdbd7f5c61..5ca667d713 100644 --- a/MMVimController.m +++ b/MMVimController.m @@ -428,12 +428,6 @@ - (void)handleMessage:(int)msgid data:(NSData *)data } else if (ShowTabBarMsgID == msgid) { //NSLog(@"Showing tab bar"); - // The tab bar has it's own baseline separator, so hide the one - // belonging to the toolbar whenever the tab bar is visible. - // BUG: The window auto shows the separator when clicking the show/hide - // toolbar button. - [toolbar setShowsBaselineSeparator:NO]; - // HACK! Vim sends several draw commands etc. after the show message // and these can mess up the display when showing the tab bar results // in the window having to resize to fit the screen; delaying this @@ -443,13 +437,6 @@ - (void)handleMessage:(int)msgid data:(NSData *)data //[windowController showTabBar:self]; } else if (HideTabBarMsgID == msgid) { //NSLog(@"Hiding tab bar"); - - // The tab bar has it's own baseline separator, so hide the one - // belonging to the toolbar whenever the tab bar is visible. - // BUG: The window auto shows the separator when clicking the show/hide - // toolbar button. - [toolbar setShowsBaselineSeparator:YES]; - [windowController hideTabBar:self]; } else if (SetTextDimensionsMsgID == msgid) { const void *bytes = [data bytes]; @@ -555,6 +542,7 @@ - (void)handleMessage:(int)msgid data:(NSData *)data //NSLog(@"Creating toolbar with identifier %@", ident); toolbar = [[NSToolbar alloc] initWithIdentifier:ident]; + [toolbar setShowsBaselineSeparator:NO]; [toolbar setDelegate:self]; [toolbar setDisplayMode:NSToolbarDisplayModeIconOnly]; [toolbar setSizeMode:NSToolbarSizeModeSmall]; From 5e3b3d9a7aaace51134246d93a268ddf0645dc32 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sat, 4 Aug 2007 20:19:22 +0000 Subject: [PATCH 0063/1156] - Tabline is automatically sized (set up in Interface Builder) - When tabline hidden a baseline is shown git-svn-id: http://macvim.googlecode.com/svn/trunk@80 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMWindowController.h | 1 + MMWindowController.m | 75 ++++++++++---------------------------------- 2 files changed, 17 insertions(+), 59 deletions(-) diff --git a/MMWindowController.h b/MMWindowController.h index ae03db20f1..69c95ec3e6 100644 --- a/MMWindowController.h +++ b/MMWindowController.h @@ -22,6 +22,7 @@ IBOutlet NSTabView *tabView; IBOutlet NSTextField *statusTextField; IBOutlet NSBox *statusSeparator; + IBOutlet NSBox *tablineSeparator; MMVimController *vimController; BOOL vimTaskSelectedTab; diff --git a/MMWindowController.m b/MMWindowController.m index 9b2f3f14cd..c2c5b78187 100644 --- a/MMWindowController.m +++ b/MMWindowController.m @@ -161,14 +161,18 @@ - (void)windowDidLoad { // Called after window nib file is loaded. + [tablineSeparator setHidden:NO]; [tabBarControl setHidden:YES]; + // NOTE: Size to fit looks good, but not many tabs will fit and there are // quite a few drawing bugs in this code, so it is disabled for now. //[tabBarControl setSizeCellsToFit:YES]; + NSUserDefaults *ud = [NSUserDefaults standardUserDefaults]; [tabBarControl setCellMinWidth:[ud integerForKey:MMTabMinWidthKey]]; [tabBarControl setCellMaxWidth:[ud integerForKey:MMTabMaxWidthKey]]; [tabBarControl setCellOptimumWidth:[ud integerForKey:MMTabOptimumWidthKey]]; + [tabBarControl setAllowsDragBetweenWindows:NO]; [tabBarControl setShowAddTabButton:YES]; [[tabBarControl addTabButton] setTarget:self]; @@ -417,14 +421,18 @@ - (IBAction)addNewTab:(id)sender - (IBAction)showTabBar:(id)sender { + [tablineSeparator setHidden:YES]; [tabBarControl setHidden:NO]; + if (setupDone) [self resizeWindowToFit:self]; } - (IBAction)hideTabBar:(id)sender { + [tablineSeparator setHidden:NO]; [tabBarControl setHidden:YES]; + if (setupDone) [self resizeWindowToFit:self]; } @@ -477,50 +485,6 @@ - (void)tabView:(NSTabView *)theTabView didDragTabViewItem: } -// -- NSLayoutManager delegate ----------------------------------------------- - - -#if 0 -- (void)layoutManager:(NSLayoutManager *)aLayoutManager - didCompleteLayoutForTextContainer:(NSTextContainer *)aTextContainer - atEnd:(BOOL)flag -{ - // HACK! Sometimes the text handling system will use fonts for some glyphs - // (e.g. digraphs) which are slightly higher than the font that the text - // storage uses (usually a fixed pitch font like Monaco). In this case the - // text might not fit in the window so the window is resized here to always - // be big enough to show all characters. This has the unpleasant visual - // side-effect of the window changing size when such glyphs are displayed. - -#if 0 - // HACK! The baseline separator keeps popping up, hide it again. This - // hack doesn't work. - if (tabBarControl) { - [[[self window] toolbar] setShowsBaselineSeparator: - [tabBarControl isHidden]]; - } -#endif - - if (flag && ![textView inLiveResize]) { - // Make sure the text storage exactly fills out the entire tab view, - // otherwise resize the window to fit the text storage. - // (This way the text storage size can change however/whenever it wants - // and the window will update to fit it.) - if (!NSEqualSizes([tabView frame].size, [textStorage size])) { - [self resizeWindowToFit:self]; - if (!NSEqualSizes([tabView frame].size, [textStorage size])) { - // NOTE! If the window is the same size after - // resizeWindowToFit:, we place the views manually - // (normally windowDidResize: takes care of that) in case the - // text view changed size (which can happen e.g. after a ':set - // lines' command). - [self placeViews]; - } - [self updateResizeIncrements]; - } - } -} -#endif // -- NSWindow delegate ------------------------------------------------------ @@ -600,8 +564,10 @@ - (NSSize)contentSizeForTextStorageSize:(NSSize)textViewSize size.width += [textView textContainerOrigin].x + right; size.height += [textView textContainerOrigin].y + bot; - if (![tabBarControl isHidden]) - size.height += [tabBarControl frame].size.height; + // A one pixel high separator is shown if tabline is hidden. + if ([tabBarControl isHidden]) ++size.height; + else size.height += [tabBarControl frame].size.height; + if (![[NSUserDefaults standardUserDefaults] boolForKey:MMStatuslineOffKey]) size.height += StatusLineHeight; @@ -619,8 +585,10 @@ - (NSRect)textViewRectForContentSize:(NSSize)contentSize { NSRect rect = { 0, 0, contentSize.width, contentSize.height }; - if (![tabBarControl isHidden]) - rect.size.height -= [tabBarControl frame].size.height; + // A one pixel high separator is shown if tabline is hidden. + if ([tabBarControl isHidden]) --rect.size.height; + else rect.size.height -= [tabBarControl frame].size.height; + if (![[NSUserDefaults standardUserDefaults] boolForKey:MMStatuslineOffKey]) { rect.size.height -= StatusLineHeight; @@ -996,17 +964,6 @@ - (void)placeViews [tabView setFrame:textViewRect]; - // HACK! I manually place the tab bar here instead of setting the sizing - // options in Interface Builder because I couldn't get the automatic sizing - // to work. - if (![tabBarControl isHidden]) { - NSRect tabBarRect = { - 0, NSMaxY(textViewRect), - contentRect.size.width, [tabBarControl frame].size.height }; - - [tabBarControl setFrame:tabBarRect]; - } - [self placeScrollbars]; } From 189ba53edfcb7b34b6bc0eeb814ad9ad8e991200 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sun, 5 Aug 2007 11:24:47 +0000 Subject: [PATCH 0064/1156] Moved 'activateIgnoringOtherApps:' call to 'connectBackend:'. git-svn-id: http://macvim.googlecode.com/svn/trunk@81 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMAppController.m | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/MMAppController.m b/MMAppController.m index 05a1b98ba3..87e92f5573 100644 --- a/MMAppController.m +++ b/MMAppController.m @@ -110,15 +110,6 @@ - (void)dealloc [super dealloc]; } -- (void)applicationDidFinishLaunching:(NSNotification *)notification -{ - // HACK! The GUI does not get activated if Vim is launched by MMBackend in - // checkin:. I have not been able to figure out any other way to get it to - // activate other than forcing it here. A better solution for launching - // the GUI would be good. - [NSApp activateIgnoringOtherApps:YES]; -} - - (BOOL)applicationShouldOpenUntitledFile:(NSApplication *)sender { // NOTE! This way it possible to start the app with the command-line @@ -379,6 +370,10 @@ - (IBAction)selectPreviousWindow:(id)sender autorelease]; [vimControllers addObject:wc]; + // HACK! MacVim does not get activated if it is launched from the + // terminal, so we forcibly activate here. + [NSApp activateIgnoringOtherApps:YES]; + return wc; } #endif From 8377ea3c5f8bdbb0f136d764bd4b2886a186c9b3 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sun, 5 Aug 2007 12:05:45 +0000 Subject: [PATCH 0065/1156] - Removed unused stuff - No default bindings for next/prev window git-svn-id: http://macvim.googlecode.com/svn/trunk@82 96c4425d-ca35-0410-94e5-3396d5c13a8f --- gvimrc | 24 ++---------------------- 1 file changed, 2 insertions(+), 22 deletions(-) diff --git a/gvimrc b/gvimrc index ee3ddc98af..6418aee89d 100644 --- a/gvimrc +++ b/gvimrc @@ -10,7 +10,7 @@ " Extra menus " -" File menu. +" File menu aunmenu File.New aunmenu File.Close @@ -28,7 +28,7 @@ an 20.460 Edit.-SEP4- an 20.470 Edit.Special\ Characters\.\.\. :action orderFrontCharacterPalette: -" Try to make Window menu follow Apple HIG. +" Window menu aunmenu Window an 70.300 Window.Minimize :action performMiniaturize: @@ -45,23 +45,6 @@ an 70.360 Window.Bring\ All\ To\ Front :action arrangeInFront: " Keyboard mappings " -" TODO: Do these mappings have to be this complicated? Is it possible to have -" each tab 'remembering' which mode it was in? -"map :tabn -"imap :tabn -"vmap :tabn - -"map :tabp -"imap :tabp -"vmap :tabp - -map :action selectPreviousWindow: -imap :action selectPreviousWindow: -vmap :action selectPreviousWindow: - -map :action selectNextWindow: -imap :action selectNextWindow: -vmap :action selectNextWindow: @@ -75,11 +58,9 @@ menukeyequiv File.Close\ Tab menukeyequiv File.Open\.\.\. menukeyequiv File.Open\ Tab\.\.\. -"menukeyequiv File.New menukeyequiv File.Close\ Window menukeyequiv File.Save menukeyequiv File.Save\ As\.\.\. -"menukeyequiv File.Exit menukeyequiv File.Print menukeyequiv Edit.Undo @@ -97,6 +78,5 @@ menukeyequiv Tools.Next\ Error menukeyequiv Tools.Previous\ Error menukeyequiv Window.Minimize -"menukeyequiv Window.Zoom menukeyequiv Window.Previous\ Tab menukeyequiv Window.Next\ Tab From ed22b4bb402214a01dbba90e68b563bc907b12eb Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sun, 5 Aug 2007 12:06:04 +0000 Subject: [PATCH 0066/1156] More active git-svn-id: http://macvim.googlecode.com/svn/trunk@83 96c4425d-ca35-0410-94e5-3396d5c13a8f --- TODO | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/TODO b/TODO index 7072788a15..df28021e52 100644 --- a/TODO +++ b/TODO @@ -1,5 +1,6 @@ Active: +- ability to modify key equivalents at any time - validate menu actions for when no windows are open (e.g. selectNextWindow:) - grey out menus which can't be used: Tab Next/Prev/Close, Undo/Redo, etc. - when only one tab open make close window @@ -49,6 +50,13 @@ Active: - got this error on Cmd-N with no other windows open: 2007-07-27 22:00:17.680 MacVim[454] *** -[NSToolbarView frameDidChange:]: selector not recognized [self = 0x39ba80] 2007-07-27 22:00:17.690 MacVim[454] Exception raised during posting of notification. Ignored. exception: *** -[NSToolbarView frameDidChange:]: selector not recognized [self = 0x39ba80] +- got this error when opening MacVim from terminal (with 'gvim gvimrc&'): + Frost:~/Projects/vim7/src/MacVim winckler$ 2007-08-05 13:25:01.151 MacVim[223] *** -[NSThemeFrame frameDidChange:]: selector not recognized [self = 0x3baa30] + 2007-08-05 13:25:01.152 MacVim[223] Exception raised during posting of notification. Ignored. exception: *** -[NSThemeFrame frameDidChange:]: selector not recognized [self = 0x3baa30] + 2007-08-05 13:25:01.155 MacVim[223] *** -[NSThemeFrame frameDidChange:]: selector not recognized [self = 0x3baa30] + 2007-08-05 13:25:01.156 MacVim[223] Exception raised during posting of notification. Ignored. exception: *** -[NSThemeFrame frameDidChange:]: selector not recognized [self = 0x3baa30] + 2007-08-05 13:25:01.246 MacVim[223] *** -[NSThemeFrame frameDidChange:]: selector not recognized [self = 0x3baa30] + 2007-08-05 13:25:01.247 MacVim[223] Exception raised during posting of notification. Ignored. exception: *** -[NSThemeFrame frameDidChange:]: selector not recognized [self = 0x3baa30] From 949531774800aa9e2514a25a6a742417e20b2741 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sun, 5 Aug 2007 18:53:39 +0000 Subject: [PATCH 0067/1156] No longer uses stringWithFormat: when creating emptyRowString (%255c does not work as a format string). git-svn-id: http://macvim.googlecode.com/svn/trunk@86 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMTextStorage.m | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/MMTextStorage.m b/MMTextStorage.m index 720a5b2ff9..efac8178f8 100644 --- a/MMTextStorage.m +++ b/MMTextStorage.m @@ -606,6 +606,8 @@ - (void)lazyResize - (void)doSetMaxRows:(int)rows columns:(int)cols { + int i; + #if MM_TS_LAZY_SET // Do nothing if the dimensions are already right. if (actualRows == rows && actualColumns == cols) @@ -623,8 +625,6 @@ - (void)doSetMaxRows:(int)rows columns:(int)cols maxRows = rows; maxColumns = cols; - NSString *fmt = [NSString stringWithFormat:@"%%%dc\%C", maxColumns, - NSLineSeparatorCharacter]; NSDictionary *dict; if (defaultBackgroundColor) { dict = [NSDictionary dictionaryWithObjectsAndKeys: @@ -635,14 +635,18 @@ - (void)doSetMaxRows:(int)rows columns:(int)cols font, NSFontAttributeName, nil]; } + NSMutableString *rowString = [NSMutableString string]; + for (i = 0; i < maxColumns; ++i) { + [rowString appendString:@" "]; + } + [rowString appendString:@"\n"]; + [emptyRowString release]; - emptyRowString = [[NSAttributedString alloc] - initWithString:[NSString stringWithFormat:fmt, ' '] - attributes:dict]; + emptyRowString = [[NSAttributedString alloc] initWithString:rowString + attributes:dict]; [attribString release]; attribString = [[NSMutableAttributedString alloc] init]; - int i; for (i=0; i Date: Sun, 5 Aug 2007 18:54:08 +0000 Subject: [PATCH 0068/1156] Two more active, one pending. git-svn-id: http://macvim.googlecode.com/svn/trunk@87 96c4425d-ca35-0410-94e5-3396d5c13a8f --- TODO | 3 +++ 1 file changed, 3 insertions(+) diff --git a/TODO b/TODO index df28021e52..b9793f62c5 100644 --- a/TODO +++ b/TODO @@ -1,5 +1,7 @@ Active: +- drag-to-resize, delay if mouse button held down +- no warning when buffer modified outside vim (implement gui_mch_dialog()) - ability to modify key equivalents at any time - validate menu actions for when no windows are open (e.g. selectNextWindow:) - grey out menus which can't be used: Tab Next/Prev/Close, Undo/Redo, etc. @@ -62,6 +64,7 @@ Active: Pending: +- Cmd-zoom -> no input received, drawing broken - scrollbars not positioned over resize box - offset text away from left edge - add menu options with key equiv: From 0351dd2f0552e76c01a7e3e8be6a723debbb449f Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Mon, 6 Aug 2007 13:21:43 +0000 Subject: [PATCH 0069/1156] Fixed tab selection bug where the wrong tab would get opened if multiple files were dragged onto the Vim dock icon. git-svn-id: http://macvim.googlecode.com/svn/trunk@88 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMWindowController.m | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/MMWindowController.m b/MMWindowController.m index c2c5b78187..afbddc4366 100644 --- a/MMWindowController.m +++ b/MMWindowController.m @@ -456,8 +456,10 @@ - (void)tabView:(NSTabView *)theTabView didSelectTabViewItem: if (!vimTaskSelectedTab) { // Propagate the selection message to the VimTask. int idx = [self representedIndexOfTabViewItem:tabViewItem]; - NSData *data = [NSData dataWithBytes:&idx length:sizeof(int)]; - [vimController sendMessage:SelectTabMsgID data:data wait:YES]; + if (NSNotFound != idx) { + NSData *data = [NSData dataWithBytes:&idx length:sizeof(int)]; + [vimController sendMessage:SelectTabMsgID data:data wait:YES]; + } } } @@ -703,9 +705,13 @@ - (NSTabViewItem *)addNewTabViewItem // BUG! This call seems to have no effect; see comment in // tabView:didSelectTabViewItem:. - [tvi setInitialFirstResponder:textView]; + //[tvi setInitialFirstResponder:textView]; + // NOTE: If this is the first tab it will be automatically selected. + vimTaskSelectedTab = YES; [tabView addTabViewItem:tvi]; + vimTaskSelectedTab = NO; + [tvi release]; return tvi; From 7249a58d744ab15e4d99cf038ab3e95b0681dee4 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Mon, 6 Aug 2007 13:22:50 +0000 Subject: [PATCH 0070/1156] Tab selection messages are ignored; selection is done when tabline updates. git-svn-id: http://macvim.googlecode.com/svn/trunk@89 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMVimController.m | 2 ++ 1 file changed, 2 insertions(+) diff --git a/MMVimController.m b/MMVimController.m index 5ca667d713..2a5058feb3 100644 --- a/MMVimController.m +++ b/MMVimController.m @@ -418,10 +418,12 @@ - (void)handleMessage:(int)msgid data:(NSData *)data [self performBatchDrawWithData:data]; } else if (SelectTabMsgID == msgid) { +#if 0 // NOTE: Tab selection is done inside updateTabsWithData:. const void *bytes = [data bytes]; int idx = *((int*)bytes); //NSLog(@"Selecting tab with index %d", idx); [windowController selectTabWithIndex:idx]; +#endif } else if (UpdateTabBarMsgID == msgid) { //NSLog(@"Updating tabs"); [windowController updateTabsWithData:data]; From 31d4006d7793100435aaf331f5e48e2762656ca9 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Mon, 6 Aug 2007 13:23:35 +0000 Subject: [PATCH 0071/1156] Added rudimentary support for drag and drop of files on window. git-svn-id: http://macvim.googlecode.com/svn/trunk@90 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMBackend.m | 55 ++++++++++++++++++++++++++++++++++++++++ MMTextView.m | 71 ++++++++++++++++++++++++++++++++++++++++++++++++++++ MacVim.h | 1 + 3 files changed, 127 insertions(+) diff --git a/MMBackend.m b/MMBackend.m index c30214419a..b82e17a117 100644 --- a/MMBackend.m +++ b/MMBackend.m @@ -1075,6 +1075,61 @@ - (void)handleMessage:(int)msgid data:(NSData *)data } } else if (VimShouldCloseMsgID == msgid) { gui_shell_closed(); + } else if (DropFilesMsgID == msgid) { +#ifdef FEAT_DND + const void *bytes = [data bytes]; + int n = *((int*)bytes); bytes += sizeof(int); + +#if 0 + int row = *((int*)bytes); bytes += sizeof(int); + int col = *((int*)bytes); bytes += sizeof(int); + + char_u **fnames = (char_u **)alloc(n * sizeof(char_u *)); + if (fnames) { + const void *end = [data bytes] + [data length]; + int i = 0; + while (bytes < end && i < n) { + int len = *((int*)bytes); bytes += sizeof(int); + fnames[i++] = vim_strnsave((char_u*)bytes, len); + bytes += len; + } + + // NOTE! This function will free 'fnames'. + gui_handle_drop(col, row, 0, fnames, i < n ? i : n); + } +#else + // HACK! I'm not sure how to get Vim to open a list of files in tabs, + // so instead I create a ':tab drop' command with all the files to open + // and execute it. + NSMutableString *cmd = [NSMutableString stringWithString:@":tab drop"]; + + const void *end = [data bytes] + [data length]; + int i; + for (i = 0; i < n && bytes < end; ++i) { + int len = *((int*)bytes); bytes += sizeof(int); + NSString *file = [NSString stringWithUTF8String:bytes]; + bytes += len; + + [cmd appendString:@" "]; + [cmd appendString:file]; + } + + // By going to the last tabpage we ensure that the new tabs will appear + // last (if this call is left out, the taborder becomes messy). + goto_tabpage(9999); + + do_cmdline_cmd((char_u*)[cmd UTF8String]); + +#if 1 + // This code was taken from the end of gui_handle_drop(). + update_screen(NOT_VALID); + setcursor(); + out_flush(); + gui_update_cursor(FALSE, FALSE); + gui_mch_flush(); +#endif +#endif +#endif // FEAT_DND } else { NSLog(@"WARNING: Unknown message received (msgid=%d)", msgid); } diff --git a/MMTextView.m b/MMTextView.m index fbe3990c77..a373079cf4 100644 --- a/MMTextView.m +++ b/MMTextView.m @@ -259,6 +259,77 @@ - (void)menuForEvent:(NSEvent *)event } #endif +#if 1 +- (NSArray *)acceptableDragTypes +{ + return [NSArray arrayWithObjects:NSFilenamesPboardType, nil]; +} + +- (BOOL)performDragOperation:(id )sender +{ + NSPasteboard *pboard = [sender draggingPasteboard]; + + if ( [[pboard types] containsObject:NSFilenamesPboardType] ) { + NSArray *files = [pboard propertyListForType:NSFilenamesPboardType]; + int i, numberOfFiles = [files count]; + NSMutableData *data = [NSMutableData data]; + + [data appendBytes:&numberOfFiles length:sizeof(int)]; + +#if 0 + int row, col; + NSPoint pt = [self convertPoint:[sender draggingLocation] fromView:nil]; + if (![self convertPoint:pt toRow:&row column:&col]) + return NO; + + [data appendBytes:&row length:sizeof(int)]; + [data appendBytes:&col length:sizeof(int)]; +#endif + + for (i = 0; i < numberOfFiles; ++i) { + NSString *file = [files objectAtIndex:i]; + int len = [file lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; + + if (len > 0) { + ++len; // append NUL as well + [data appendBytes:&len length:sizeof(int)]; + [data appendBytes:[file UTF8String] length:len]; + } + } + + [[self vimController] sendMessage:DropFilesMsgID data:data wait:NO]; + return YES; + } + + return NO; +} + +- (NSDragOperation)draggingEntered:(id )sender +{ + NSDragOperation sourceDragMask = [sender draggingSourceOperationMask]; + NSPasteboard *pboard = [sender draggingPasteboard]; + + if ( [[pboard types] containsObject:NSFilenamesPboardType] + && (sourceDragMask & NSDragOperationCopy) ) + return NSDragOperationCopy; + + return NSDragOperationNone; +} + +- (NSDragOperation)draggingUpdated:(id )sender +{ + NSDragOperation sourceDragMask = [sender draggingSourceOperationMask]; + NSPasteboard *pboard = [sender draggingPasteboard]; + + if ( [[pboard types] containsObject:NSFilenamesPboardType] + && (sourceDragMask & NSDragOperationCopy) ) + return NSDragOperationCopy; + + return NSDragOperationNone; +} + +#endif + @end // MMTextView diff --git a/MacVim.h b/MacVim.h index 187ab7af9d..f0032b7ac4 100644 --- a/MacVim.h +++ b/MacVim.h @@ -90,6 +90,7 @@ enum { VimShouldCloseMsgID, SetDefaultColorsMsgID, ExecuteActionMsgID, + DropFilesMsgID, }; From 397c6a926f252d99f3c648c43879e7db567d1b20 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Mon, 6 Aug 2007 13:32:27 +0000 Subject: [PATCH 0072/1156] Replaced "Close Tab" and "Close Window" with "Close" which maps to ":q". git-svn-id: http://macvim.googlecode.com/svn/trunk@91 96c4425d-ca35-0410-94e5-3396d5c13a8f --- gvimrc | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/gvimrc b/gvimrc index 6418aee89d..3305b1078c 100644 --- a/gvimrc +++ b/gvimrc @@ -1,6 +1,6 @@ " System gvimrc file for MacVim " Author: Björn Winckler -" Last Change: Wed Aug 1 20:03:43 CEST 2007 +" Last Change: Mon Aug 6 15:30:37 CEST 2007 " " This is a work in progress. If you feel so inclined, please help me improve " this file. @@ -21,8 +21,9 @@ aunmenu File.Save-Exit an 10.290 File.New\ Window :action newVimWindow: an 10.295 File.New\ Tab :tabnew an 10.328 File.-SEP0- -an 10.330 File.Close\ Window :confirm qa -an 10.331 File.Close\ Tab :tabclose +an 10.330 File.Close:q :confirm q +"an 10.330 File.Close\ Window :confirm qa +"an 10.331 File.Close\ Tab :tabclose an 20.460 Edit.-SEP4- an 20.470 Edit.Special\ Characters\.\.\. :action orderFrontCharacterPalette: @@ -54,11 +55,12 @@ an 70.360 Window.Bring\ All\ To\ Front :action arrangeInFront: menukeyequiv File.New\ Window menukeyequiv File.New\ Tab -menukeyequiv File.Close\ Tab menukeyequiv File.Open\.\.\. menukeyequiv File.Open\ Tab\.\.\. -menukeyequiv File.Close\ Window +"menukeyequiv File.Close\ Window +"menukeyequiv File.Close\ Tab +menukeyequiv File.Close menukeyequiv File.Save menukeyequiv File.Save\ As\.\.\. menukeyequiv File.Print From 00d4006bebf760d46796f7db14c105e02b828edc Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Mon, 6 Aug 2007 18:50:29 +0000 Subject: [PATCH 0073/1156] Added menukeyequiv for "Tools.Older List" and "Tools.Newer List". git-svn-id: http://macvim.googlecode.com/svn/trunk@92 96c4425d-ca35-0410-94e5-3396d5c13a8f --- gvimrc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/gvimrc b/gvimrc index 3305b1078c..47ff6fcfc8 100644 --- a/gvimrc +++ b/gvimrc @@ -78,6 +78,8 @@ menukeyequiv Tools.List\ Errors menukeyequiv Tools.List\ Messages menukeyequiv Tools.Next\ Error menukeyequiv Tools.Previous\ Error +menukeyequiv Tools.Older\ List +menukeyequiv Tools.Newer\ List menukeyequiv Window.Minimize menukeyequiv Window.Previous\ Tab From 0306e0edf03806df6505eede9bd0b165465c3e36 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Mon, 6 Aug 2007 18:52:11 +0000 Subject: [PATCH 0074/1156] Added support for dropping text on window. git-svn-id: http://macvim.googlecode.com/svn/trunk@93 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMBackend.m | 23 +++++++++++++++++++++-- MMTextView.m | 21 +++++++++++++++++++-- MacVim.h | 1 + gui_macvim.m | 2 +- 4 files changed, 42 insertions(+), 5 deletions(-) diff --git a/MMBackend.m b/MMBackend.m index b82e17a117..0a9f28441a 100644 --- a/MMBackend.m +++ b/MMBackend.m @@ -1120,7 +1120,6 @@ - (void)handleMessage:(int)msgid data:(NSData *)data do_cmdline_cmd((char_u*)[cmd UTF8String]); -#if 1 // This code was taken from the end of gui_handle_drop(). update_screen(NOT_VALID); setcursor(); @@ -1128,7 +1127,27 @@ - (void)handleMessage:(int)msgid data:(NSData *)data gui_update_cursor(FALSE, FALSE); gui_mch_flush(); #endif -#endif +#endif // FEAT_DND + } else if (DropStringMsgID == msgid) { +#ifdef FEAT_DND + char_u dropkey[3] = { CSI, KS_EXTRA, (char_u)KE_DROP }; + const void *bytes = [data bytes]; + int len = *((int*)bytes); bytes += sizeof(int); + NSMutableString *string = [NSMutableString stringWithUTF8String:bytes]; + + // Replace unrecognized end-of-line sequences with \x0a (line feed). + NSRange range = { 0, [string length] }; + unsigned n = [string replaceOccurrencesOfString:@"\x0d\x0a" + withString:@"\x0a" options:0 + range:range]; + if (0 == n) { + n = [string replaceOccurrencesOfString:@"\x0d" withString:@"\x0a" + options:0 range:range]; + } + + len = [string lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; + dnd_yank_drag_data((char_u*)[string UTF8String], len); + add_to_input_buf(dropkey, sizeof(dropkey)); #endif // FEAT_DND } else { NSLog(@"WARNING: Unknown message received (msgid=%d)", msgid); diff --git a/MMTextView.m b/MMTextView.m index a373079cf4..2747ecbb3a 100644 --- a/MMTextView.m +++ b/MMTextView.m @@ -262,14 +262,15 @@ - (void)menuForEvent:(NSEvent *)event #if 1 - (NSArray *)acceptableDragTypes { - return [NSArray arrayWithObjects:NSFilenamesPboardType, nil]; + return [NSArray arrayWithObjects:NSFilenamesPboardType, + NSStringPboardType, nil]; } - (BOOL)performDragOperation:(id )sender { NSPasteboard *pboard = [sender draggingPasteboard]; - if ( [[pboard types] containsObject:NSFilenamesPboardType] ) { + if ([[pboard types] containsObject:NSFilenamesPboardType]) { NSArray *files = [pboard propertyListForType:NSFilenamesPboardType]; int i, numberOfFiles = [files count]; NSMutableData *data = [NSMutableData data]; @@ -299,6 +300,16 @@ - (BOOL)performDragOperation:(id )sender [[self vimController] sendMessage:DropFilesMsgID data:data wait:NO]; return YES; + } else if ([[pboard types] containsObject:NSStringPboardType]) { + NSString *string = [pboard stringForType:NSStringPboardType]; + NSMutableData *data = [NSMutableData data]; + int len = [string lengthOfBytesUsingEncoding:NSUTF8StringEncoding] + 1; + + [data appendBytes:&len length:sizeof(int)]; + [data appendBytes:[string UTF8String] length:len]; + + [[self vimController] sendMessage:DropStringMsgID data:data wait:NO]; + return YES; } return NO; @@ -312,6 +323,9 @@ - (NSDragOperation)draggingEntered:(id )sender if ( [[pboard types] containsObject:NSFilenamesPboardType] && (sourceDragMask & NSDragOperationCopy) ) return NSDragOperationCopy; + if ( [[pboard types] containsObject:NSStringPboardType] + && (sourceDragMask & NSDragOperationCopy) ) + return NSDragOperationCopy; return NSDragOperationNone; } @@ -324,6 +338,9 @@ - (NSDragOperation)draggingUpdated:(id )sender if ( [[pboard types] containsObject:NSFilenamesPboardType] && (sourceDragMask & NSDragOperationCopy) ) return NSDragOperationCopy; + if ( [[pboard types] containsObject:NSStringPboardType] + && (sourceDragMask & NSDragOperationCopy) ) + return NSDragOperationCopy; return NSDragOperationNone; } diff --git a/MacVim.h b/MacVim.h index f0032b7ac4..bb7131cfa1 100644 --- a/MacVim.h +++ b/MacVim.h @@ -91,6 +91,7 @@ enum { SetDefaultColorsMsgID, ExecuteActionMsgID, DropFilesMsgID, + DropStringMsgID, }; diff --git a/gui_macvim.m b/gui_macvim.m index e332338d63..33b44cde8d 100644 --- a/gui_macvim.m +++ b/gui_macvim.m @@ -485,7 +485,7 @@ [NSArray arrayWithObject:NSStringPboardType]]; if (type) { NSMutableString *string = - [[pb stringForType:NSStringPboardType] mutableCopy]; + [[pb stringForType:NSStringPboardType] mutableCopy]; // Replace unrecognized end-of-line sequences with \x0a (line feed). NSRange range = { 0, [string length] }; From be7c3da504801f2cc0ba9dba35110e089c2bf033 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Mon, 6 Aug 2007 19:09:09 +0000 Subject: [PATCH 0075/1156] Updated outdate information git-svn-id: http://macvim.googlecode.com/svn/trunk@94 96c4425d-ca35-0410-94e5-3396d5c13a8f --- README | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/README b/README index 9fba8cdb17..8127760786 100644 --- a/README +++ b/README @@ -22,7 +22,7 @@ Compiling: Weirdness: -- When the text system (Cocoa) comes across multi byte characters it +- [obsolete] When the text system (Cocoa) comes across multi byte characters it automatically chooses a font for those characters; this font may not be the same height as the one set on the text storage and hence the program must account for the fact that lines may have differing heights. @@ -30,7 +30,7 @@ Weirdness: after the layout manager has performed layout. As a side-effect the user sees how the window resizes when certain multi byte characters are being displayed. -- Remember to set 'inputReceived = YES' in MMBackend +- [obsolete] Remember to set 'inputReceived = YES' in MMBackend handlePortMessage:, otherwise Vim will not inform MMVimController of changes it makes (e.g. in response to a key down event). - The way delegate messages from the tab bar are handled are based on lots of @@ -139,29 +139,30 @@ Features (!supp indicates that a feature is not supported): - Tabs: uses PSMTabBarControl to show tabs, can reorder tabs by dragging them, has overflow menu, new tab button on tabline - Menubar: accelerators !supp, actext hint displayed as tool tip - instead of on menu, each window has its own menu, key equivalents !supp + instead of on menu, each window has its own menu, set key equivalents with + :menukeyequiv command - Toolbar: toolbariconsize supported (tiny&small equiv to 24x24 px, medium&large equiv to 32x32 px), toolbar supports 'icons' and 'text' options (but not 'tooltip' which is always on), each window has its own toolbar, custom toolbar items - Cocoa input protocols: input managers, character palette input etc. supported, marked text !supp, cocoa key bindings (DefaultKeyBinding.dict) - !supp + are disabled - Mouse: resize (vim) windows, selection, different mouse cursors !supp, autoscrolling whilst selecting works poorly -- Drag and Drop: drag files onto dock icon to open in tabs, drag to text view - !supp -- Zoom: Command-click to zoom height only, otherwise maximize witdh as well, +- Drag and Drop: drag files onto dock icon to open in tabs, drag text and files + onto text view +- Zoom: Command-click to zoom to fill window, otherwise only zoom height, hold down Option to zoom all windows - Resize: live resize (although terribly slow), :set lines will not make window higher than can fit the screen (no such restrictions on width at the moment) - Pasteboard: star-register works with the mac os x pasteboard - Open/Save dialog: use with :browse -- Fonts: bold/italic/underline traits supported, font changes !supp +- Fonts: bold/italic/underline traits supported, font changes with ':set gfn' - File type associations: add more associations by editing Info.plist - Start GUI from terminal, type :gui -- Scroll bars: !supp -- Wide characters: !supp +- Scroll bars +- Wide characters: poor support, do not render at right width/height - Printing: !supp - Find/Replace dialog: !supp - Gui dialogs: !supp From b91bd4afc925c4560de2c3963900e1696d2a0e7e Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Mon, 6 Aug 2007 19:09:33 +0000 Subject: [PATCH 0076/1156] More active & pending git-svn-id: http://macvim.googlecode.com/svn/trunk@95 96c4425d-ca35-0410-94e5-3396d5c13a8f --- TODO | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/TODO b/TODO index b9793f62c5..1e831d1f2d 100644 --- a/TODO +++ b/TODO @@ -1,16 +1,19 @@ Active: -- drag-to-resize, delay if mouse button held down -- no warning when buffer modified outside vim (implement gui_mch_dialog()) -- ability to modify key equivalents at any time -- validate menu actions for when no windows are open (e.g. selectNextWindow:) +- improve drag and drop support (drop in command line mode not working, + modifier keys are ignored) - grey out menus which can't be used: Tab Next/Prev/Close, Undo/Redo, etc. - when only one tab open make close window -- drag and drop inside view (FEAT_GUI_DND, gui_handle_drop()) - main menu (buffers menu, window menu) +- services menu +- no warning when buffer modified outside vim (implement gui_mch_dialog()) +- gui dialogs (FEAT_GUI_DIALOG) +- find/replace toolbar item (FIND_REPLACE_DIALOG) +- drag-to-resize, delay if mouse button held down +- ability to modify key equivalents at any time +- validate menu actions for when no windows are open (e.g. selectNextWindow:) - application:openFiles: should open in tabs in current window instead of in a new window, only if user default is set -- toolbar drawing bug - need E??? numbers for vim errors - tab-completion for :action command? - should ignore action message if is called too often (e.g. in addNewTab:) @@ -18,9 +21,6 @@ Active: - font selection dialog (:set gfn=*) - check for memory leaks - i8n -- services menu -- gui dialogs (FEAT_GUI_DIALOG) -- find/replace toolbar item (FIND_REPLACE_DIALOG) - popup menus - encoding -- convert strings from vim to utf-8 - change building procedure so that the Makefile compiles and links VimTask and @@ -38,7 +38,6 @@ Active: - window count should be typeset nicely in tab - put marked text in status line (?) - track pad scrolling is jerky -- memory leak with text view? (need to release text storage) - sanity check all input in handlePortMessage: etc. - cursor in replace mode - nice looking cursors (both the block and in insert mode) @@ -64,6 +63,9 @@ Active: Pending: +- memory leak with text view? (need to release text storage) +- drag and drop inside view (FEAT_GUI_DND, gui_handle_drop()) +- toolbar drawing bug - Cmd-zoom -> no input received, drawing broken - scrollbars not positioned over resize box - offset text away from left edge From 84494a00bd0de8c42284e8b54debd83556001875 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Tue, 7 Aug 2007 19:23:05 +0000 Subject: [PATCH 0077/1156] - Added services menu support with some simple provider messages - MMVimController observer registration moved from MMVimController init to MMWindowController windowDidLoad - Text system initialized in MMWindowController init instead of awakeFromNib git-svn-id: http://macvim.googlecode.com/svn/trunk@96 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMAppController.m | 178 +++++++++++++++++++++++++++++++++++++++++-- MMBackend.m | 48 +++++++++++- MMVimController.m | 12 --- MMWindowController.m | 104 +++++++++++++++++-------- MacVim.h | 2 + 5 files changed, 294 insertions(+), 50 deletions(-) diff --git a/MMAppController.m b/MMAppController.m index 87e92f5573..7f74fed7b2 100644 --- a/MMAppController.m +++ b/MMAppController.m @@ -27,11 +27,25 @@ +@interface MMAppController (MMServices) +- (void)openSelection:(NSPasteboard *)pboard userData:(NSString *)userData + error:(NSString **)error; +- (void)openFile:(NSPasteboard *)pboard userData:(NSString *)userData + error:(NSString **)error; +@end + + +@interface MMAppController (Private) +- (MMVimController *)keyVimController; +- (MMVimController *)topmostVimController; +@end + @interface NSMenu (MMExtras) - (void)recurseSetAutoenablesItems:(BOOL)on; @end + @implementation MMAppController + (void)initialize @@ -50,6 +64,9 @@ + (void)initialize nil]; [[NSUserDefaults standardUserDefaults] registerDefaults:dict]; + + NSArray *types = [NSArray arrayWithObject:NSStringPboardType]; + [NSApp registerServicesMenuSendTypes:types returnTypes:types]; } - (id)init @@ -110,6 +127,11 @@ - (void)dealloc [super dealloc]; } +- (void)applicationDidFinishLaunching:(NSNotification *)notification +{ + [NSApp setServicesProvider:self]; +} + - (BOOL)applicationShouldOpenUntitledFile:(NSApplication *)sender { // NOTE! This way it possible to start the app with the command-line @@ -127,8 +149,45 @@ - (BOOL)applicationOpenUntitledFile:(NSApplication *)sender - (void)application:(NSApplication *)sender openFiles:(NSArray *)filenames { + NSString *firstMissingFile = nil; + NSMutableArray *files = [NSMutableArray array]; + int i, count = [filenames count]; + for (i = 0; i < count; ++i) { + NSString *name = [filenames objectAtIndex:i]; + if ([NSFileHandle fileHandleForReadingAtPath:name]) { + [files addObject:name]; + } else if (!firstMissingFile) { + firstMissingFile = name; + } + } + + if (firstMissingFile) { + NSAlert *alert = [[NSAlert alloc] init]; + [alert addButtonWithTitle:@"OK"]; + + NSString *text; + if ([files count] >= count-1) { + [alert setMessageText:@"File not found"]; + text = [NSString stringWithFormat:@"Could not open file with " + "name %@.", firstMissingFile]; + } else { + [alert setMessageText:@"Multiple files not found"]; + text = [NSString stringWithFormat:@"Could not open file with " + "name %@, and %d other files.", firstMissingFile, + count-[files count]-1]; + } + + [alert setInformativeText:text]; + [alert setAlertStyle:NSWarningAlertStyle]; + + [alert runModal]; + [alert release]; + + return; + } + NSMutableArray *args = [NSMutableArray arrayWithObjects:@"-g", @"-p", nil]; - [args addObjectsFromArray:filenames]; + [args addObjectsFromArray:files]; NSString *path = [[NSBundle mainBundle] pathForAuxiliaryExecutable:@"Vim"]; @@ -305,7 +364,7 @@ - (IBAction)selectNextWindow:(id)sender NSWindow *keyWindow = [NSApp keyWindow]; for (i = 0; i < count; ++i) { - MMWindowController *vc = [vimControllers objectAtIndex:i]; + MMVimController *vc = [vimControllers objectAtIndex:i]; if ([[[vc windowController] window] isEqual:keyWindow]) break; } @@ -313,7 +372,7 @@ - (IBAction)selectNextWindow:(id)sender if (i < count) { if (++i >= count) i = 0; - MMWindowController *vc = [vimControllers objectAtIndex:i]; + MMVimController *vc = [vimControllers objectAtIndex:i]; [[vc windowController] showWindow:self]; } #endif @@ -338,7 +397,7 @@ - (IBAction)selectPreviousWindow:(id)sender NSWindow *keyWindow = [NSApp keyWindow]; for (i = 0; i < count; ++i) { - MMWindowController *vc = [vimControllers objectAtIndex:i]; + MMVimController *vc = [vimControllers objectAtIndex:i]; if ([[[vc windowController] window] isEqual:keyWindow]) break; } @@ -349,7 +408,7 @@ - (IBAction)selectPreviousWindow:(id)sender } else { i = count - 1; } - MMWindowController *vc = [vimControllers objectAtIndex:i]; + MMVimController *vc = [vimControllers objectAtIndex:i]; [[vc windowController] showWindow:self]; } #endif @@ -378,10 +437,117 @@ - (IBAction)selectPreviousWindow:(id)sender } #endif +@end // MMAppController + + + + +@implementation MMAppController (MMServices) + +- (void)openSelection:(NSPasteboard *)pboard userData:(NSString *)userData + error:(NSString **)error +{ + if (![[pboard types] containsObject:NSStringPboardType]) { + NSLog(@"WARNING: Pasteboard contains no object of type " + "NSStringPboardType"); + return; + } + + MMVimController *vc = [self topmostVimController]; + if (vc) { + NSString *string = [pboard stringForType:NSStringPboardType]; + NSMutableData *data = [NSMutableData data]; + int len = [string lengthOfBytesUsingEncoding:NSUTF8StringEncoding] + 1; + + [data appendBytes:&len length:sizeof(int)]; + [data appendBytes:[string UTF8String] length:len]; + + [vc sendMessage:AddNewTabMsgID data:nil wait:NO]; + [vc sendMessage:DropStringMsgID data:data wait:NO]; + } else { + // TODO: Open the selection in the new window. + *error = @"ERROR: No window found to open selection in."; + [self newVimWindow:self]; + } +} + +- (void)openFile:(NSPasteboard *)pboard userData:(NSString *)userData + error:(NSString **)error +{ + if (![[pboard types] containsObject:NSStringPboardType]) { + NSLog(@"WARNING: Pasteboard contains no object of type " + "NSStringPboardType"); + return; + } + + // TODO: Parse multiple filenames and create array with names. + int numberOfFiles = 1; + NSString *string = [pboard stringForType:NSStringPboardType]; + string = [string stringByTrimmingCharactersInSet: + [NSCharacterSet whitespaceAndNewlineCharacterSet]]; + string = [string stringByStandardizingPath]; + + MMVimController *vc = nil; + if (userData && [userData isEqual:@"Tab"]) + vc = [self topmostVimController]; + + if (vc) { + NSMutableData *data = [NSMutableData data]; + int len = [string lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; + + [data appendBytes:&numberOfFiles length:sizeof(int)]; + [data appendBytes:&len length:sizeof(int)]; + [data appendBytes:[string UTF8String] length:len]; + + [vc sendMessage:DropFilesMsgID data:data wait:NO]; + } else { + [self application:NSApp openFiles:[NSArray arrayWithObject:string]]; + } +} + +@end // MMAppController (MMServices) + + + + +@implementation MMAppController (Private) + +- (MMVimController *)keyVimController +{ + NSWindow *keyWindow = [NSApp keyWindow]; + if (keyWindow) { + unsigned i, count = [vimControllers count]; + for (i = 0; i < count; ++i) { + MMVimController *vc = [vimControllers objectAtIndex:i]; + if ([[[vc windowController] window] isEqual:keyWindow]) + return vc; + } + } + + return nil; +} + +- (MMVimController *)topmostVimController +{ + NSArray *windows = [NSApp orderedWindows]; + if ([windows count] > 0) { + NSWindow *window = [windows objectAtIndex:0]; + unsigned i, count = [vimControllers count]; + for (i = 0; i < count; ++i) { + MMVimController *vc = [vimControllers objectAtIndex:i]; + if ([[[vc windowController] window] isEqual:window]) + return vc; + } + } + + return nil; +} + @end + @implementation NSMenu (MMExtras) - (void)recurseSetAutoenablesItems:(BOOL)on @@ -397,4 +563,4 @@ - (void)recurseSetAutoenablesItems:(BOOL)on } } -@end +@end // NSMenu (MMExtras) diff --git a/MMBackend.m b/MMBackend.m index 0a9f28441a..54afef76b8 100644 --- a/MMBackend.m +++ b/MMBackend.m @@ -810,6 +810,47 @@ - (BOOL)checkForModifiedBuffers return NO; } +- (BOOL)starRegisterToPasteboard:(byref NSPasteboard *)pboard +{ + if (VIsual_active && (State & NORMAL) && clip_star.available) { + // If there is no pasteboard, return YES to indicate that there is text + // to copy. + if (!pboard) + return YES; + + clip_copy_selection(); + + // Get the text to put on the pasteboard. + long_u len = 0; char_u *str = 0; + int type = clip_convert_selection(&str, &len, &clip_star); + if (type < 0) + return NO; + + NSString *string = [[NSString alloc] + initWithBytes:str length:len encoding:NSUTF8StringEncoding]; + + NSArray *types = [NSArray arrayWithObject:NSStringPboardType]; + [pboard declareTypes:types owner:nil]; + BOOL ok = [pboard setString:string forType:NSStringPboardType]; + + [string release]; + vim_free(str); + + return ok; + } + + return NO; +} + +- (BOOL)starRegisterFromPasteboard:(byref NSPasteboard *)pboard +{ + if (curbuf && !curbuf->b_p_ro) { + return YES; + } + + return NO; +} + #else // MM_USE_DO - (void)handlePortMessage:(NSPortMessage *)portMessage @@ -1107,7 +1148,12 @@ - (void)handleMessage:(int)msgid data:(NSData *)data int i; for (i = 0; i < n && bytes < end; ++i) { int len = *((int*)bytes); bytes += sizeof(int); - NSString *file = [NSString stringWithUTF8String:bytes]; + NSMutableString *file = + [NSMutableString stringWithUTF8String:bytes]; + [file replaceOccurrencesOfString:@" " + withString:@"\\ " + options:0 + range:NSMakeRange(0, [file length])]; bytes += len; [cmd appendString:@" "]; diff --git a/MMVimController.m b/MMVimController.m index 2a5058feb3..f3022b88aa 100644 --- a/MMVimController.m +++ b/MMVimController.m @@ -123,18 +123,6 @@ - (id)initWithPort:(NSPort *)port //[self addToolbarItemToDictionaryWithTag:0 label:@"Attention" // toolTip:@"A toolbar item is missing" // icon:@"Attention"]; - - [[NSNotificationCenter defaultCenter] - addObserver:self - selector:@selector(windowWillClose:) - name:NSWindowWillCloseNotification - object:[windowController window]]; - [[NSNotificationCenter defaultCenter] - addObserver:self - selector:@selector(windowDidBecomeMain:) - name:NSWindowDidBecomeMainNotification - object:[windowController window]]; - } return self; diff --git a/MMWindowController.m b/MMWindowController.m index afbddc4366..0e89f2ce0e 100644 --- a/MMWindowController.m +++ b/MMWindowController.m @@ -100,9 +100,32 @@ - (id)initWithVimController:(MMVimController *)controller if ((self = [super initWithWindowNibName:@"VimWindow"])) { vimController = controller; scrollbars = [[NSMutableArray alloc] init]; -#if 0 + + // Setup a complete text system. textStorage = [[MMTextStorage alloc] init]; -#endif + NSLayoutManager *lm = [[NSLayoutManager alloc] init]; + NSTextContainer *tc = [[NSTextContainer alloc] initWithContainerSize: + NSMakeSize(1.0e7,1.0e7)]; + + [tc setWidthTracksTextView:NO]; + [tc setHeightTracksTextView:NO]; + [tc setLineFragmentPadding:0]; + + [textStorage addLayoutManager:lm]; + [lm addTextContainer:tc]; + + textView = [[MMTextView alloc] initWithFrame:NSZeroRect + textContainer:tc]; + + NSUserDefaults *ud = [NSUserDefaults standardUserDefaults]; + int left = [ud integerForKey:MMTextInsetLeft]; + int top = [ud integerForKey:MMTextInsetTop]; + [textView setTextContainerInset:NSMakeSize(left, top)]; + + // The text storage retains the layout manager which in turn retains + // the text container. + [tc release]; + [lm release]; } return self; @@ -128,35 +151,6 @@ - (void)dealloc [super dealloc]; } -- (void)awakeFromNib -{ - // Setup a complete text system. - textStorage = [[MMTextStorage alloc] init]; - NSLayoutManager *lm = [[NSLayoutManager alloc] init]; - NSTextContainer *tc = [[NSTextContainer alloc] initWithContainerSize: - NSMakeSize(1.0e7,1.0e7)]; - - [tc setWidthTracksTextView:NO]; - [tc setHeightTracksTextView:NO]; - [tc setLineFragmentPadding:0]; - - [textStorage addLayoutManager:lm]; - [lm addTextContainer:tc]; - - textView = [[MMTextView alloc] initWithFrame:NSZeroRect - textContainer:tc]; - - NSUserDefaults *ud = [NSUserDefaults standardUserDefaults]; - int left = [ud integerForKey:MMTextInsetLeft]; - int top = [ud integerForKey:MMTextInsetTop]; - [textView setTextContainerInset:NSMakeSize(left, top)]; - - // The text storage retains the layout manager which in turn retains the - // text container. - [tc release]; - [lm release]; -} - - (void)windowDidLoad { // Called after window nib file is loaded. @@ -180,6 +174,22 @@ - (void)windowDidLoad // HACK! remove any tabs present in the nib [tabView removeAllTabViewItems]; + + // HACK! These observers used to be set in the designated init of + // MMVimController, but this occasionally caused exceptions from within the + // AppKit to be raised. The problem seemed related to the fact that the + // window got loaded 'too early'; adding the observers here seems to + // alleviate this problem. + [[NSNotificationCenter defaultCenter] + addObserver:vimController + selector:@selector(windowWillClose:) + name:NSWindowWillCloseNotification + object:[self window]]; + [[NSNotificationCenter defaultCenter] + addObserver:vimController + selector:@selector(windowDidBecomeMain:) + name:NSWindowDidBecomeMainNotification + object:[self window]]; } - (MMVimController *)vimController @@ -549,6 +559,38 @@ - (NSRect)windowWillUseStandardFrame:(NSWindow *)win return frame; } +#if MM_USE_DO +- (id)validRequestorForSendType:(NSString *)sendType + returnType:(NSString *)returnType +{ + //NSLog(@"validRequestorForSendType:%@ returnType:%@", sendType, returnType); + + id backendProxy = [vimController backendProxy]; + + if ((!sendType || [sendType isEqual:NSStringPboardType]) + && (!returnType || [returnType isEqual:NSStringPboardType])) { + if ((!sendType || [backendProxy starRegisterToPasteboard:nil]) + && (!returnType || [backendProxy starRegisterFromPasteboard:nil])) { + return self; + } + } + + return [super validRequestorForSendType:sendType returnType:returnType]; +} + +- (BOOL)writeSelectionToPasteboard:(NSPasteboard *)pboard + types:(NSArray *)types +{ + //NSLog(@"writeSelectionToPasteboard:%@ types:%@", pboard, types); + + if (![types containsObject:NSStringPboardType]) + return NO; + + id backendProxy = [vimController backendProxy]; + return [backendProxy starRegisterToPasteboard:pboard]; +} +#endif // MM_USE_DO + @end // MMWindowController diff --git a/MacVim.h b/MacVim.h index bb7131cfa1..c2e210e4f0 100644 --- a/MacVim.h +++ b/MacVim.h @@ -22,6 +22,8 @@ - (oneway void)processInput:(int)msgid data:(in NSData *)data; - (BOOL)checkForModifiedBuffers; - (oneway void)setBrowseForFileString:(in bycopy NSString *)string; +- (BOOL)starRegisterToPasteboard:(byref NSPasteboard *)pboard; +- (BOOL)starRegisterFromPasteboard:(byref NSPasteboard *)pboard; @end @protocol MMFrontendProtocol From ed5935d1c85100b03aa9219ac70d53f7f186a9b3 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Wed, 8 Aug 2007 09:05:42 +0000 Subject: [PATCH 0078/1156] Added Services menu entries git-svn-id: http://macvim.googlecode.com/svn/trunk@98 96c4425d-ca35-0410-94e5-3396d5c13a8f --- Info.plist | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/Info.plist b/Info.plist index 95dd126b70..6787e125d9 100644 --- a/Info.plist +++ b/Info.plist @@ -546,5 +546,57 @@ MainMenu NSPrincipalClass NSApplication + NSServices + + + NSMenuItem + + default + MacVim/New Tab Containing Selection + + NSMessage + openSelection + NSPortName + MacVim + NSSendTypes + + NSStringPboardType + + + + NSMenuItem + + default + MacVim/Open Selected File in Tab + + NSMessage + openFile + NSPortName + MacVim + NSSendTypes + + NSStringPboardType + + NSUserData + Tab + + + NSMenuItem + + default + MacVim/Open Selected File in Window + + NSMessage + openFile + NSPortName + MacVim + NSSendTypes + + NSStringPboardType + + NSUserData + Window + + From c659ac0f362f6b4e316ee85b754e69995aff912c Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Wed, 8 Aug 2007 09:06:24 +0000 Subject: [PATCH 0079/1156] Modified default menus (which only show if no window has been opened) git-svn-id: http://macvim.googlecode.com/svn/trunk@99 96c4425d-ca35-0410-94e5-3396d5c13a8f --- English.lproj/MainMenu.nib/keyedobjects.nib | Bin 7524 -> 7267 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/English.lproj/MainMenu.nib/keyedobjects.nib b/English.lproj/MainMenu.nib/keyedobjects.nib index e54b9abc0818ffcb9bf7f581e2113a7f5f50476d..7d3cba39f53ad729f73005f703c2aff72db3fffe 100644 GIT binary patch literal 7267 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 U@!AB4{5URpr=z0x*j1bLze(pt4gdfE literal 7524 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 Date: Wed, 8 Aug 2007 09:07:30 +0000 Subject: [PATCH 0080/1156] If only one file is dropped, use ':drop' instead of ':tab drop' (this works better when a directory is dropped). git-svn-id: http://macvim.googlecode.com/svn/trunk@100 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMBackend.m | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/MMBackend.m b/MMBackend.m index 54afef76b8..a58f43a925 100644 --- a/MMBackend.m +++ b/MMBackend.m @@ -1142,7 +1142,9 @@ - (void)handleMessage:(int)msgid data:(NSData *)data // HACK! I'm not sure how to get Vim to open a list of files in tabs, // so instead I create a ':tab drop' command with all the files to open // and execute it. - NSMutableString *cmd = [NSMutableString stringWithString:@":tab drop"]; + NSMutableString *cmd = (n > 1) + ? [NSMutableString stringWithString:@":tab drop"] + : [NSMutableString stringWithString:@":drop"]; const void *end = [data bytes] + [data length]; int i; From 6c59edb93ed0de0764f68ce70a46b116bcb82a2c Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Wed, 8 Aug 2007 09:58:41 +0000 Subject: [PATCH 0081/1156] Code cleanup. git-svn-id: http://macvim.googlecode.com/svn/trunk@101 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMAppController.h | 10 +- MMAppController.m | 122 ----------------------- MMBackend.h | 11 +-- MMBackend.m | 228 ++----------------------------------------- MMTextStorage.h | 3 - MMTextStorage.m | 92 ----------------- MMTextView.m | 13 --- MMVimController.h | 17 +--- MMVimController.m | 156 +---------------------------- MMWindowController.m | 15 +-- MacVim.h | 49 ++++------ MacVim.m | 80 +-------------- gui_macvim.m | 26 ----- 13 files changed, 43 insertions(+), 779 deletions(-) diff --git a/MMAppController.h b/MMAppController.h index 0ddf90b3dc..086749e347 100644 --- a/MMAppController.h +++ b/MMAppController.h @@ -26,17 +26,9 @@ extern NSString *MMTerminateAfterLastWindowClosed; -@interface MMAppController : NSObject -#if MM_USE_DO - -#endif +@interface MMAppController : NSObject { NSMutableArray *vimControllers; -#if !MM_USE_DO - NSPort *receivePort; - unsigned terminateNowCount; - BOOL abortTermination; -#endif } - (void)removeVimController:(id)controller; diff --git a/MMAppController.m b/MMAppController.m index 7f74fed7b2..cfd4b1726d 100644 --- a/MMAppController.m +++ b/MMAppController.m @@ -74,7 +74,6 @@ - (id)init if ((self = [super init])) { vimControllers = [NSMutableArray new]; -#if MM_USE_DO // NOTE! If the name of the connection changes here it must also be // updated in MMBackend.m. NSConnection *connection = [NSConnection defaultConnection]; @@ -92,24 +91,6 @@ - (id)init NSLog(@"WARNING: Failed to register connection with name '%@'", name); } -#else - // Init named port for VimTasks to connect to - receivePort = [NSMachPort new]; - [receivePort setDelegate:self]; - - [[NSRunLoop currentRunLoop] addPort:receivePort - forMode:NSDefaultRunLoopMode]; - - // NOTE! If the name of the port changes here it must also be updated - // in MMBackend.m. - NSString *portName = [NSString stringWithFormat:@"%@-taskport", - [[NSBundle mainBundle] bundleIdentifier]]; - //NSLog(@"Starting mach bootstrap server: %@", portName); - if (![[NSMachBootstrapServer sharedInstance] registerPort:receivePort - name:portName]) { - NSLog(@"WARNING: Failed to start mach bootstrap server"); - } -#endif } return self; @@ -119,9 +100,6 @@ - (void)dealloc { //NSLog(@"MMAppController dealloc"); -#if !MM_USE_DO - [receivePort release]; -#endif [vimControllers release]; [super dealloc]; @@ -209,7 +187,6 @@ - (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)sender - (NSApplicationTerminateReply)applicationShouldTerminate: (NSApplication *)sender { -#if MM_USE_DO int reply = NSTerminateNow; BOOL modifiedBuffers = NO; @@ -240,58 +217,6 @@ - (NSApplicationTerminateReply)applicationShouldTerminate: } return reply; -#else - int reply = NSTerminateNow; - - // HACK! Send message to all vim tasks asking if they have modified - // buffers, then hang around for a while waiting for responses to come - // back. If any task has at least one modified buffer an alert dialog is - // displayed telling the user that there are modified buffers. The user - // can then choose whether to quit anyway, or cancel the termination. - // (NSTerminateLater is not supported.) - terminateNowCount = 0; - abortTermination = NO; - - unsigned i, count = [vimControllers count]; - for (i = 0; i < count; ++i) { - MMVimController *controller = [vimControllers objectAtIndex:i]; - [NSPortMessage sendMessage:TaskShouldTerminateMsgID - withSendPort:[controller sendPort] - receivePort:receivePort - wait:NO]; - } - - NSDate *timeOutDate = [NSDate dateWithTimeIntervalSinceNow:15]; - while (terminateNowCount < count && !abortTermination && - NSOrderedDescending == [timeOutDate compare:[NSDate date]]) { - [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode - beforeDate:timeOutDate]; - } - - //NSLog(@"%s terminateNowCount=%d abortTermination=%s", _cmd, - // terminateNowCount, abortTermination ? "YES" : "NO"); - - if (abortTermination) { - NSAlert *alert = [[NSAlert alloc] init]; - [alert addButtonWithTitle:@"Quit"]; - [alert addButtonWithTitle:@"Cancel"]; - [alert setMessageText:@"Quit without saving?"]; - [alert setInformativeText:@"There are modified buffers, " - " if you quit now all changes will be lost. Quit anyway?"]; - [alert setAlertStyle:NSWarningAlertStyle]; - - if ([alert runModal] != NSAlertFirstButtonReturn) { - reply = NSTerminateCancel; - } - - [alert release]; - } else if (terminateNowCount < count) { - NSLog(@"WARNING: Not all tasks replied to TaskShouldTerminateMsgID," - " quitting anyway."); - } - - return reply; -#endif } - (void)applicationWillTerminate:(NSNotification *)aNotification @@ -301,27 +226,6 @@ - (void)applicationWillTerminate:(NSNotification *)aNotification [self autorelease]; } -#if !MM_USE_DO -- (void)handlePortMessage:(NSPortMessage *)portMessage -{ - unsigned msgid = [portMessage msgid]; - - if (msgid == CheckinMsgID) { - //NSLog(@"Received checkin message from VimTask."); - MMVimController *wc = [[MMVimController alloc] - initWithPort:[portMessage sendPort]]; - [vimControllers addObject:wc]; - [wc release]; - } else if (msgid == TerminateReplyYesMsgID) { - ++terminateNowCount; - } else if (msgid == TerminateReplyNoMsgID) { - abortTermination = YES; - } else { - NSLog(@"WARNING: Unknown message received (msgid=%d)", msgid); - } -} -#endif - - (void)removeVimController:(id)controller { [vimControllers removeObject:controller]; @@ -350,15 +254,6 @@ - (IBAction)newVimWindow:(id)sender - (IBAction)selectNextWindow:(id)sender { -#if 0 - NSArray *windows = [NSApp orderedWindows]; - unsigned idx = [windows indexOfObject:[NSApp keyWindow]]; - if (NSNotFound != idx) { - if (++idx >= [windows count]) - idx = 0; - [[windows objectAtIndex:idx] makeKeyAndOrderFront:self]; - } -#else unsigned i, count = [vimControllers count]; if (!count) return; @@ -375,23 +270,10 @@ - (IBAction)selectNextWindow:(id)sender MMVimController *vc = [vimControllers objectAtIndex:i]; [[vc windowController] showWindow:self]; } -#endif } - (IBAction)selectPreviousWindow:(id)sender { -#if 0 - NSArray *windows = [NSApp orderedWindows]; - unsigned idx = [windows indexOfObject:[NSApp keyWindow]]; - if (NSNotFound != idx) { - if (idx > 0) { - --idx; - } else { - idx = [windows count] - 1; - } - [[windows objectAtIndex:idx] makeKeyAndOrderFront:self]; - } -#else unsigned i, count = [vimControllers count]; if (!count) return; @@ -411,11 +293,8 @@ - (IBAction)selectPreviousWindow:(id)sender MMVimController *vc = [vimControllers objectAtIndex:i]; [[vc windowController] showWindow:self]; } -#endif } - -#if MM_USE_DO - (byref id )connectBackend: (byref in id )backend; { @@ -435,7 +314,6 @@ - (IBAction)selectPreviousWindow:(id)sender return wc; } -#endif @end // MMAppController diff --git a/MMBackend.h b/MMBackend.h index 6a15f2ea50..5b9a6c5686 100644 --- a/MMBackend.h +++ b/MMBackend.h @@ -13,22 +13,13 @@ -@interface MMBackend : NSObject -#if MM_USE_DO - -#endif +@interface MMBackend : NSObject { NSMutableArray *queue; NSMutableData *drawData; -#if MM_USE_DO NSConnection *connection; id frontendProxy; NSString *browseForFileString; -#else - NSPort *sendPort; - NSPort *receivePort; - NSData *replyData; -#endif NSDictionary *colorDict; BOOL inputReceived; BOOL receivedKillTaskMsg; diff --git a/MMBackend.m b/MMBackend.m index a58f43a925..a80a635f85 100644 --- a/MMBackend.m +++ b/MMBackend.m @@ -26,9 +26,7 @@ - (void)handleMessage:(int)msgid data:(NSData *)data; + (NSDictionary *)specialKeys; - (void)handleKeyDown:(NSString *)key modifiers:(int)mods; - (void)queueMessage:(int)msgid data:(NSData *)data; -#if MM_USE_DO - (void)connectionDidDie:(NSNotification *)notification; -#endif @end @@ -60,13 +58,8 @@ - (void)dealloc [queue release]; [drawData release]; -#if MM_USE_DO [frontendProxy release]; [connection release]; -#else - [sendPort release]; - [receivePort release]; -#endif [colorDict release]; [super dealloc]; @@ -99,24 +92,12 @@ - (BOOL)checkin { NSBundle *mainBundle = [NSBundle mainBundle]; -#if MM_USE_DO // NOTE! If the name of the connection changes here it must also be // updated in MMAppController.m. NSString *name = [NSString stringWithFormat:@"%@-connection", [mainBundle bundleIdentifier]]; connection = [NSConnection connectionWithRegisteredName:name host:nil]; - if (!connection) -#else - // NOTE! If the name of the port changes here it must also be updated in - // MMAppController.m. - NSString *portName = [NSString stringWithFormat:@"%@-taskport", - [mainBundle bundleIdentifier]]; - - NSPort *port = [[[NSMachBootstrapServer sharedInstance] - portForName:portName host:nil] retain]; - if (!port) -#endif - { + if (!connection) { #if 0 NSString *path = [mainBundle bundlePath]; if (![[NSWorkspace sharedWorkspace] launchApplication:path]) { @@ -147,41 +128,26 @@ - (BOOL)checkin // HACK! The NSWorkspaceDidLaunchApplicationNotification does not work // for tasks like this, so poll the mach bootstrap server until it - // returns a valid port. Also set a time-out date so that we don't get - // stuck doing this forever. + // returns a valid connection. Also set a time-out date so that we + // don't get stuck doing this forever. NSDate *timeOutDate = [NSDate dateWithTimeIntervalSinceNow:15]; - while ( -#if MM_USE_DO - !connection -#else - !port -#endif - && NSOrderedDescending == [timeOutDate compare:[NSDate date]]) + while (!connection && + NSOrderedDescending == [timeOutDate compare:[NSDate date]]) { [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:1]]; -#if MM_USE_DO + connection = [NSConnection connectionWithRegisteredName:name host:nil]; -#else - port = [[NSMachBootstrapServer sharedInstance] - portForName:portName]; -#endif } -#if MM_USE_DO - if (!connection) -#else - if (!port) -#endif - { + if (!connection) { NSLog(@"WARNING: Timed-out waiting for GUI to launch."); return NO; } } -#if MM_USE_DO id proxy = [connection rootProxy]; [proxy setProtocolForProxy:@protocol(MMAppProtocol)]; @@ -195,49 +161,10 @@ - (BOOL)checkin } return connection && frontendProxy; -#else - receivePort = [NSMachPort new]; - [receivePort setDelegate:self]; - - [[NSRunLoop currentRunLoop] addPort:receivePort - forMode:NSDefaultRunLoopMode]; - - [NSPortMessage sendMessage:CheckinMsgID withSendPort:port - receivePort:receivePort wait:YES]; - - return YES; -#endif } - (BOOL)openVimWindow { -#if !MM_USE_DO - if (!sendPort) { -#if 0 - // TODO: Wait until connected---maybe time out at some point? - // Note that if we return 'NO' Vim will be started in terminal mode - // (i.e. output goes to stdout). - NSLog(@"WARNING: Trying to open VimWindow but sendPort==nil;" - " waiting for connected message."); - - [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode - beforeDate:[NSDate distantFuture]]; - if (!sendPort) - return NO; -#else - // Wait until the sendPort has actually been set. - // - // TODO: Come up with a more elegant solution to this problem---this - // message should not be called before the sendPort has been - // initialized. - while (!sendPort) { - [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode - beforeDate:[NSDate distantFuture]]; - } -#endif - } -#endif // !MM_USE_DO - [self queueMessage:OpenVimWindowMsgID data:nil]; return YES; } @@ -332,26 +259,13 @@ - (void)flushQueue // TODO: Come up with a better way to handle the insertion point. [self updateInsertionPoint]; -#if MM_USE_DO [frontendProxy processCommandQueue:queue]; -#else - [NSPortMessage sendMessage:FlushQueueMsgID withSendPort:sendPort - components:queue wait:YES]; -#endif [queue removeAllObjects]; } } - (BOOL)waitForInput:(int)milliseconds { -#if !MM_USE_DO - if (![receivePort isValid]) { - // This should only happen if the GUI crashes. - NSLog(@"ERROR: The receive port is no longer valid, quitting..."); - getout(0); - } -#endif - NSDate *date = milliseconds > 0 ? [NSDate dateWithTimeIntervalSinceNow:.001*milliseconds] : [NSDate distantFuture]; @@ -360,7 +274,7 @@ - (BOOL)waitForInput:(int)milliseconds // I know of no way to figure out if the run loop exited because input was // found or because of a time out, so I need to manually indicate when - // input was received in handlePortMessage and then reset it every time + // input was received in processInput:data: and then reset it every time // here. BOOL yn = inputReceived; inputReceived = NO; @@ -370,18 +284,11 @@ - (BOOL)waitForInput:(int)milliseconds - (void)exit { -#if MM_USE_DO // By invalidating the NSConnection the MMWindowController immediately // finds out that the connection is down and as a result // [MMWindowController connectionDidDie:] is invoked. [[NSNotificationCenter defaultCenter] removeObserver:self]; [connection invalidate]; -#else - if (!receivedKillTaskMsg) { - [NSPortMessage sendMessage:TaskExitedMsgID withSendPort:sendPort - receivePort:receivePort wait:YES]; - } -#endif } - (void)selectTab:(int)index @@ -455,7 +362,6 @@ - (void)setVimWindowTitle:(char *)title [self queueMessage:SetVimWindowTitleMsgID data:data]; } -#if MM_USE_DO - (oneway void)setBrowseForFileString:(in bycopy NSString *)string { // NOTE: This is called by [MMVimController panelDidEnd:::] to indicate @@ -463,7 +369,6 @@ - (oneway void)setBrowseForFileString:(in bycopy NSString *)string // the user pressed cancel. browseForFileString = string ? [string copy] : nil; } -#endif - (char *)browseForFileInDirectory:(char *)dir title:(char *)title saving:(int)saving @@ -471,7 +376,6 @@ - (char *)browseForFileInDirectory:(char *)dir title:(char *)title //NSLog(@"browseForFileInDirectory:%s title:%s saving:%d", dir, title, // saving); -#if MM_USE_DO NSString *ds = dir ? [NSString stringWithCString:dir encoding:NSUTF8StringEncoding] : nil; @@ -490,48 +394,6 @@ - (char *)browseForFileInDirectory:(char *)dir title:(char *)title [browseForFileString release]; browseForFileString = nil; return (char *)s; -#else - NSMutableData *data = [NSMutableData data]; - - [data appendBytes:&saving length:sizeof(int)]; - - int len = dir ? strlen(dir) : 0; - [data appendBytes:&len length:sizeof(int)]; - if (len > 0) - [data appendBytes:dir length:len]; - - len = title ? strlen(title) : 0; - [data appendBytes:&len length:sizeof(int)]; - if (len > 0) - [data appendBytes:title length:len]; - - if (![NSPortMessage sendMessage:BrowseForFileMsgID withSendPort:sendPort - data:data wait:YES]) - return nil; - - // Wait until a reply is sent from MMVimController. - [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode - beforeDate:[NSDate distantFuture]]; - - // Something went wrong if replyData is nil. - if (!replyData) - return nil; - - const void *bytes = [replyData bytes]; - int ok = *((int*)bytes); bytes += sizeof(int); - len = *((int*)bytes); bytes += sizeof(int); - - char_u *s = NULL; - if (ok && len > 0) { - NSString *name = [[NSString alloc] initWithBytes:(void*)bytes - length:len encoding:NSUTF8StringEncoding]; - s = vim_strsave((char_u*)[name UTF8String]); - [name release]; - } - - [replyData release]; replyData = nil; - return (char*)s; -#endif // MM_USE_DO } - (void)updateInsertionPoint @@ -791,7 +653,6 @@ - (int)lookupColorWithKey:(NSString *)key return INVALCOLOR; } -#if MM_USE_DO - (oneway void)processInput:(int)msgid data:(in NSData *)data { [self handleMessage:msgid data:data]; @@ -851,39 +712,6 @@ - (BOOL)starRegisterFromPasteboard:(byref NSPasteboard *)pboard return NO; } -#else // MM_USE_DO - -- (void)handlePortMessage:(NSPortMessage *)portMessage -{ - unsigned msgid = [portMessage msgid]; - - if (ConnectedMsgID == msgid) { - sendPort = [[portMessage sendPort] retain]; - //NSLog(@"VimTask connected to MMVimController."); - } else if (TaskShouldTerminateMsgID == msgid) { - int reply = TerminateReplyYesMsgID; - buf_T *buf; - for (buf = firstbuf; buf != NULL; buf = buf->b_next) { - if (bufIsChanged(buf)) { - reply = TerminateReplyNoMsgID; - break; - } - } - - //NSLog(@"TaskShouldTerminateMsgID = %s", - // reply == TerminateReplyYesMsgID ? "YES" : "NO"); - - [NSPortMessage sendMessage:reply withSendPort:[portMessage sendPort] - wait:YES]; - } else { - NSArray *components = [portMessage components]; - NSData *data = [components count] > 0 ? - [components objectAtIndex:0] : nil; - [self handleMessage:msgid data:data]; - } -} -#endif // MM_USE_DO - @end // MMBackend @@ -906,8 +734,6 @@ - (void)handleMessage:(int)msgid data:(NSData *)data add_to_input_buf((char_u*)[key UTF8String], [key lengthOfBytesUsingEncoding:NSUTF8StringEncoding]); [key release]; - - inputReceived = YES; } else if (KeyDownMsgID == msgid || CmdKeyMsgID == msgid) { if (!data) return; const void *bytes = [data bytes]; @@ -920,25 +746,21 @@ - (void)handleMessage:(int)msgid data:(NSData *)data [self handleKeyDown:key modifiers:mods]; [key release]; - inputReceived = YES; } else if (SelectTabMsgID == msgid) { if (!data) return; const void *bytes = [data bytes]; int idx = *((int*)bytes) + 1; //NSLog(@"Selecting tab %d", idx); send_tabline_event(idx); - inputReceived = YES; } else if (CloseTabMsgID == msgid) { if (!data) return; const void *bytes = [data bytes]; int idx = *((int*)bytes) + 1; //NSLog(@"Closing tab %d", idx); send_tabline_menu_event(idx, TABLINE_MENU_CLOSE); - inputReceived = YES; } else if (AddNewTabMsgID == msgid) { //NSLog(@"Adding new tab"); send_tabline_menu_event(0, TABLINE_MENU_NEW); - inputReceived = YES; } else if (DraggedTabMsgID == msgid) { if (!data) return; const void *bytes = [data bytes]; @@ -946,21 +768,7 @@ - (void)handleMessage:(int)msgid data:(NSData *)data // based. int idx = *((int*)bytes); -#if 0 - tabpage_T *tp = find_tabpage(oldIdx); - if (tp) { - // HACK! tabpage_move(idx) moves 'curtab' to 'idx', but since it - // is also possible to drag tabs which are not selected we must - // first set 'curtab' to the tab that was actually dragged and then - // reset 'curtab' to what it used to be. - tabpage_T *oldcur = curtab; - curtab = tp; - tabpage_move(idx); - curtab = oldcur; - } -#else tabpage_move(idx); -#endif } else if (ScrollWheelMsgID == msgid) { if (!data) return; const void *bytes = [data bytes]; @@ -976,7 +784,6 @@ - (void)handleMessage:(int)msgid data:(NSData *)data flags = eventModifierFlagsToVimMouseModMask(flags); gui_send_mouse_event(button, col, row, NO, flags); - inputReceived = YES; } else if (MouseDownMsgID == msgid) { if (!data) return; const void *bytes = [data bytes]; @@ -991,8 +798,6 @@ - (void)handleMessage:(int)msgid data:(NSData *)data flags = eventModifierFlagsToVimMouseModMask(flags); gui_send_mouse_event(button, col, row, 0 != count, flags); - - inputReceived = YES; } else if (MouseUpMsgID == msgid) { if (!data) return; const void *bytes = [data bytes]; @@ -1004,7 +809,6 @@ - (void)handleMessage:(int)msgid data:(NSData *)data flags = eventModifierFlagsToVimMouseModMask(flags); gui_send_mouse_event(MOUSE_RELEASE, col, row, NO, flags); - inputReceived = YES; } else if (MouseDraggedMsgID == msgid) { if (!data) return; const void *bytes = [data bytes]; @@ -1016,16 +820,7 @@ - (void)handleMessage:(int)msgid data:(NSData *)data flags = eventModifierFlagsToVimMouseModMask(flags); gui_send_mouse_event(MOUSE_DRAG, col, row, NO, flags); - inputReceived = YES; - } -#if !MM_USE_DO - else if (BrowseForFileReplyMsgID == msgid) { - if (!data) return; - [replyData release]; - replyData = [data copy]; - } -#endif - else if (SetTextDimensionsMsgID == msgid) { + } else if (SetTextDimensionsMsgID == msgid) { if (!data) return; const void *bytes = [data bytes]; int rows = *((int*)bytes); bytes += sizeof(int); @@ -1048,7 +843,6 @@ - (void)handleMessage:(int)msgid data:(NSData *)data // TODO! Make sure 'menu' is a valid menu pointer! if (menu) { gui_menu_cb(menu); - inputReceived = YES; } } else if (ScrollbarEventMsgID == msgid) { if (!data) return; @@ -1111,8 +905,6 @@ - (void)handleMessage:(int)msgid data:(NSData *)data identifier:ident]; } } - - inputReceived = YES; } } else if (VimShouldCloseMsgID == msgid) { gui_shell_closed(); @@ -1292,7 +1084,6 @@ - (void)queueMessage:(int)msgid data:(NSData *)data [queue addObject:[NSData data]]; } -#if MM_USE_DO - (void)connectionDidDie:(NSNotification *)notification { // If the main connection to MacVim is lost this means that MacVim was @@ -1303,7 +1094,6 @@ - (void)connectionDidDie:(NSNotification *)notification //NSLog(@"A Vim process lots its connection to MacVim; quitting."); getout(0); } -#endif // MM_USE_DO @end // MMBackend (Private) diff --git a/MMTextStorage.h b/MMTextStorage.h index f609b38239..edca544769 100644 --- a/MMTextStorage.h +++ b/MMTextStorage.h @@ -11,15 +11,12 @@ #import -#define MM_TS_LAZY_SET 1 @interface MMTextStorage : NSTextStorage { NSMutableAttributedString *attribString; int maxRows, maxColumns; -#if MM_TS_LAZY_SET int actualRows, actualColumns; -#endif NSAttributedString *emptyRowString; NSFont *font; NSColor *defaultBackgroundColor; diff --git a/MMTextStorage.m b/MMTextStorage.m index efac8178f8..921f7e3022 100644 --- a/MMTextStorage.m +++ b/MMTextStorage.m @@ -23,18 +23,12 @@ //static float LINEHEIGHT = 30.0f; -#define MM_SIMPLE_TS_CALC 1 -#if MM_TS_LAZY_SET -# define MM_SIMPLE_TS_CALC 1 -#endif @interface MMTextStorage (Private) -#if MM_TS_LAZY_SET - (void)doSetMaxRows:(int)rows columns:(int)cols; - (void)lazyResize; -#endif - (float)cellWidth; - (float)widthOfEmptyRow; @end @@ -129,12 +123,8 @@ - (void)getMaxRows:(int*)rows columns:(int*)cols - (void)setMaxRows:(int)rows columns:(int)cols { -#if MM_TS_LAZY_SET maxRows = rows; maxColumns = cols; -#else - [self doSetMaxRows:rows columns:cols]; -#endif } - (void)replaceString:(NSString*)string atRow:(int)row column:(int)col @@ -356,48 +346,17 @@ - (void)setDefaultColorsBackground:(NSColor *)bgColor { // NOTE: Foreground color is ignored. [defaultBackgroundColor release]; - -#if 0 - if (bgColor) { - defaultBackgroundColor = [bgColor retain]; -#if 1 - NSMutableAttributedString *string = [emptyRowString mutableCopy]; - [string addAttribute:NSBackgroundColorAttributeName value:bgColor - range:NSMakeRange(0, [emptyRowString length])]; - [emptyRowString release]; - emptyRowString = string; -#endif - [self clearAllWithColor:bgColor]; - } else { - defaultBackgroundColor = nil; - } -#else defaultBackgroundColor = bgColor ? [bgColor retain] : nil; -#endif } - (void)setFont:(NSFont*)newFont { -#if 0 - if (font != newFont) { - //NSLog(@"Changing font from %@ to %@", font, newFont); - [font release]; - font = [newFont retain]; - NSRange range = { 0, [attribString length] }; - [attribString addAttribute:NSFontAttributeName value:font - range:range]; - [self setDefaultFg:norm_pixel bg:gui.back_pixel]; - [self edited:NSTextStorageEditedAttributes range:range - changeInLength:0]; - } -#else if (newFont && font != newFont) { //NSLog(@"Setting font %@", newFont); [font release]; font = [newFont retain]; // TODO! Change paragraph style to match line height of new font } -#endif } - (NSFont*)font @@ -410,24 +369,8 @@ - (NSSize)size if (![[self layoutManagers] count]) return NSZeroSize; NSLayoutManager *lm = [[self layoutManagers] objectAtIndex:0]; -#if MM_SIMPLE_TS_CALC float h = [lm defaultLineHeightForFont:font]; NSSize size = NSMakeSize([self cellWidth]*maxColumns, h*maxRows); -#else - if (![[lm textContainers] count]) return NSZeroSize; - NSTextContainer *tc = [[lm textContainers] objectAtIndex:0]; - - NSRange range = [lm glyphRangeForTextContainer:tc]; - NSRect rect = [lm boundingRectForGlyphRange:range inTextContainer:tc]; - //[lm glyphRangeForTextContainer:tc]; - //NSRect rect = [lm usedRectForTextContainer:tc]; - - NSSize size = NSMakeSize([self widthOfEmptyRow], rect.size.height); - //NSSize size = NSMakeSize([self widthOfEmptyRow], maxRows*LINEHEIGHT); - //NSLog(@"size=(%.2f,%.2f) rows=%d cols=%d layoutManager size=(%.2f,%.2f)", - // size.width, size.height, maxRows, maxColumns, rect.size.width, - // rect.size.height); -#endif return size; } @@ -519,11 +462,6 @@ - (NSSize)fitToSize:(NSSize)size rows:(int *)rows columns:(int *)columns if (![[self layoutManagers] count]) return size; NSLayoutManager *lm = [[self layoutManagers] objectAtIndex:0]; -#if !MM_SIMPLE_TS_CALC - if (![[lm textContainers] count]) return size; - NSTextContainer *tc = [[lm textContainers] objectAtIndex:0]; -#endif - NSSize curSize = [self size]; NSSize fitSize = curSize; int fitRows = maxRows; @@ -535,7 +473,6 @@ - (NSSize)fitToSize:(NSSize)size rows:(int *)rows columns:(int *)columns // text storage. (Why 3? It seem Vim never allows less than 3 lines.) // // TODO: Use binary search instead of the current linear one. -#if MM_TS_LAZY_SET int rowCount = maxRows; int rowsToRemove; for (rowsToRemove = 0; rowsToRemove < maxRows-3; ++rowsToRemove) { @@ -548,23 +485,6 @@ - (NSSize)fitToSize:(NSSize)size rows:(int *)rows columns:(int *)columns --rowCount; } -#else - NSRange charRange = { 0, maxRows*(maxColumns+1) }; - int rowsToRemove; - for (rowsToRemove = 0; rowsToRemove < maxRows-3; ++rowsToRemove) { - NSRange glyphRange = [lm glyphRangeForCharacterRange:charRange - actualCharacterRange:nil]; - float height = [lm boundingRectForGlyphRange:glyphRange - inTextContainer:tc].size.height; - - if (height <= size.height) { - fitSize.height = height; - break; - } - - charRange.length -= (maxColumns+1); - } -#endif fitRows -= rowsToRemove; } else if (size.height > curSize.height) { @@ -595,32 +515,22 @@ - (NSSize)fitToSize:(NSSize)size rows:(int *)rows columns:(int *)columns @implementation MMTextStorage (Private) -#if MM_TS_LAZY_SET - (void)lazyResize { if (actualRows != maxRows || actualColumns != maxColumns) { [self doSetMaxRows:maxRows columns:maxColumns]; } } -#endif // MM_TS_LAZY_SET - (void)doSetMaxRows:(int)rows columns:(int)cols { int i; -#if MM_TS_LAZY_SET // Do nothing if the dimensions are already right. if (actualRows == rows && actualColumns == cols) return; NSRange oldRange = NSMakeRange(0, actualRows*(actualColumns+1)); -#else - // Do nothing if the dimensions are already right. - if (maxRows == rows && maxColumns == cols) - return; - - NSRange oldRange = NSMakeRange(0, maxRows*(maxColumns+1)); -#endif maxRows = rows; maxColumns = cols; @@ -655,9 +565,7 @@ - (void)doSetMaxRows:(int)rows columns:(int)cols [self edited:(NSTextStorageEditedCharacters|NSTextStorageEditedAttributes) range:oldRange changeInLength:fullRange.length-oldRange.length]; -#if MM_TS_LAZY_SET actualRows = rows; actualColumns = cols; -#endif } - (float)cellWidth diff --git a/MMTextView.m b/MMTextView.m index 2747ecbb3a..f4c2fd4a28 100644 --- a/MMTextView.m +++ b/MMTextView.m @@ -132,16 +132,6 @@ - (void)setMarkedText:(id)text selectedRange:(NSRange)range range.length); } -#if 0 -- (IBAction)copy:(id)sender -{ -} - -- (IBAction)paste:(id)sender -{ -} -#endif - - (void)scrollWheel:(NSEvent *)event { if ([event deltaY] == 0) @@ -259,7 +249,6 @@ - (void)menuForEvent:(NSEvent *)event } #endif -#if 1 - (NSArray *)acceptableDragTypes { return [NSArray arrayWithObjects:NSFilenamesPboardType, @@ -345,8 +334,6 @@ - (NSDragOperation)draggingUpdated:(id )sender return NSDragOperationNone; } -#endif - @end // MMTextView diff --git a/MMVimController.h b/MMVimController.h index 1c7782666a..69f2a4c1f2 100644 --- a/MMVimController.h +++ b/MMVimController.h @@ -15,22 +15,12 @@ -@interface MMVimController : NSObject -#if MM_USE_DO - -#endif +@interface MMVimController : NSObject { MMWindowController *windowController; -#if MM_USE_DO id backendProxy; -# if MM_DELAY_SEND_IN_PROCESS_CMD_QUEUE BOOL inProcessCommandQueue; NSMutableArray *sendQueue; -# endif -#else - NSPort *sendPort; - NSPort *receivePort; -#endif NSMutableArray *mainMenuItems; BOOL shouldUpdateMainMenu; //NSMutableArray *popupMenus; @@ -38,13 +28,8 @@ NSMutableDictionary *toolbarItemDict; } -#if MM_USE_DO - (id)initWithBackend:(id)backend; - (id)backendProxy; -#else -- (id)initWithPort:(NSPort *)port; -- (NSPort *)sendPort; -#endif - (MMWindowController *)windowController; - (void)windowWillClose:(NSNotification *)notification; - (void)sendMessage:(int)msgid data:(NSData *)data wait:(BOOL)wait; diff --git a/MMVimController.m b/MMVimController.m index f3022b88aa..f22306bdbe 100644 --- a/MMVimController.m +++ b/MMVimController.m @@ -40,9 +40,7 @@ - (void)addToolbarItemToDictionaryWithTag:(int)tag label:(NSString *)title - (void)addToolbarItemWithTag:(int)tag label:(NSString *)label tip:(NSString *)tip icon:(NSString *)icon atIndex:(int)idx; -#if MM_USE_DO - (void)connectionDidDie:(NSNotification *)notification; -#endif - (BOOL)executeActionWithName:(NSString *)name; @end @@ -79,50 +77,20 @@ + (NSColor *)colorWithRgbInt:(int)rgb; @implementation MMVimController -#if MM_USE_DO - (id)initWithBackend:(id)backend -#else -- (id)initWithPort:(NSPort *)port -#endif { if ((self = [super init])) { windowController = [[MMWindowController alloc] initWithVimController:self]; -#if MM_USE_DO backendProxy = [backend retain]; -# if MM_DELAY_SEND_IN_PROCESS_CMD_QUEUE sendQueue = [NSMutableArray new]; -# endif + mainMenuItems = [[NSMutableArray alloc] init]; + toolbarItemDict = [[NSMutableDictionary alloc] init]; NSConnection *connection = [backendProxy connectionForProxy]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(connectionDidDie:) name:NSConnectionDidDieNotification object:connection]; -#else - sendPort = [port retain]; - - // Init receive port and send connected message to VimTask - receivePort = [NSMachPort new]; - [receivePort setDelegate:self]; - - // Add to the default run loop mode as well as the event tracking mode; - // the latter ensures that updates from the VimTask reaches - // MMVimController whilst the user resizes a window with the mouse. - [[NSRunLoop currentRunLoop] addPort:receivePort - forMode:NSDefaultRunLoopMode]; - [[NSRunLoop currentRunLoop] addPort:receivePort - forMode:NSEventTrackingRunLoopMode]; - - [NSPortMessage sendMessage:ConnectedMsgID withSendPort:sendPort - receivePort:receivePort wait:YES]; -#endif - - mainMenuItems = [[NSMutableArray alloc] init]; - - toolbarItemDict = [[NSMutableDictionary alloc] init]; - //[self addToolbarItemToDictionaryWithTag:0 label:@"Attention" - // toolTip:@"A toolbar item is missing" - // icon:@"Attention"]; } return self; @@ -134,21 +102,8 @@ - (void)dealloc [[NSNotificationCenter defaultCenter] removeObserver:self]; -#if MM_USE_DO [backendProxy release]; -# if MM_DELAY_SEND_IN_PROCESS_CMD_QUEUE [sendQueue release]; -# endif -#else - if (sendPort) { - // Kill task immediately - [NSPortMessage sendMessage:KillTaskMsgID withSendPort:sendPort - receivePort:receivePort wait:NO]; - } - - [sendPort release]; - [receivePort release]; -#endif [toolbarItemDict release]; [toolbar release]; @@ -165,8 +120,6 @@ - (MMWindowController *)windowController - (void)sendMessage:(int)msgid data:(NSData *)data wait:(BOOL)wait { -#if MM_USE_DO -# if MM_DELAY_SEND_IN_PROCESS_CMD_QUEUE if (inProcessCommandQueue) { //NSLog(@"In process command queue; delaying message send."); [sendQueue addObject:[NSNumber numberWithInt:msgid]]; @@ -176,7 +129,7 @@ - (void)sendMessage:(int)msgid data:(NSData *)data wait:(BOOL)wait [sendQueue addObject:[NSNull null]]; return; } -# endif + if (wait) { [backendProxy processInput:msgid data:data]; } else { @@ -198,13 +151,8 @@ - (void)sendMessage:(int)msgid data:(NSData *)data wait:(BOOL)wait } } } -#else - [NSPortMessage sendMessage:msgid withSendPort:sendPort data:data - wait:wait]; -#endif } -#if MM_USE_DO - (id)backendProxy { return backendProxy; @@ -242,9 +190,7 @@ - (oneway void)processCommandQueue:(in NSArray *)queue return; } -#if MM_DELAY_SEND_IN_PROCESS_CMD_QUEUE inProcessCommandQueue = YES; -#endif //NSLog(@"======== %s BEGIN ========", _cmd); for (i = 0; i < count; i += 2) { @@ -267,7 +213,6 @@ - (oneway void)processCommandQueue:(in NSArray *)queue [self updateMainMenu]; } -#if MM_DELAY_SEND_IN_PROCESS_CMD_QUEUE inProcessCommandQueue = NO; count = [sendQueue count]; @@ -287,53 +232,8 @@ - (oneway void)processCommandQueue:(in NSArray *)queue [sendQueue removeAllObjects]; } -#endif -} - -#else // MM_USE_DO - -- (NSPort *)sendPort -{ - return sendPort; } -- (void)handlePortMessage:(NSPortMessage *)portMessage -{ - //NSLog(@"%@ %s %@", [self className], _cmd, portMessage); - - NSArray *components = [portMessage components]; - unsigned msgid = [portMessage msgid]; - - //NSLog(@"%s%d", _cmd, msgid); - - if (FlushQueueMsgID == msgid) { - unsigned i, count = [components count]; - if (count % 2) { - NSLog(@"WARNING: Uneven number of components (%d) in flush queue " - "message; ignoring this message.", count); - return; - } - - for (i = 0; i < count; i += 2) { - NSData *value = [components objectAtIndex:i]; - NSData *data = [components objectAtIndex:i+1]; - - [self handleMessage:*((int*)[value bytes]) data:data]; - } - } else { - NSData *data = nil; - if ([components count] > 0) - data = [components objectAtIndex:0]; - - [self handleMessage:msgid data:data]; - } - - if (shouldUpdateMainMenu) { - [self updateMainMenu]; - } -} -#endif // MM_USE_DO - - (void)windowWillClose:(NSNotification *)notification { // NOTE! This causes the call to removeVimController: to be delayed. @@ -385,23 +285,7 @@ - (void)handleMessage:(int)msgid data:(NSData *)data if (OpenVimWindowMsgID == msgid) { [windowController openWindow]; - } -#if !MM_USE_DO - else if (TaskExitedMsgID == msgid) { - //NSLog(@"Received task exited message from VimTask; closing window."); - - // Release sendPort immediately to avoid dealloc trying to send a 'kill - // task' message to the task. - [sendPort release]; sendPort = nil; - // NOTE! This causes windowWillClose: to be called, which in turn asks - // the MMAppController to remove this MMVimController. - [windowController close]; - - // HACK! Make sure no menu updating is done, we're about to close. - shouldUpdateMainMenu = NO; - } -#endif // !MM_USE_DO - else if (BatchDrawMsgID == msgid) { + } else if (BatchDrawMsgID == msgid) { //NSLog(@"Received batch draw message from VimTask."); [self performBatchDrawWithData:data]; @@ -438,18 +322,8 @@ - (void)handleMessage:(int)msgid data:(NSData *)data const void *bytes = [data bytes]; int len = *((int*)bytes); bytes += sizeof(int); -#if 0 - // BUG! Using this call leads to ALL windows getting the same title - // and then the app crashes if you :q a window. - NSString *string = [[NSString alloc] - initWithBytesNoCopy:(void*)bytes - length:len - encoding:NSUTF8StringEncoding - freeWhenDone:NO]; -#else NSString *string = [[NSString alloc] initWithBytes:(void*)bytes length:len encoding:NSUTF8StringEncoding]; -#endif [[windowController window] setTitle:string]; @@ -802,30 +676,10 @@ - (void)performBatchDrawWithData:(NSData *)data - (void)panelDidEnd:(NSSavePanel *)panel code:(int)code context:(void *)context { -#if MM_USE_DO [windowController setStatusText:@""]; NSString *string = (code == NSOKButton) ? [panel filename] : nil; [backendProxy setBrowseForFileString:string]; -#else - NSMutableData *data = [NSMutableData data]; - int ok = (code == NSOKButton); - NSString *filename = [panel filename]; - int len = [filename lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; - - [data appendBytes:&ok length:sizeof(int)]; - [data appendBytes:&len length:sizeof(int)]; - if (len > 0) - [data appendBytes:[filename UTF8String] length:len]; - - if (![NSPortMessage sendMessage:BrowseForFileReplyMsgID - withSendPort:sendPort data:data wait:YES]) { - NSLog(@"WARNING: Failed to send browse for files reply back to " - "VimTask."); - } - - [windowController setStatusText:@""]; -#endif // !MM_USE_DO } - (NSMenuItem *)menuItemForTag:(int)tag @@ -1024,14 +878,12 @@ - (void)addToolbarItemWithTag:(int)tag label:(NSString *)label tip:(NSString [toolbar insertItemWithItemIdentifier:label atIndex:idx]; } -#if MM_USE_DO - (void)connectionDidDie:(NSNotification *)notification { //NSLog(@"A MMVimController lost its connection to the backend; " // "closing the controller."); [windowController close]; } -#endif // MM_USE_DO - (BOOL)executeActionWithName:(NSString *)name { diff --git a/MMWindowController.m b/MMWindowController.m index 0e89f2ce0e..0e330f56c8 100644 --- a/MMWindowController.m +++ b/MMWindowController.m @@ -559,7 +559,6 @@ - (NSRect)windowWillUseStandardFrame:(NSWindow *)win return frame; } -#if MM_USE_DO - (id)validRequestorForSendType:(NSString *)sendType returnType:(NSString *)returnType { @@ -589,7 +588,6 @@ - (BOOL)writeSelectionToPasteboard:(NSPasteboard *)pboard id backendProxy = [vimController backendProxy]; return [backendProxy starRegisterToPasteboard:pboard]; } -#endif // MM_USE_DO @end // MMWindowController @@ -985,17 +983,12 @@ - (void)placeViews NSRect contentRect = [win contentRectForFrameRect:[win frame]]; NSRect textViewRect = [self textViewRectForContentSize:contentRect.size]; NSSize tsSize = [self textStorageSizeForTextViewSize:textViewRect.size]; -#if 0 - if ([textStorage resizeToFitSize:tsSize]) { - // Text storage dimensions changed, notify the VimTask. - int dim[2]; - [textStorage getMaxRows:&dim[0] columns:&dim[1]]; -#else + int dim[2], rows, cols; [textStorage getMaxRows:&rows columns:&cols]; [textStorage fitToSize:tsSize rows:&dim[0] columns:&dim[1]]; + if (dim[0] != rows || dim[1] != cols) { -#endif NSString *sdim = [NSString stringWithFormat:@"%dx%d", dim[1], dim[0]]; [self flashStatusText:sdim]; @@ -1004,8 +997,8 @@ - (void)placeViews NSData *data = [NSData dataWithBytes:dim length:2*sizeof(int)]; // NOTE! This can get called a lot when in live resize, which causes - // the ports to fill up. If we wait for the message to be sent then - // the app might become unresponsive. + // the connection buffers to fill up. If we wait for the message to be + // sent then the app might become unresponsive. [vimController sendMessage:SetTextDimensionsMsgID data:data wait:![textView inLiveResize]]; } diff --git a/MacVim.h b/MacVim.h index c2e210e4f0..7bbdcf7f95 100644 --- a/MacVim.h +++ b/MacVim.h @@ -11,13 +11,14 @@ #import -#define MM_USE_DO 1 -#define MM_DELAY_SEND_IN_PROCESS_CMD_QUEUE 1 - -#if MM_USE_DO - +// +// This is the protocol MMBackend implements. +// +// Only processInput:data: is allowed to cause state changes in Vim; all other +// messages should only read the Vim state. +// @protocol MMBackendProtocol - (oneway void)processInput:(int)msgid data:(in NSData *)data; - (BOOL)checkForModifiedBuffers; @@ -26,6 +27,10 @@ - (BOOL)starRegisterFromPasteboard:(byref NSPasteboard *)pboard; @end + +// +// This is the protocol MMVimController implements. +// @protocol MMFrontendProtocol - (oneway void)processCommandQueue:(in NSArray *)queue; - (oneway void)showSavePanelForDirectory:(in bycopy NSString *)dir @@ -33,14 +38,24 @@ saving:(int)saving; @end + +// +// This is the protocol MMAppController implements. +// +// It handles connections between MacVim and Vim. +// @protocol MMAppProtocol - (byref id )connectBackend: (byref in id )backend; @end -#endif +// +// The following enum lists all messages that are passed between MacVim and +// Vim. These can be sent in processInput:data: and in processCommandQueue:. +// + // NOTE! This array must be updated whenever the enum below changes! extern char *MessageStrings[]; @@ -77,11 +92,6 @@ enum { EnableMenuItemMsgID, ExecuteMenuMsgID, ShowToolbarMsgID, -#if !MM_USE_DO - TaskShouldTerminateMsgID, - TerminateReplyYesMsgID, - TerminateReplyNoMsgID, -#endif CreateScrollbarMsgID, DestroyScrollbarMsgID, ShowScrollbarMsgID, @@ -122,21 +132,4 @@ enum { }; -@interface NSPortMessage (MacVim) - -+ (BOOL)sendMessage:(int)msgid withSendPort:(NSPort *)sendPort - receivePort:(NSPort *)receivePort components:(NSArray *)components - wait:(BOOL)wait; -+ (BOOL)sendMessage:(int)msgid withSendPort:(NSPort *)sendPort - receivePort:(NSPort *)receivePort data:(NSData *)data wait:(BOOL)wait; -+ (BOOL)sendMessage:(int)msgid withSendPort:(NSPort *)sendPort - receivePort:(NSPort *)receivePort wait:(BOOL)wait; -+ (BOOL)sendMessage:(int)msgid withSendPort:(NSPort *)sendPort - components:(NSArray *)components wait:(BOOL)wait; -+ (BOOL)sendMessage:(int)msgid withSendPort:(NSPort *)sendPort - data:(NSData *)data wait:(BOOL)wait; -+ (BOOL)sendMessage:(int)msgid withSendPort:(NSPort *)sendPort wait:(BOOL)wait; - -@end - // vim: set ft=objc: diff --git a/MacVim.m b/MacVim.m index 2955d00f44..f3473aa4d9 100644 --- a/MacVim.m +++ b/MacVim.m @@ -45,11 +45,6 @@ "EnableMenuItemMsgID", "ExecuteMenuMsgID", "ShowToolbarMsgID", -#if !MM_USE_DO - "TaskShouldTerminateMsgID", - "TerminateReplyYesMsgID", - "TerminateReplyNoMsgID", -#endif "CreateScrollbarMsgID", "DestroyScrollbarMsgID", "ShowScrollbarMsgID", @@ -60,78 +55,7 @@ "VimShouldCloseMsgID", "SetDefaultColorsMsgID", "ExecuteActionMsgID", + "DropFilesMsgID", + "DropStringMsgID", }; -@implementation NSPortMessage (MacVim) - -+ (BOOL)sendMessage:(int)msgid withSendPort:(NSPort *)sendPort - receivePort:(NSPort *)receivePort components:(NSArray *)components - wait:(BOOL)wait -{ - NSPortMessage *msg = [[NSPortMessage alloc] - initWithSendPort:sendPort - receivePort:receivePort - components:components]; - [msg setMsgid:msgid]; - - // HACK! How long should this wait before time out? - NSDate *date = wait ? [NSDate dateWithTimeIntervalSinceNow:1] - : [NSDate date]; - BOOL ok = [msg sendBeforeDate:date]; - - [msg release]; - - return ok; -} - -+ (BOOL)sendMessage:(int)msgid withSendPort:(NSPort *)sendPort - receivePort:(NSPort *)receivePort data:(NSData *)data wait:(BOOL)wait -{ - return [NSPortMessage sendMessage:msgid - withSendPort:sendPort - receivePort:receivePort - components:[NSArray arrayWithObject:data] - wait:wait]; -} - -+ (BOOL)sendMessage:(int)msgid withSendPort:(NSPort *)sendPort - receivePort:(NSPort *)receivePort wait:(BOOL)wait -{ - return [NSPortMessage sendMessage:msgid - withSendPort:sendPort - receivePort:receivePort - components:nil - wait:wait]; -} - -+ (BOOL)sendMessage:(int)msgid withSendPort:(NSPort *)sendPort - components:(NSArray *)components wait:(BOOL)wait -{ - return [NSPortMessage sendMessage:msgid - withSendPort:sendPort - receivePort:nil - components:components - wait:wait]; -} - -+ (BOOL)sendMessage:(int)msgid withSendPort:(NSPort *)sendPort - data:(NSData *)data wait:(BOOL)wait -{ - return [NSPortMessage sendMessage:msgid - withSendPort:sendPort - receivePort:nil - components:[NSArray arrayWithObject:data] - wait:wait]; -} - -+ (BOOL)sendMessage:(int)msgid withSendPort:(NSPort *)sendPort wait:(BOOL)wait -{ - return [NSPortMessage sendMessage:msgid - withSendPort:sendPort - receivePort:nil - components:nil - wait:wait]; -} - - -@end diff --git a/gui_macvim.m b/gui_macvim.m index 33b44cde8d..1890675d2e 100644 --- a/gui_macvim.m +++ b/gui_macvim.m @@ -715,13 +715,6 @@ gui_mch_free_font(font) GuiFont font; { -#if 0 - static GuiFont last_font = -1; - if (last_font != font) { - NSLog(@"gui_mch_free_font(font=%d)", font); - last_font = font; - } -#endif } @@ -774,13 +767,6 @@ void gui_mch_set_font(GuiFont font) { -#if 0 - static GuiFont last_font = -1; - if (last_font != font) { - NSLog(@"gui_mch_set_font(font=%d)", font); - last_font = font; - } -#endif } @@ -857,20 +843,8 @@ //NSLog(@"gui_mch_set_scrollbar_thumb(id=%d, val=%d, size=%d, max=%d)", // sb->ident, val, size, max); -#if 0 - float value = max-size+1 > 0 ? (float)val/(max-size+1) : 0; - float prop = (float)size/(max+1); - if (value < 0) value = 0; - else if (value > 1.0f) value = 1.0f; - if (prop < 0) prop = 0; - else if (prop > 1.0f) prop = 1.0f; - - [[MMBackend sharedInstance] - setScrollbarThumbValue:value proportion:prop identifier:sb->ident]; -#else [[MMBackend sharedInstance] setScrollbarThumbValue:val size:size max:max identifier:sb->ident]; -#endif } From e12a38b992ee38cd7fabc6d4e0109b76b85bd917 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Wed, 8 Aug 2007 12:00:17 +0000 Subject: [PATCH 0082/1156] - Added processCommandQueueDidFinish notification to MMWindowController - Window resizing is delayed until processCommandQueueDidFinish (no more need for performSelectionOnMainThread:::) git-svn-id: http://macvim.googlecode.com/svn/trunk@102 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMVimController.m | 11 +++-------- MMWindowController.h | 2 ++ MMWindowController.m | 44 +++++++++++++++++++++++++++++++------------- 3 files changed, 36 insertions(+), 21 deletions(-) diff --git a/MMVimController.m b/MMVimController.m index f22306bdbe..a4f955f013 100644 --- a/MMVimController.m +++ b/MMVimController.m @@ -213,6 +213,8 @@ - (oneway void)processCommandQueue:(in NSArray *)queue [self updateMainMenu]; } + [windowController processCommandQueueDidFinish]; + inProcessCommandQueue = NO; count = [sendQueue count]; @@ -301,14 +303,7 @@ - (void)handleMessage:(int)msgid data:(NSData *)data [windowController updateTabsWithData:data]; } else if (ShowTabBarMsgID == msgid) { //NSLog(@"Showing tab bar"); - - // HACK! Vim sends several draw commands etc. after the show message - // and these can mess up the display when showing the tab bar results - // in the window having to resize to fit the screen; delaying this - // message alleviates this problem. - [windowController performSelectorOnMainThread:@selector(showTabBar:) - withObject:self waitUntilDone:NO]; - //[windowController showTabBar:self]; + [windowController showTabBar:self]; } else if (HideTabBarMsgID == msgid) { //NSLog(@"Hiding tab bar"); [windowController hideTabBar:self]; diff --git a/MMWindowController.h b/MMWindowController.h index 69c95ec3e6..144c2f43a2 100644 --- a/MMWindowController.h +++ b/MMWindowController.h @@ -31,6 +31,7 @@ MMTextStorage *textStorage; NSMutableArray *scrollbars; BOOL setupDone; + BOOL shouldUpdateWindowSize; } - (id)initWithVimController:(MMVimController *)controller; @@ -51,6 +52,7 @@ identifier:(long)ident; - (void)setDefaultColorsBackground:(NSColor *)back foreground:(NSColor *)fore; - (void)setFont:(NSFont *)font; +- (void)processCommandQueueDidFinish; - (IBAction)addNewTab:(id)sender; - (IBAction)showTabBar:(id)sender; diff --git a/MMWindowController.m b/MMWindowController.m index 0e330f56c8..8bc91167b5 100644 --- a/MMWindowController.m +++ b/MMWindowController.m @@ -304,7 +304,7 @@ - (void)setTextDimensionsWithRows:(int)rows columns:(int)cols [textStorage setMaxRows:rows columns:cols]; if (setupDone && ![textView inLiveResize]) - [self resizeWindowToFit:self]; + shouldUpdateWindowSize = YES; } - (void)setStatusText:(NSString *)text @@ -361,9 +361,9 @@ - (void)destroyScrollbarWithIdentifier:(long)ident if (![scroller isHidden]) { // A visible scroller was removed, so the window must resize to // fit. - // TODO! Should only do this once per update. - [self performSelectorOnMainThread:@selector(resizeWindowToFit:) - withObject:self waitUntilDone:NO]; + //NSLog(@"Visible scroller %d was destroyed, resizing window.", + // ident); + shouldUpdateWindowSize = YES; } } } @@ -380,10 +380,9 @@ - (void)showScrollbarWithIdentifier:(long)ident state:(BOOL)visible if (wasVisible != visible) { // A scroller was hidden or shown, so the window must resize to fit. - //NSLog(@"%s scroller %d", visible ? "Show" : "Hide", ident); - // TODO! Should only do this once per update. - [self performSelectorOnMainThread:@selector(resizeWindowToFit:) - withObject:self waitUntilDone:NO]; + //NSLog(@"%s scroller %d and resize.", visible ? "Show" : "Hide", + // ident); + shouldUpdateWindowSize = YES; } } @@ -421,6 +420,14 @@ - (void)setFont:(NSFont *)font [self updateResizeIncrements]; } +- (void)processCommandQueueDidFinish +{ + if (shouldUpdateWindowSize) { + shouldUpdateWindowSize = NO; + [self resizeWindowToFit:self]; + } +} + - (IBAction)addNewTab:(id)sender { // NOTE! This can get called a lot if the user holds down the key @@ -435,7 +442,7 @@ - (IBAction)showTabBar:(id)sender [tabBarControl setHidden:NO]; if (setupDone) - [self resizeWindowToFit:self]; + shouldUpdateWindowSize = YES; } - (IBAction)hideTabBar:(id)sender @@ -444,10 +451,12 @@ - (IBAction)hideTabBar:(id)sender [tabBarControl setHidden:YES]; if (setupDone) - [self resizeWindowToFit:self]; + shouldUpdateWindowSize = YES; } + + // -- PSMTabBarControl delegate ---------------------------------------------- @@ -559,6 +568,11 @@ - (NSRect)windowWillUseStandardFrame:(NSWindow *)win return frame; } + + + +// -- Services menu delegate ------------------------------------------------- + - (id)validRequestorForSendType:(NSString *)sendType returnType:(NSString *)returnType { @@ -567,9 +581,11 @@ - (id)validRequestorForSendType:(NSString *)sendType id backendProxy = [vimController backendProxy]; if ((!sendType || [sendType isEqual:NSStringPboardType]) - && (!returnType || [returnType isEqual:NSStringPboardType])) { - if ((!sendType || [backendProxy starRegisterToPasteboard:nil]) - && (!returnType || [backendProxy starRegisterFromPasteboard:nil])) { + && (!returnType || [returnType isEqual:NSStringPboardType])) + { + if ((!sendType || [backendProxy starRegisterToPasteboard:nil]) && + (!returnType || [backendProxy starRegisterFromPasteboard:nil])) + { return self; } } @@ -697,6 +713,8 @@ - (void)resizeWindowToFit:(id)sender frame = [self fitWindowToFrame:maxFrame]; } + //NSLog(@"%s %@", _cmd, NSStringFromRect(frame)); + // HACK! If the window does resize, then windowDidResize is called which in // turn calls placeViews. In case the computed new size of the window is // no different from the current size, then we need to call placeViews From 4c3331492b33abb0d4741b76fe0bf8cda8a7a4c5 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Wed, 8 Aug 2007 12:40:30 +0000 Subject: [PATCH 0083/1156] Code cleanup git-svn-id: http://macvim.googlecode.com/svn/trunk@103 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMBackend.h | 3 --- MMTextStorage.h | 2 -- MMTextView.h | 2 -- 3 files changed, 7 deletions(-) diff --git a/MMBackend.h b/MMBackend.h index 5b9a6c5686..7742a499af 100644 --- a/MMBackend.h +++ b/MMBackend.h @@ -81,6 +81,3 @@ - (int)lookupColorWithKey:(NSString *)key; @end - - -// vim: set ft=objc: diff --git a/MMTextStorage.h b/MMTextStorage.h index edca544769..6a223a87df 100644 --- a/MMTextStorage.h +++ b/MMTextStorage.h @@ -60,5 +60,3 @@ - (NSSize)fitToSize:(NSSize)size rows:(int *)rows columns:(int *)columns; @end - -/* vim: set filetype=objc: */ diff --git a/MMTextView.h b/MMTextView.h index 6acdb8843b..af51abb675 100644 --- a/MMTextView.h +++ b/MMTextView.h @@ -18,5 +18,3 @@ - (void)setShouldDrawInsertionPoint:(BOOL)enable; @end - -// vim: set ft=objc : From 656dcdea1216599d7dbcc9075898527ac6f5ad18 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Wed, 8 Aug 2007 19:16:05 +0000 Subject: [PATCH 0084/1156] Added MMTypesetter.[m|h] to project. git-svn-id: http://macvim.googlecode.com/svn/trunk@104 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MacVim.xcodeproj/project.pbxproj | 6 ++++++ MacVim.xcodeproj/winckler.mode1 | 9 +++++---- MacVim.xcodeproj/winckler.pbxuser | 6 +++--- 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/MacVim.xcodeproj/project.pbxproj b/MacVim.xcodeproj/project.pbxproj index 33c4e7df69..ff24851b92 100644 --- a/MacVim.xcodeproj/project.pbxproj +++ b/MacVim.xcodeproj/project.pbxproj @@ -7,6 +7,7 @@ objects = { /* Begin PBXBuildFile section */ + 1D09AB420C6A4D520045497E /* MMTypesetter.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D09AB400C6A4D520045497E /* MMTypesetter.m */; }; 1D0E051C0BA5F83800B6049E /* Colors.plist in Resources */ = {isa = PBXBuildFile; fileRef = 1D0E051B0BA5F83800B6049E /* Colors.plist */; }; 1D1474980C56703C0038FA2B /* MacVim.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D1474960C56703C0038FA2B /* MacVim.m */; }; 1D1474A00C5673AE0038FA2B /* MMAppController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D14749E0C5673AE0038FA2B /* MMAppController.m */; }; @@ -117,6 +118,8 @@ 089C165DFE840E0CC02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = ""; }; 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = ""; }; 13E42FB307B3F0F600E4EEF1 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = /System/Library/Frameworks/CoreData.framework; sourceTree = ""; }; + 1D09AB3F0C6A4D520045497E /* MMTypesetter.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = MMTypesetter.h; sourceTree = ""; }; + 1D09AB400C6A4D520045497E /* MMTypesetter.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = MMTypesetter.m; sourceTree = ""; }; 1D0E051B0BA5F83800B6049E /* Colors.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = Colors.plist; sourceTree = ""; }; 1D1474950C56703C0038FA2B /* MacVim.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = MacVim.h; sourceTree = ""; }; 1D1474960C56703C0038FA2B /* MacVim.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = MacVim.m; sourceTree = ""; }; @@ -196,6 +199,8 @@ 080E96DDFE201D6D7F000001 /* MacVim Source */ = { isa = PBXGroup; children = ( + 1D09AB3F0C6A4D520045497E /* MMTypesetter.h */, + 1D09AB400C6A4D520045497E /* MMTypesetter.m */, 1D1474B90C567A910038FA2B /* MMWindowController.h */, 1D1474BA0C567A910038FA2B /* MMWindowController.m */, 1D1474B30C56796D0038FA2B /* MMVimController.h */, @@ -470,6 +475,7 @@ 1D1474B00C5678370038FA2B /* MMTextView.m in Sources */, 1D1474B60C56796D0038FA2B /* MMVimController.m in Sources */, 1D1474BC0C567A910038FA2B /* MMWindowController.m in Sources */, + 1D09AB420C6A4D520045497E /* MMTypesetter.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/MacVim.xcodeproj/winckler.mode1 b/MacVim.xcodeproj/winckler.mode1 index 46c3831785..a1f8f0bcbb 100644 --- a/MacVim.xcodeproj/winckler.mode1 +++ b/MacVim.xcodeproj/winckler.mode1 @@ -368,9 +368,9 @@ TableOfContents - 1D8FA20B0C61AF48009406B2 + 1D09AB4F0C6A4DC10045497E 1CE0B1FE06471DED0097A5F4 - 1D8FA20C0C61AF48009406B2 + 1D09AB500C6A4DC10045497E 1CE0B20306471E060097A5F4 1CE0B20506471E060097A5F4 @@ -504,7 +504,6 @@ 5 WindowOrderList - 1C0AD2B3069F1EA900FABCE6 1D16B9EF0BA33E3800A69B33 /Users/winckler/Projects/vim7/src/MacVim/MacVim.xcodeproj @@ -547,6 +546,8 @@ 194pt + BecomeActive + ContentConfiguration PBXProjectModuleGUID @@ -586,7 +587,7 @@ TableOfContents 1D16B9EF0BA33E3800A69B33 - 1D8FA20D0C61AF48009406B2 + 1D09AB470C6A4D690045497E 1CD0528F0623707200166675 XCMainBuildResultsModuleGUID diff --git a/MacVim.xcodeproj/winckler.pbxuser b/MacVim.xcodeproj/winckler.pbxuser index eb808ef241..0af2cdd292 100644 --- a/MacVim.xcodeproj/winckler.pbxuser +++ b/MacVim.xcodeproj/winckler.pbxuser @@ -132,7 +132,7 @@ ); }; 29B97313FDCFA39411CA2CEA /* Project object */ = { - activeBuildConfigurationName = Release; + activeBuildConfigurationName = Debug; activeExecutable = 1D16B9CF0BA33BAE00A69B33 /* MacVim */; activeTarget = 8D1107260486CEB800E47090 /* MacVim */; addToTargets = ( @@ -244,8 +244,8 @@ PBXFileDataSource_Warnings_ColumnID, ); }; - PBXPerProjectTemplateStateSaveDate = 207728380; - PBXWorkspaceStateSaveDate = 207728380; + PBXPerProjectTemplateStateSaveDate = 208293179; + PBXWorkspaceStateSaveDate = 208293179; }; sourceControlManager = 1D16B9DD0BA33BB000A69B33 /* Source Control */; userBuildSettings = { From a15c9110c04a98f4489464ea65a264ade7c2f920 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Wed, 8 Aug 2007 19:18:16 +0000 Subject: [PATCH 0085/1156] Added custom typesetter (better wide-font support, can typeset proportional fonts) git-svn-id: http://macvim.googlecode.com/svn/trunk@105 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMTextStorage.h | 1 + MMTextStorage.m | 11 ++-- MMTypesetter.h | 22 +++++++ MMTypesetter.m | 140 +++++++++++++++++++++++++++++++++++++++++++ MMWindowController.m | 12 ++++ 5 files changed, 180 insertions(+), 6 deletions(-) create mode 100644 MMTypesetter.h create mode 100644 MMTypesetter.m diff --git a/MMTextStorage.h b/MMTextStorage.h index 6a223a87df..21aa47b8aa 100644 --- a/MMTextStorage.h +++ b/MMTextStorage.h @@ -58,5 +58,6 @@ - (BOOL)resizeToFitSize:(NSSize)size; - (NSSize)fitToSize:(NSSize)size; - (NSSize)fitToSize:(NSSize)size rows:(int *)rows columns:(int *)columns; +- (float)cellWidth; @end diff --git a/MMTextStorage.m b/MMTextStorage.m index 921f7e3022..c69dff86ff 100644 --- a/MMTextStorage.m +++ b/MMTextStorage.m @@ -29,7 +29,6 @@ @interface MMTextStorage (Private) - (void)doSetMaxRows:(int)rows columns:(int)cols; - (void)lazyResize; -- (float)cellWidth; - (float)widthOfEmptyRow; @end @@ -509,6 +508,11 @@ - (NSSize)fitToSize:(NSSize)size rows:(int *)rows columns:(int *)columns return fitSize; } +- (float)cellWidth +{ + return [font widthOfString:@"W"]; +} + @end // MMTextStorage @@ -568,11 +572,6 @@ - (void)doSetMaxRows:(int)rows columns:(int)cols actualRows = rows; actualColumns = cols; } -- (float)cellWidth -{ - return [font widthOfString:@"W"]; -} - - (float)widthOfEmptyRow { return [font widthOfString:[emptyRowString string]]; diff --git a/MMTypesetter.h b/MMTypesetter.h new file mode 100644 index 0000000000..9557c8a0b4 --- /dev/null +++ b/MMTypesetter.h @@ -0,0 +1,22 @@ +/* vi:set ts=8 sts=4 sw=4 ft=objc: + * + * VIM - Vi IMproved by Bram Moolenaar + * MacVim GUI port by Bjorn Winckler + * + * Do ":help uganda" in Vim to read copying and usage conditions. + * Do ":help credits" in Vim to see a list of people who contributed. + * See README.txt for an overview of the Vim source code. + */ + +#import + + +@interface MMTypesetter : NSTypesetter { +} + +- (void)layoutGlyphsInLayoutManager:(NSLayoutManager *)lm + startingAtGlyphIndex:(unsigned)startGlyphIdx + maxNumberOfLineFragments:(unsigned)maxNumLines + nextGlyphIndex:(unsigned *)nextGlyph; + +@end diff --git a/MMTypesetter.m b/MMTypesetter.m new file mode 100644 index 0000000000..aa65b2d109 --- /dev/null +++ b/MMTypesetter.m @@ -0,0 +1,140 @@ +/* vi:set ts=8 sts=4 sw=4 ft=objc: + * + * VIM - Vi IMproved by Bram Moolenaar + * MacVim GUI port by Bjorn Winckler + * + * Do ":help uganda" in Vim to read copying and usage conditions. + * Do ":help credits" in Vim to see a list of people who contributed. + * See README.txt for an overview of the Vim source code. + */ + +#import "MMTypesetter.h" +#import "MMTextStorage.h" + + + +#if 0 +@interface MMTypesetter (Private) +- (NSCharacterSet *)hiddenCharSet; +@end +#endif + + + +@implementation MMTypesetter + +// +// Layout glyphs so that each glyph takes up exactly one cell. +// +// The width of a cell is determined by [MMTextStorage cellWidth] (which +// typically sets one cell to equal the width of 'W' in the current font), and +// the height of a cell is given by the default line height for the current +// font. +// +// It is assumed that the text storage is set up so that each wide character is +// followed by a 'zero-width space' character (Unicode 0x200b); these are not +// rendered. If a wide character is not followed by a zero-width space, then +// the next character will render on top of it. +// +- (void)layoutGlyphsInLayoutManager:(NSLayoutManager *)lm + startingAtGlyphIndex:(unsigned)startGlyphIdx + maxNumberOfLineFragments:(unsigned)maxNumLines + nextGlyphIndex:(unsigned *)nextGlyph +{ + // TODO: Check that it really is an MMTextStorage. + MMTextStorage *ts = (MMTextStorage*)[lm textStorage]; + NSTextView *tv = [lm firstTextView]; + NSTextContainer *tc = [tv textContainer]; + NSFont *font = [ts font]; + NSString *text = [ts string]; + unsigned textLen = [text length]; + float cellWidth = [ts cellWidth]; + float cellHeight = [lm defaultLineHeightForFont:font]; + float baseline = [font descender]; + + if (!(ts && tv && tc && font && text && textLen)) + return; + + unsigned startCharIdx = [lm characterIndexForGlyphAtIndex:startGlyphIdx]; + unsigned i, numberOfLines = 0, firstLine = 0; + NSRange firstLineRange = { 0, 0 }; + + // Find first line and its range, and count the number of lines. + for (i = 0; i < textLen; numberOfLines++) { + NSRange lineRange = [text lineRangeForRange:NSMakeRange(i, 0)]; + if (NSLocationInRange(startCharIdx, lineRange)) { + firstLine = numberOfLines; + firstLineRange = lineRange; + } + + i = NSMaxRange(lineRange); + } + + // Perform line fragment generation one line at a time. + NSRange lineRange = firstLineRange; + unsigned endGlyphIdx = startGlyphIdx; + for (i = 0; i < maxNumLines && lineRange.length; ++i) { + NSRange glyphRange = [lm glyphRangeForCharacterRange:lineRange + actualCharacterRange:nil]; + NSRect lineRect = { 0, (firstLine+i)*cellHeight, + cellWidth*(lineRange.length-1), cellHeight }; + unsigned endLineIdx = NSMaxRange(lineRange); + NSPoint glyphPt = { 0, cellHeight+baseline }; + unsigned j; + + endGlyphIdx = NSMaxRange(glyphRange); + + [lm setTextContainer:tc forGlyphRange:glyphRange]; + [lm setLineFragmentRect:lineRect forGlyphRange:glyphRange + usedRect:lineRect]; + //[lm setLocation:glyphPt forStartOfGlyphRange:glyphRange]; + + // Position each glyph individually to ensure they take up exactly one + // cell. + for (j = glyphRange.location; j < endGlyphIdx; ++j) { + [lm setLocation:glyphPt forStartOfGlyphRange:NSMakeRange(j, 1)]; + glyphPt.x += cellWidth; + } + + // Hide non-zero space characters (there is one after every wide + // character). + for (j = lineRange.location; j < endLineIdx; ++j) { + if ([text characterAtIndex:j] == 0x200b) { + NSRange range = { j, 1 }; + range = [lm glyphRangeForCharacterRange:range + actualCharacterRange:nil]; + [lm setNotShownAttribute:YES forGlyphAtIndex:range.location]; + } + } + + lineRange = [text lineRangeForRange:NSMakeRange(endLineIdx, 0)]; + } + + if (nextGlyph) + *nextGlyph = endGlyphIdx; +} + +@end // MMTypesetter + + + + +#if 0 +@implementation MMTypesetter (Private) + +- (NSCharacterSet *)hiddenCharSet +{ + static NSCharacterSet *hiddenCharSet = nil; + + if (!hiddenCharSet) { + NSString *string = [NSString stringWithFormat:@"%C\n", 0x200b]; + hiddenCharSet = [NSCharacterSet + characterSetWithCharactersInString:string]; + [hiddenCharSet retain]; + } + + return hiddenCharSet; +} + +@end // MMTypesetter (Private) +#endif diff --git a/MMWindowController.m b/MMWindowController.m index 8bc91167b5..2f3c863e12 100644 --- a/MMWindowController.m +++ b/MMWindowController.m @@ -8,6 +8,8 @@ * See README.txt for an overview of the Vim source code. */ +#define MM_USE_CUSTOM_TYPESETTER 1 + #import "MMWindowController.h" #import #import "MMTextView.h" @@ -16,6 +18,10 @@ #import "MacVim.h" #import "MMAppController.h" +#if MM_USE_CUSTOM_TYPESETTER +# import "MMTypesetter.h" +#endif + // Scroller type; these must match SBAR_* in gui.h enum { @@ -107,6 +113,12 @@ - (id)initWithVimController:(MMVimController *)controller NSTextContainer *tc = [[NSTextContainer alloc] initWithContainerSize: NSMakeSize(1.0e7,1.0e7)]; +#if MM_USE_CUSTOM_TYPESETTER + MMTypesetter *typesetter = [[MMTypesetter alloc] init]; + [lm setTypesetter:typesetter]; + [typesetter release]; +#endif + [tc setWidthTracksTextView:NO]; [tc setHeightTracksTextView:NO]; [tc setLineFragmentPadding:0]; From 846d11d79cf0022b91a759c4e1a701767a5b3099 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Thu, 9 Aug 2007 09:12:47 +0000 Subject: [PATCH 0086/1156] Added support for font panel. git-svn-id: http://macvim.googlecode.com/svn/trunk@106 96c4425d-ca35-0410-94e5-3396d5c13a8f --- Actions.plist | 2 ++ MMBackend.m | 22 +++++++++++++++++++++- MMTextView.m | 26 ++++++++++++++++++++++++++ gvimrc | 1 + 4 files changed, 50 insertions(+), 1 deletion(-) diff --git a/Actions.plist b/Actions.plist index 22c4c7012f..3f8093cd06 100644 --- a/Actions.plist +++ b/Actions.plist @@ -16,6 +16,8 @@ orderFrontCharacterPalette: + orderFrontFontPanel: + performClose: performMiniaturize: diff --git a/MMBackend.m b/MMBackend.m index a80a635f85..934acef1c2 100644 --- a/MMBackend.m +++ b/MMBackend.m @@ -906,6 +906,25 @@ - (void)handleMessage:(int)msgid data:(NSData *)data } } } + } else if (SetFontMsgID == msgid) { + if (!data) return; + const void *bytes = [data bytes]; + float pointSize = *((float*)bytes); bytes += sizeof(float); + //unsigned len = *((unsigned*)bytes); bytes += sizeof(unsigned); + bytes += sizeof(unsigned); // len not used + + NSMutableString *name = [NSMutableString stringWithUTF8String:bytes]; + [name appendString:[NSString stringWithFormat:@":h%f", pointSize]]; + + gui_init_font((char_u*)[name UTF8String], FALSE); + + // Force screen redraw (does it have to be this complicated?). + redraw_all_later(CLEAR); + update_screen(NOT_VALID); + setcursor(); + out_flush(); + gui_update_cursor(FALSE, FALSE); + gui_mch_flush(); } else if (VimShouldCloseMsgID == msgid) { gui_shell_closed(); } else if (DropFilesMsgID == msgid) { @@ -960,7 +979,8 @@ - (void)handleMessage:(int)msgid data:(NSData *)data do_cmdline_cmd((char_u*)[cmd UTF8String]); - // This code was taken from the end of gui_handle_drop(). + // Force screen redraw (does it have to be this complicated?). + // (This code was taken from the end of gui_handle_drop().) update_screen(NOT_VALID); setcursor(); out_flush(); diff --git a/MMTextView.m b/MMTextView.m index f4c2fd4a28..0f39be8baa 100644 --- a/MMTextView.m +++ b/MMTextView.m @@ -334,6 +334,32 @@ - (NSDragOperation)draggingUpdated:(id )sender return NSDragOperationNone; } +- (void)changeFont:(id)sender +{ + MMTextStorage *ts = (MMTextStorage*)[self textStorage]; + if (!ts) return; + + NSFont *oldFont = [ts font]; + NSFont *newFont = [sender convertFont:oldFont]; + + if (newFont) { + NSString *name = [newFont displayName]; + unsigned len = [name lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; + if (len > 0) { + NSMutableData *data = [NSMutableData data]; + float pointSize = [newFont pointSize]; + + [data appendBytes:&pointSize length:sizeof(float)]; + + ++len; // include NUL byte + [data appendBytes:&len length:sizeof(unsigned)]; + [data appendBytes:[name UTF8String] length:len]; + + [[self vimController] sendMessage:SetFontMsgID data:data wait:NO]; + } + } +} + @end // MMTextView diff --git a/gvimrc b/gvimrc index 47ff6fcfc8..b504fa37dd 100644 --- a/gvimrc +++ b/gvimrc @@ -26,6 +26,7 @@ an 10.330 File.Close:q :confirm q "an 10.331 File.Close\ Tab :tabclose an 20.460 Edit.-SEP4- +an 20.465 Edit.Show\ Fonts\.\.\. :action orderFrontFontPanel: an 20.470 Edit.Special\ Characters\.\.\. :action orderFrontCharacterPalette: From be3881c8f9e290d59c3e0bb6eb6e201d0304af77 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Thu, 9 Aug 2007 09:24:29 +0000 Subject: [PATCH 0087/1156] Changing font via font panel now sets 'guifont' as well. git-svn-id: http://macvim.googlecode.com/svn/trunk@107 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMBackend.m | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/MMBackend.m b/MMBackend.m index 934acef1c2..a7d34f9f31 100644 --- a/MMBackend.m +++ b/MMBackend.m @@ -914,9 +914,9 @@ - (void)handleMessage:(int)msgid data:(NSData *)data bytes += sizeof(unsigned); // len not used NSMutableString *name = [NSMutableString stringWithUTF8String:bytes]; - [name appendString:[NSString stringWithFormat:@":h%f", pointSize]]; + [name appendString:[NSString stringWithFormat:@":h%.2f", pointSize]]; - gui_init_font((char_u*)[name UTF8String], FALSE); + set_option_value((char_u*)"gfn", 0, (char_u*)[name UTF8String], 0); // Force screen redraw (does it have to be this complicated?). redraw_all_later(CLEAR); From ba058d45a9f00141efea7c8b3cbf5ba7cc889f54 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Thu, 9 Aug 2007 10:22:52 +0000 Subject: [PATCH 0088/1156] - All user default key variables end with 'key' - Added user default keys: typesetter, cellwidthmultiplier, baselineoffset - Cell width calculations based on widht of 'm' (so that 'cellwidthmultiplier' is the width of a cell in em-units) git-svn-id: http://macvim.googlecode.com/svn/trunk@108 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMAppController.h | 13 ++++++++----- MMAppController.m | 29 ++++++++++++++++++----------- MMTextStorage.m | 7 ++++++- MMTypesetter.m | 6 ++++++ MMWindowController.m | 37 +++++++++++++++++++------------------ 5 files changed, 57 insertions(+), 35 deletions(-) diff --git a/MMAppController.h b/MMAppController.h index 086749e347..abf9a69bf0 100644 --- a/MMAppController.h +++ b/MMAppController.h @@ -18,11 +18,14 @@ extern NSString *MMTabMinWidthKey; extern NSString *MMTabMaxWidthKey; extern NSString *MMTabOptimumWidthKey; extern NSString *MMStatuslineOffKey; -extern NSString *MMTextInsetLeft; -extern NSString *MMTextInsetRight; -extern NSString *MMTextInsetTop; -extern NSString *MMTextInsetBottom; -extern NSString *MMTerminateAfterLastWindowClosed; +extern NSString *MMTextInsetLeftKey; +extern NSString *MMTextInsetRightKey; +extern NSString *MMTextInsetTopKey; +extern NSString *MMTextInsetBottomKey; +extern NSString *MMTerminateAfterLastWindowClosedKey; +extern NSString *MMTypesetterKey; +extern NSString *MMCellWidthMultiplierKey; +extern NSString *MMBaselineOffsetKey; diff --git a/MMAppController.m b/MMAppController.m index cfd4b1726d..220cec88db 100644 --- a/MMAppController.m +++ b/MMAppController.m @@ -19,11 +19,15 @@ NSString *MMTabMaxWidthKey = @"tabmaxwidth"; NSString *MMTabOptimumWidthKey = @"taboptimumwidth"; NSString *MMStatuslineOffKey = @"statuslineoff"; -NSString *MMTextInsetLeft = @"insetleft"; -NSString *MMTextInsetRight = @"insetright"; -NSString *MMTextInsetTop = @"insettop"; -NSString *MMTextInsetBottom = @"insetbottom"; -NSString *MMTerminateAfterLastWindowClosed = @"terminateafterlastwindowclosed"; +NSString *MMTextInsetLeftKey = @"insetleft"; +NSString *MMTextInsetRightKey = @"insetright"; +NSString *MMTextInsetTopKey = @"insettop"; +NSString *MMTextInsetBottomKey = @"insetbottom"; +NSString *MMTerminateAfterLastWindowClosedKey + = @"terminateafterlastwindowclosed"; +NSString *MMTypesetterKey = @"typesetter"; +NSString *MMCellWidthMultiplierKey = @"cellwidthmultiplier"; +NSString *MMBaselineOffsetKey = @"baselineoffset"; @@ -56,11 +60,14 @@ + (void)initialize [NSNumber numberWithInt:6*64], MMTabMaxWidthKey, [NSNumber numberWithInt:132], MMTabOptimumWidthKey, [NSNumber numberWithBool:NO], MMStatuslineOffKey, - [NSNumber numberWithInt:2], MMTextInsetLeft, - [NSNumber numberWithInt:1], MMTextInsetRight, - [NSNumber numberWithInt:1], MMTextInsetTop, - [NSNumber numberWithInt:1], MMTextInsetBottom, - [NSNumber numberWithBool:NO], MMTerminateAfterLastWindowClosed, + [NSNumber numberWithInt:2], MMTextInsetLeftKey, + [NSNumber numberWithInt:1], MMTextInsetRightKey, + [NSNumber numberWithInt:1], MMTextInsetTopKey, + [NSNumber numberWithInt:1], MMTextInsetBottomKey, + [NSNumber numberWithBool:NO], MMTerminateAfterLastWindowClosedKey, + @"MMTypesetter", MMTypesetterKey, + [NSNumber numberWithFloat:1.0], MMCellWidthMultiplierKey, + [NSNumber numberWithFloat:0.0], MMBaselineOffsetKey, nil]; [[NSUserDefaults standardUserDefaults] registerDefaults:dict]; @@ -181,7 +188,7 @@ - (void)application:(NSApplication *)sender openFiles:(NSArray *)filenames - (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)sender { return [[NSUserDefaults standardUserDefaults] - boolForKey:MMTerminateAfterLastWindowClosed]; + boolForKey:MMTerminateAfterLastWindowClosedKey]; } - (NSApplicationTerminateReply)applicationShouldTerminate: diff --git a/MMTextStorage.m b/MMTextStorage.m index c69dff86ff..08610b137f 100644 --- a/MMTextStorage.m +++ b/MMTextStorage.m @@ -9,6 +9,7 @@ */ #import "MMTextStorage.h" +#import "MMAppController.h" // If 0 DRAW_TRANSP flag will be ignored. Setting it to 1 causes the cursor // background to be drawn in white. @@ -510,7 +511,11 @@ - (NSSize)fitToSize:(NSSize)size rows:(int *)rows columns:(int *)columns - (float)cellWidth { - return [font widthOfString:@"W"]; + float em = [font widthOfString:@"m"]; + float cellWidthMultiplier = [[NSUserDefaults standardUserDefaults] + floatForKey:MMCellWidthMultiplierKey]; + + return em * cellWidthMultiplier; } @end // MMTextStorage diff --git a/MMTypesetter.m b/MMTypesetter.m index aa65b2d109..2ab3af4bbf 100644 --- a/MMTypesetter.m +++ b/MMTypesetter.m @@ -10,6 +10,7 @@ #import "MMTypesetter.h" #import "MMTextStorage.h" +#import "MMAppController.h" @@ -55,6 +56,11 @@ - (void)layoutGlyphsInLayoutManager:(NSLayoutManager *)lm if (!(ts && tv && tc && font && text && textLen)) return; + float baselineOffset = [[NSUserDefaults standardUserDefaults] + floatForKey:MMBaselineOffsetKey]; + + baseline += baselineOffset; + unsigned startCharIdx = [lm characterIndexForGlyphAtIndex:startGlyphIdx]; unsigned i, numberOfLines = 0, firstLine = 0; NSRange firstLineRange = { 0, 0 }; diff --git a/MMWindowController.m b/MMWindowController.m index 2f3c863e12..6660df839b 100644 --- a/MMWindowController.m +++ b/MMWindowController.m @@ -8,8 +8,6 @@ * See README.txt for an overview of the Vim source code. */ -#define MM_USE_CUSTOM_TYPESETTER 1 - #import "MMWindowController.h" #import #import "MMTextView.h" @@ -17,10 +15,7 @@ #import "MMVimController.h" #import "MacVim.h" #import "MMAppController.h" - -#if MM_USE_CUSTOM_TYPESETTER -# import "MMTypesetter.h" -#endif +#import "MMTypesetter.h" // Scroller type; these must match SBAR_* in gui.h @@ -113,11 +108,17 @@ - (id)initWithVimController:(MMVimController *)controller NSTextContainer *tc = [[NSTextContainer alloc] initWithContainerSize: NSMakeSize(1.0e7,1.0e7)]; -#if MM_USE_CUSTOM_TYPESETTER - MMTypesetter *typesetter = [[MMTypesetter alloc] init]; - [lm setTypesetter:typesetter]; - [typesetter release]; -#endif + NSString *typesetterString = [[NSUserDefaults standardUserDefaults] + stringForKey:MMTypesetterKey]; + if (![typesetterString isEqual:@"NSTypesetter"]) { + MMTypesetter *typesetter = [[MMTypesetter alloc] init]; + [lm setTypesetter:typesetter]; + [typesetter release]; + } else { + // Only MMTypesetter supports different cell width multipliers. + [[NSUserDefaults standardUserDefaults] + setFloat:1.0 forKey:MMCellWidthMultiplierKey]; + } [tc setWidthTracksTextView:NO]; [tc setHeightTracksTextView:NO]; @@ -130,8 +131,8 @@ - (id)initWithVimController:(MMVimController *)controller textContainer:tc]; NSUserDefaults *ud = [NSUserDefaults standardUserDefaults]; - int left = [ud integerForKey:MMTextInsetLeft]; - int top = [ud integerForKey:MMTextInsetTop]; + int left = [ud integerForKey:MMTextInsetLeftKey]; + int top = [ud integerForKey:MMTextInsetTopKey]; [textView setTextContainerInset:NSMakeSize(left, top)]; // The text storage retains the layout manager which in turn retains @@ -628,8 +629,8 @@ - (NSSize)contentSizeForTextStorageSize:(NSSize)textViewSize NSSize size = textViewSize; NSUserDefaults *ud = [NSUserDefaults standardUserDefaults]; - int right = [ud integerForKey:MMTextInsetRight]; - int bot = [ud integerForKey:MMTextInsetBottom]; + int right = [ud integerForKey:MMTextInsetRightKey]; + int bot = [ud integerForKey:MMTextInsetBottomKey]; size.width += [textView textContainerOrigin].x + right; size.height += [textView textContainerOrigin].y + bot; @@ -638,7 +639,7 @@ - (NSSize)contentSizeForTextStorageSize:(NSSize)textViewSize if ([tabBarControl isHidden]) ++size.height; else size.height += [tabBarControl frame].size.height; - if (![[NSUserDefaults standardUserDefaults] boolForKey:MMStatuslineOffKey]) + if (![ud boolForKey:MMStatuslineOffKey]) size.height += StatusLineHeight; if ([self bottomScrollbarVisible]) @@ -684,8 +685,8 @@ - (NSSize)textStorageSizeForTextViewSize:(NSSize)textViewSize NSSize size = textViewSize; NSUserDefaults *ud = [NSUserDefaults standardUserDefaults]; - int right = [ud integerForKey:MMTextInsetRight]; - int bot = [ud integerForKey:MMTextInsetBottom]; + int right = [ud integerForKey:MMTextInsetRightKey]; + int bot = [ud integerForKey:MMTextInsetBottomKey]; size.width -= [textView textContainerOrigin].x + right; size.height -= [textView textContainerOrigin].y + bot; From d355ab4b00a580a4540edb34f84c767d3b7dd389 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Thu, 9 Aug 2007 11:19:08 +0000 Subject: [PATCH 0089/1156] Hides end-of-line characters git-svn-id: http://macvim.googlecode.com/svn/trunk@109 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMTypesetter.m | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/MMTypesetter.m b/MMTypesetter.m index 2ab3af4bbf..f1140e9b24 100644 --- a/MMTypesetter.m +++ b/MMTypesetter.m @@ -28,7 +28,7 @@ @implementation MMTypesetter // Layout glyphs so that each glyph takes up exactly one cell. // // The width of a cell is determined by [MMTextStorage cellWidth] (which -// typically sets one cell to equal the width of 'W' in the current font), and +// typically sets one cell to equal the width of 'm' in the current font), and // the height of a cell is given by the default line height for the current // font. // @@ -93,7 +93,6 @@ - (void)layoutGlyphsInLayoutManager:(NSLayoutManager *)lm [lm setTextContainer:tc forGlyphRange:glyphRange]; [lm setLineFragmentRect:lineRect forGlyphRange:glyphRange usedRect:lineRect]; - //[lm setLocation:glyphPt forStartOfGlyphRange:glyphRange]; // Position each glyph individually to ensure they take up exactly one // cell. @@ -102,10 +101,11 @@ - (void)layoutGlyphsInLayoutManager:(NSLayoutManager *)lm glyphPt.x += cellWidth; } - // Hide non-zero space characters (there is one after every wide - // character). + // Hide end-of-line and non-zero space characters (there is one after + // every wide character). for (j = lineRange.location; j < endLineIdx; ++j) { - if ([text characterAtIndex:j] == 0x200b) { + unichar ch = [text characterAtIndex:j]; + if (ch == 0x200b || ch == '\n') { NSRange range = { j, 1 }; range = [lm glyphRangeForCharacterRange:range actualCharacterRange:nil]; From ddc4ed0b35ce988a8d7332908bf64b8b1f0557f7 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Thu, 9 Aug 2007 17:48:17 +0000 Subject: [PATCH 0090/1156] - First window autosaves its position - Safari-like window cascading support (cascade from key window) git-svn-id: http://macvim.googlecode.com/svn/trunk@110 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMAppController.h | 6 +++-- MMAppController.m | 55 +++++++++++++++++++++++++++++++++++++++++--- MMBackend.h | 3 +-- MMWindowController.h | 6 +++-- MMWindowController.m | 52 ++++++++++++++++++++++++++++++++++++++++- 5 files changed, 112 insertions(+), 10 deletions(-) diff --git a/MMAppController.h b/MMAppController.h index abf9a69bf0..d73becf36b 100644 --- a/MMAppController.h +++ b/MMAppController.h @@ -28,13 +28,15 @@ extern NSString *MMCellWidthMultiplierKey; extern NSString *MMBaselineOffsetKey; +@class MMWindowController; -@interface MMAppController : NSObject -{ + +@interface MMAppController : NSObject { NSMutableArray *vimControllers; } - (void)removeVimController:(id)controller; +- (void)windowControllerWillOpen:(MMWindowController *)windowController; - (IBAction)newVimWindow:(id)sender; - (IBAction)selectNextWindow:(id)sender; - (IBAction)selectPreviousWindow:(id)sender; diff --git a/MMAppController.m b/MMAppController.m index 220cec88db..82bb04934c 100644 --- a/MMAppController.m +++ b/MMAppController.m @@ -10,6 +10,7 @@ #import "MMAppController.h" #import "MMVimController.h" +#import "MMWindowController.h" @@ -30,6 +31,10 @@ NSString *MMBaselineOffsetKey = @"baselineoffset"; +// Key in user defaults for autosave data. +NSString *MMAutosaveKey = @"DefaultWindow"; + + @interface MMAppController (MMServices) - (void)openSelection:(NSPasteboard *)pboard userData:(NSString *)userData @@ -249,6 +254,42 @@ - (void)removeVimController:(id)controller } } +- (void)windowControllerWillOpen:(MMWindowController *)windowController +{ + NSPoint topLeft = NSZeroPoint; + NSWindow *keyWin = [NSApp keyWindow]; + NSWindow *win = [windowController window]; + + if (!win) return; + + // If there is a key window, cascade from it, otherwise use the autosaved + // window position (if any). + if (keyWin) { + NSRect frame = [keyWin frame]; + topLeft = NSMakePoint(frame.origin.x, NSMaxY(frame)); + } else { + NSDictionary *dict = [[NSUserDefaults standardUserDefaults] + dictionaryForKey:MMAutosaveKey]; + if (dict) { + id x = [dict objectForKey:@"x"]; + id y = [dict objectForKey:@"y"]; + + if (x && [x isKindOfClass:[NSNumber class]] && + y && [y isKindOfClass:[NSNumber class]]) { + topLeft.x = [x floatValue]; + topLeft.y = [y floatValue]; + } + } + } + + if (!NSEqualPoints(topLeft, NSZeroPoint)) { + if (keyWin) + topLeft = [win cascadeTopLeftFromPoint:topLeft]; + + [win setFrameTopLeftPoint:topLeft]; + } +} + - (IBAction)newVimWindow:(id)sender { NSMutableArray *args = [NSMutableArray arrayWithObject:@"-g"]; @@ -311,15 +352,23 @@ - (IBAction)selectPreviousWindow:(id)sender [(NSDistantObject*)backend setProtocolForProxy:@protocol(MMBackendProtocol)]; - MMVimController *wc = [[[MMVimController alloc] initWithBackend:backend] + MMVimController *vc = [[[MMVimController alloc] initWithBackend:backend] autorelease]; - [vimControllers addObject:wc]; + + if (![vimControllers count]) { + // The first window autosaves its position. (The autosaving features + // of Cocoa are not used because we need more control over what is + // autosaved and when it is restored.) + [[vc windowController] setWindowAutosaveKey:MMAutosaveKey]; + } + + [vimControllers addObject:vc]; // HACK! MacVim does not get activated if it is launched from the // terminal, so we forcibly activate here. [NSApp activateIgnoringOtherApps:YES]; - return wc; + return vc; } @end // MMAppController diff --git a/MMBackend.h b/MMBackend.h index 7742a499af..f4a8499520 100644 --- a/MMBackend.h +++ b/MMBackend.h @@ -13,8 +13,7 @@ -@interface MMBackend : NSObject -{ +@interface MMBackend : NSObject { NSMutableArray *queue; NSMutableData *drawData; NSConnection *connection; diff --git a/MMWindowController.h b/MMWindowController.h index 144c2f43a2..39c8c8515a 100644 --- a/MMWindowController.h +++ b/MMWindowController.h @@ -16,8 +16,7 @@ @class MMVimController; -@interface MMWindowController : NSWindowController -{ +@interface MMWindowController : NSWindowController { IBOutlet PSMTabBarControl *tabBarControl; IBOutlet NSTabView *tabView; IBOutlet NSTextField *statusTextField; @@ -32,12 +31,15 @@ NSMutableArray *scrollbars; BOOL setupDone; BOOL shouldUpdateWindowSize; + NSString *windowAutosaveKey; } - (id)initWithVimController:(MMVimController *)controller; - (MMVimController *)vimController; - (MMTextView *)textView; - (MMTextStorage *)textStorage; +- (NSString *)windowAutosaveKey; +- (void)setWindowAutosaveKey:(NSString *)key; - (void)openWindow; - (void)updateTabsWithData:(NSData *)data; - (void)selectTabWithIndex:(int)idx; diff --git a/MMWindowController.m b/MMWindowController.m index 6660df839b..bc33cc0911 100644 --- a/MMWindowController.m +++ b/MMWindowController.m @@ -67,6 +67,7 @@ - (BOOL)rightScrollbarVisible; - (void)placeScrollbars; - (void)scroll:(id)sender; - (void)placeViews; +- (NSDictionary *)windowAutosaveDict; @end @@ -102,6 +103,9 @@ - (id)initWithVimController:(MMVimController *)controller vimController = controller; scrollbars = [[NSMutableArray alloc] init]; + // Window cascading is handled by MMAppController. + [self setShouldCascadeWindows:NO]; + // Setup a complete text system. textStorage = [[MMTextStorage alloc] init]; NSLayoutManager *lm = [[NSLayoutManager alloc] init]; @@ -220,8 +224,21 @@ - (MMTextStorage *)textStorage return textStorage; } +- (NSString *)windowAutosaveKey +{ + return windowAutosaveKey; +} + +- (void)setWindowAutosaveKey:(NSString *)key +{ + [windowAutosaveKey autorelease]; + windowAutosaveKey = [key copy]; +} + - (void)openWindow { + [[NSApp delegate] windowControllerWillOpen:self]; + [self addNewTabViewItem]; // NOTE! This flag is set once the entire text system is set up. @@ -229,7 +246,6 @@ - (void)openWindow [self updateResizeIncrements]; [self resizeWindowToFit:self]; - [[self window] makeKeyAndOrderFront:self]; BOOL statusOff = [[NSUserDefaults standardUserDefaults] @@ -541,6 +557,16 @@ - (void)windowWillClose:(NSNotification *)notification [tabBarControl setDelegate:nil]; } +- (void)windowDidMove:(NSNotification *)notification +{ + if (windowAutosaveKey) { + NSDictionary *dict = [self windowAutosaveDict]; + if (dict) + [[NSUserDefaults standardUserDefaults] + setObject:dict forKey:windowAutosaveKey]; + } +} + - (void)windowDidResize:(id)sender { if (!setupDone) return; @@ -1039,6 +1065,30 @@ - (void)placeViews [self placeScrollbars]; } +- (NSDictionary *)windowAutosaveDict +{ + if (!setupDone) + return nil; + + int rows = 0, cols = 0; + if (textStorage) + [textStorage getMaxRows:&rows columns:&cols]; + + NSPoint origin = NSZeroPoint; + if (setupDone) { + NSRect frame = [[self window] frame]; + origin = NSMakePoint(frame.origin.x, NSMaxY(frame)); + } + + NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys: + [NSNumber numberWithInt:rows], @"Rows", + [NSNumber numberWithInt:cols], @"Columns", + [NSNumber numberWithFloat:origin.x], @"x", + [NSNumber numberWithFloat:origin.y], @"y", nil]; + + return dict; +} + @end // MMWindowController (Private) From 9b9a6096edfd89b5ca72f43eda8150ed7040bdc2 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Thu, 9 Aug 2007 18:25:16 +0000 Subject: [PATCH 0091/1156] Key down events in which Ctrl, Alt, or Command is held are immediately sent off to Vim instead of to interpretKeyEvents:. This is an attempt to bypass Key Bindings in Cocoa, since some key bindings cause several doCommandBySelector: messages to be sent (which means the key gets repeated). This fixed the CTRL-O bug in insert mode. git-svn-id: http://macvim.googlecode.com/svn/trunk@111 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMTextView.m | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/MMTextView.m b/MMTextView.m index 0f39be8baa..58e2bb35fe 100644 --- a/MMTextView.m +++ b/MMTextView.m @@ -80,6 +80,7 @@ - (void)doCommandBySelector:(SEL)selector // We usually end up here if the user pressed Ctrl+key (but not // Ctrl+Option+key). + //NSLog(@"%s%@", _cmd, NSStringFromSelector(selector)); [self dispatchKeyEvent:[NSApp currentEvent]]; } @@ -387,6 +388,21 @@ - (BOOL)convertPoint:(NSPoint)point toRow:(int *)row column:(int *)column return YES; } +- (void)keyDown:(NSEvent *)event +{ + // HACK! If a modifier is held, don't pass the event along to + // interpretKeyEvents: since some keys are bound to multiple commands which + // means doCommandBySelector: is called several times. + // + // TODO: Figure out a way to disable Cocoa key bindings entirely. + + if ([event modifierFlags] & + (NSControlKeyMask|NSAlternateKeyMask|NSCommandKeyMask)) + [self dispatchKeyEvent:event]; + else + [super keyDown:event]; +} + - (void)dispatchKeyEvent:(NSEvent *)event { // Only handle the command if it came from a keyDown event @@ -431,6 +447,7 @@ - (void)dispatchKeyEvent:(NSEvent *)event [NSCursor setHiddenUntilMouseMoves:YES]; + //NSLog(@"%s len=%d bytes=0x%x", _cmd, len, bytes[0]); [[self vimController] sendMessage:KeyDownMsgID data:data wait:NO]; } } From 0813d7c5c2f3973f88edba620dd923d8af989c2b Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Thu, 9 Aug 2007 19:30:30 +0000 Subject: [PATCH 0092/1156] Only bypass interpretKeyEvents: if Ctrl is held on key down (fixes bug where alt-e, e, did not produce e-acute). git-svn-id: http://macvim.googlecode.com/svn/trunk@112 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMTextView.m | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/MMTextView.m b/MMTextView.m index 58e2bb35fe..040d50647a 100644 --- a/MMTextView.m +++ b/MMTextView.m @@ -394,10 +394,10 @@ - (void)keyDown:(NSEvent *)event // interpretKeyEvents: since some keys are bound to multiple commands which // means doCommandBySelector: is called several times. // - // TODO: Figure out a way to disable Cocoa key bindings entirely. + // TODO: Figure out a way to disable Cocoa key bindings entirely, without + // affecting input management. - if ([event modifierFlags] & - (NSControlKeyMask|NSAlternateKeyMask|NSCommandKeyMask)) + if ([event modifierFlags] & NSControlKeyMask) [self dispatchKeyEvent:event]; else [super keyDown:event]; From b3c22363a4962776839667b47eae8ca40386c3e1 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Fri, 10 Aug 2007 10:10:52 +0000 Subject: [PATCH 0093/1156] - Default baselineoffset changed to -1 - Added user default 'centerglyphs' for nicer looking proportional fonts (disabled by default) git-svn-id: http://macvim.googlecode.com/svn/trunk@113 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMAppController.h | 1 + MMAppController.m | 6 ++++-- MMTypesetter.m | 31 ++++++++++++++++++++++++++----- 3 files changed, 31 insertions(+), 7 deletions(-) diff --git a/MMAppController.h b/MMAppController.h index d73becf36b..5bc675e01a 100644 --- a/MMAppController.h +++ b/MMAppController.h @@ -26,6 +26,7 @@ extern NSString *MMTerminateAfterLastWindowClosedKey; extern NSString *MMTypesetterKey; extern NSString *MMCellWidthMultiplierKey; extern NSString *MMBaselineOffsetKey; +extern NSString *MMCenterGlyphsKey; @class MMWindowController; diff --git a/MMAppController.m b/MMAppController.m index 82bb04934c..adeca6b974 100644 --- a/MMAppController.m +++ b/MMAppController.m @@ -29,6 +29,7 @@ NSString *MMTypesetterKey = @"typesetter"; NSString *MMCellWidthMultiplierKey = @"cellwidthmultiplier"; NSString *MMBaselineOffsetKey = @"baselineoffset"; +NSString *MMCenterGlyphsKey = @"centerglyphs"; // Key in user defaults for autosave data. @@ -71,8 +72,9 @@ + (void)initialize [NSNumber numberWithInt:1], MMTextInsetBottomKey, [NSNumber numberWithBool:NO], MMTerminateAfterLastWindowClosedKey, @"MMTypesetter", MMTypesetterKey, - [NSNumber numberWithFloat:1.0], MMCellWidthMultiplierKey, - [NSNumber numberWithFloat:0.0], MMBaselineOffsetKey, + [NSNumber numberWithFloat:1], MMCellWidthMultiplierKey, + [NSNumber numberWithFloat:-1], MMBaselineOffsetKey, + [NSNumber numberWithBool:NO], MMCenterGlyphsKey, nil]; [[NSUserDefaults standardUserDefaults] registerDefaults:dict]; diff --git a/MMTypesetter.m b/MMTypesetter.m index f1140e9b24..241f50427c 100644 --- a/MMTypesetter.m +++ b/MMTypesetter.m @@ -58,6 +58,8 @@ - (void)layoutGlyphsInLayoutManager:(NSLayoutManager *)lm float baselineOffset = [[NSUserDefaults standardUserDefaults] floatForKey:MMBaselineOffsetKey]; + BOOL centerGlyphs = [[NSUserDefaults standardUserDefaults] + boolForKey:MMCenterGlyphsKey]; baseline += baselineOffset; @@ -94,11 +96,30 @@ - (void)layoutGlyphsInLayoutManager:(NSLayoutManager *)lm [lm setLineFragmentRect:lineRect forGlyphRange:glyphRange usedRect:lineRect]; - // Position each glyph individually to ensure they take up exactly one - // cell. - for (j = glyphRange.location; j < endGlyphIdx; ++j) { - [lm setLocation:glyphPt forStartOfGlyphRange:NSMakeRange(j, 1)]; - glyphPt.x += cellWidth; + if (centerGlyphs) { + // Center each glyph inside its cell. (Optional) + // + Proportional fonts look better. + // - The cursor changes width depending on which glyph it is over + // and selections look uneven. + for (j = glyphRange.location; j < endGlyphIdx; ++j) { + NSGlyph glyph = [lm glyphAtIndex:j]; + NSSize adv = [font advancementForGlyph:glyph]; + NSPoint pt = glyphPt; + if (adv.width > 0 && adv.width < cellWidth) { + pt.x += .5*(cellWidth-adv.width); + } + [lm setLocation:pt forStartOfGlyphRange:NSMakeRange(j, 1)]; + glyphPt.x += cellWidth; + } + } else { + // Position each glyph individually to ensure they take up exactly + // one cell. (Default) + // + The cursor and selections look good + // - Proportional fonts look bad (try entering 'Wi') + for (j = glyphRange.location; j < endGlyphIdx; ++j) { + [lm setLocation:glyphPt forStartOfGlyphRange:NSMakeRange(j, 1)]; + glyphPt.x += cellWidth; + } } // Hide end-of-line and non-zero space characters (there is one after From 556bf0a410dc84d38446c810eaf4c5b6405b919c Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Fri, 10 Aug 2007 10:24:28 +0000 Subject: [PATCH 0094/1156] Disabled NSTextView's popup menus git-svn-id: http://macvim.googlecode.com/svn/trunk@114 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMTextView.m | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/MMTextView.m b/MMTextView.m index 040d50647a..6e6946083e 100644 --- a/MMTextView.m +++ b/MMTextView.m @@ -240,15 +240,13 @@ - (void)otherMouseDragged:(NSEvent *)event [self mouseDragged:event]; } -#if 0 -- (void)menuForEvent:(NSEvent *)event +- (NSMenu*)menuForEvent:(NSEvent *)event { - // TODO: Enabling this causes a crash at the moment. Why? - // - // Called when user Ctrl-clicks in the view - [self mouseDown:event]; + // HACK! Return nil to disable NSTextView's popup menus (Vim provides its + // own). Called when user Ctrl-clicks in the view (this is already handled + // in rightMouseDown:). + return nil; } -#endif - (NSArray *)acceptableDragTypes { From 1b2826662283d983c60eb1eb712b84ecb274667a Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Fri, 10 Aug 2007 13:28:59 +0000 Subject: [PATCH 0095/1156] - Added support for popup menus - Adding a submenu to a popup menu now places the submenu under the popup menu instead of under the main menu (bug) git-svn-id: http://macvim.googlecode.com/svn/trunk@115 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMBackend.h | 1 + MMBackend.m | 11 ++++++ MMTextView.h | 2 ++ MMTextView.m | 22 ++++++++++++ MMVimController.h | 2 +- MMVimController.m | 92 +++++++++++++++++++++++++++++++++++++++-------- MacVim.h | 1 + MacVim.m | 1 + gui_macvim.m | 2 ++ 9 files changed, 118 insertions(+), 16 deletions(-) diff --git a/MMBackend.h b/MMBackend.h index f4a8499520..1f64714b75 100644 --- a/MMBackend.h +++ b/MMBackend.h @@ -67,6 +67,7 @@ action:(NSString *)action atIndex:(int)index; - (void)removeMenuItemWithTag:(int)tag; - (void)enableMenuItemWithTag:(int)tag state:(int)enabled; +- (void)showPopupMenuWithName:(char *)name; - (void)showToolbar:(int)enable flags:(int)flags; - (void)createScrollbarWithIdentifier:(long)ident type:(int)type; - (void)destroyScrollbarWithIdentifier:(long)ident; diff --git a/MMBackend.m b/MMBackend.m index a7d34f9f31..cd28439190 100644 --- a/MMBackend.m +++ b/MMBackend.m @@ -481,6 +481,17 @@ - (void)enableMenuItemWithTag:(int)tag state:(int)enabled [self queueMessage:EnableMenuItemMsgID data:data]; } +- (void)showPopupMenuWithName:(char *)name +{ + int len = strlen(name); + NSMutableData *data = [NSMutableData data]; + + [data appendBytes:&len length:sizeof(int)]; + [data appendBytes:name length:len]; + + [self queueMessage:ShowPopupMenuMsgID data:data]; +} + - (void)showToolbar:(int)enable flags:(int)flags { NSMutableData *data = [NSMutableData data]; diff --git a/MMTextView.h b/MMTextView.h index af51abb675..d9c4c533c9 100644 --- a/MMTextView.h +++ b/MMTextView.h @@ -13,8 +13,10 @@ @interface MMTextView : NSTextView { BOOL shouldDrawInsertionPoint; + NSEvent *lastMouseDownEvent; } +- (void)popupMenu:(NSMenu *)menu; - (void)setShouldDrawInsertionPoint:(BOOL)enable; @end diff --git a/MMTextView.m b/MMTextView.m index 6e6946083e..884d21b931 100644 --- a/MMTextView.m +++ b/MMTextView.m @@ -26,6 +26,26 @@ - (MMVimController *)vimController; @implementation MMTextView +- (void)dealloc +{ + [lastMouseDownEvent release]; + [super dealloc]; +} + +- (void)popupMenu:(NSMenu *)menu +{ +#if 0 + NSEvent *event = [NSEvent + mouseEventWithType:NSLeftMouseDown location:NSZeroPoint + modifierFlags:0 timestamp:0 + windowNumber:[[self window] windowNumber] context:nil + eventNumber:0 clickCount:0 pressure:1.0]; + [NSMenu popUpContextMenu:menu withEvent:event forView:self]; +#else + [NSMenu popUpContextMenu:menu withEvent:lastMouseDownEvent forView:self]; +#endif +} + - (void)setShouldDrawInsertionPoint:(BOOL)enable { shouldDrawInsertionPoint = enable; @@ -162,6 +182,8 @@ - (void)mouseDown:(NSEvent *)event if (![self convertPoint:pt toRow:&row column:&col]) return; + lastMouseDownEvent = [event copy]; + int button = [event buttonNumber]; int flags = [event modifierFlags]; int count = [event clickCount]; diff --git a/MMVimController.h b/MMVimController.h index 69f2a4c1f2..943a897917 100644 --- a/MMVimController.h +++ b/MMVimController.h @@ -22,8 +22,8 @@ BOOL inProcessCommandQueue; NSMutableArray *sendQueue; NSMutableArray *mainMenuItems; + NSMutableArray *popupMenuItems; BOOL shouldUpdateMainMenu; - //NSMutableArray *popupMenus; NSToolbar *toolbar; NSMutableDictionary *toolbarItemDict; } diff --git a/MMVimController.m b/MMVimController.m index a4f955f013..6aa417f448 100644 --- a/MMVimController.m +++ b/MMVimController.m @@ -26,7 +26,8 @@ - (void)panelDidEnd:(NSSavePanel *)panel code:(int)code context:(void *)context; - (NSMenuItem *)menuItemForTag:(int)tag; - (NSMenu *)menuForTag:(int)tag; -- (void)addMenuWithTag:(int)tag parent:(NSMenu *)parent title:(NSString *)title +- (NSMenu *)topLevelMenuForTitle:(NSString *)title; +- (void)addMenuWithTag:(int)tag parent:(int)parentTag title:(NSString *)title atIndex:(int)idx; - (void)addMenuItemWithTag:(int)tag parent:(NSMenu *)parent title:(NSString *)title tip:(NSString *)tip @@ -85,6 +86,7 @@ - (id)initWithBackend:(id)backend backendProxy = [backend retain]; sendQueue = [NSMutableArray new]; mainMenuItems = [[NSMutableArray alloc] init]; + popupMenuItems = [[NSMutableArray alloc] init]; toolbarItemDict = [[NSMutableDictionary alloc] init]; NSConnection *connection = [backendProxy connectionForProxy]; @@ -107,6 +109,7 @@ - (void)dealloc [toolbarItemDict release]; [toolbar release]; + [popupMenuItems release]; [mainMenuItems release]; [windowController release]; @@ -408,11 +411,8 @@ - (void)handleMessage:(int)msgid data:(NSData *)data [[windowController window] setToolbar:toolbar]; } - } else if (MenuPopupType == parentTag) { - // TODO! } else if (title) { - NSMenu *parent = [self menuForTag:parentTag]; - [self addMenuWithTag:tag parent:parent title:title atIndex:idx]; + [self addMenuWithTag:tag parent:parentTag title:title atIndex:idx]; } [title release]; @@ -471,24 +471,32 @@ - (void)handleMessage:(int)msgid data:(NSData *)data const void *bytes = [data bytes]; int tag = *((int*)bytes); bytes += sizeof(int); - // TODO: Search for tag in popup menus. id item; int idx; if ((item = [self toolbarItemForTag:tag index:&idx])) { [toolbar removeItemAtIndex:idx]; } else if ((item = [self menuItemForTag:tag])) { - if ([item menu] == [NSApp mainMenu]) { - NSLog(@"Removing menu: %@", item); + [item retain]; + + if ([item menu] == [NSApp mainMenu] || ![item menu]) { + //NSLog(@"Removing menu: %@", item); + // NOTE: To be on the safe side we try to remove the item from + // both arrays (it is ok to call removeObject: even if an array + // does not contain the object to remove). [mainMenuItems removeObject:item]; + [popupMenuItems removeObject:item]; } - [[item menu] removeItem:item]; + + if ([item menu]) + [[item menu] removeItem:item]; + + [item release]; } } else if (EnableMenuItemMsgID == msgid) { const void *bytes = [data bytes]; int tag = *((int*)bytes); bytes += sizeof(int); int state = *((int*)bytes); bytes += sizeof(int); - // TODO: Search for tag in popup menus. id item = [self toolbarItemForTag:tag index:NULL]; if (!item) item = [self menuItemForTag:tag]; @@ -580,6 +588,24 @@ - (void)handleMessage:(int)msgid data:(NSData *)data [NSApp sendAction:sel to:nil from:self]; [actionName release]; + } else if (ShowPopupMenuMsgID == msgid) { + const void *bytes = [data bytes]; + int len = *((int*)bytes); bytes += sizeof(int); + NSString *title = [[NSString alloc] + initWithBytesNoCopy:(void*)bytes + length:len + encoding:NSUTF8StringEncoding + freeWhenDone:NO]; + + NSMenu *menu = [self topLevelMenuForTitle:title]; + if (menu) { + [[windowController textView] popupMenu:menu]; + } else { + NSLog(@"WARNING: Cannot popup menu with title %@; no such menu.", + title); + } + + [title release]; } else { NSLog(@"WARNING: Unknown message received (msgid=%d)", msgid); } @@ -679,6 +705,7 @@ - (void)panelDidEnd:(NSSavePanel *)panel code:(int)code context:(void *)context - (NSMenuItem *)menuItemForTag:(int)tag { + // Search the main menu. int i, count = [mainMenuItems count]; for (i = 0; i < count; ++i) { NSMenuItem *item = [mainMenuItems objectAtIndex:i]; @@ -687,6 +714,15 @@ - (NSMenuItem *)menuItemForTag:(int)tag if (item) return item; } + // Search the popup menus. + count = [popupMenuItems count]; + for (i = 0; i < count; ++i) { + NSMenuItem *item = [popupMenuItems objectAtIndex:i]; + if ([item tag] == tag) return item; + item = findMenuItemWithTagInMenu([item submenu], tag); + if (item) return item; + } + return nil; } @@ -695,9 +731,31 @@ - (NSMenu *)menuForTag:(int)tag return [[self menuItemForTag:tag] submenu]; } -- (void)addMenuWithTag:(int)tag parent:(NSMenu *)parent title:(NSString *)title +- (NSMenu *)topLevelMenuForTitle:(NSString *)title +{ + // Search only the top-level menus. + + unsigned i, count = [popupMenuItems count]; + for (i = 0; i < count; ++i) { + NSMenuItem *item = [popupMenuItems objectAtIndex:i]; + if ([title isEqual:[item title]]) + return [item submenu]; + } + + count = [mainMenuItems count]; + for (i = 0; i < count; ++i) { + NSMenuItem *item = [mainMenuItems objectAtIndex:i]; + if ([title isEqual:[item title]]) + return [item submenu]; + } + + return nil; +} + +- (void)addMenuWithTag:(int)tag parent:(int)parentTag title:(NSString *)title atIndex:(int)idx { + NSMenu *parent = [self menuForTag:parentTag]; NSMenuItem *item = [[NSMenuItem alloc] init]; NSMenu *menu = [[NSMenu alloc] initWithTitle:title]; @@ -713,13 +771,15 @@ - (void)addMenuWithTag:(int)tag parent:(NSMenu *)parent title:(NSString *)title [parent insertItem:item atIndex:idx]; } } else { - if ([mainMenuItems count] <= idx) { - [mainMenuItems addObject:item]; + NSMutableArray *items = (MenuPopupType == parentTag) + ? popupMenuItems : mainMenuItems; + if ([items count] <= idx) { + [items addObject:item]; } else { - [mainMenuItems insertObject:item atIndex:idx]; + [items insertObject:item atIndex:idx]; } - shouldUpdateMainMenu = YES; + shouldUpdateMainMenu = (MenuPopupType != parentTag); } [item release]; @@ -762,6 +822,8 @@ - (void)addMenuItemWithTag:(int)tag parent:(NSMenu *)parent } else { [parent insertItem:item atIndex:idx]; } + } else { + NSLog(@"WARNING: Menu item '%@' (tag=%d) has no parent.", title, tag); } } diff --git a/MacVim.h b/MacVim.h index 7bbdcf7f95..7ce529323b 100644 --- a/MacVim.h +++ b/MacVim.h @@ -104,6 +104,7 @@ enum { ExecuteActionMsgID, DropFilesMsgID, DropStringMsgID, + ShowPopupMenuMsgID, }; diff --git a/MacVim.m b/MacVim.m index f3473aa4d9..f156621ba2 100644 --- a/MacVim.m +++ b/MacVim.m @@ -57,5 +57,6 @@ "ExecuteActionMsgID", "DropFilesMsgID", "DropStringMsgID", + "ShowPopupMenuMsgID", }; diff --git a/gui_macvim.m b/gui_macvim.m index 1890675d2e..c45fc4f795 100644 --- a/gui_macvim.m +++ b/gui_macvim.m @@ -660,6 +660,8 @@ gui_mch_show_popupmenu(vimmenu_T *menu) { //NSLog(@"gui_mch_show_popupmenu(name=%s)", menu->name); + + [[MMBackend sharedInstance] showPopupMenuWithName:(char*)menu->name]; } From 8155d8045588a72e6710781606a25612deb1834a Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Fri, 10 Aug 2007 13:46:49 +0000 Subject: [PATCH 0096/1156] Ctrl-click is translated to right click (for people with one button mice). This behaviour can be disabled by setting user default 'translatectrlclick' to 0. git-svn-id: http://macvim.googlecode.com/svn/trunk@116 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMAppController.h | 1 + MMAppController.m | 2 ++ MMTextView.m | 9 +++++++++ 3 files changed, 12 insertions(+) diff --git a/MMAppController.h b/MMAppController.h index 5bc675e01a..30c6415fc5 100644 --- a/MMAppController.h +++ b/MMAppController.h @@ -27,6 +27,7 @@ extern NSString *MMTypesetterKey; extern NSString *MMCellWidthMultiplierKey; extern NSString *MMBaselineOffsetKey; extern NSString *MMCenterGlyphsKey; +extern NSString *MMTranslateCtrlClickKey; @class MMWindowController; diff --git a/MMAppController.m b/MMAppController.m index adeca6b974..fcb235de10 100644 --- a/MMAppController.m +++ b/MMAppController.m @@ -30,6 +30,7 @@ NSString *MMCellWidthMultiplierKey = @"cellwidthmultiplier"; NSString *MMBaselineOffsetKey = @"baselineoffset"; NSString *MMCenterGlyphsKey = @"centerglyphs"; +NSString *MMTranslateCtrlClickKey = @"translatectrlclick"; // Key in user defaults for autosave data. @@ -75,6 +76,7 @@ + (void)initialize [NSNumber numberWithFloat:1], MMCellWidthMultiplierKey, [NSNumber numberWithFloat:-1], MMBaselineOffsetKey, [NSNumber numberWithBool:NO], MMCenterGlyphsKey, + [NSNumber numberWithBool:YES], MMTranslateCtrlClickKey, nil]; [[NSUserDefaults standardUserDefaults] registerDefaults:dict]; diff --git a/MMTextView.m b/MMTextView.m index 884d21b931..d3f1b18cb2 100644 --- a/MMTextView.m +++ b/MMTextView.m @@ -12,6 +12,7 @@ #import "MMTextStorage.h" #import "MMWindowController.h" #import "MMVimController.h" +#import "MMAppController.h" #import "MacVim.h" @@ -189,6 +190,14 @@ - (void)mouseDown:(NSEvent *)event int count = [event clickCount]; NSMutableData *data = [NSMutableData data]; + // If desired, intepret Ctrl-Click as a right mouse click. + if ([[NSUserDefaults standardUserDefaults] + boolForKey:MMTranslateCtrlClickKey] + && button == 0 && flags & NSControlKeyMask) { + button = 1; + flags &= ~NSControlKeyMask; + } + [data appendBytes:&row length:sizeof(int)]; [data appendBytes:&col length:sizeof(int)]; [data appendBytes:&button length:sizeof(int)]; From 959c39dac1c7888d707d661cacc58cf1be97cc19 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Fri, 10 Aug 2007 14:22:52 +0000 Subject: [PATCH 0097/1156] The flags '<' and 'C' in cpoptions are cleared and restored, so that mappings with in them work. git-svn-id: http://macvim.googlecode.com/svn/trunk@117 96c4425d-ca35-0410-94e5-3396d5c13a8f --- gvimrc | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/gvimrc b/gvimrc index b504fa37dd..77e1cc4738 100644 --- a/gvimrc +++ b/gvimrc @@ -6,10 +6,17 @@ " this file. " +" Make sure the '<' and 'C' flags are not included in 'cpoptions', otherwise +" would not be recognized. See ":help 'cpoptions'". +let s:cpo_save = &cpo +set cpo&vim + + " " Extra menus " + " File menu aunmenu File.New @@ -19,7 +26,7 @@ aunmenu File.Exit aunmenu File.Save-Exit an 10.290 File.New\ Window :action newVimWindow: -an 10.295 File.New\ Tab :tabnew +an 10.295 File.New\ Tab :tabnew an 10.328 File.-SEP0- an 10.330 File.Close:q :confirm q "an 10.330 File.Close\ Window :confirm qa @@ -85,3 +92,8 @@ menukeyequiv Tools.Newer\ List menukeyequiv Window.Minimize menukeyequiv Window.Previous\ Tab menukeyequiv Window.Next\ Tab + + +" Restore the previous value of 'cpoptions'. +let &cpo = s:cpo_save +unlet s:cpo_save From 45888724568f631dd3f2eb414f62918700758c05 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Fri, 10 Aug 2007 20:09:41 +0000 Subject: [PATCH 0098/1156] Removed 'centerglyphs' user default git-svn-id: http://macvim.googlecode.com/svn/trunk@118 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMAppController.h | 1 - MMAppController.m | 2 -- 2 files changed, 3 deletions(-) diff --git a/MMAppController.h b/MMAppController.h index 30c6415fc5..56cad8ab95 100644 --- a/MMAppController.h +++ b/MMAppController.h @@ -26,7 +26,6 @@ extern NSString *MMTerminateAfterLastWindowClosedKey; extern NSString *MMTypesetterKey; extern NSString *MMCellWidthMultiplierKey; extern NSString *MMBaselineOffsetKey; -extern NSString *MMCenterGlyphsKey; extern NSString *MMTranslateCtrlClickKey; diff --git a/MMAppController.m b/MMAppController.m index fcb235de10..00798ca6c1 100644 --- a/MMAppController.m +++ b/MMAppController.m @@ -29,7 +29,6 @@ NSString *MMTypesetterKey = @"typesetter"; NSString *MMCellWidthMultiplierKey = @"cellwidthmultiplier"; NSString *MMBaselineOffsetKey = @"baselineoffset"; -NSString *MMCenterGlyphsKey = @"centerglyphs"; NSString *MMTranslateCtrlClickKey = @"translatectrlclick"; @@ -75,7 +74,6 @@ + (void)initialize @"MMTypesetter", MMTypesetterKey, [NSNumber numberWithFloat:1], MMCellWidthMultiplierKey, [NSNumber numberWithFloat:-1], MMBaselineOffsetKey, - [NSNumber numberWithBool:NO], MMCenterGlyphsKey, [NSNumber numberWithBool:YES], MMTranslateCtrlClickKey, nil]; From 4e599646f174a56f634ef3cb21db6a210325a9fc Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Fri, 10 Aug 2007 20:13:57 +0000 Subject: [PATCH 0099/1156] - MMTextStorage ensures that all glyphs have the same width (or twice that, for wide chars) - MMTypesetter only has to make all line fragments the same height, no glyph placement is necessary anymore - MMTextStorage cleaned up now that cell size is fixed across fonts git-svn-id: http://macvim.googlecode.com/svn/trunk@119 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMTextStorage.h | 17 ++-- MMTextStorage.m | 188 ++++++++++++++++++++----------------------- MMTypesetter.m | 59 ++++---------- MMWindowController.m | 2 +- 4 files changed, 113 insertions(+), 153 deletions(-) diff --git a/MMTextStorage.h b/MMTextStorage.h index 21aa47b8aa..dd7c765805 100644 --- a/MMTextStorage.h +++ b/MMTextStorage.h @@ -14,13 +14,13 @@ @interface MMTextStorage : NSTextStorage { - NSMutableAttributedString *attribString; - int maxRows, maxColumns; - int actualRows, actualColumns; - NSAttributedString *emptyRowString; - NSFont *font; - NSColor *defaultBackgroundColor; - //NSMutableParagraphStyle *paragraphStyle; + NSMutableAttributedString *attribString; + int maxRows, maxColumns; + int actualRows, actualColumns; + NSAttributedString *emptyRowString; + NSFont *font; + NSColor *defaultBackgroundColor; + NSSize cellSize; } - (NSString *)string; @@ -51,13 +51,12 @@ - (void)setFont:(NSFont*)newFont; - (NSFont*)font; - (NSSize)size; -- (NSSize)calculateAverageFontSize; +- (NSSize)cellSize; - (NSRect)rectForRowsInRange:(NSRange)range; - (NSRect)rectForColumnsInRange:(NSRange)range; - (unsigned)offsetFromRow:(int)row column:(int)col; - (BOOL)resizeToFitSize:(NSSize)size; - (NSSize)fitToSize:(NSSize)size; - (NSSize)fitToSize:(NSSize)size rows:(int *)rows columns:(int *)columns; -- (float)cellWidth; @end diff --git a/MMTextStorage.m b/MMTextStorage.m index 08610b137f..4b174fc4b4 100644 --- a/MMTextStorage.m +++ b/MMTextStorage.m @@ -22,15 +22,10 @@ #define DRAW_ITALIC 0x10 /* draw italic text */ -//static float LINEHEIGHT = 30.0f; - - @interface MMTextStorage (Private) -- (void)doSetMaxRows:(int)rows columns:(int)cols; - (void)lazyResize; -- (float)widthOfEmptyRow; @end @@ -42,15 +37,10 @@ - (id)init if ((self = [super init])) { attribString = [[NSMutableAttributedString alloc] initWithString:@""]; // NOTE! It does not matter which font is set here, Vim will set its - // own font on startup anyway. + // own font on startup anyway. Just set some bogus values. font = [[NSFont userFixedPitchFontOfSize:0] retain]; - -#if 0 - paragraphStyle = [[NSMutableParagraphStyle alloc] init]; - [paragraphStyle setMinimumLineHeight:LINEHEIGHT]; - [paragraphStyle setMaximumLineHeight:LINEHEIGHT]; - [paragraphStyle setLineSpacing:0]; -#endif + cellSize.height = [font pointSize]; + cellSize.width = [font defaultLineHeightForFont]; } return self; @@ -61,7 +51,6 @@ - (void)dealloc //NSLog(@"%@ %s", [self className], _cmd); [emptyRowString release]; - //[paragraphStyle release]; [font release]; [defaultBackgroundColor release]; [attribString release]; @@ -75,34 +64,69 @@ - (NSString *)string } - (NSDictionary *)attributesAtIndex:(unsigned)index - effectiveRange:(NSRangePointer)aRange + effectiveRange:(NSRangePointer)range { //NSLog(@"%s", _cmd); if (index>=[attribString length]) { //NSLog(@"%sWARNING: index (%d) out of bounds", _cmd, index); - if (aRange) { - *aRange = NSMakeRange(NSNotFound, 0); + if (range) { + *range = NSMakeRange(NSNotFound, 0); } return [NSDictionary dictionary]; } - return [attribString attributesAtIndex:index effectiveRange:aRange]; + return [attribString attributesAtIndex:index effectiveRange:range]; } -- (void)replaceCharactersInRange:(NSRange)aRange - withString:(NSString *)aString +- (void)replaceCharactersInRange:(NSRange)range + withString:(NSString *)string { - //NSLog(@"replaceCharactersInRange:(%d,%d) withString:%@", aRange.location, - // aRange.length, aString); + //NSLog(@"replaceCharactersInRange:(%d,%d) withString:%@", range.location, + // range.length, string); NSLog(@"WARNING: calling %s on MMTextStorage is unsupported", _cmd); - //[attribString replaceCharactersInRange:aRange withString:aString]; + //[attribString replaceCharactersInRange:range withString:string]; } -- (void)setAttributes:(NSDictionary *)attributes range:(NSRange)aRange +- (void)setAttributes:(NSDictionary *)attributes range:(NSRange)range { // NOTE! This method must be implemented since the text system calls it // constantly to 'fix attributes', apply font substitution, etc. - [attribString setAttributes:attributes range:aRange]; +#if 0 + [attribString setAttributes:attributes range:range]; +#else + // HACK! If the font attribute is being modified, then ensure that the new + // font has a fixed advancement which is either the same as the current + // font or twice that, depending on whether it is a 'wide' character that + // is being fixed or not. This code really only works if 'range' has + // length 1 or 2. + NSFont *newFont = [attributes objectForKey:NSFontAttributeName]; + if (newFont) { + float adv = cellSize.width; + if ([attribString length] > range.location+1) { + // If the first char is followed by zero-width space, then it is a + // 'wide' character, so double the advancement. + NSString *string = [attribString string]; + if ([string characterAtIndex:range.location+1] == 0x200b) + adv += adv; + } + + // Create a new font which has the 'fixed advance attribute' set. + NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys: + [NSNumber numberWithFloat:adv], NSFontFixedAdvanceAttribute, nil]; + NSFontDescriptor *desc = [newFont fontDescriptor]; + desc = [desc fontDescriptorByAddingAttributes:dict]; + newFont = [NSFont fontWithDescriptor:desc size:[newFont pointSize]]; + + // Now modify the 'attributes' dictionary to hold the new font. + NSMutableDictionary *newAttr = [NSMutableDictionary + dictionaryWithDictionary:attributes]; + [newAttr setObject:newFont forKey:NSFontAttributeName]; + + [attribString setAttributes:newAttr range:range]; + } else { + [attribString setAttributes:attributes range:range]; + } +#endif } - (int)maxRows @@ -123,6 +147,7 @@ - (void)getMaxRows:(int*)rows columns:(int*)cols - (void)setMaxRows:(int)rows columns:(int)cols { + // NOTE: Just remember the new values, the actual resizing is done lazily. maxRows = rows; maxColumns = cols; } @@ -153,7 +178,6 @@ - (void)replaceString:(NSString*)string atRow:(int)row column:(int)col NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys: font, NSFontAttributeName, - //paragraphStyle, NSParagraphStyleAttributeName, #if !HEED_DRAW_TRANSP bg, NSBackgroundColorAttributeName, #endif @@ -192,12 +216,6 @@ - (void)replaceString:(NSString*)string atRow:(int)row column:(int)col value:value range:range]; } -#if 0 - [attribString addAttribute:NSParagraphStyleAttributeName - value:paragraphStyle - range:NSMakeRange(0, [attribString length])]; -#endif - [self edited:(NSTextStorageEditedCharacters|NSTextStorageEditedAttributes) range:range changeInLength:0]; } @@ -352,10 +370,29 @@ - (void)setDefaultColorsBackground:(NSColor *)bgColor - (void)setFont:(NSFont*)newFont { if (newFont && font != newFont) { - //NSLog(@"Setting font %@", newFont); [font release]; - font = [newFont retain]; - // TODO! Change paragraph style to match line height of new font + + // NOTE! When setting a new font we make sure that the advancement of + // each glyph is fixed. + + float em = [newFont widthOfString:@"m"]; + float cellWidthMultiplier = [[NSUserDefaults standardUserDefaults] + floatForKey:MMCellWidthMultiplierKey]; + + cellSize.width = em * cellWidthMultiplier; + + NSDictionary *dict = [NSDictionary + dictionaryWithObject:[NSNumber numberWithFloat:cellSize.width] + forKey:NSFontFixedAdvanceAttribute]; + NSFontDescriptor *desc = [newFont fontDescriptor]; + desc = [desc fontDescriptorByAddingAttributes:dict]; + + font = [NSFont fontWithDescriptor:desc size:[newFont pointSize]]; + [font retain]; + + NSLayoutManager *lm = [[self layoutManagers] objectAtIndex:0]; + cellSize.height = lm ? [lm defaultLineHeightForFont:font] + : [font defaultLineHeightForFont]; } } @@ -366,46 +403,25 @@ - (NSFont*)font - (NSSize)size { - if (![[self layoutManagers] count]) return NSZeroSize; - NSLayoutManager *lm = [[self layoutManagers] objectAtIndex:0]; - - float h = [lm defaultLineHeightForFont:font]; - NSSize size = NSMakeSize([self cellWidth]*maxColumns, h*maxRows); - - return size; + return NSMakeSize(maxColumns*cellSize.width, maxRows*cellSize.height); } -- (NSSize)calculateAverageFontSize +- (NSSize)cellSize { - if (![[self layoutManagers] count]) return NSZeroSize; - - NSSize size; - NSLayoutManager *lm = [[self layoutManagers] objectAtIndex:0]; - size.height = [lm defaultLineHeightForFont:font]; - size.width = [self cellWidth]; - if (size.height < 1.0f) size.height = 1.0f; - if (size.width < 1.0f) size.width = 1.0f; - - return size; + return cellSize; } - (NSRect)rectForRowsInRange:(NSRange)range { - if (![[self layoutManagers] count]) return NSZeroRect; - - // TODO! Take range.location into account when computing height (in case - // the line height varies). NSRect rect = { 0, 0, 0, 0 }; - NSLayoutManager *lm = [[self layoutManagers] objectAtIndex:0]; - float fontHeight = [lm defaultLineHeightForFont:font]; - unsigned start = range.location > maxRows ? maxRows : range.location; unsigned length = range.length; + if (start+length > maxRows) length = maxRows - start; - rect.origin.y = fontHeight * start; - rect.size.height = fontHeight * length; + rect.origin.y = cellSize.height * start; + rect.size.height = cellSize.height * length; return rect; } @@ -413,15 +429,14 @@ - (NSRect)rectForRowsInRange:(NSRange)range - (NSRect)rectForColumnsInRange:(NSRange)range { NSRect rect = { 0, 0, 0, 0 }; - float fontWidth = [self cellWidth]; - unsigned start = range.location > maxColumns ? maxColumns : range.location; unsigned length = range.length; + if (start+length > maxColumns) length = maxColumns - start; - rect.origin.x = fontWidth * start; - rect.size.width = fontWidth * length; + rect.origin.x = cellSize.width * start; + rect.size.width = cellSize.width * length; return rect; } @@ -459,9 +474,6 @@ - (NSSize)fitToSize:(NSSize)size - (NSSize)fitToSize:(NSSize)size rows:(int *)rows columns:(int *)columns { - if (![[self layoutManagers] count]) return size; - NSLayoutManager *lm = [[self layoutManagers] objectAtIndex:0]; - NSSize curSize = [self size]; NSSize fitSize = curSize; int fitRows = maxRows; @@ -472,11 +484,12 @@ - (NSSize)fitToSize:(NSSize)size rows:(int *)rows columns:(int *)columns // 'size'. However, always make sure there are at least 3 lines in the // text storage. (Why 3? It seem Vim never allows less than 3 lines.) // - // TODO: Use binary search instead of the current linear one. + // TODO: No need to search since line height is fixed, just calculate + // the new height. int rowCount = maxRows; int rowsToRemove; for (rowsToRemove = 0; rowsToRemove < maxRows-3; ++rowsToRemove) { - float height = [lm defaultLineHeightForFont:font]*rowCount; + float height = cellSize.height*rowCount; if (height <= size.height) { fitSize.height = height; @@ -488,7 +501,7 @@ - (NSSize)fitToSize:(NSSize)size rows:(int *)rows columns:(int *)columns fitRows -= rowsToRemove; } else if (size.height > curSize.height) { - float fh = [lm defaultLineHeightForFont:font]; + float fh = cellSize.height; if (fh < 1.0f) fh = 1.0f; fitRows = floor(size.height/fh); @@ -496,7 +509,7 @@ - (NSSize)fitToSize:(NSSize)size rows:(int *)rows columns:(int *)columns } if (size.width != curSize.width) { - float fw = [self cellWidth]; + float fw = cellSize.width; if (fw < 1.0f) fw = 1.0f; fitCols = floor(size.width/fw); @@ -509,15 +522,6 @@ - (NSSize)fitToSize:(NSSize)size rows:(int *)rows columns:(int *)columns return fitSize; } -- (float)cellWidth -{ - float em = [font widthOfString:@"m"]; - float cellWidthMultiplier = [[NSUserDefaults standardUserDefaults] - floatForKey:MMCellWidthMultiplierKey]; - - return em * cellWidthMultiplier; -} - @end // MMTextStorage @@ -525,24 +529,17 @@ - (float)cellWidth @implementation MMTextStorage (Private) - (void)lazyResize -{ - if (actualRows != maxRows || actualColumns != maxColumns) { - [self doSetMaxRows:maxRows columns:maxColumns]; - } -} - -- (void)doSetMaxRows:(int)rows columns:(int)cols { int i; // Do nothing if the dimensions are already right. - if (actualRows == rows && actualColumns == cols) + if (actualRows == maxRows && actualColumns == maxColumns) return; NSRange oldRange = NSMakeRange(0, actualRows*(actualColumns+1)); - maxRows = rows; - maxColumns = cols; + actualRows = maxRows; + actualColumns = maxColumns; NSDictionary *dict; if (defaultBackgroundColor) { @@ -573,13 +570,6 @@ - (void)doSetMaxRows:(int)rows columns:(int)cols NSRange fullRange = NSMakeRange(0, [attribString length]); [self edited:(NSTextStorageEditedCharacters|NSTextStorageEditedAttributes) range:oldRange changeInLength:fullRange.length-oldRange.length]; - - actualRows = rows; actualColumns = cols; -} - -- (float)widthOfEmptyRow -{ - return [font widthOfString:[emptyRowString string]]; } @end // MMTextStorage (Private) diff --git a/MMTypesetter.m b/MMTypesetter.m index 241f50427c..ed4e778bec 100644 --- a/MMTypesetter.m +++ b/MMTypesetter.m @@ -25,17 +25,14 @@ - (NSCharacterSet *)hiddenCharSet; @implementation MMTypesetter // -// Layout glyphs so that each glyph takes up exactly one cell. +// Layout glyphs so that each line fragment has a fixed size. // -// The width of a cell is determined by [MMTextStorage cellWidth] (which -// typically sets one cell to equal the width of 'm' in the current font), and -// the height of a cell is given by the default line height for the current -// font. -// -// It is assumed that the text storage is set up so that each wide character is -// followed by a 'zero-width space' character (Unicode 0x200b); these are not -// rendered. If a wide character is not followed by a zero-width space, then -// the next character will render on top of it. +// It is assumed that the font for each character has been chosen so that every +// glyph has the right advancement (either 2*cellSize.width or half that, +// depending on whether it is a wide character or not). This is taken care of +// by MMTextStorage in setAttributes:range: and in setFont:. All that is left +// for the typesetter to do is to make sure each line fragment has the same +// height and that unwanted glyphs are hidden. // - (void)layoutGlyphsInLayoutManager:(NSLayoutManager *)lm startingAtGlyphIndex:(unsigned)startGlyphIdx @@ -49,8 +46,7 @@ - (void)layoutGlyphsInLayoutManager:(NSLayoutManager *)lm NSFont *font = [ts font]; NSString *text = [ts string]; unsigned textLen = [text length]; - float cellWidth = [ts cellWidth]; - float cellHeight = [lm defaultLineHeightForFont:font]; + NSSize cellSize = [ts cellSize]; float baseline = [font descender]; if (!(ts && tv && tc && font && text && textLen)) @@ -58,8 +54,6 @@ - (void)layoutGlyphsInLayoutManager:(NSLayoutManager *)lm float baselineOffset = [[NSUserDefaults standardUserDefaults] floatForKey:MMBaselineOffsetKey]; - BOOL centerGlyphs = [[NSUserDefaults standardUserDefaults] - boolForKey:MMCenterGlyphsKey]; baseline += baselineOffset; @@ -67,7 +61,9 @@ - (void)layoutGlyphsInLayoutManager:(NSLayoutManager *)lm unsigned i, numberOfLines = 0, firstLine = 0; NSRange firstLineRange = { 0, 0 }; - // Find first line and its range, and count the number of lines. + // Find the first line and its range, and count the number of lines. (This + // info could also be gleaned from MMTextStorage, but we do it here anyway + // to make absolutely sure everything is right.) for (i = 0; i < textLen; numberOfLines++) { NSRange lineRange = [text lineRangeForRange:NSMakeRange(i, 0)]; if (NSLocationInRange(startCharIdx, lineRange)) { @@ -84,10 +80,10 @@ - (void)layoutGlyphsInLayoutManager:(NSLayoutManager *)lm for (i = 0; i < maxNumLines && lineRange.length; ++i) { NSRange glyphRange = [lm glyphRangeForCharacterRange:lineRange actualCharacterRange:nil]; - NSRect lineRect = { 0, (firstLine+i)*cellHeight, - cellWidth*(lineRange.length-1), cellHeight }; + NSRect lineRect = { 0, (firstLine+i)*cellSize.height, + cellSize.width*(lineRange.length-1), cellSize.height }; unsigned endLineIdx = NSMaxRange(lineRange); - NSPoint glyphPt = { 0, cellHeight+baseline }; + NSPoint glyphPt = { 0, cellSize.height+baseline }; unsigned j; endGlyphIdx = NSMaxRange(glyphRange); @@ -95,32 +91,7 @@ - (void)layoutGlyphsInLayoutManager:(NSLayoutManager *)lm [lm setTextContainer:tc forGlyphRange:glyphRange]; [lm setLineFragmentRect:lineRect forGlyphRange:glyphRange usedRect:lineRect]; - - if (centerGlyphs) { - // Center each glyph inside its cell. (Optional) - // + Proportional fonts look better. - // - The cursor changes width depending on which glyph it is over - // and selections look uneven. - for (j = glyphRange.location; j < endGlyphIdx; ++j) { - NSGlyph glyph = [lm glyphAtIndex:j]; - NSSize adv = [font advancementForGlyph:glyph]; - NSPoint pt = glyphPt; - if (adv.width > 0 && adv.width < cellWidth) { - pt.x += .5*(cellWidth-adv.width); - } - [lm setLocation:pt forStartOfGlyphRange:NSMakeRange(j, 1)]; - glyphPt.x += cellWidth; - } - } else { - // Position each glyph individually to ensure they take up exactly - // one cell. (Default) - // + The cursor and selections look good - // - Proportional fonts look bad (try entering 'Wi') - for (j = glyphRange.location; j < endGlyphIdx; ++j) { - [lm setLocation:glyphPt forStartOfGlyphRange:NSMakeRange(j, 1)]; - glyphPt.x += cellWidth; - } - } + [lm setLocation:glyphPt forStartOfGlyphRange:glyphRange]; // Hide end-of-line and non-zero space characters (there is one after // every wide character). diff --git a/MMWindowController.m b/MMWindowController.m index bc33cc0911..aa511e60d6 100644 --- a/MMWindowController.m +++ b/MMWindowController.m @@ -787,7 +787,7 @@ - (void)updateResizeIncrements { if (!setupDone) return; - NSSize size = [textStorage calculateAverageFontSize]; + NSSize size = [textStorage cellSize]; [[self window] setContentResizeIncrements:size]; } From 4834afb74a76191d461a9d1dc6e3f1add37b4047 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sat, 11 Aug 2007 11:20:16 +0000 Subject: [PATCH 0100/1156] Added support for ':popup' command. git-svn-id: http://macvim.googlecode.com/svn/trunk@120 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMBackend.h | 2 +- MMBackend.m | 12 ++++++++++-- MMTextView.h | 2 +- MMTextView.m | 13 ++----------- MMVimController.m | 4 +++- MMWindowController.h | 1 + MMWindowController.m | 26 ++++++++++++++++++++++++++ gui_macvim.m | 18 +++++++++++++++++- 8 files changed, 61 insertions(+), 17 deletions(-) diff --git a/MMBackend.h b/MMBackend.h index 1f64714b75..a0e4b3afcf 100644 --- a/MMBackend.h +++ b/MMBackend.h @@ -67,7 +67,7 @@ action:(NSString *)action atIndex:(int)index; - (void)removeMenuItemWithTag:(int)tag; - (void)enableMenuItemWithTag:(int)tag state:(int)enabled; -- (void)showPopupMenuWithName:(char *)name; +- (void)showPopupMenuWithName:(char *)name atMouseLocation:(BOOL)mouse; - (void)showToolbar:(int)enable flags:(int)flags; - (void)createScrollbarWithIdentifier:(long)ident type:(int)type; - (void)destroyScrollbarWithIdentifier:(long)ident; diff --git a/MMBackend.m b/MMBackend.m index cd28439190..1b415b1ac8 100644 --- a/MMBackend.m +++ b/MMBackend.m @@ -481,11 +481,19 @@ - (void)enableMenuItemWithTag:(int)tag state:(int)enabled [self queueMessage:EnableMenuItemMsgID data:data]; } -- (void)showPopupMenuWithName:(char *)name +- (void)showPopupMenuWithName:(char *)name atMouseLocation:(BOOL)mouse { - int len = strlen(name); NSMutableData *data = [NSMutableData data]; + int len = strlen(name); + int row = -1, col = -1; + + if (!mouse && curwin) { + row = curwin->w_wrow; + col = curwin->w_wcol; + } + [data appendBytes:&row length:sizeof(int)]; + [data appendBytes:&col length:sizeof(int)]; [data appendBytes:&len length:sizeof(int)]; [data appendBytes:name length:len]; diff --git a/MMTextView.h b/MMTextView.h index d9c4c533c9..67ffdb1f0e 100644 --- a/MMTextView.h +++ b/MMTextView.h @@ -16,7 +16,7 @@ NSEvent *lastMouseDownEvent; } -- (void)popupMenu:(NSMenu *)menu; +- (NSEvent *)lastMouseDownEvent; - (void)setShouldDrawInsertionPoint:(BOOL)enable; @end diff --git a/MMTextView.m b/MMTextView.m index d3f1b18cb2..8a8f12aa90 100644 --- a/MMTextView.m +++ b/MMTextView.m @@ -33,18 +33,9 @@ - (void)dealloc [super dealloc]; } -- (void)popupMenu:(NSMenu *)menu +- (NSEvent *)lastMouseDownEvent { -#if 0 - NSEvent *event = [NSEvent - mouseEventWithType:NSLeftMouseDown location:NSZeroPoint - modifierFlags:0 timestamp:0 - windowNumber:[[self window] windowNumber] context:nil - eventNumber:0 clickCount:0 pressure:1.0]; - [NSMenu popUpContextMenu:menu withEvent:event forView:self]; -#else - [NSMenu popUpContextMenu:menu withEvent:lastMouseDownEvent forView:self]; -#endif + return lastMouseDownEvent; } - (void)setShouldDrawInsertionPoint:(BOOL)enable diff --git a/MMVimController.m b/MMVimController.m index 6aa417f448..c4db2642bd 100644 --- a/MMVimController.m +++ b/MMVimController.m @@ -590,6 +590,8 @@ - (void)handleMessage:(int)msgid data:(NSData *)data [actionName release]; } else if (ShowPopupMenuMsgID == msgid) { const void *bytes = [data bytes]; + int row = *((int*)bytes); bytes += sizeof(int); + int col = *((int*)bytes); bytes += sizeof(int); int len = *((int*)bytes); bytes += sizeof(int); NSString *title = [[NSString alloc] initWithBytesNoCopy:(void*)bytes @@ -599,7 +601,7 @@ - (void)handleMessage:(int)msgid data:(NSData *)data NSMenu *menu = [self topLevelMenuForTitle:title]; if (menu) { - [[windowController textView] popupMenu:menu]; + [windowController popupMenu:menu atRow:row column:col]; } else { NSLog(@"WARNING: Cannot popup menu with title %@; no such menu.", title); diff --git a/MMWindowController.h b/MMWindowController.h index 39c8c8515a..6c33adc94c 100644 --- a/MMWindowController.h +++ b/MMWindowController.h @@ -55,6 +55,7 @@ - (void)setDefaultColorsBackground:(NSColor *)back foreground:(NSColor *)fore; - (void)setFont:(NSFont *)font; - (void)processCommandQueueDidFinish; +- (void)popupMenu:(NSMenu *)menu atRow:(int)row column:(int)col; - (IBAction)addNewTab:(id)sender; - (IBAction)showTabBar:(id)sender; diff --git a/MMWindowController.m b/MMWindowController.m index aa511e60d6..22d867d097 100644 --- a/MMWindowController.m +++ b/MMWindowController.m @@ -457,6 +457,32 @@ - (void)processCommandQueueDidFinish } } +- (void)popupMenu:(NSMenu *)menu atRow:(int)row column:(int)col +{ + if (!setupDone) return; + + NSEvent *event; + if (row >= 0 && col >= 0) { + NSSize cellSize = [textStorage cellSize]; + NSPoint pt = { (col+1)*cellSize.width, [textView frame].size.height + - (row+1)*cellSize.height }; + + event = [NSEvent mouseEventWithType:NSRightMouseDown + location:pt + modifierFlags:0 + timestamp:0 + windowNumber:[[self window] windowNumber] + context:nil + eventNumber:0 + clickCount:0 + pressure:1.0]; + } else { + event = [textView lastMouseDownEvent]; + } + + [NSMenu popUpContextMenu:menu withEvent:event forView:textView]; +} + - (IBAction)addNewTab:(id)sender { // NOTE! This can get called a lot if the user holds down the key diff --git a/gui_macvim.m b/gui_macvim.m index c45fc4f795..4d1239a84e 100644 --- a/gui_macvim.m +++ b/gui_macvim.m @@ -656,12 +656,28 @@ } +/* + * This is called when user right clicks. + */ void gui_mch_show_popupmenu(vimmenu_T *menu) { //NSLog(@"gui_mch_show_popupmenu(name=%s)", menu->name); - [[MMBackend sharedInstance] showPopupMenuWithName:(char*)menu->name]; + [[MMBackend sharedInstance] showPopupMenuWithName:(char*)menu->name + atMouseLocation:YES]; +} + + +/* + * This is called when a :popup command is executed. + */ + void +gui_make_popup(char_u *path_name, int mouse_pos) +{ + // TODO: Unless mouse_pos set, popup at cursor location. + [[MMBackend sharedInstance] showPopupMenuWithName:(char*)path_name + atMouseLocation:mouse_pos]; } From a2fa2f99edb238c962de0bfc6741d4205e46376a Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sat, 11 Aug 2007 11:48:08 +0000 Subject: [PATCH 0101/1156] - Moved user default keys to MacVim.[h|m] - Renamed user defaults to the same name as their keys (minus "Key" at the end) - Window top left point autosave is now a string instead of a dictionary git-svn-id: http://macvim.googlecode.com/svn/trunk@121 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMAppController.h | 17 ----------------- MMAppController.m | 40 +++++----------------------------------- MMBackend.h | 1 - MMBackend.m | 4 ++-- MMTextStorage.m | 4 +++- MMTextView.m | 1 - MMTypesetter.m | 2 +- MMVimController.h | 1 + MMVimController.m | 2 +- MMWindowController.m | 37 +++++++------------------------------ MacVim.h | 20 ++++++++++++++++++++ MacVim.m | 20 ++++++++++++++++++++ 12 files changed, 60 insertions(+), 89 deletions(-) diff --git a/MMAppController.h b/MMAppController.h index 56cad8ab95..85b0b8a57b 100644 --- a/MMAppController.h +++ b/MMAppController.h @@ -12,23 +12,6 @@ #import "MacVim.h" -// NSUserDefaults keys -extern NSString *MMNoWindowKey; -extern NSString *MMTabMinWidthKey; -extern NSString *MMTabMaxWidthKey; -extern NSString *MMTabOptimumWidthKey; -extern NSString *MMStatuslineOffKey; -extern NSString *MMTextInsetLeftKey; -extern NSString *MMTextInsetRightKey; -extern NSString *MMTextInsetTopKey; -extern NSString *MMTextInsetBottomKey; -extern NSString *MMTerminateAfterLastWindowClosedKey; -extern NSString *MMTypesetterKey; -extern NSString *MMCellWidthMultiplierKey; -extern NSString *MMBaselineOffsetKey; -extern NSString *MMTranslateCtrlClickKey; - - @class MMWindowController; diff --git a/MMAppController.m b/MMAppController.m index 00798ca6c1..df3356be3c 100644 --- a/MMAppController.m +++ b/MMAppController.m @@ -14,28 +14,6 @@ -// NSUserDefaults keys -NSString *MMNoWindowKey = @"nowindow"; -NSString *MMTabMinWidthKey = @"tabminwidth"; -NSString *MMTabMaxWidthKey = @"tabmaxwidth"; -NSString *MMTabOptimumWidthKey = @"taboptimumwidth"; -NSString *MMStatuslineOffKey = @"statuslineoff"; -NSString *MMTextInsetLeftKey = @"insetleft"; -NSString *MMTextInsetRightKey = @"insetright"; -NSString *MMTextInsetTopKey = @"insettop"; -NSString *MMTextInsetBottomKey = @"insetbottom"; -NSString *MMTerminateAfterLastWindowClosedKey - = @"terminateafterlastwindowclosed"; -NSString *MMTypesetterKey = @"typesetter"; -NSString *MMCellWidthMultiplierKey = @"cellwidthmultiplier"; -NSString *MMBaselineOffsetKey = @"baselineoffset"; -NSString *MMTranslateCtrlClickKey = @"translatectrlclick"; - - -// Key in user defaults for autosave data. -NSString *MMAutosaveKey = @"DefaultWindow"; - - @interface MMAppController (MMServices) - (void)openSelection:(NSPasteboard *)pboard userData:(NSString *)userData @@ -270,18 +248,10 @@ - (void)windowControllerWillOpen:(MMWindowController *)windowController NSRect frame = [keyWin frame]; topLeft = NSMakePoint(frame.origin.x, NSMaxY(frame)); } else { - NSDictionary *dict = [[NSUserDefaults standardUserDefaults] - dictionaryForKey:MMAutosaveKey]; - if (dict) { - id x = [dict objectForKey:@"x"]; - id y = [dict objectForKey:@"y"]; - - if (x && [x isKindOfClass:[NSNumber class]] && - y && [y isKindOfClass:[NSNumber class]]) { - topLeft.x = [x floatValue]; - topLeft.y = [y floatValue]; - } - } + NSString *topLeftString = [[NSUserDefaults standardUserDefaults] + stringForKey:MMTopLeftPointKey]; + if (topLeftString) + topLeft = NSPointFromString(topLeftString); } if (!NSEqualPoints(topLeft, NSZeroPoint)) { @@ -361,7 +331,7 @@ - (IBAction)selectPreviousWindow:(id)sender // The first window autosaves its position. (The autosaving features // of Cocoa are not used because we need more control over what is // autosaved and when it is restored.) - [[vc windowController] setWindowAutosaveKey:MMAutosaveKey]; + [[vc windowController] setWindowAutosaveKey:MMTopLeftPointKey]; } [vimControllers addObject:vc]; diff --git a/MMBackend.h b/MMBackend.h index a0e4b3afcf..353112c7c5 100644 --- a/MMBackend.h +++ b/MMBackend.h @@ -12,7 +12,6 @@ #import "MacVim.h" - @interface MMBackend : NSObject { NSMutableArray *queue; NSMutableData *drawData; diff --git a/MMBackend.m b/MMBackend.m index 1b415b1ac8..ab438ac24e 100644 --- a/MMBackend.m +++ b/MMBackend.m @@ -113,8 +113,8 @@ - (BOOL)checkin // that the GUI won't be activated (or raised) so there is a hack in // MMWindowController which always raises the app when a new window is // opened. - NSMutableArray *args = [NSMutableArray arrayWithObjects:@"-nowindow", - @"yes", nil]; + NSMutableArray *args = [NSMutableArray arrayWithObjects: + MMNoWindowKey, @"yes", nil]; NSString *exeName = [[mainBundle infoDictionary] objectForKey:@"CFBundleExecutable"]; NSString *path = [mainBundle pathForAuxiliaryExecutable:exeName]; diff --git a/MMTextStorage.m b/MMTextStorage.m index 4b174fc4b4..5011f6c63f 100644 --- a/MMTextStorage.m +++ b/MMTextStorage.m @@ -9,7 +9,9 @@ */ #import "MMTextStorage.h" -#import "MMAppController.h" +#import "MacVim.h" + + // If 0 DRAW_TRANSP flag will be ignored. Setting it to 1 causes the cursor // background to be drawn in white. diff --git a/MMTextView.m b/MMTextView.m index 8a8f12aa90..1a973314d2 100644 --- a/MMTextView.m +++ b/MMTextView.m @@ -12,7 +12,6 @@ #import "MMTextStorage.h" #import "MMWindowController.h" #import "MMVimController.h" -#import "MMAppController.h" #import "MacVim.h" diff --git a/MMTypesetter.m b/MMTypesetter.m index ed4e778bec..388107dd9c 100644 --- a/MMTypesetter.m +++ b/MMTypesetter.m @@ -10,7 +10,7 @@ #import "MMTypesetter.h" #import "MMTextStorage.h" -#import "MMAppController.h" +#import "MacVim.h" diff --git a/MMVimController.h b/MMVimController.h index 943a897917..7024e04cee 100644 --- a/MMVimController.h +++ b/MMVimController.h @@ -11,6 +11,7 @@ #import #import "MacVim.h" + @class MMWindowController; diff --git a/MMVimController.m b/MMVimController.m index c4db2642bd..41fddbf8f7 100644 --- a/MMVimController.m +++ b/MMVimController.m @@ -10,8 +10,8 @@ #import "MMVimController.h" #import "MMWindowController.h" -#import "MMAppController.h" #import "MMTextView.h" +#import "MMAppController.h" #import "MMTextStorage.h" diff --git a/MMWindowController.m b/MMWindowController.m index 22d867d097..445ed9f150 100644 --- a/MMWindowController.m +++ b/MMWindowController.m @@ -67,7 +67,6 @@ - (BOOL)rightScrollbarVisible; - (void)placeScrollbars; - (void)scroll:(id)sender; - (void)placeViews; -- (NSDictionary *)windowAutosaveDict; @end @@ -585,11 +584,13 @@ - (void)windowWillClose:(NSNotification *)notification - (void)windowDidMove:(NSNotification *)notification { - if (windowAutosaveKey) { - NSDictionary *dict = [self windowAutosaveDict]; - if (dict) - [[NSUserDefaults standardUserDefaults] - setObject:dict forKey:windowAutosaveKey]; + if (setupDone && windowAutosaveKey) { + NSRect frame = [[self window] frame]; + NSPoint topLeft = { frame.origin.x, NSMaxY(frame) }; + NSString *topLeftString = NSStringFromPoint(topLeft); + + [[NSUserDefaults standardUserDefaults] + setObject:topLeftString forKey:windowAutosaveKey]; } } @@ -1091,30 +1092,6 @@ - (void)placeViews [self placeScrollbars]; } -- (NSDictionary *)windowAutosaveDict -{ - if (!setupDone) - return nil; - - int rows = 0, cols = 0; - if (textStorage) - [textStorage getMaxRows:&rows columns:&cols]; - - NSPoint origin = NSZeroPoint; - if (setupDone) { - NSRect frame = [[self window] frame]; - origin = NSMakePoint(frame.origin.x, NSMaxY(frame)); - } - - NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys: - [NSNumber numberWithInt:rows], @"Rows", - [NSNumber numberWithInt:cols], @"Columns", - [NSNumber numberWithFloat:origin.x], @"x", - [NSNumber numberWithFloat:origin.y], @"y", nil]; - - return dict; -} - @end // MMWindowController (Private) diff --git a/MacVim.h b/MacVim.h index 7ce529323b..a4e80cf3ee 100644 --- a/MacVim.h +++ b/MacVim.h @@ -133,4 +133,24 @@ enum { }; +// NSUserDefaults keys +extern NSString *MMNoWindowKey; +extern NSString *MMTabMinWidthKey; +extern NSString *MMTabMaxWidthKey; +extern NSString *MMTabOptimumWidthKey; +extern NSString *MMStatuslineOffKey; +extern NSString *MMTextInsetLeftKey; +extern NSString *MMTextInsetRightKey; +extern NSString *MMTextInsetTopKey; +extern NSString *MMTextInsetBottomKey; +extern NSString *MMTerminateAfterLastWindowClosedKey; +extern NSString *MMTypesetterKey; +extern NSString *MMCellWidthMultiplierKey; +extern NSString *MMBaselineOffsetKey; +extern NSString *MMTranslateCtrlClickKey; +extern NSString *MMTopLeftPointKey; + + + + // vim: set ft=objc: diff --git a/MacVim.m b/MacVim.m index f156621ba2..0d02be4e8a 100644 --- a/MacVim.m +++ b/MacVim.m @@ -60,3 +60,23 @@ "ShowPopupMenuMsgID", }; + + + +// NSUserDefaults keys +NSString *MMNoWindowKey = @"MMNoWindow"; +NSString *MMTabMinWidthKey = @"MMTabMinWidth"; +NSString *MMTabMaxWidthKey = @"MMTabMaxWidth"; +NSString *MMTabOptimumWidthKey = @"MMTabOptimumWidth"; +NSString *MMStatuslineOffKey = @"MMStatuslineOff"; +NSString *MMTextInsetLeftKey = @"MMTextInsetLeft"; +NSString *MMTextInsetRightKey = @"MMTextInsetRight"; +NSString *MMTextInsetTopKey = @"MMTextInsetTop"; +NSString *MMTextInsetBottomKey = @"MMTextInsetBottom"; +NSString *MMTerminateAfterLastWindowClosedKey + = @"MMTerminateAfterLastWindowClosed"; +NSString *MMTypesetterKey = @"MMTypesetter"; +NSString *MMCellWidthMultiplierKey = @"MMCellWidthMultiplier"; +NSString *MMBaselineOffsetKey = @"MMBaselineOffset"; +NSString *MMTranslateCtrlClickKey = @"MMTranslateCtrlClick"; +NSString *MMTopLeftPointKey = @"MMTopLeftPoint"; From d0a09a8cfeb8196b78bc9ddb65fb80d81fb44468 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sat, 11 Aug 2007 14:22:26 +0000 Subject: [PATCH 0102/1156] This file is long since obsolete (Colors.plist is used instead) git-svn-id: http://macvim.googlecode.com/svn/trunk@122 96c4425d-ca35-0410-94e5-3396d5c13a8f --- VimColorList.clr | 803 ----------------------------------------------- 1 file changed, 803 deletions(-) delete mode 100644 VimColorList.clr diff --git a/VimColorList.clr b/VimColorList.clr deleted file mode 100644 index 1d6aaabe53..0000000000 --- a/VimColorList.clr +++ /dev/null @@ -1,803 +0,0 @@ -802 -0 0.0000 0.0000 0.0000 1.0 Black -0 0.5020 0.5020 0.5020 1.0 darkgray -0 0.5020 0.5020 0.5020 1.0 darkgrey -0 0.7529 0.7529 0.7529 1.0 Gray -0 0.7529 0.7529 0.7529 1.0 Grey -0 0.8784 0.8784 0.8784 1.0 lightgray -0 0.8784 0.8784 0.8784 1.0 lightgrey -0 0.1020 0.1020 0.1020 1.0 gray10 -0 0.1020 0.1020 0.1020 1.0 grey10 -0 0.2000 0.2000 0.2000 1.0 gray20 -0 0.2000 0.2000 0.2000 1.0 grey20 -0 0.3020 0.3020 0.3020 1.0 gray30 -0 0.3020 0.3020 0.3020 1.0 grey30 -0 0.4000 0.4000 0.4000 1.0 gray40 -0 0.4000 0.4000 0.4000 1.0 grey40 -0 0.4980 0.4980 0.4980 1.0 gray50 -0 0.4980 0.4980 0.4980 1.0 grey50 -0 0.6000 0.6000 0.6000 1.0 gray60 -0 0.6000 0.6000 0.6000 1.0 grey60 -0 0.7020 0.7020 0.7020 1.0 gray70 -0 0.7020 0.7020 0.7020 1.0 grey70 -0 0.8000 0.8000 0.8000 1.0 gray80 -0 0.8000 0.8000 0.8000 1.0 grey80 -0 0.8980 0.8980 0.8980 1.0 gray90 -0 0.8980 0.8980 0.8980 1.0 grey90 -0 1.0000 1.0000 1.0000 1.0 white -0 0.5020 0.0000 0.0000 1.0 darkred -0 0.8667 0.0314 0.0235 1.0 red -0 1.0000 0.6275 0.6275 1.0 lightred -0 0.0000 0.0000 0.5020 1.0 DarkBlue -0 0.0000 0.0000 0.8314 1.0 Blue -0 0.6275 0.6275 1.0000 1.0 lightblue -0 0.0000 0.5020 0.0000 1.0 DarkGreen -0 0.0000 0.3922 0.0667 1.0 Green -0 0.6275 1.0000 0.6275 1.0 lightgreen -0 0.0000 0.5020 0.5020 1.0 DarkCyan -0 0.0078 0.6706 0.9176 1.0 cyan -0 0.6275 1.0000 1.0000 1.0 lightcyan -0 0.5020 0.0000 0.5020 1.0 darkmagenta -0 0.9490 0.0314 0.5176 1.0 magenta -0 0.9412 0.6275 0.9412 1.0 lightmagenta -0 0.5020 0.2510 0.2510 1.0 brown -0 0.9882 0.9529 0.0196 1.0 yellow -0 1.0000 1.0000 0.6275 1.0 lightyellow -0 0.7333 0.7333 0.0000 1.0 darkyellow -0 0.1804 0.5451 0.3412 1.0 SeaGreen -0 0.9882 0.5020 0.0000 1.0 orange -0 0.6275 0.1255 0.9412 1.0 Purple -0 0.4157 0.3529 0.8039 1.0 SlateBlue -0 0.5529 0.2196 0.7882 1.0 Violet -0 1.0000 0.9804 0.9804 1.0 snow -0 0.9725 0.9725 1.0000 1.0 ghost white -0 0.9725 0.9725 1.0000 1.0 GhostWhite -0 0.9608 0.9608 0.9608 1.0 white smoke -0 0.9608 0.9608 0.9608 1.0 WhiteSmoke -0 0.8627 0.8627 0.8627 1.0 gainsboro -0 1.0000 0.9804 0.9412 1.0 floral white -0 1.0000 0.9804 0.9412 1.0 FloralWhite -0 0.9922 0.9608 0.9020 1.0 old lace -0 0.9922 0.9608 0.9020 1.0 OldLace -0 0.9804 0.9412 0.9020 1.0 linen -0 0.9804 0.9216 0.8431 1.0 antique white -0 0.9804 0.9216 0.8431 1.0 AntiqueWhite -0 1.0000 0.9373 0.8353 1.0 papaya whip -0 1.0000 0.9373 0.8353 1.0 PapayaWhip -0 1.0000 0.9216 0.8039 1.0 blanched almond -0 1.0000 0.9216 0.8039 1.0 BlanchedAlmond -0 1.0000 0.8941 0.7686 1.0 bisque -0 1.0000 0.8549 0.7255 1.0 peach puff -0 1.0000 0.8549 0.7255 1.0 PeachPuff -0 1.0000 0.8706 0.6784 1.0 navajo white -0 1.0000 0.8706 0.6784 1.0 NavajoWhite -0 1.0000 0.8941 0.7098 1.0 moccasin -0 1.0000 0.9725 0.8627 1.0 cornsilk -0 1.0000 1.0000 0.9412 1.0 ivory -0 1.0000 0.9804 0.8039 1.0 lemon chiffon -0 1.0000 0.9804 0.8039 1.0 LemonChiffon -0 1.0000 0.9608 0.9333 1.0 seashell -0 0.9412 1.0000 0.9412 1.0 honeydew -0 0.9608 1.0000 0.9804 1.0 mint cream -0 0.9608 1.0000 0.9804 1.0 MintCream -0 0.9412 1.0000 1.0000 1.0 azure -0 0.9412 0.9725 1.0000 1.0 alice blue -0 0.9412 0.9725 1.0000 1.0 AliceBlue -0 0.9020 0.9020 0.9804 1.0 lavender -0 1.0000 0.9412 0.9608 1.0 lavender blush -0 1.0000 0.9412 0.9608 1.0 LavenderBlush -0 1.0000 0.8941 0.8824 1.0 misty rose -0 1.0000 0.8941 0.8824 1.0 MistyRose -0 1.0000 1.0000 1.0000 1.0 white -0 0.0000 0.0000 0.0000 1.0 black -0 0.1843 0.3098 0.3098 1.0 dark slate gray -0 0.1843 0.3098 0.3098 1.0 DarkSlateGray -0 0.1843 0.3098 0.3098 1.0 dark slate grey -0 0.1843 0.3098 0.3098 1.0 DarkSlateGrey -0 0.4118 0.4118 0.4118 1.0 dim gray -0 0.4118 0.4118 0.4118 1.0 DimGray -0 0.4118 0.4118 0.4118 1.0 dim grey -0 0.4118 0.4118 0.4118 1.0 DimGrey -0 0.4392 0.5020 0.5647 1.0 slate gray -0 0.4392 0.5020 0.5647 1.0 SlateGray -0 0.4392 0.5020 0.5647 1.0 slate grey -0 0.4392 0.5020 0.5647 1.0 SlateGrey -0 0.4667 0.5333 0.6000 1.0 light slate gray -0 0.4667 0.5333 0.6000 1.0 LightSlateGray -0 0.4667 0.5333 0.6000 1.0 light slate grey -0 0.4667 0.5333 0.6000 1.0 LightSlateGrey -0 0.7451 0.7451 0.7451 1.0 gray -0 0.7451 0.7451 0.7451 1.0 grey -0 0.8275 0.8275 0.8275 1.0 light grey -0 0.8275 0.8275 0.8275 1.0 LightGrey -0 0.8275 0.8275 0.8275 1.0 light gray -0 0.8275 0.8275 0.8275 1.0 LightGray -0 0.0980 0.0980 0.4392 1.0 midnight blue -0 0.0980 0.0980 0.4392 1.0 MidnightBlue -0 0.0000 0.0000 0.5020 1.0 navy -0 0.0000 0.0000 0.5020 1.0 navy blue -0 0.0000 0.0000 0.5020 1.0 NavyBlue -0 0.3922 0.5843 0.9294 1.0 cornflower blue -0 0.3922 0.5843 0.9294 1.0 CornflowerBlue -0 0.2824 0.2392 0.5451 1.0 dark slate blue -0 0.2824 0.2392 0.5451 1.0 DarkSlateBlue -0 0.4157 0.3529 0.8039 1.0 slate blue -0 0.4157 0.3529 0.8039 1.0 SlateBlue -0 0.4824 0.4078 0.9333 1.0 medium slate blue -0 0.4824 0.4078 0.9333 1.0 MediumSlateBlue -0 0.5176 0.4392 1.0000 1.0 light slate blue -0 0.5176 0.4392 1.0000 1.0 LightSlateBlue -0 0.0000 0.0000 0.8039 1.0 medium blue -0 0.0000 0.0000 0.8039 1.0 MediumBlue -0 0.2549 0.4118 0.8824 1.0 royal blue -0 0.2549 0.4118 0.8824 1.0 RoyalBlue -0 0.0000 0.0000 1.0000 1.0 blue -0 0.1176 0.5647 1.0000 1.0 dodger blue -0 0.1176 0.5647 1.0000 1.0 DodgerBlue -0 0.0000 0.7490 1.0000 1.0 deep sky blue -0 0.0000 0.7490 1.0000 1.0 DeepSkyBlue -0 0.5294 0.8078 0.9216 1.0 sky blue -0 0.5294 0.8078 0.9216 1.0 SkyBlue -0 0.5294 0.8078 0.9804 1.0 light sky blue -0 0.5294 0.8078 0.9804 1.0 LightSkyBlue -0 0.2745 0.5098 0.7059 1.0 steel blue -0 0.2745 0.5098 0.7059 1.0 SteelBlue -0 0.6902 0.7686 0.8706 1.0 light steel blue -0 0.6902 0.7686 0.8706 1.0 LightSteelBlue -0 0.6784 0.8471 0.9020 1.0 light blue -0 0.6784 0.8471 0.9020 1.0 LightBlue -0 0.6902 0.8784 0.9020 1.0 powder blue -0 0.6902 0.8784 0.9020 1.0 PowderBlue -0 0.6863 0.9333 0.9333 1.0 pale turquoise -0 0.6863 0.9333 0.9333 1.0 PaleTurquoise -0 0.0000 0.8078 0.8196 1.0 dark turquoise -0 0.0000 0.8078 0.8196 1.0 DarkTurquoise -0 0.2824 0.8196 0.8000 1.0 medium turquoise -0 0.2824 0.8196 0.8000 1.0 MediumTurquoise -0 0.2510 0.8784 0.8157 1.0 turquoise -0 0.0000 1.0000 1.0000 1.0 cyan -0 0.8784 1.0000 1.0000 1.0 light cyan -0 0.8784 1.0000 1.0000 1.0 LightCyan -0 0.3725 0.6196 0.6275 1.0 cadet blue -0 0.3725 0.6196 0.6275 1.0 CadetBlue -0 0.4000 0.8039 0.6667 1.0 medium aquamarine -0 0.4000 0.8039 0.6667 1.0 MediumAquamarine -0 0.4980 1.0000 0.8314 1.0 aquamarine -0 0.0000 0.3922 0.0000 1.0 dark green -0 0.0000 0.3922 0.0000 1.0 DarkGreen -0 0.3333 0.4196 0.1843 1.0 dark olive green -0 0.3333 0.4196 0.1843 1.0 DarkOliveGreen -0 0.5608 0.7373 0.5608 1.0 dark sea green -0 0.5608 0.7373 0.5608 1.0 DarkSeaGreen -0 0.1804 0.5451 0.3412 1.0 sea green -0 0.1804 0.5451 0.3412 1.0 SeaGreen -0 0.2353 0.7020 0.4431 1.0 medium sea green -0 0.2353 0.7020 0.4431 1.0 MediumSeaGreen -0 0.1255 0.6980 0.6667 1.0 light sea green -0 0.1255 0.6980 0.6667 1.0 LightSeaGreen -0 0.5961 0.9843 0.5961 1.0 pale green -0 0.5961 0.9843 0.5961 1.0 PaleGreen -0 0.0000 1.0000 0.4980 1.0 spring green -0 0.0000 1.0000 0.4980 1.0 SpringGreen -0 0.4863 0.9882 0.0000 1.0 lawn green -0 0.4863 0.9882 0.0000 1.0 LawnGreen -0 0.0000 1.0000 0.0000 1.0 green -0 0.4980 1.0000 0.0000 1.0 chartreuse -0 0.0000 0.9804 0.6039 1.0 medium spring green -0 0.0000 0.9804 0.6039 1.0 MediumSpringGreen -0 0.6784 1.0000 0.1843 1.0 green yellow -0 0.6784 1.0000 0.1843 1.0 GreenYellow -0 0.1961 0.8039 0.1961 1.0 lime green -0 0.1961 0.8039 0.1961 1.0 LimeGreen -0 0.6039 0.8039 0.1961 1.0 yellow green -0 0.6039 0.8039 0.1961 1.0 YellowGreen -0 0.1333 0.5451 0.1333 1.0 forest green -0 0.1333 0.5451 0.1333 1.0 ForestGreen -0 0.4196 0.5569 0.1373 1.0 olive drab -0 0.4196 0.5569 0.1373 1.0 OliveDrab -0 0.7412 0.7176 0.4196 1.0 dark khaki -0 0.7412 0.7176 0.4196 1.0 DarkKhaki -0 0.9412 0.9020 0.5490 1.0 khaki -0 0.9333 0.9098 0.6667 1.0 pale goldenrod -0 0.9333 0.9098 0.6667 1.0 PaleGoldenrod -0 0.9804 0.9804 0.8235 1.0 light goldenrod yellow -0 0.9804 0.9804 0.8235 1.0 LightGoldenrodYellow -0 1.0000 1.0000 0.8784 1.0 light yellow -0 1.0000 1.0000 0.8784 1.0 LightYellow -0 1.0000 1.0000 0.0000 1.0 yellow -0 1.0000 0.8431 0.0000 1.0 gold -0 0.9333 0.8667 0.5098 1.0 light goldenrod -0 0.9333 0.8667 0.5098 1.0 LightGoldenrod -0 0.8549 0.6471 0.1255 1.0 goldenrod -0 0.7216 0.5255 0.0431 1.0 dark goldenrod -0 0.7216 0.5255 0.0431 1.0 DarkGoldenrod -0 0.7373 0.5608 0.5608 1.0 rosy brown -0 0.7373 0.5608 0.5608 1.0 RosyBrown -0 0.8039 0.3608 0.3608 1.0 indian red -0 0.8039 0.3608 0.3608 1.0 IndianRed -0 0.5451 0.2706 0.0745 1.0 saddle brown -0 0.5451 0.2706 0.0745 1.0 SaddleBrown -0 0.6275 0.3216 0.1765 1.0 sienna -0 0.8039 0.5216 0.2471 1.0 peru -0 0.8706 0.7216 0.5294 1.0 burlywood -0 0.9608 0.9608 0.8627 1.0 beige -0 0.9608 0.8706 0.7020 1.0 wheat -0 0.9569 0.6431 0.3765 1.0 sandy brown -0 0.9569 0.6431 0.3765 1.0 SandyBrown -0 0.8235 0.7059 0.5490 1.0 tan -0 0.8235 0.4118 0.1176 1.0 chocolate -0 0.6980 0.1333 0.1333 1.0 firebrick -0 0.6471 0.1647 0.1647 1.0 brown -0 0.9137 0.5882 0.4784 1.0 dark salmon -0 0.9137 0.5882 0.4784 1.0 DarkSalmon -0 0.9804 0.5020 0.4471 1.0 salmon -0 1.0000 0.6275 0.4784 1.0 light salmon -0 1.0000 0.6275 0.4784 1.0 LightSalmon -0 1.0000 0.6471 0.0000 1.0 orange -0 1.0000 0.5490 0.0000 1.0 dark orange -0 1.0000 0.5490 0.0000 1.0 DarkOrange -0 1.0000 0.4980 0.3137 1.0 coral -0 0.9412 0.5020 0.5020 1.0 light coral -0 0.9412 0.5020 0.5020 1.0 LightCoral -0 1.0000 0.3882 0.2784 1.0 tomato -0 1.0000 0.2706 0.0000 1.0 orange red -0 1.0000 0.2706 0.0000 1.0 OrangeRed -0 1.0000 0.0000 0.0000 1.0 red -0 1.0000 0.4118 0.7059 1.0 hot pink -0 1.0000 0.4118 0.7059 1.0 HotPink -0 1.0000 0.0784 0.5765 1.0 deep pink -0 1.0000 0.0784 0.5765 1.0 DeepPink -0 1.0000 0.7529 0.7961 1.0 pink -0 1.0000 0.7137 0.7569 1.0 light pink -0 1.0000 0.7137 0.7569 1.0 LightPink -0 0.8588 0.4392 0.5765 1.0 pale violet red -0 0.8588 0.4392 0.5765 1.0 PaleVioletRed -0 0.6902 0.1882 0.3765 1.0 maroon -0 0.7804 0.0824 0.5216 1.0 medium violet red -0 0.7804 0.0824 0.5216 1.0 MediumVioletRed -0 0.8157 0.1255 0.5647 1.0 violet red -0 0.8157 0.1255 0.5647 1.0 VioletRed -0 1.0000 0.0000 1.0000 1.0 magenta -0 0.9333 0.5098 0.9333 1.0 violet -0 0.8667 0.6275 0.8667 1.0 plum -0 0.8549 0.4392 0.8392 1.0 orchid -0 0.7294 0.3333 0.8275 1.0 medium orchid -0 0.7294 0.3333 0.8275 1.0 MediumOrchid -0 0.6000 0.1961 0.8000 1.0 dark orchid -0 0.6000 0.1961 0.8000 1.0 DarkOrchid -0 0.5804 0.0000 0.8275 1.0 dark violet -0 0.5804 0.0000 0.8275 1.0 DarkViolet -0 0.5412 0.1686 0.8863 1.0 blue violet -0 0.5412 0.1686 0.8863 1.0 BlueViolet -0 0.6275 0.1255 0.9412 1.0 purple -0 0.5765 0.4392 0.8588 1.0 medium purple -0 0.5765 0.4392 0.8588 1.0 MediumPurple -0 0.8471 0.7490 0.8471 1.0 thistle -0 1.0000 0.9804 0.9804 1.0 snow1 -0 0.9333 0.9137 0.9137 1.0 snow2 -0 0.8039 0.7882 0.7882 1.0 snow3 -0 0.5451 0.5373 0.5373 1.0 snow4 -0 1.0000 0.9608 0.9333 1.0 seashell1 -0 0.9333 0.8980 0.8706 1.0 seashell2 -0 0.8039 0.7725 0.7490 1.0 seashell3 -0 0.5451 0.5255 0.5098 1.0 seashell4 -0 1.0000 0.9373 0.8588 1.0 AntiqueWhite1 -0 0.9333 0.8745 0.8000 1.0 AntiqueWhite2 -0 0.8039 0.7529 0.6902 1.0 AntiqueWhite3 -0 0.5451 0.5137 0.4706 1.0 AntiqueWhite4 -0 1.0000 0.8941 0.7686 1.0 bisque1 -0 0.9333 0.8353 0.7176 1.0 bisque2 -0 0.8039 0.7176 0.6196 1.0 bisque3 -0 0.5451 0.4902 0.4196 1.0 bisque4 -0 1.0000 0.8549 0.7255 1.0 PeachPuff1 -0 0.9333 0.7961 0.6784 1.0 PeachPuff2 -0 0.8039 0.6863 0.5843 1.0 PeachPuff3 -0 0.5451 0.4667 0.3961 1.0 PeachPuff4 -0 1.0000 0.8706 0.6784 1.0 NavajoWhite1 -0 0.9333 0.8118 0.6314 1.0 NavajoWhite2 -0 0.8039 0.7020 0.5451 1.0 NavajoWhite3 -0 0.5451 0.4745 0.3686 1.0 NavajoWhite4 -0 1.0000 0.9804 0.8039 1.0 LemonChiffon1 -0 0.9333 0.9137 0.7490 1.0 LemonChiffon2 -0 0.8039 0.7882 0.6471 1.0 LemonChiffon3 -0 0.5451 0.5373 0.4392 1.0 LemonChiffon4 -0 1.0000 0.9725 0.8627 1.0 cornsilk1 -0 0.9333 0.9098 0.8039 1.0 cornsilk2 -0 0.8039 0.7843 0.6941 1.0 cornsilk3 -0 0.5451 0.5333 0.4706 1.0 cornsilk4 -0 1.0000 1.0000 0.9412 1.0 ivory1 -0 0.9333 0.9333 0.8784 1.0 ivory2 -0 0.8039 0.8039 0.7569 1.0 ivory3 -0 0.5451 0.5451 0.5137 1.0 ivory4 -0 0.9412 1.0000 0.9412 1.0 honeydew1 -0 0.8784 0.9333 0.8784 1.0 honeydew2 -0 0.7569 0.8039 0.7569 1.0 honeydew3 -0 0.5137 0.5451 0.5137 1.0 honeydew4 -0 1.0000 0.9412 0.9608 1.0 LavenderBlush1 -0 0.9333 0.8784 0.8980 1.0 LavenderBlush2 -0 0.8039 0.7569 0.7725 1.0 LavenderBlush3 -0 0.5451 0.5137 0.5255 1.0 LavenderBlush4 -0 1.0000 0.8941 0.8824 1.0 MistyRose1 -0 0.9333 0.8353 0.8235 1.0 MistyRose2 -0 0.8039 0.7176 0.7098 1.0 MistyRose3 -0 0.5451 0.4902 0.4824 1.0 MistyRose4 -0 0.9412 1.0000 1.0000 1.0 azure1 -0 0.8784 0.9333 0.9333 1.0 azure2 -0 0.7569 0.8039 0.8039 1.0 azure3 -0 0.5137 0.5451 0.5451 1.0 azure4 -0 0.5137 0.4353 1.0000 1.0 SlateBlue1 -0 0.4784 0.4039 0.9333 1.0 SlateBlue2 -0 0.4118 0.3490 0.8039 1.0 SlateBlue3 -0 0.2784 0.2353 0.5451 1.0 SlateBlue4 -0 0.2824 0.4627 1.0000 1.0 RoyalBlue1 -0 0.2627 0.4314 0.9333 1.0 RoyalBlue2 -0 0.2275 0.3725 0.8039 1.0 RoyalBlue3 -0 0.1529 0.2510 0.5451 1.0 RoyalBlue4 -0 0.0000 0.0000 1.0000 1.0 blue1 -0 0.0000 0.0000 0.9333 1.0 blue2 -0 0.0000 0.0000 0.8039 1.0 blue3 -0 0.0000 0.0000 0.5451 1.0 blue4 -0 0.1176 0.5647 1.0000 1.0 DodgerBlue1 -0 0.1098 0.5255 0.9333 1.0 DodgerBlue2 -0 0.0941 0.4549 0.8039 1.0 DodgerBlue3 -0 0.0627 0.3059 0.5451 1.0 DodgerBlue4 -0 0.3882 0.7216 1.0000 1.0 SteelBlue1 -0 0.3608 0.6745 0.9333 1.0 SteelBlue2 -0 0.3098 0.5804 0.8039 1.0 SteelBlue3 -0 0.2118 0.3922 0.5451 1.0 SteelBlue4 -0 0.0000 0.7490 1.0000 1.0 DeepSkyBlue1 -0 0.0000 0.6980 0.9333 1.0 DeepSkyBlue2 -0 0.0000 0.6039 0.8039 1.0 DeepSkyBlue3 -0 0.0000 0.4078 0.5451 1.0 DeepSkyBlue4 -0 0.5294 0.8078 1.0000 1.0 SkyBlue1 -0 0.4941 0.7529 0.9333 1.0 SkyBlue2 -0 0.4235 0.6510 0.8039 1.0 SkyBlue3 -0 0.2902 0.4392 0.5451 1.0 SkyBlue4 -0 0.6902 0.8863 1.0000 1.0 LightSkyBlue1 -0 0.6431 0.8275 0.9333 1.0 LightSkyBlue2 -0 0.5529 0.7137 0.8039 1.0 LightSkyBlue3 -0 0.3765 0.4824 0.5451 1.0 LightSkyBlue4 -0 0.7765 0.8863 1.0000 1.0 SlateGray1 -0 0.7255 0.8275 0.9333 1.0 SlateGray2 -0 0.6235 0.7137 0.8039 1.0 SlateGray3 -0 0.4235 0.4824 0.5451 1.0 SlateGray4 -0 0.7922 0.8824 1.0000 1.0 LightSteelBlue1 -0 0.7373 0.8235 0.9333 1.0 LightSteelBlue2 -0 0.6353 0.7098 0.8039 1.0 LightSteelBlue3 -0 0.4314 0.4824 0.5451 1.0 LightSteelBlue4 -0 0.7490 0.9373 1.0000 1.0 LightBlue1 -0 0.6980 0.8745 0.9333 1.0 LightBlue2 -0 0.6039 0.7529 0.8039 1.0 LightBlue3 -0 0.4078 0.5137 0.5451 1.0 LightBlue4 -0 0.8784 1.0000 1.0000 1.0 LightCyan1 -0 0.8196 0.9333 0.9333 1.0 LightCyan2 -0 0.7059 0.8039 0.8039 1.0 LightCyan3 -0 0.4784 0.5451 0.5451 1.0 LightCyan4 -0 0.7333 1.0000 1.0000 1.0 PaleTurquoise1 -0 0.6824 0.9333 0.9333 1.0 PaleTurquoise2 -0 0.5882 0.8039 0.8039 1.0 PaleTurquoise3 -0 0.4000 0.5451 0.5451 1.0 PaleTurquoise4 -0 0.5961 0.9608 1.0000 1.0 CadetBlue1 -0 0.5569 0.8980 0.9333 1.0 CadetBlue2 -0 0.4784 0.7725 0.8039 1.0 CadetBlue3 -0 0.3255 0.5255 0.5451 1.0 CadetBlue4 -0 0.0000 0.9608 1.0000 1.0 turquoise1 -0 0.0000 0.8980 0.9333 1.0 turquoise2 -0 0.0000 0.7725 0.8039 1.0 turquoise3 -0 0.0000 0.5255 0.5451 1.0 turquoise4 -0 0.0000 1.0000 1.0000 1.0 cyan1 -0 0.0000 0.9333 0.9333 1.0 cyan2 -0 0.0000 0.8039 0.8039 1.0 cyan3 -0 0.0000 0.5451 0.5451 1.0 cyan4 -0 0.5922 1.0000 1.0000 1.0 DarkSlateGray1 -0 0.5529 0.9333 0.9333 1.0 DarkSlateGray2 -0 0.4745 0.8039 0.8039 1.0 DarkSlateGray3 -0 0.3216 0.5451 0.5451 1.0 DarkSlateGray4 -0 0.4980 1.0000 0.8314 1.0 aquamarine1 -0 0.4627 0.9333 0.7765 1.0 aquamarine2 -0 0.4000 0.8039 0.6667 1.0 aquamarine3 -0 0.2706 0.5451 0.4549 1.0 aquamarine4 -0 0.7569 1.0000 0.7569 1.0 DarkSeaGreen1 -0 0.7059 0.9333 0.7059 1.0 DarkSeaGreen2 -0 0.6078 0.8039 0.6078 1.0 DarkSeaGreen3 -0 0.4118 0.5451 0.4118 1.0 DarkSeaGreen4 -0 0.3294 1.0000 0.6235 1.0 SeaGreen1 -0 0.3059 0.9333 0.5804 1.0 SeaGreen2 -0 0.2627 0.8039 0.5020 1.0 SeaGreen3 -0 0.1804 0.5451 0.3412 1.0 SeaGreen4 -0 0.6039 1.0000 0.6039 1.0 PaleGreen1 -0 0.5647 0.9333 0.5647 1.0 PaleGreen2 -0 0.4863 0.8039 0.4863 1.0 PaleGreen3 -0 0.3294 0.5451 0.3294 1.0 PaleGreen4 -0 0.0000 1.0000 0.4980 1.0 SpringGreen1 -0 0.0000 0.9333 0.4627 1.0 SpringGreen2 -0 0.0000 0.8039 0.4000 1.0 SpringGreen3 -0 0.0000 0.5451 0.2706 1.0 SpringGreen4 -0 0.0000 1.0000 0.0000 1.0 green1 -0 0.0000 0.9333 0.0000 1.0 green2 -0 0.0000 0.8039 0.0000 1.0 green3 -0 0.0000 0.5451 0.0000 1.0 green4 -0 0.4980 1.0000 0.0000 1.0 chartreuse1 -0 0.4627 0.9333 0.0000 1.0 chartreuse2 -0 0.4000 0.8039 0.0000 1.0 chartreuse3 -0 0.2706 0.5451 0.0000 1.0 chartreuse4 -0 0.7529 1.0000 0.2431 1.0 OliveDrab1 -0 0.7020 0.9333 0.2275 1.0 OliveDrab2 -0 0.6039 0.8039 0.1961 1.0 OliveDrab3 -0 0.4118 0.5451 0.1333 1.0 OliveDrab4 -0 0.7922 1.0000 0.4392 1.0 DarkOliveGreen1 -0 0.7373 0.9333 0.4078 1.0 DarkOliveGreen2 -0 0.6353 0.8039 0.3529 1.0 DarkOliveGreen3 -0 0.4314 0.5451 0.2392 1.0 DarkOliveGreen4 -0 1.0000 0.9647 0.5608 1.0 khaki1 -0 0.9333 0.9020 0.5216 1.0 khaki2 -0 0.8039 0.7765 0.4510 1.0 khaki3 -0 0.5451 0.5255 0.3059 1.0 khaki4 -0 1.0000 0.9255 0.5451 1.0 LightGoldenrod1 -0 0.9333 0.8627 0.5098 1.0 LightGoldenrod2 -0 0.8039 0.7451 0.4392 1.0 LightGoldenrod3 -0 0.5451 0.5059 0.2980 1.0 LightGoldenrod4 -0 1.0000 1.0000 0.8784 1.0 LightYellow1 -0 0.9333 0.9333 0.8196 1.0 LightYellow2 -0 0.8039 0.8039 0.7059 1.0 LightYellow3 -0 0.5451 0.5451 0.4784 1.0 LightYellow4 -0 1.0000 1.0000 0.0000 1.0 yellow1 -0 0.9333 0.9333 0.0000 1.0 yellow2 -0 0.8039 0.8039 0.0000 1.0 yellow3 -0 0.5451 0.5451 0.0000 1.0 yellow4 -0 1.0000 0.8431 0.0000 1.0 gold1 -0 0.9333 0.7882 0.0000 1.0 gold2 -0 0.8039 0.6784 0.0000 1.0 gold3 -0 0.5451 0.4588 0.0000 1.0 gold4 -0 1.0000 0.7569 0.1451 1.0 goldenrod1 -0 0.9333 0.7059 0.1333 1.0 goldenrod2 -0 0.8039 0.6078 0.1137 1.0 goldenrod3 -0 0.5451 0.4118 0.0784 1.0 goldenrod4 -0 1.0000 0.7255 0.0588 1.0 DarkGoldenrod1 -0 0.9333 0.6784 0.0549 1.0 DarkGoldenrod2 -0 0.8039 0.5843 0.0471 1.0 DarkGoldenrod3 -0 0.5451 0.3961 0.0314 1.0 DarkGoldenrod4 -0 1.0000 0.7569 0.7569 1.0 RosyBrown1 -0 0.9333 0.7059 0.7059 1.0 RosyBrown2 -0 0.8039 0.6078 0.6078 1.0 RosyBrown3 -0 0.5451 0.4118 0.4118 1.0 RosyBrown4 -0 1.0000 0.4157 0.4157 1.0 IndianRed1 -0 0.9333 0.3882 0.3882 1.0 IndianRed2 -0 0.8039 0.3333 0.3333 1.0 IndianRed3 -0 0.5451 0.2275 0.2275 1.0 IndianRed4 -0 1.0000 0.5098 0.2784 1.0 sienna1 -0 0.9333 0.4745 0.2588 1.0 sienna2 -0 0.8039 0.4078 0.2235 1.0 sienna3 -0 0.5451 0.2784 0.1490 1.0 sienna4 -0 1.0000 0.8275 0.6078 1.0 burlywood1 -0 0.9333 0.7725 0.5686 1.0 burlywood2 -0 0.8039 0.6667 0.4902 1.0 burlywood3 -0 0.5451 0.4510 0.3333 1.0 burlywood4 -0 1.0000 0.9059 0.7294 1.0 wheat1 -0 0.9333 0.8471 0.6824 1.0 wheat2 -0 0.8039 0.7294 0.5882 1.0 wheat3 -0 0.5451 0.4941 0.4000 1.0 wheat4 -0 1.0000 0.6471 0.3098 1.0 tan1 -0 0.9333 0.6039 0.2863 1.0 tan2 -0 0.8039 0.5216 0.2471 1.0 tan3 -0 0.5451 0.3529 0.1686 1.0 tan4 -0 1.0000 0.4980 0.1412 1.0 chocolate1 -0 0.9333 0.4627 0.1294 1.0 chocolate2 -0 0.8039 0.4000 0.1137 1.0 chocolate3 -0 0.5451 0.2706 0.0745 1.0 chocolate4 -0 1.0000 0.1882 0.1882 1.0 firebrick1 -0 0.9333 0.1725 0.1725 1.0 firebrick2 -0 0.8039 0.1490 0.1490 1.0 firebrick3 -0 0.5451 0.1020 0.1020 1.0 firebrick4 -0 1.0000 0.2510 0.2510 1.0 brown1 -0 0.9333 0.2314 0.2314 1.0 brown2 -0 0.8039 0.2000 0.2000 1.0 brown3 -0 0.5451 0.1373 0.1373 1.0 brown4 -0 1.0000 0.5490 0.4118 1.0 salmon1 -0 0.9333 0.5098 0.3843 1.0 salmon2 -0 0.8039 0.4392 0.3294 1.0 salmon3 -0 0.5451 0.2980 0.2235 1.0 salmon4 -0 1.0000 0.6275 0.4784 1.0 LightSalmon1 -0 0.9333 0.5843 0.4471 1.0 LightSalmon2 -0 0.8039 0.5059 0.3843 1.0 LightSalmon3 -0 0.5451 0.3412 0.2588 1.0 LightSalmon4 -0 1.0000 0.6471 0.0000 1.0 orange1 -0 0.9333 0.6039 0.0000 1.0 orange2 -0 0.8039 0.5216 0.0000 1.0 orange3 -0 0.5451 0.3529 0.0000 1.0 orange4 -0 1.0000 0.4980 0.0000 1.0 DarkOrange1 -0 0.9333 0.4627 0.0000 1.0 DarkOrange2 -0 0.8039 0.4000 0.0000 1.0 DarkOrange3 -0 0.5451 0.2706 0.0000 1.0 DarkOrange4 -0 1.0000 0.4471 0.3373 1.0 coral1 -0 0.9333 0.4157 0.3137 1.0 coral2 -0 0.8039 0.3569 0.2706 1.0 coral3 -0 0.5451 0.2431 0.1843 1.0 coral4 -0 1.0000 0.3882 0.2784 1.0 tomato1 -0 0.9333 0.3608 0.2588 1.0 tomato2 -0 0.8039 0.3098 0.2235 1.0 tomato3 -0 0.5451 0.2118 0.1490 1.0 tomato4 -0 1.0000 0.2706 0.0000 1.0 OrangeRed1 -0 0.9333 0.2510 0.0000 1.0 OrangeRed2 -0 0.8039 0.2157 0.0000 1.0 OrangeRed3 -0 0.5451 0.1451 0.0000 1.0 OrangeRed4 -0 1.0000 0.0000 0.0000 1.0 red1 -0 0.9333 0.0000 0.0000 1.0 red2 -0 0.8039 0.0000 0.0000 1.0 red3 -0 0.5451 0.0000 0.0000 1.0 red4 -0 1.0000 0.0784 0.5765 1.0 DeepPink1 -0 0.9333 0.0706 0.5373 1.0 DeepPink2 -0 0.8039 0.0627 0.4627 1.0 DeepPink3 -0 0.5451 0.0392 0.3137 1.0 DeepPink4 -0 1.0000 0.4314 0.7059 1.0 HotPink1 -0 0.9333 0.4157 0.6549 1.0 HotPink2 -0 0.8039 0.3765 0.5647 1.0 HotPink3 -0 0.5451 0.2275 0.3843 1.0 HotPink4 -0 1.0000 0.7098 0.7725 1.0 pink1 -0 0.9333 0.6627 0.7216 1.0 pink2 -0 0.8039 0.5686 0.6196 1.0 pink3 -0 0.5451 0.3882 0.4235 1.0 pink4 -0 1.0000 0.6824 0.7255 1.0 LightPink1 -0 0.9333 0.6353 0.6784 1.0 LightPink2 -0 0.8039 0.5490 0.5843 1.0 LightPink3 -0 0.5451 0.3725 0.3961 1.0 LightPink4 -0 1.0000 0.5098 0.6706 1.0 PaleVioletRed1 -0 0.9333 0.4745 0.6235 1.0 PaleVioletRed2 -0 0.8039 0.4078 0.5373 1.0 PaleVioletRed3 -0 0.5451 0.2784 0.3647 1.0 PaleVioletRed4 -0 1.0000 0.2039 0.7020 1.0 maroon1 -0 0.9333 0.1882 0.6549 1.0 maroon2 -0 0.8039 0.1608 0.5647 1.0 maroon3 -0 0.5451 0.1098 0.3843 1.0 maroon4 -0 1.0000 0.2431 0.5882 1.0 VioletRed1 -0 0.9333 0.2275 0.5490 1.0 VioletRed2 -0 0.8039 0.1961 0.4706 1.0 VioletRed3 -0 0.5451 0.1333 0.3216 1.0 VioletRed4 -0 1.0000 0.0000 1.0000 1.0 magenta1 -0 0.9333 0.0000 0.9333 1.0 magenta2 -0 0.8039 0.0000 0.8039 1.0 magenta3 -0 0.5451 0.0000 0.5451 1.0 magenta4 -0 1.0000 0.5137 0.9804 1.0 orchid1 -0 0.9333 0.4784 0.9137 1.0 orchid2 -0 0.8039 0.4118 0.7882 1.0 orchid3 -0 0.5451 0.2784 0.5373 1.0 orchid4 -0 1.0000 0.7333 1.0000 1.0 plum1 -0 0.9333 0.6824 0.9333 1.0 plum2 -0 0.8039 0.5882 0.8039 1.0 plum3 -0 0.5451 0.4000 0.5451 1.0 plum4 -0 0.8784 0.4000 1.0000 1.0 MediumOrchid1 -0 0.8196 0.3725 0.9333 1.0 MediumOrchid2 -0 0.7059 0.3216 0.8039 1.0 MediumOrchid3 -0 0.4784 0.2157 0.5451 1.0 MediumOrchid4 -0 0.7490 0.2431 1.0000 1.0 DarkOrchid1 -0 0.6980 0.2275 0.9333 1.0 DarkOrchid2 -0 0.6039 0.1961 0.8039 1.0 DarkOrchid3 -0 0.4078 0.1333 0.5451 1.0 DarkOrchid4 -0 0.6078 0.1882 1.0000 1.0 purple1 -0 0.5686 0.1725 0.9333 1.0 purple2 -0 0.4902 0.1490 0.8039 1.0 purple3 -0 0.3333 0.1020 0.5451 1.0 purple4 -0 0.6706 0.5098 1.0000 1.0 MediumPurple1 -0 0.6235 0.4745 0.9333 1.0 MediumPurple2 -0 0.5373 0.4078 0.8039 1.0 MediumPurple3 -0 0.3647 0.2784 0.5451 1.0 MediumPurple4 -0 1.0000 0.8824 1.0000 1.0 thistle1 -0 0.9333 0.8235 0.9333 1.0 thistle2 -0 0.8039 0.7098 0.8039 1.0 thistle3 -0 0.5451 0.4824 0.5451 1.0 thistle4 -0 0.0000 0.0000 0.0000 1.0 gray0 -0 0.0000 0.0000 0.0000 1.0 grey0 -0 0.0118 0.0118 0.0118 1.0 gray1 -0 0.0118 0.0118 0.0118 1.0 grey1 -0 0.0196 0.0196 0.0196 1.0 gray2 -0 0.0196 0.0196 0.0196 1.0 grey2 -0 0.0314 0.0314 0.0314 1.0 gray3 -0 0.0314 0.0314 0.0314 1.0 grey3 -0 0.0392 0.0392 0.0392 1.0 gray4 -0 0.0392 0.0392 0.0392 1.0 grey4 -0 0.0510 0.0510 0.0510 1.0 gray5 -0 0.0510 0.0510 0.0510 1.0 grey5 -0 0.0588 0.0588 0.0588 1.0 gray6 -0 0.0588 0.0588 0.0588 1.0 grey6 -0 0.0706 0.0706 0.0706 1.0 gray7 -0 0.0706 0.0706 0.0706 1.0 grey7 -0 0.0784 0.0784 0.0784 1.0 gray8 -0 0.0784 0.0784 0.0784 1.0 grey8 -0 0.0902 0.0902 0.0902 1.0 gray9 -0 0.0902 0.0902 0.0902 1.0 grey9 -0 0.1020 0.1020 0.1020 1.0 gray10 -0 0.1020 0.1020 0.1020 1.0 grey10 -0 0.1098 0.1098 0.1098 1.0 gray11 -0 0.1098 0.1098 0.1098 1.0 grey11 -0 0.1216 0.1216 0.1216 1.0 gray12 -0 0.1216 0.1216 0.1216 1.0 grey12 -0 0.1294 0.1294 0.1294 1.0 gray13 -0 0.1294 0.1294 0.1294 1.0 grey13 -0 0.1412 0.1412 0.1412 1.0 gray14 -0 0.1412 0.1412 0.1412 1.0 grey14 -0 0.1490 0.1490 0.1490 1.0 gray15 -0 0.1490 0.1490 0.1490 1.0 grey15 -0 0.1608 0.1608 0.1608 1.0 gray16 -0 0.1608 0.1608 0.1608 1.0 grey16 -0 0.1686 0.1686 0.1686 1.0 gray17 -0 0.1686 0.1686 0.1686 1.0 grey17 -0 0.1804 0.1804 0.1804 1.0 gray18 -0 0.1804 0.1804 0.1804 1.0 grey18 -0 0.1882 0.1882 0.1882 1.0 gray19 -0 0.1882 0.1882 0.1882 1.0 grey19 -0 0.2000 0.2000 0.2000 1.0 gray20 -0 0.2000 0.2000 0.2000 1.0 grey20 -0 0.2118 0.2118 0.2118 1.0 gray21 -0 0.2118 0.2118 0.2118 1.0 grey21 -0 0.2196 0.2196 0.2196 1.0 gray22 -0 0.2196 0.2196 0.2196 1.0 grey22 -0 0.2314 0.2314 0.2314 1.0 gray23 -0 0.2314 0.2314 0.2314 1.0 grey23 -0 0.2392 0.2392 0.2392 1.0 gray24 -0 0.2392 0.2392 0.2392 1.0 grey24 -0 0.2510 0.2510 0.2510 1.0 gray25 -0 0.2510 0.2510 0.2510 1.0 grey25 -0 0.2588 0.2588 0.2588 1.0 gray26 -0 0.2588 0.2588 0.2588 1.0 grey26 -0 0.2706 0.2706 0.2706 1.0 gray27 -0 0.2706 0.2706 0.2706 1.0 grey27 -0 0.2784 0.2784 0.2784 1.0 gray28 -0 0.2784 0.2784 0.2784 1.0 grey28 -0 0.2902 0.2902 0.2902 1.0 gray29 -0 0.2902 0.2902 0.2902 1.0 grey29 -0 0.3020 0.3020 0.3020 1.0 gray30 -0 0.3020 0.3020 0.3020 1.0 grey30 -0 0.3098 0.3098 0.3098 1.0 gray31 -0 0.3098 0.3098 0.3098 1.0 grey31 -0 0.3216 0.3216 0.3216 1.0 gray32 -0 0.3216 0.3216 0.3216 1.0 grey32 -0 0.3294 0.3294 0.3294 1.0 gray33 -0 0.3294 0.3294 0.3294 1.0 grey33 -0 0.3412 0.3412 0.3412 1.0 gray34 -0 0.3412 0.3412 0.3412 1.0 grey34 -0 0.3490 0.3490 0.3490 1.0 gray35 -0 0.3490 0.3490 0.3490 1.0 grey35 -0 0.3608 0.3608 0.3608 1.0 gray36 -0 0.3608 0.3608 0.3608 1.0 grey36 -0 0.3686 0.3686 0.3686 1.0 gray37 -0 0.3686 0.3686 0.3686 1.0 grey37 -0 0.3804 0.3804 0.3804 1.0 gray38 -0 0.3804 0.3804 0.3804 1.0 grey38 -0 0.3882 0.3882 0.3882 1.0 gray39 -0 0.3882 0.3882 0.3882 1.0 grey39 -0 0.4000 0.4000 0.4000 1.0 gray40 -0 0.4000 0.4000 0.4000 1.0 grey40 -0 0.4118 0.4118 0.4118 1.0 gray41 -0 0.4118 0.4118 0.4118 1.0 grey41 -0 0.4196 0.4196 0.4196 1.0 gray42 -0 0.4196 0.4196 0.4196 1.0 grey42 -0 0.4314 0.4314 0.4314 1.0 gray43 -0 0.4314 0.4314 0.4314 1.0 grey43 -0 0.4392 0.4392 0.4392 1.0 gray44 -0 0.4392 0.4392 0.4392 1.0 grey44 -0 0.4510 0.4510 0.4510 1.0 gray45 -0 0.4510 0.4510 0.4510 1.0 grey45 -0 0.4588 0.4588 0.4588 1.0 gray46 -0 0.4588 0.4588 0.4588 1.0 grey46 -0 0.4706 0.4706 0.4706 1.0 gray47 -0 0.4706 0.4706 0.4706 1.0 grey47 -0 0.4784 0.4784 0.4784 1.0 gray48 -0 0.4784 0.4784 0.4784 1.0 grey48 -0 0.4902 0.4902 0.4902 1.0 gray49 -0 0.4902 0.4902 0.4902 1.0 grey49 -0 0.4980 0.4980 0.4980 1.0 gray50 -0 0.4980 0.4980 0.4980 1.0 grey50 -0 0.5098 0.5098 0.5098 1.0 gray51 -0 0.5098 0.5098 0.5098 1.0 grey51 -0 0.5216 0.5216 0.5216 1.0 gray52 -0 0.5216 0.5216 0.5216 1.0 grey52 -0 0.5294 0.5294 0.5294 1.0 gray53 -0 0.5294 0.5294 0.5294 1.0 grey53 -0 0.5412 0.5412 0.5412 1.0 gray54 -0 0.5412 0.5412 0.5412 1.0 grey54 -0 0.5490 0.5490 0.5490 1.0 gray55 -0 0.5490 0.5490 0.5490 1.0 grey55 -0 0.5608 0.5608 0.5608 1.0 gray56 -0 0.5608 0.5608 0.5608 1.0 grey56 -0 0.5686 0.5686 0.5686 1.0 gray57 -0 0.5686 0.5686 0.5686 1.0 grey57 -0 0.5804 0.5804 0.5804 1.0 gray58 -0 0.5804 0.5804 0.5804 1.0 grey58 -0 0.5882 0.5882 0.5882 1.0 gray59 -0 0.5882 0.5882 0.5882 1.0 grey59 -0 0.6000 0.6000 0.6000 1.0 gray60 -0 0.6000 0.6000 0.6000 1.0 grey60 -0 0.6118 0.6118 0.6118 1.0 gray61 -0 0.6118 0.6118 0.6118 1.0 grey61 -0 0.6196 0.6196 0.6196 1.0 gray62 -0 0.6196 0.6196 0.6196 1.0 grey62 -0 0.6314 0.6314 0.6314 1.0 gray63 -0 0.6314 0.6314 0.6314 1.0 grey63 -0 0.6392 0.6392 0.6392 1.0 gray64 -0 0.6392 0.6392 0.6392 1.0 grey64 -0 0.6510 0.6510 0.6510 1.0 gray65 -0 0.6510 0.6510 0.6510 1.0 grey65 -0 0.6588 0.6588 0.6588 1.0 gray66 -0 0.6588 0.6588 0.6588 1.0 grey66 -0 0.6706 0.6706 0.6706 1.0 gray67 -0 0.6706 0.6706 0.6706 1.0 grey67 -0 0.6784 0.6784 0.6784 1.0 gray68 -0 0.6784 0.6784 0.6784 1.0 grey68 -0 0.6902 0.6902 0.6902 1.0 gray69 -0 0.6902 0.6902 0.6902 1.0 grey69 -0 0.7020 0.7020 0.7020 1.0 gray70 -0 0.7020 0.7020 0.7020 1.0 grey70 -0 0.7098 0.7098 0.7098 1.0 gray71 -0 0.7098 0.7098 0.7098 1.0 grey71 -0 0.7216 0.7216 0.7216 1.0 gray72 -0 0.7216 0.7216 0.7216 1.0 grey72 -0 0.7294 0.7294 0.7294 1.0 gray73 -0 0.7294 0.7294 0.7294 1.0 grey73 -0 0.7412 0.7412 0.7412 1.0 gray74 -0 0.7412 0.7412 0.7412 1.0 grey74 -0 0.7490 0.7490 0.7490 1.0 gray75 -0 0.7490 0.7490 0.7490 1.0 grey75 -0 0.7608 0.7608 0.7608 1.0 gray76 -0 0.7608 0.7608 0.7608 1.0 grey76 -0 0.7686 0.7686 0.7686 1.0 gray77 -0 0.7686 0.7686 0.7686 1.0 grey77 -0 0.7804 0.7804 0.7804 1.0 gray78 -0 0.7804 0.7804 0.7804 1.0 grey78 -0 0.7882 0.7882 0.7882 1.0 gray79 -0 0.7882 0.7882 0.7882 1.0 grey79 -0 0.8000 0.8000 0.8000 1.0 gray80 -0 0.8000 0.8000 0.8000 1.0 grey80 -0 0.8118 0.8118 0.8118 1.0 gray81 -0 0.8118 0.8118 0.8118 1.0 grey81 -0 0.8196 0.8196 0.8196 1.0 gray82 -0 0.8196 0.8196 0.8196 1.0 grey82 -0 0.8314 0.8314 0.8314 1.0 gray83 -0 0.8314 0.8314 0.8314 1.0 grey83 -0 0.8392 0.8392 0.8392 1.0 gray84 -0 0.8392 0.8392 0.8392 1.0 grey84 -0 0.8510 0.8510 0.8510 1.0 gray85 -0 0.8510 0.8510 0.8510 1.0 grey85 -0 0.8588 0.8588 0.8588 1.0 gray86 -0 0.8588 0.8588 0.8588 1.0 grey86 -0 0.8706 0.8706 0.8706 1.0 gray87 -0 0.8706 0.8706 0.8706 1.0 grey87 -0 0.8784 0.8784 0.8784 1.0 gray88 -0 0.8784 0.8784 0.8784 1.0 grey88 -0 0.8902 0.8902 0.8902 1.0 gray89 -0 0.8902 0.8902 0.8902 1.0 grey89 -0 0.8980 0.8980 0.8980 1.0 gray90 -0 0.8980 0.8980 0.8980 1.0 grey90 -0 0.9098 0.9098 0.9098 1.0 gray91 -0 0.9098 0.9098 0.9098 1.0 grey91 -0 0.9216 0.9216 0.9216 1.0 gray92 -0 0.9216 0.9216 0.9216 1.0 grey92 -0 0.9294 0.9294 0.9294 1.0 gray93 -0 0.9294 0.9294 0.9294 1.0 grey93 -0 0.9412 0.9412 0.9412 1.0 gray94 -0 0.9412 0.9412 0.9412 1.0 grey94 -0 0.9490 0.9490 0.9490 1.0 gray95 -0 0.9490 0.9490 0.9490 1.0 grey95 -0 0.9608 0.9608 0.9608 1.0 gray96 -0 0.9608 0.9608 0.9608 1.0 grey96 -0 0.9686 0.9686 0.9686 1.0 gray97 -0 0.9686 0.9686 0.9686 1.0 grey97 -0 0.9804 0.9804 0.9804 1.0 gray98 -0 0.9804 0.9804 0.9804 1.0 grey98 -0 0.9882 0.9882 0.9882 1.0 gray99 -0 0.9882 0.9882 0.9882 1.0 grey99 -0 1.0000 1.0000 1.0000 1.0 gray100 -0 1.0000 1.0000 1.0000 1.0 grey100 -0 0.6627 0.6627 0.6627 1.0 dark grey -0 0.6627 0.6627 0.6627 1.0 DarkGrey -0 0.6627 0.6627 0.6627 1.0 dark gray -0 0.6627 0.6627 0.6627 1.0 DarkGray -0 0.0000 0.0000 0.5451 1.0 dark blue -0 0.0000 0.0000 0.5451 1.0 DarkBlue -0 0.0000 0.5451 0.5451 1.0 dark cyan -0 0.0000 0.5451 0.5451 1.0 DarkCyan -0 0.5451 0.0000 0.5451 1.0 dark magenta -0 0.5451 0.0000 0.5451 1.0 DarkMagenta -0 0.5451 0.0000 0.0000 1.0 dark red -0 0.5451 0.0000 0.0000 1.0 DarkRed -0 0.5647 0.9333 0.5647 1.0 light green -0 0.5647 0.9333 0.5647 1.0 LightGreen From 6e8f33c7669aaa7a6d26501823ba6965b8c3c101 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sat, 11 Aug 2007 14:23:56 +0000 Subject: [PATCH 0103/1156] Added system vimrc to project git-svn-id: http://macvim.googlecode.com/svn/trunk@123 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MacVim.xcodeproj/project.pbxproj | 4 ++ MacVim.xcodeproj/winckler.mode1 | 39 +++++++------ MacVim.xcodeproj/winckler.pbxuser | 95 ++++++++++++++++++++++++------- gvimrc | 7 ++- vimrc | 6 ++ 5 files changed, 111 insertions(+), 40 deletions(-) create mode 100644 vimrc diff --git a/MacVim.xcodeproj/project.pbxproj b/MacVim.xcodeproj/project.pbxproj index ff24851b92..4e43225376 100644 --- a/MacVim.xcodeproj/project.pbxproj +++ b/MacVim.xcodeproj/project.pbxproj @@ -35,6 +35,7 @@ 1DD704310BA9F9C2008679E9 /* SpecialKeys.plist in Resources */ = {isa = PBXBuildFile; fileRef = 1DD704300BA9F9C2008679E9 /* SpecialKeys.plist */; }; 1DE608B40C587FDA0055263D /* runtime in CopyFiles */ = {isa = PBXBuildFile; fileRef = 1DE602470C587FD10055263D /* runtime */; }; 1DE8CC620C5E2AAD003F56E3 /* Actions.plist in Resources */ = {isa = PBXBuildFile; fileRef = 1DE8CC610C5E2AAD003F56E3 /* Actions.plist */; }; + 1DED78600C6DE43D0079945F /* vimrc in Resources */ = {isa = PBXBuildFile; fileRef = 1DED785F0C6DE43D0079945F /* vimrc */; }; 1DEE0D9F0C4E150B008E82B2 /* Attention.png in Resources */ = {isa = PBXBuildFile; fileRef = 1DEE0D8A0C4E150B008E82B2 /* Attention.png */; }; 1DEE0DA00C4E150B008E82B2 /* Copy.png in Resources */ = {isa = PBXBuildFile; fileRef = 1DEE0D8B0C4E150B008E82B2 /* Copy.png */; }; 1DEE0DA10C4E150B008E82B2 /* Cut.png in Resources */ = {isa = PBXBuildFile; fileRef = 1DEE0D8C0C4E150B008E82B2 /* Cut.png */; }; @@ -153,6 +154,7 @@ 1DD704300BA9F9C2008679E9 /* SpecialKeys.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = SpecialKeys.plist; sourceTree = ""; }; 1DE602470C587FD10055263D /* runtime */ = {isa = PBXFileReference; lastKnownFileType = folder; name = runtime; path = ../../runtime; sourceTree = SOURCE_ROOT; }; 1DE8CC610C5E2AAD003F56E3 /* Actions.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = Actions.plist; sourceTree = ""; }; + 1DED785F0C6DE43D0079945F /* vimrc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = vimrc; sourceTree = ""; }; 1DEE0D8A0C4E150B008E82B2 /* Attention.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Attention.png; path = Toolbar/Attention.png; sourceTree = ""; }; 1DEE0D8B0C4E150B008E82B2 /* Copy.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Copy.png; path = Toolbar/Copy.png; sourceTree = ""; }; 1DEE0D8C0C4E150B008E82B2 /* Cut.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Cut.png; path = Toolbar/Cut.png; sourceTree = ""; }; @@ -283,6 +285,7 @@ 1DE602460C587F760055263D /* Vim Resources */ = { isa = PBXGroup; children = ( + 1DED785F0C6DE43D0079945F /* vimrc */, 1DD0C20A0C60FF9A008CD84A /* gvimrc */, 1DE602470C587FD10055263D /* runtime */, ); @@ -458,6 +461,7 @@ 1DEE0DB30C4E150B008E82B2 /* Undo.png in Resources */, 1DD04DEC0C529C5E006CDC2B /* Credits.rtf in Resources */, 1DE8CC620C5E2AAD003F56E3 /* Actions.plist in Resources */, + 1DED78600C6DE43D0079945F /* vimrc in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/MacVim.xcodeproj/winckler.mode1 b/MacVim.xcodeproj/winckler.mode1 index a1f8f0bcbb..b9fc1e74ca 100644 --- a/MacVim.xcodeproj/winckler.mode1 +++ b/MacVim.xcodeproj/winckler.mode1 @@ -368,9 +368,9 @@ TableOfContents - 1D09AB4F0C6A4DC10045497E + 1DED78180C6DCFB00079945F 1CE0B1FE06471DED0097A5F4 - 1D09AB500C6A4DC10045497E + 1DED78190C6DCFB00079945F 1CE0B20306471E060097A5F4 1CE0B20506471E060097A5F4 @@ -504,6 +504,7 @@ 5 WindowOrderList + 1C0AD2B3069F1EA900FABCE6 1D16B9EF0BA33E3800A69B33 /Users/winckler/Projects/vim7/src/MacVim/MacVim.xcodeproj @@ -529,7 +530,7 @@ PBXProjectModuleGUID 1CD0528F0623707200166675 PBXProjectModuleLabel - + MMTypesetter.m StatusBarVisibility @@ -587,7 +588,7 @@ TableOfContents 1D16B9EF0BA33E3800A69B33 - 1D09AB470C6A4D690045497E + 1DED78170C6DCFAF0079945F 1CD0528F0623707200166675 XCMainBuildResultsModuleGUID @@ -629,8 +630,8 @@ yes sizes - {{0, 0}, {409, 339}} - {{409, 0}, {615, 339}} + {{0, 0}, {401, 339}} + {{401, 0}, {623, 339}} VerticalSplitView @@ -693,14 +694,14 @@ TableOfContents 1CD10A99069EF8BA00B06720 - 1DE8CC4C0C5E24CD003F56E3 + 1DB6C9A40C6CE37300DDB514 1C162984064C10D400B95A72 - 1DE8CC4D0C5E24CD003F56E3 - 1DE8CC4E0C5E24CD003F56E3 - 1DE8CC4F0C5E24CD003F56E3 - 1DE8CC500C5E24CD003F56E3 - 1DE8CC510C5E24CD003F56E3 - 1DE8CC520C5E24CD003F56E3 + 1DB6C9A50C6CE37300DDB514 + 1DB6C9A60C6CE37300DDB514 + 1DB6C9A70C6CE37300DDB514 + 1DB6C9A80C6CE37300DDB514 + 1DB6C9A90C6CE37300DDB514 + 1DB6C9AA0C6CE37300DDB514 ToolbarConfiguration xcode.toolbar.config.debug @@ -827,6 +828,8 @@ Dock + BecomeActive + ContentConfiguration PBXProjectModuleGUID @@ -839,7 +842,7 @@ Frame {{0, 0}, {836, 380}} RubberWindowFrame - 118 143 836 421 0 0 1024 746 + 128 242 836 421 0 0 1024 746 Module PBXDebugCLIModule @@ -862,11 +865,11 @@ TableOfContents 1DE444730BA4445100C4C77A - 1DE8CC530C5E24CD003F56E3 + 1DB6C9AB0C6CE37300DDB514 1C78EAAC065D492600B07095 WindowString - 118 143 836 421 0 0 1024 746 + 128 242 836 421 0 0 1024 746 WindowToolGUID 1DE444730BA4445100C4C77A WindowToolIsVisible @@ -957,9 +960,9 @@ TableOfContents 1C0AD2B3069F1EA900FABCE6 - 1D8FA20E0C61AF48009406B2 + 1DED782E0C6DD7AF0079945F 1CD0528B0623707200166675 - 1D8FA20F0C61AF48009406B2 + 1DED782F0C6DD7AF0079945F ToolbarConfiguration xcode.toolbar.config.run diff --git a/MacVim.xcodeproj/winckler.pbxuser b/MacVim.xcodeproj/winckler.pbxuser index 0af2cdd292..7104a1789f 100644 --- a/MacVim.xcodeproj/winckler.pbxuser +++ b/MacVim.xcodeproj/winckler.pbxuser @@ -8,6 +8,14 @@ sepNavWindowFrame = "{{15, 4}, {823, 737}}"; }; }; + 1D09AB400C6A4D520045497E /* MMTypesetter.m */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {795, 2224}}"; + sepNavSelRange = "{0, 0}"; + sepNavVisRect = "{{0, 0}, {795, 162}}"; + sepNavWindowFrame = "{{15, 4}, {820, 737}}"; + }; + }; 1D0DC9EB0BA34B3D00B6CCFA /* VimWindowController.m */ = { isa = PBXFileReference; fileEncoding = 30; @@ -16,18 +24,57 @@ path = /Users/winckler/Projects/vim70/src/MacVim/VimWindowController.m; sourceTree = ""; }; + 1D14749D0C5673AE0038FA2B /* MMAppController.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {795, 464}}"; + sepNavSelRange = "{686, 0}"; + sepNavVisRect = "{{0, 302}, {795, 162}}"; + }; + }; 1D14749E0C5673AE0038FA2B /* MMAppController.m */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {795, 4880}}"; - sepNavSelRange = "{9716, 0}"; - sepNavVisRect = "{{0, 4183}, {795, 162}}"; + sepNavIntBoundsRect = "{{0, 0}, {795, 7568}}"; + sepNavSelRange = "{14355, 0}"; + sepNavVisRect = "{{0, 3943}, {795, 162}}"; + }; + }; + 1D1474A80C5677450038FA2B /* MMTextStorage.m */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {795, 9248}}"; + sepNavSelRange = "{18454, 0}"; + sepNavVisRect = "{{0, 6007}, {795, 162}}"; + sepNavWindowFrame = "{{15, 4}, {820, 737}}"; + }; + }; + 1D1474AD0C5678370038FA2B /* MMTextView.h */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {781, 608}}"; + sepNavSelRange = "{0, 0}"; + sepNavVisRect = "{{0, 0}, {781, 608}}"; + sepNavWindowFrame = "{{15, 4}, {820, 737}}"; + }; + }; + 1D1474AE0C5678370038FA2B /* MMTextView.m */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {795, 7760}}"; + sepNavSelRange = "{14917, 0}"; + sepNavVisRect = "{{0, 423}, {795, 162}}"; + sepNavWindowFrame = "{{15, 4}, {820, 737}}"; }; }; 1D1474B40C56796D0038FA2B /* MMVimController.m */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {795, 16112}}"; - sepNavSelRange = "{35098, 0}"; - sepNavVisRect = "{{0, 11239}, {795, 162}}"; + sepNavIntBoundsRect = "{{0, 0}, {795, 15968}}"; + sepNavSelRange = "{34308, 0}"; + sepNavVisRect = "{{0, 9591}, {795, 162}}"; + sepNavWindowFrame = "{{15, 4}, {820, 737}}"; + }; + }; + 1D1474BA0C567A910038FA2B /* MMWindowController.m */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {795, 18528}}"; + sepNavSelRange = "{0, 0}"; + sepNavVisRect = "{{0, 0}, {795, 162}}"; }; }; 1D16B9CF0BA33BAE00A69B33 /* MacVim */ = { @@ -43,17 +90,27 @@ NO, NO, NO, + NO, + NO, + NO, + NO, + NO, ); argumentStrings = ( - "-insetleft 2", - "-insetright 1", - "-insettop 1", - "-insetbottom 1", - "-tabmaxwidth 384", - "-taboptimumwidth 132", - "-statuslineoff 1", - "-nowindow 1", - "-tabminwidth 32", + "-MMTextInsetLeft 2", + "-MMTextInsetRight 1", + "-MMTextInsetTop 1", + "-MMTextInsetBottom 1", + "-MMTabMaxWidth 384", + "-MMTabOptimumWidth 132", + "-MMStatuslineOff 1", + "-MMNoWindow 1", + "-MMTabMinWidth 32", + "-MMCellWidthMultiplier 1.414", + "-MMBaselineOffset 2", + "-MMTypesetter \"NSTypesetter\"", + "-MMTerminateAfterLastWindowClosed 0", + "-MMTranslateCtrlClick 0", ); autoAttachOnCrash = 1; configStateDict = { @@ -97,7 +154,7 @@ delayBeforeContinue = 0; hitCount = 1; location = Foundation; - modificationTime = 207496396.974839; + modificationTime = 208462702.108592; state = 1; symbolName = "[NSException raise]"; }; @@ -120,7 +177,7 @@ functionName = "-windowDidResize:"; hitCount = 1; lineNumber = 539; - modificationTime = 207496396.974762; + modificationTime = 208463293.566525; state = 1; }; 1DE445650BA493EC00C4C77A /* XCBreakpointsBucket */ = { @@ -244,8 +301,8 @@ PBXFileDataSource_Warnings_ColumnID, ); }; - PBXPerProjectTemplateStateSaveDate = 208293179; - PBXWorkspaceStateSaveDate = 208293179; + PBXPerProjectTemplateStateSaveDate = 208523154; + PBXWorkspaceStateSaveDate = 208523154; }; sourceControlManager = 1D16B9DD0BA33BB000A69B33 /* Source Control */; userBuildSettings = { diff --git a/gvimrc b/gvimrc index 77e1cc4738..a6569a76d0 100644 --- a/gvimrc +++ b/gvimrc @@ -1,10 +1,11 @@ " System gvimrc file for MacVim -" Author: Björn Winckler -" Last Change: Mon Aug 6 15:30:37 CEST 2007 +" +" Maintainer: Björn Winckler +" Last Change: Sat Aug 11 14:27:26 CEST 2007 " " This is a work in progress. If you feel so inclined, please help me improve " this file. -" + " Make sure the '<' and 'C' flags are not included in 'cpoptions', otherwise " would not be recognized. See ":help 'cpoptions'". diff --git a/vimrc b/vimrc new file mode 100644 index 0000000000..6f6c4c36f0 --- /dev/null +++ b/vimrc @@ -0,0 +1,6 @@ +" System vimrc file for MacVim +" +" Maintainer: Björn Winckler +" Last Change: Sat Aug 11 14:26:41 CEST 2007 + +set nocompatible From fb36ef1acdde104e33b881d5c620702aa013d843 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sat, 11 Aug 2007 17:48:34 +0000 Subject: [PATCH 0104/1156] The wrong command line arguments were specified when launching MacVim. git-svn-id: http://macvim.googlecode.com/svn/trunk@124 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMBackend.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MMBackend.m b/MMBackend.m index ab438ac24e..a2b14d64ee 100644 --- a/MMBackend.m +++ b/MMBackend.m @@ -114,7 +114,7 @@ - (BOOL)checkin // MMWindowController which always raises the app when a new window is // opened. NSMutableArray *args = [NSMutableArray arrayWithObjects: - MMNoWindowKey, @"yes", nil]; + [NSString stringWithFormat:@"-%@", MMNoWindowKey], @"yes", nil]; NSString *exeName = [[mainBundle infoDictionary] objectForKey:@"CFBundleExecutable"]; NSString *path = [mainBundle pathForAuxiliaryExecutable:exeName]; From 37c3229d448b41d51aa18382c2394f67c3f67ac1 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sat, 11 Aug 2007 17:50:05 +0000 Subject: [PATCH 0105/1156] Now possible to have space and flexible space in toolbar (by creating items which math '-space.*-' and '-flexspace.*-' respectively). git-svn-id: http://macvim.googlecode.com/svn/trunk@125 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMVimController.m | 33 +++++++++++++++++++++++++-------- gui_macvim.m | 3 ++- 2 files changed, 27 insertions(+), 9 deletions(-) diff --git a/MMVimController.m b/MMVimController.m index 41fddbf8f7..687dee1604 100644 --- a/MMVimController.m +++ b/MMVimController.m @@ -795,7 +795,9 @@ - (void)addMenuItemWithTag:(int)tag parent:(NSMenu *)parent { if (parent) { NSMenuItem *item = nil; - if (title) { + if (!title || ([title hasPrefix:@"-"] && [title hasSuffix:@"-"])) { + item = [NSMenuItem separatorItem]; + } else { item = [[[NSMenuItem alloc] init] autorelease]; [item setTitle:title]; // TODO: Check that 'action' is a valid action (nothing will happen @@ -810,8 +812,6 @@ - (void)addMenuItemWithTag:(int)tag parent:(NSMenu *)parent [item setKeyEquivalent:keyString]; [item setKeyEquivalentModifierMask:mask]; } - } else { - item = [NSMenuItem separatorItem]; } // NOTE! The tag is used to idenfity which menu items were @@ -893,9 +893,12 @@ - (IBAction)toolbarAction:(id)sender - (void)addToolbarItemToDictionaryWithTag:(int)tag label:(NSString *)title toolTip:(NSString *)tip icon:(NSString *)icon { - // NOTE! 'title' is nul for separator item. Since this is already defined - // by Coca, we don't need to do anything here. - if (!title) return; + // If the item corresponds to a separator then do nothing, since it is + // already defined by Cocoa. + if (!title || [title isEqual:NSToolbarSeparatorItemIdentifier] + || [title isEqual:NSToolbarSpaceItemIdentifier] + || [title isEqual:NSToolbarFlexibleSpaceItemIdentifier]) + return; NSToolbarItem *item = [[NSToolbarItem alloc] initWithItemIdentifier:title]; [item setTag:tag]; @@ -926,14 +929,28 @@ - (void)addToolbarItemWithTag:(int)tag label:(NSString *)label tip:(NSString { if (!toolbar) return; + // Check for separator items. + if (!label) { + label = NSToolbarSeparatorItemIdentifier; + } else if ([label length] >= 2 && [label hasPrefix:@"-"] + && [label hasSuffix:@"-"]) { + // The label begins and ends with '-'; decided which kind of separator + // item it is by looking at the prefix. + if ([label hasPrefix:@"-space"]) { + label = NSToolbarSpaceItemIdentifier; + } else if ([label hasPrefix:@"-flexspace"]) { + label = NSToolbarFlexibleSpaceItemIdentifier; + } else { + label = NSToolbarSeparatorItemIdentifier; + } + } + [self addToolbarItemToDictionaryWithTag:tag label:label toolTip:tip icon:icon]; int maxIdx = [[toolbar items] count]; if (maxIdx < idx) idx = maxIdx; - // If 'label' is nul, insert a separator. - if (!label) label = NSToolbarSeparatorItemIdentifier; [toolbar insertItemWithItemIdentifier:label atIndex:idx]; } diff --git a/gui_macvim.m b/gui_macvim.m index 4d1239a84e..598755f6a2 100644 --- a/gui_macvim.m +++ b/gui_macvim.m @@ -580,7 +580,8 @@ char *icon = menu->iconfile ? (char*)menu->iconfile : menu->iconidx >= 0 ? (char*)menu->dname : NULL; - char *name = menu_is_separator(menu->name) ? NULL : (char*)menu->dname; + //char *name = menu_is_separator(menu->name) ? NULL : (char*)menu->dname; + char *name = (char*)menu->dname; char *tip = menu->strings[MENU_INDEX_TIP] ? (char*)menu->strings[MENU_INDEX_TIP] : (char*)menu->actext; From 15f99f17de1c84fe2e9c177c181bf3bf47d008d0 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sat, 11 Aug 2007 17:53:52 +0000 Subject: [PATCH 0106/1156] Removed some items from the toolbar so that all items were visible at the default window size. git-svn-id: http://macvim.googlecode.com/svn/trunk@126 96c4425d-ca35-0410-94e5-3396d5c13a8f --- gvimrc | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/gvimrc b/gvimrc index a6569a76d0..c10ef14bfd 100644 --- a/gvimrc +++ b/gvimrc @@ -1,7 +1,7 @@ " System gvimrc file for MacVim " -" Maintainer: Björn Winckler -" Last Change: Sat Aug 11 14:27:26 CEST 2007 +" Maintainer: Björn Winckler +" Last Change: Sat Aug 11 2007 " " This is a work in progress. If you feel so inclined, please help me improve " this file. @@ -51,6 +51,31 @@ an 70.350 Window.-SEP2- an 70.360 Window.Bring\ All\ To\ Front :action arrangeInFront: + +" +" Toolbar +" +" These items are special ('*' means zero or more arbitrary characters): +" -space*- an empty space +" -flexspace*- a flexible space +" -*- a separator item + +" Remove some items so that all items are visible at the default window size. +aunmenu ToolBar.Undo +aunmenu ToolBar.Redo +aunmenu ToolBar.-sep2- +aunmenu ToolBar.Cut +aunmenu ToolBar.Copy +aunmenu ToolBar.Paste +aunmenu ToolBar.-sep3- +aunmenu ToolBar.Replace +aunmenu ToolBar.FindNext +aunmenu ToolBar.FindPrev +aunmenu ToolBar.-sep5- + + + + " " Keyboard mappings " From 3a54b3e0f4a5be6fdc73b82467899523341a3d2c Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sat, 11 Aug 2007 17:58:53 +0000 Subject: [PATCH 0107/1156] Syntax highlighting enabled by default git-svn-id: http://macvim.googlecode.com/svn/trunk@127 96c4425d-ca35-0410-94e5-3396d5c13a8f --- gvimrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/gvimrc b/gvimrc index c10ef14bfd..8037634a1c 100644 --- a/gvimrc +++ b/gvimrc @@ -13,6 +13,15 @@ let s:cpo_save = &cpo set cpo&vim +" +" Global default options +" + +if !exists("syntax_on") + syntax on +endif + + " " Extra menus " From c098f82debd11a0a05b57754560b590b17f000df Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sat, 11 Aug 2007 17:59:18 +0000 Subject: [PATCH 0108/1156] The system vimrc is now copied to the right directory. git-svn-id: http://macvim.googlecode.com/svn/trunk@128 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MacVim.xcodeproj/project.pbxproj | 4 ++-- MacVim.xcodeproj/winckler.mode1 | 12 ++++++------ MacVim.xcodeproj/winckler.pbxuser | 4 ++-- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/MacVim.xcodeproj/project.pbxproj b/MacVim.xcodeproj/project.pbxproj index 4e43225376..97b32e2610 100644 --- a/MacVim.xcodeproj/project.pbxproj +++ b/MacVim.xcodeproj/project.pbxproj @@ -35,7 +35,7 @@ 1DD704310BA9F9C2008679E9 /* SpecialKeys.plist in Resources */ = {isa = PBXBuildFile; fileRef = 1DD704300BA9F9C2008679E9 /* SpecialKeys.plist */; }; 1DE608B40C587FDA0055263D /* runtime in CopyFiles */ = {isa = PBXBuildFile; fileRef = 1DE602470C587FD10055263D /* runtime */; }; 1DE8CC620C5E2AAD003F56E3 /* Actions.plist in Resources */ = {isa = PBXBuildFile; fileRef = 1DE8CC610C5E2AAD003F56E3 /* Actions.plist */; }; - 1DED78600C6DE43D0079945F /* vimrc in Resources */ = {isa = PBXBuildFile; fileRef = 1DED785F0C6DE43D0079945F /* vimrc */; }; + 1DED78600C6DE43D0079945F /* vimrc in CopyFiles */ = {isa = PBXBuildFile; fileRef = 1DED785F0C6DE43D0079945F /* vimrc */; }; 1DEE0D9F0C4E150B008E82B2 /* Attention.png in Resources */ = {isa = PBXBuildFile; fileRef = 1DEE0D8A0C4E150B008E82B2 /* Attention.png */; }; 1DEE0DA00C4E150B008E82B2 /* Copy.png in Resources */ = {isa = PBXBuildFile; fileRef = 1DEE0D8B0C4E150B008E82B2 /* Copy.png */; }; 1DEE0DA10C4E150B008E82B2 /* Cut.png in Resources */ = {isa = PBXBuildFile; fileRef = 1DEE0D8C0C4E150B008E82B2 /* Cut.png */; }; @@ -108,6 +108,7 @@ dstPath = vim; dstSubfolderSpec = 7; files = ( + 1DED78600C6DE43D0079945F /* vimrc in CopyFiles */, 1DD0C20C0C60FFB4008CD84A /* gvimrc in CopyFiles */, 1DE608B40C587FDA0055263D /* runtime in CopyFiles */, ); @@ -461,7 +462,6 @@ 1DEE0DB30C4E150B008E82B2 /* Undo.png in Resources */, 1DD04DEC0C529C5E006CDC2B /* Credits.rtf in Resources */, 1DE8CC620C5E2AAD003F56E3 /* Actions.plist in Resources */, - 1DED78600C6DE43D0079945F /* vimrc in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/MacVim.xcodeproj/winckler.mode1 b/MacVim.xcodeproj/winckler.mode1 index b9fc1e74ca..4d45fe2c6b 100644 --- a/MacVim.xcodeproj/winckler.mode1 +++ b/MacVim.xcodeproj/winckler.mode1 @@ -368,9 +368,9 @@ TableOfContents - 1DED78180C6DCFB00079945F + 1DEB90230C6E044900BB466E 1CE0B1FE06471DED0097A5F4 - 1DED78190C6DCFB00079945F + 1DEB90240C6E044900BB466E 1CE0B20306471E060097A5F4 1CE0B20506471E060097A5F4 @@ -530,7 +530,7 @@ PBXProjectModuleGUID 1CD0528F0623707200166675 PBXProjectModuleLabel - MMTypesetter.m + StatusBarVisibility @@ -588,7 +588,7 @@ TableOfContents 1D16B9EF0BA33E3800A69B33 - 1DED78170C6DCFAF0079945F + 1DEB90250C6E044900BB466E 1CD0528F0623707200166675 XCMainBuildResultsModuleGUID @@ -960,9 +960,9 @@ TableOfContents 1C0AD2B3069F1EA900FABCE6 - 1DED782E0C6DD7AF0079945F + 1DEB902B0C6E050B00BB466E 1CD0528B0623707200166675 - 1DED782F0C6DD7AF0079945F + 1DEB902C0C6E050B00BB466E ToolbarConfiguration xcode.toolbar.config.run diff --git a/MacVim.xcodeproj/winckler.pbxuser b/MacVim.xcodeproj/winckler.pbxuser index 7104a1789f..d6bcbad8a2 100644 --- a/MacVim.xcodeproj/winckler.pbxuser +++ b/MacVim.xcodeproj/winckler.pbxuser @@ -301,8 +301,8 @@ PBXFileDataSource_Warnings_ColumnID, ); }; - PBXPerProjectTemplateStateSaveDate = 208523154; - PBXWorkspaceStateSaveDate = 208523154; + PBXPerProjectTemplateStateSaveDate = 208536631; + PBXWorkspaceStateSaveDate = 208536631; }; sourceControlManager = 1D16B9DD0BA33BB000A69B33 /* Source Control */; userBuildSettings = { From c5e9d5d50542833fc409bc8999445015abda08f3 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sun, 12 Aug 2007 11:12:56 +0000 Subject: [PATCH 0109/1156] Cell width is rounded to an integer (fixes bug where window is too wide) git-svn-id: http://macvim.googlecode.com/svn/trunk@129 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMTextStorage.m | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/MMTextStorage.m b/MMTextStorage.m index 5011f6c63f..ed29f4d87a 100644 --- a/MMTextStorage.m +++ b/MMTextStorage.m @@ -381,7 +381,11 @@ - (void)setFont:(NSFont*)newFont float cellWidthMultiplier = [[NSUserDefaults standardUserDefaults] floatForKey:MMCellWidthMultiplierKey]; - cellSize.width = em * cellWidthMultiplier; + // NOTE! Even though NSFontFixedAdvanceAttribute is a float, it will + // only render at integer sizes. Hence, we restrict the cell width to + // an integer here, otherwise the window width and the actual text + // width will not match. + cellSize.width = ceilf(em * cellWidthMultiplier); NSDictionary *dict = [NSDictionary dictionaryWithObject:[NSNumber numberWithFloat:cellSize.width] From 9487df63bfd39576c03a36b374a2e2cc690ed83f Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Tue, 14 Aug 2007 15:51:24 +0000 Subject: [PATCH 0110/1156] Command queue if flushed more often so that there are no long pauses of (seeming) inactivity when Vim is doing lengthy processing. git-svn-id: http://macvim.googlecode.com/svn/trunk@135 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMBackend.h | 4 ++-- MMBackend.m | 25 ++++++++++++++++++------- gui_macvim.m | 16 +++++----------- 3 files changed, 25 insertions(+), 20 deletions(-) diff --git a/MMBackend.h b/MMBackend.h index 353112c7c5..d0a577f3e8 100644 --- a/MMBackend.h +++ b/MMBackend.h @@ -26,6 +26,7 @@ int foregroundColor; int defaultBackgroundColor; int defaultForegroundColor; + NSDate *lastFlushDate; } + (MMBackend *)sharedInstance; @@ -45,8 +46,7 @@ flags:(int)flags; - (void)insertLinesFromRow:(int)row count:(int)count scrollBottom:(int)bottom left:(int)left right:(int)right; -- (void)flush; -- (void)flushQueue; +- (void)flushQueue:(BOOL)force; - (BOOL)waitForInput:(int)milliseconds; - (void)exit; - (void)selectTab:(int)index; diff --git a/MMBackend.m b/MMBackend.m index a2b14d64ee..7932b5748a 100644 --- a/MMBackend.m +++ b/MMBackend.m @@ -13,6 +13,9 @@ +static float MMFlushTimeoutInterval = 0.1f; + + // TODO: Move to separate file. static int eventModifierFlagsToVimModMask(int modifierFlags); static int vimModMaskToEventModifierFlags(int mods); @@ -243,24 +246,29 @@ - (void)insertLinesFromRow:(int)row count:(int)count [drawData appendBytes:&right length:sizeof(int)]; } -- (void)flush +- (void)flushQueue:(BOOL)force { + // NOTE! This method gets called a lot; if we were to flush every time it + // was called MacVim would feel unresponsive. So there is a time out which + // ensures that the queue isn't flushed too often. + if (!force && lastFlushDate && -[lastFlushDate timeIntervalSinceNow] + < MMFlushTimeoutInterval) + return; + if ([drawData length] > 0) { [self queueMessage:BatchDrawMsgID data:[drawData copy]]; [drawData setLength:0]; } -} -- (void)flushQueue -{ - [self flush]; - - if ([drawData length] > 0 || [queue count] > 0) { + if ([queue count] > 0) { // TODO: Come up with a better way to handle the insertion point. [self updateInsertionPoint]; [frontendProxy processCommandQueue:queue]; [queue removeAllObjects]; + + [lastFlushDate release]; + lastFlushDate = [[NSDate date] retain]; } } @@ -674,6 +682,9 @@ - (int)lookupColorWithKey:(NSString *)key - (oneway void)processInput:(int)msgid data:(in NSData *)data { + [lastFlushDate release]; + lastFlushDate = [[NSDate date] retain]; + [self handleMessage:msgid data:data]; inputReceived = YES; } diff --git a/gui_macvim.m b/gui_macvim.m index 598755f6a2..dcf8253527 100644 --- a/gui_macvim.m +++ b/gui_macvim.m @@ -133,8 +133,7 @@ void gui_mch_update(void) { - // HACK! Nothing to do here since we tend to the run loop (which holds - // incoming events) in gui_mch_wait_for_chars(). + [[MMBackend sharedInstance] flushQueue:NO]; } @@ -142,13 +141,7 @@ void gui_mch_flush(void) { - // HACK! This function is called so often that draw performance suffers. - // Instead of actually flushing the output it is placed on a queue and - // flushed in gui_mch_wait_for_chars(), which makes the program feel much - // more responsive. This might have unintended side effects though; if - // so, another solution might have to be found. - - //[[MMBackend sharedInstance] flush]; + [[MMBackend sharedInstance] flushQueue:NO]; } @@ -164,8 +157,9 @@ int gui_mch_wait_for_chars(int wtime) { - // HACK! See comment in gui_mch_flush(). - [[MMBackend sharedInstance] flushQueue]; + // NOTE! In all likelyhood Vim will take a nap when waitForInput: is + // called, so force a flush of the command queue here. + [[MMBackend sharedInstance] flushQueue:YES]; return [[MMBackend sharedInstance] waitForInput:wtime]; } From d0aa271e7a6ddf8d47bbbf3942a0bc5a685fe1e8 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Tue, 14 Aug 2007 16:42:10 +0000 Subject: [PATCH 0111/1156] Shift-tab no longer treated as Ctrl-Y (fixes Ctrl-Y bug) git-svn-id: http://macvim.googlecode.com/svn/trunk@136 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMTextView.m | 11 ++++++++--- SpecialKeys.plist | 2 +- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/MMTextView.m b/MMTextView.m index 1a973314d2..22e7f7d7a4 100644 --- a/MMTextView.m +++ b/MMTextView.m @@ -428,8 +428,6 @@ - (void)dispatchKeyEvent:(NSEvent *)event if ([event type] != NSKeyDown) return; - //NSLog(@"%s%@", _cmd, event); - NSString *chars = [event characters]; NSString *imchars = [event charactersIgnoringModifiers]; unichar c = [chars characterAtIndex:0]; @@ -437,6 +435,8 @@ - (void)dispatchKeyEvent:(NSEvent *)event int len = 0; const char *bytes = 0; + //NSLog(@"%s chars=0x%x unmodchars=0x%x", _cmd, c, imc); + if (' ' == imc && 0xa0 != c) { // HACK! The AppKit turns into which is not standard // Vim behaviour, so bypass this problem. (0xa0 is , which @@ -451,7 +451,12 @@ - (void)dispatchKeyEvent:(NSEvent *)event // HACK! Translate Ctrl+6 to . static char ctrl_hat = 0x1e; len = 1; bytes = &ctrl_hat; - } else { + } else if (c == 0x19 && imc == 0x19) { + // HACK! AppKit turns back tab into Ctrl-Y, so we need to handle it + // separately (else Ctrl-Y doesn't work). + static char back_tab[2] = { 'k', 'B' }; + len = 2; bytes = back_tab; + }else { len = [chars lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; bytes = [chars UTF8String]; } diff --git a/SpecialKeys.plist b/SpecialKeys.plist index 8d91cccc37..ce89630cdf 100644 --- a/SpecialKeys.plist +++ b/SpecialKeys.plist @@ -4,7 +4,7 @@  KA -  + kB kB  kb From 5e9bd1011d931dfb0c88e2ecbc266abc2de754fc Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Tue, 14 Aug 2007 17:18:25 +0000 Subject: [PATCH 0112/1156] Keypad enter no longer conflicts with Ctrl-C (fixing Ctrl-C bug) git-svn-id: http://macvim.googlecode.com/svn/trunk@137 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMBackend.m | 8 ++++++++ MMTextView.m | 7 ++++++- SpecialKeys.plist | 2 +- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/MMBackend.m b/MMBackend.m index 7932b5748a..2f503b3388 100644 --- a/MMBackend.m +++ b/MMBackend.m @@ -1089,6 +1089,14 @@ - (void)handleKeyDown:(NSString *)key modifiers:(int)mods length = [key lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; unichar c = [key characterAtIndex:0]; + if ((c == Ctrl_C && ctrl_c_interrupts) + || (c == intr_char && intr_char != Ctrl_C)) { + // TODO: The run loop is not touched while Vim is processing, so + // effectively it is impossible to interrupt Vim. + trash_input_buf(); + got_int = TRUE; + } + //NSLog(@"non-special: %@ (hex=%x, mods=%d)", key, // [key characterAtIndex:0], mods); diff --git a/MMTextView.m b/MMTextView.m index 22e7f7d7a4..ee227e4f85 100644 --- a/MMTextView.m +++ b/MMTextView.m @@ -456,7 +456,12 @@ - (void)dispatchKeyEvent:(NSEvent *)event // separately (else Ctrl-Y doesn't work). static char back_tab[2] = { 'k', 'B' }; len = 2; bytes = back_tab; - }else { + } else if (c == 0x3 && imc == 0x3) { + // HACK! AppKit turns enter (not return) into Ctrl-C, so we need to + // handle it separately (else Ctrl-C doesn't work). + static char enter[2] = { 'K', 'A' }; + len = 2; bytes = enter; + } else { len = [chars lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; bytes = [chars UTF8String]; } diff --git a/SpecialKeys.plist b/SpecialKeys.plist index ce89630cdf..c4e0419713 100644 --- a/SpecialKeys.plist +++ b/SpecialKeys.plist @@ -2,7 +2,7 @@ -  + KA KA kB kB From 830ba6f4e20f4965b9e753d2b0c5e68824badbd9 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Tue, 14 Aug 2007 18:41:51 +0000 Subject: [PATCH 0113/1156] - Toolbar pill button redirected to toggleToolbar: action, which passes the click on to Vim (fixes several toolbar bugs reported by Nico) - Tabline separator hide/show code has been fixed git-svn-id: http://macvim.googlecode.com/svn/trunk@138 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMBackend.m | 29 +++++++++++++++ MMVimController.m | 20 +++++++---- MMWindowController.h | 5 +-- MMWindowController.m | 85 +++++++++++++++++++++++++++----------------- MacVim.h | 1 + 5 files changed, 100 insertions(+), 40 deletions(-) diff --git a/MMBackend.m b/MMBackend.m index 2f503b3388..71d5edc069 100644 --- a/MMBackend.m +++ b/MMBackend.m @@ -874,6 +874,35 @@ - (void)handleMessage:(int)msgid data:(NSData *)data if (menu) { gui_menu_cb(menu); } + } else if (ToggleToolbarMsgID == msgid) { + char_u go[sizeof(GO_ALL)+2]; + char_u *p; + int len; + + STRCPY(go, p_go); + p = vim_strchr(go, GO_TOOLBAR); + len = STRLEN(go); + + if (p != NULL) { + char_u *end = go + len; + while (p < end) { + p[0] = p[1]; + ++p; + } + } else { + go[len] = GO_TOOLBAR; + go[len+1] = NUL; + } + + set_option_value((char_u*)"guioptions", 0, go, 0); + + // Force screen redraw (does it have to be this complicated?). + redraw_all_later(CLEAR); + update_screen(NOT_VALID); + setcursor(); + out_flush(); + gui_update_cursor(FALSE, FALSE); + gui_mch_flush(); } else if (ScrollbarEventMsgID == msgid) { if (!data) return; const void *bytes = [data bytes]; diff --git a/MMVimController.m b/MMVimController.m index 687dee1604..99e48fda5e 100644 --- a/MMVimController.m +++ b/MMVimController.m @@ -306,10 +306,10 @@ - (void)handleMessage:(int)msgid data:(NSData *)data [windowController updateTabsWithData:data]; } else if (ShowTabBarMsgID == msgid) { //NSLog(@"Showing tab bar"); - [windowController showTabBar:self]; + [windowController showTabBar:YES]; } else if (HideTabBarMsgID == msgid) { //NSLog(@"Hiding tab bar"); - [windowController hideTabBar:self]; + [windowController showTabBar:NO]; } else if (SetTextDimensionsMsgID == msgid) { const void *bytes = [data bytes]; int rows = *((int*)bytes); bytes += sizeof(int); @@ -409,7 +409,17 @@ - (void)handleMessage:(int)msgid data:(NSData *)data [toolbar setDisplayMode:NSToolbarDisplayModeIconOnly]; [toolbar setSizeMode:NSToolbarSizeModeSmall]; - [[windowController window] setToolbar:toolbar]; + NSWindow *win = [windowController window]; + [win setToolbar:toolbar]; + + // HACK! Redirect the pill button so that we can ask Vim to + // hide the toolbar. + NSButton *pillButton = [win + standardWindowButton:NSWindowToolbarButton]; + if (pillButton) { + [pillButton setAction:@selector(toggleToolbar:)]; + [pillButton setTarget:windowController]; + } } } else if (title) { [self addMenuWithTag:tag parent:parentTag title:title atIndex:idx]; @@ -518,9 +528,7 @@ - (void)handleMessage:(int)msgid data:(NSData *)data int size = flags & ToolbarSizeRegularFlag ? NSToolbarSizeModeRegular : NSToolbarSizeModeSmall; - [toolbar setSizeMode:size]; - [toolbar setDisplayMode:mode]; - [toolbar setVisible:enable]; + [windowController showToolbar:enable size:size mode:mode]; } else if (CreateScrollbarMsgID == msgid) { const void *bytes = [data bytes]; long ident = *((long*)bytes); bytes += sizeof(long); diff --git a/MMWindowController.h b/MMWindowController.h index 6c33adc94c..5227c03273 100644 --- a/MMWindowController.h +++ b/MMWindowController.h @@ -56,10 +56,11 @@ - (void)setFont:(NSFont *)font; - (void)processCommandQueueDidFinish; - (void)popupMenu:(NSMenu *)menu atRow:(int)row column:(int)col; +- (void)showTabBar:(BOOL)on; +- (void)showToolbar:(BOOL)on size:(int)size mode:(int)mode; - (IBAction)addNewTab:(id)sender; -- (IBAction)showTabBar:(id)sender; -- (IBAction)hideTabBar:(id)sender; +- (IBAction)toggleToolbar:(id)sender; @end diff --git a/MMWindowController.m b/MMWindowController.m index 445ed9f150..7cd9e93686 100644 --- a/MMWindowController.m +++ b/MMWindowController.m @@ -169,6 +169,8 @@ - (void)dealloc - (void)windowDidLoad { + NSWindow *win = [self window]; + // Called after window nib file is loaded. [tablineSeparator setHidden:NO]; @@ -200,12 +202,12 @@ - (void)windowDidLoad addObserver:vimController selector:@selector(windowWillClose:) name:NSWindowWillCloseNotification - object:[self window]]; + object:win]; [[NSNotificationCenter defaultCenter] addObserver:vimController selector:@selector(windowDidBecomeMain:) name:NSWindowDidBecomeMainNotification - object:[self window]]; + object:win]; } - (MMVimController *)vimController @@ -482,32 +484,49 @@ - (void)popupMenu:(NSMenu *)menu atRow:(int)row column:(int)col [NSMenu popUpContextMenu:menu withEvent:event forView:textView]; } -- (IBAction)addNewTab:(id)sender +- (void)showTabBar:(BOOL)on { - // NOTE! This can get called a lot if the user holds down the key - // equivalent for this action, which causes the ports to fill up. If we - // wait for the message to be sent then the app might become unresponsive. - [vimController sendMessage:AddNewTabMsgID data:nil wait:NO]; -} + [tabBarControl setHidden:!on]; -- (IBAction)showTabBar:(id)sender -{ - [tablineSeparator setHidden:YES]; - [tabBarControl setHidden:NO]; + if (!on) { + NSToolbar *toolbar = [[self window] toolbar]; + [tablineSeparator setHidden:![toolbar isVisible]]; + } else { + [tablineSeparator setHidden:on]; + } if (setupDone) shouldUpdateWindowSize = YES; } -- (IBAction)hideTabBar:(id)sender +- (void)showToolbar:(BOOL)on size:(int)size mode:(int)mode { - [tablineSeparator setHidden:NO]; - [tabBarControl setHidden:YES]; + NSToolbar *toolbar = [[self window] toolbar]; + if (!toolbar) return; - if (setupDone) - shouldUpdateWindowSize = YES; + [toolbar setSizeMode:size]; + [toolbar setDisplayMode:mode]; + [toolbar setVisible:on]; + + if (!on) { + [tablineSeparator setHidden:YES]; + } else { + [tablineSeparator setHidden:![tabBarControl isHidden]]; + } +} + +- (IBAction)addNewTab:(id)sender +{ +// NOTE! This can get called a lot if the user holds down the key +// equivalent for this action, which causes the ports to fill up. If we +// wait for the message to be sent then the app might become unresponsive. +[vimController sendMessage:AddNewTabMsgID data:nil wait:NO]; } +- (IBAction)toggleToolbar:(id)sender +{ +[vimController sendMessage:ToggleToolbarMsgID data:nil wait:NO]; +} @@ -515,16 +534,16 @@ - (IBAction)hideTabBar:(id)sender - (void)tabView:(NSTabView *)theTabView didSelectTabViewItem: - (NSTabViewItem *)tabViewItem + (NSTabViewItem *)tabViewItem { - // HACK! There seem to be a bug in NSTextView which results in the first - // responder not being set to the view of the tab item so it is done - // manually here. - [[self window] makeFirstResponder:[tabViewItem view]]; - - // HACK! The selection message should not be propagated to the VimTask if - // the VimTask selected the tab (e.g. as opposed the user clicking the - // tab). The delegate method has no way of knowing who initiated the +// HACK! There seem to be a bug in NSTextView which results in the first +// responder not being set to the view of the tab item so it is done +// manually here. +[[self window] makeFirstResponder:[tabViewItem view]]; + +// HACK! The selection message should not be propagated to the VimTask if +// the VimTask selected the tab (e.g. as opposed the user clicking the +// tab). The delegate method has no way of knowing who initiated the // selection so a flag is set when the VimTask initiated the selection. if (!vimTaskSelectedTab) { // Propagate the selection message to the VimTask. @@ -688,9 +707,10 @@ - (NSSize)contentSizeForTextStorageSize:(NSSize)textViewSize size.width += [textView textContainerOrigin].x + right; size.height += [textView textContainerOrigin].y + bot; - // A one pixel high separator is shown if tabline is hidden. - if ([tabBarControl isHidden]) ++size.height; - else size.height += [tabBarControl frame].size.height; + if (![tablineSeparator isHidden]) + ++size.height; + if (![tabBarControl isHidden]) + size.height += [tabBarControl frame].size.height; if (![ud boolForKey:MMStatuslineOffKey]) size.height += StatusLineHeight; @@ -709,9 +729,10 @@ - (NSRect)textViewRectForContentSize:(NSSize)contentSize { NSRect rect = { 0, 0, contentSize.width, contentSize.height }; - // A one pixel high separator is shown if tabline is hidden. - if ([tabBarControl isHidden]) --rect.size.height; - else rect.size.height -= [tabBarControl frame].size.height; + if (![tablineSeparator isHidden]) + --rect.size.height; + if (![tabBarControl isHidden]) + rect.size.height -= [tabBarControl frame].size.height; if (![[NSUserDefaults standardUserDefaults] boolForKey:MMStatuslineOffKey]) { diff --git a/MacVim.h b/MacVim.h index a4e80cf3ee..71affc1279 100644 --- a/MacVim.h +++ b/MacVim.h @@ -92,6 +92,7 @@ enum { EnableMenuItemMsgID, ExecuteMenuMsgID, ShowToolbarMsgID, + ToggleToolbarMsgID, CreateScrollbarMsgID, DestroyScrollbarMsgID, ShowScrollbarMsgID, From a94be507249f0e77502c5887ef7b982ae92b15b8 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Tue, 14 Aug 2007 18:42:02 +0000 Subject: [PATCH 0114/1156] git-svn-id: http://macvim.googlecode.com/svn/trunk@139 96c4425d-ca35-0410-94e5-3396d5c13a8f --- TODO | 41 ++++++++++++++++++++++++++++------------- 1 file changed, 28 insertions(+), 13 deletions(-) diff --git a/TODO b/TODO index 1e831d1f2d..daffd8bc22 100644 --- a/TODO +++ b/TODO @@ -1,13 +1,19 @@ Active: +- ability to interrupt vim (needs to check the run-loop for interrupts) +- let user choose file encoding and format in open/save dialogs +- view menu option to show/hide gui status line +- autosave settings ? +- encoding -- convert strings from vim to utf-8 +- main menu (buffers menu, window menu) +- gui dialogs (FEAT_GUI_DIALOG) + no warning when buffer modified outside vim (implement gui_mch_dialog()) +- standardize NSString usage (initialization & how it is passed in messages) +- autosave window rows&columns? +- set gfn=* ? - improve drag and drop support (drop in command line mode not working, modifier keys are ignored) - grey out menus which can't be used: Tab Next/Prev/Close, Undo/Redo, etc. -- when only one tab open make close window -- main menu (buffers menu, window menu) -- services menu -- no warning when buffer modified outside vim (implement gui_mch_dialog()) -- gui dialogs (FEAT_GUI_DIALOG) - find/replace toolbar item (FIND_REPLACE_DIALOG) - drag-to-resize, delay if mouse button held down - ability to modify key equivalents at any time @@ -18,11 +24,8 @@ Active: - tab-completion for :action command? - should ignore action message if is called too often (e.g. in addNewTab:) - proper font handling -- font selection dialog (:set gfn=*) - check for memory leaks - i8n -- popup menus -- encoding -- convert strings from vim to utf-8 - change building procedure so that the Makefile compiles and links VimTask and then calls pbxbuild to build MacVim (and put MacVim.app) in the src folder - icons for all built in toolbar items @@ -33,7 +36,6 @@ Active: - forking doesn't work with :gui (i think) - make sure [NSMutableData appendByte:length:] is never called with 0 length (this will lead to a crash) -- wide characters are badly supported: they render as too wide - update speed whilst resizing with mouse is excruciatingly slow - window count should be typeset nicely in tab - put marked text in status line (?) @@ -63,8 +65,25 @@ Active: Pending: +- toogle toolbar off, maximize window, toolbar on -> text view under toolbar +- clicking pill button does not update 'guioptions' +- detect Cmd-. (and Ctrl-C) for interrupt +- :popup +- popup menus +- when only one tab open make close window +- cscope, ctags +- Ctrl-O in insert mode +- remember window position +- font selection dialog (:set gfn=*) +- services menu +- wide characters are badly supported: they render as too wide +- dropping directories does not work - memory leak with text view? (need to release text storage) - drag and drop inside view (FEAT_GUI_DND, gui_handle_drop()) + + +Done: + - toolbar drawing bug - Cmd-zoom -> no input received, drawing broken - scrollbars not positioned over resize box @@ -86,10 +105,6 @@ Pending: - :colorscheme elflord, :set lines+=3 --> colors are not updated properly - use DO to communicate between GUI and Vim (only for two-way communication, one-way communication should still use mach ports) - - -Done: - - make scrollbar inactive if it is too small to display properly - make vertical scrollbars cover command line as well - setting font in .gvimrc has no effect since textStorage has not been init'ed From 6646d230e13aa714d56e6a64b4159322d8a73b71 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Tue, 14 Aug 2007 18:42:28 +0000 Subject: [PATCH 0115/1156] Changed which toolbar icons are hidden git-svn-id: http://macvim.googlecode.com/svn/trunk@140 96c4425d-ca35-0410-94e5-3396d5c13a8f --- gvimrc | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/gvimrc b/gvimrc index 8037634a1c..e22bfc3c43 100644 --- a/gvimrc +++ b/gvimrc @@ -70,18 +70,24 @@ an 70.360 Window.Bring\ All\ To\ Front :action arrangeInFront: " -*- a separator item " Remove some items so that all items are visible at the default window size. -aunmenu ToolBar.Undo -aunmenu ToolBar.Redo -aunmenu ToolBar.-sep2- -aunmenu ToolBar.Cut -aunmenu ToolBar.Copy -aunmenu ToolBar.Paste -aunmenu ToolBar.-sep3- +"aunmenu ToolBar.Undo +"aunmenu ToolBar.Redo +"aunmenu ToolBar.-sep2- +"aunmenu ToolBar.Cut +"aunmenu ToolBar.Copy +"aunmenu ToolBar.Paste +"aunmenu ToolBar.-sep3- aunmenu ToolBar.Replace aunmenu ToolBar.FindNext aunmenu ToolBar.FindPrev aunmenu ToolBar.-sep5- +aunmenu ToolBar.-sep6- +aunmenu ToolBar.RunCtags +aunmenu ToolBar.TagJump +"aunmenu ToolBar.-sep7- +aunmenu ToolBar.FindHelp +"an 1.295 ToolBar.-flexspace7- From 2abf0b83702430977271b9b1dced3b24fdc189b5 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Thu, 16 Aug 2007 08:42:30 +0000 Subject: [PATCH 0116/1156] Added 'Close' item to menu for debugging purposes. git-svn-id: http://macvim.googlecode.com/svn/trunk@141 96c4425d-ca35-0410-94e5-3396d5c13a8f --- English.lproj/MainMenu.nib/keyedobjects.nib | Bin 7267 -> 7451 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/English.lproj/MainMenu.nib/keyedobjects.nib b/English.lproj/MainMenu.nib/keyedobjects.nib index 7d3cba39f53ad729f73005f703c2aff72db3fffe..8bbeff59128d68b05b12e2e9e074b3bc9f0be343 100644 GIT binary patch literal 7451 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 U@!AB4{5URpr=z0x*j1bLze(pt4gdfE From 0c28d2ce65a4a9962f7ec6067bc1634db97a5d48 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Thu, 16 Aug 2007 08:42:52 +0000 Subject: [PATCH 0117/1156] Changed default title git-svn-id: http://macvim.googlecode.com/svn/trunk@142 96c4425d-ca35-0410-94e5-3396d5c13a8f --- English.lproj/VimWindow.nib/keyedobjects.nib | Bin 5985 -> 5976 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/English.lproj/VimWindow.nib/keyedobjects.nib b/English.lproj/VimWindow.nib/keyedobjects.nib index 6cf2d232fabd662c6f8870dfac29d9d1c126c430..218166e6c6e277880792ffd46c809b27b7ef9a8d 100644 GIT binary patch delta 1253 zcmZuvdr*}{6yNVt$NBbk&RG)72i$z;6Cz)km|`d*SImS`Kp?JoMWlp;(z>5!H4bB? zx17ex9+qipW8%~}P1-|p95u_VFeNcFbILI@Gz+1v$j!{I zPxo3}C#ODJR(42T%fhUTHL_gR#_Al#+F6a0;H+>QKi*IBg@3cp{b7EbpW%=7m7n5g z`&rQo&^=OT5sfU_V#{n6i(%I0IIPUpa*J{;R@f{Slk5vw_AEcb(pbFni_^G`#du?^ z$^Xk6V|D+_`!BxL;-f2ZL|S2R#@)pwx#3VvW_73{B{wg;u(Yx!KO?*#)W0e)t!80p zQEqU?gv#2Kd|Mf+t@D*i z^B(t}^j3Ox-YRdmcff1%&Uu%-R?hhiJf3&u-FOe4$OF6=@5B4@{ydqd^5J|WpUkK5 zsXWMYc!)3I%lXT^p6}uN`BC1?&+`lXBEQ62_!ZtNnCK!B#Eqi6=qXYo;tr86?i6>4 zB2gmBMYVWBM8!I>L2MN}#9?tv92ZUEq-YkW#Tju{w8-Ff33*j@Qk|8jgi;C=sW=rGq|($R zm7@yOQ|cMDMm?+6s^`@@^@4gyZB(1p7PU?7Rv)U5)n4_fYEplyR@J7Nc6CQhI!+JN z6Lhwoud8&euG4Gu2K|P9Q*YK=^iJKN_v!umfIg&8>R(U#Rfcx$FLdCV+*!nJ2}Kj zkfM0Xq%6v&X*8W?&`ipsducWm&>SkJ`zSg4M4wOt?W6s4fDX}N`hvcsujm^(M#rg%PSPnlO=svVoui-WJYArRbctH%3SFhY z=o+;f$8<2AOlRX6VUz(wCeCy*2_|4}GQG`UGsFxtqs(YC#!NJs?D}$}lM}i+_xufu C@>;?G delta 1273 zcmYk4dra0<7{|}=)xzJoKF<+fh>=oxK~eD?UQk0P5}*h=FE7Oi5qQN{F0TstlDGFr zI^9@n4M(P3W>$95yr4B}rgJQ_3pu7nYL=!(W|^g}tf2GiKc4M5J3G&LKKnl3=X8#| zFmg|h6YpUjP8!KUkFa~2jpsd*G6L^WV)CX9ueTL+X-dhHC@MO6-FLW&U6wJgq)Z(|i*KKRJu! zkQpT3N{G6UOIn;bGSl`D?P(e*utKI=pVm3VI+jP8%p&8OQd4GyMZHP3Vti(y?JU}9 zk*ToqimiM3);(cLn!{L^G6f!i2`~{R!Gq8r2ErJ~fJAU$01SdhVKj_`u`n6ZAqmE} z_S2(0k*V$scb;45mbztbmAl++a96mi+%>Lo8{Jm-h}+?wce~shZVz=Sqk<}mv@h*P zBsaqJw-3lOY{ouqF3oPdV}6# zlyN2*FwK%9Yz#|h6Ic$L#|l{~3$m4LBYTc*X4}{f*2db|3D&_*vQw;+onhzLA3T;n z%m?zpJed#U!}&;_#?yH|FX81pz$^J;9^q^GGkiVYz_;)n{2jiNAK*uMJ3q@W3y+Wj zgch;FE8<0hNEDILB1g;;Pl$!$1@WTTDqa?^ifv-McwM|Hc8h&tzj$996UW8p;!E+B zxFUPW`(%uCC6huX$V8bY^Q2$a$yIW#+$6Wko$@`oNA8pRs5=|thT6^)GKPQ z`cR!xU#oA_S@o^@PF+wxsLSd{^^^Kp{i3d`8|t>|fj)NrgJ1{@g%lV8so;Y&`v=Cs zc>5~H|7h}feUdFF2-uC#U;25 z>v1_Y;0j!YYtUdLuES>|cm$7P8-9YH;%E2;w&Mxxz>|0yJMj#j!}It(Uc^gy1-tMn zUc+DUH~bxM;-B~z-o}5iTNCZkz4iUNkEWVysX=QUtGzm2C+I}oUnl9IdYB%r$LO&- XT~E=OI!ov4+2qdhG*6C;cNY8)@s(Sl From c9ce3ae679b4c7ee269130f74ba280f1f3851a1c Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Thu, 16 Aug 2007 08:44:31 +0000 Subject: [PATCH 0118/1156] - VimWindow.nib is deprecated; it is replaced by EmptyWindow.nib - Removed VimWidow.nib from project and added EmptyWindow.nib git-svn-id: http://macvim.googlecode.com/svn/trunk@143 96c4425d-ca35-0410-94e5-3396d5c13a8f --- English.lproj/EmptyWindow.nib/classes.nib | 19 ++ English.lproj/EmptyWindow.nib/info.nib | 16 ++ .../EmptyWindow.nib/keyedobjects.nib | Bin 0 -> 1940 bytes MacVim.xcodeproj/project.pbxproj | 14 +- MacVim.xcodeproj/winckler.mode1 | 75 ++++---- MacVim.xcodeproj/winckler.pbxuser | 169 ++++++++++++++---- 6 files changed, 211 insertions(+), 82 deletions(-) create mode 100644 English.lproj/EmptyWindow.nib/classes.nib create mode 100644 English.lproj/EmptyWindow.nib/info.nib create mode 100644 English.lproj/EmptyWindow.nib/keyedobjects.nib diff --git a/English.lproj/EmptyWindow.nib/classes.nib b/English.lproj/EmptyWindow.nib/classes.nib new file mode 100644 index 0000000000..1b3240d12a --- /dev/null +++ b/English.lproj/EmptyWindow.nib/classes.nib @@ -0,0 +1,19 @@ +{ + IBClasses = ( + {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, + { + ACTIONS = {addNewTab = id; toggleToolbar = id; }; + CLASS = MMWindowController; + LANGUAGE = ObjC; + OUTLETS = { + statusSeparator = NSBox; + statusTextField = NSTextField; + tabBarControl = PSMTabBarControl; + tabView = NSTabView; + tablineSeparator = NSBox; + }; + SUPERCLASS = NSWindowController; + } + ); + IBVersion = 1; +} \ No newline at end of file diff --git a/English.lproj/EmptyWindow.nib/info.nib b/English.lproj/EmptyWindow.nib/info.nib new file mode 100644 index 0000000000..dab4ca583e --- /dev/null +++ b/English.lproj/EmptyWindow.nib/info.nib @@ -0,0 +1,16 @@ + + + + + IBDocumentLocation + 69 14 356 240 0 0 1024 746 + IBFramework Version + 446.1 + IBOpenObjects + + 5 + + IBSystem Version + 8R218 + + diff --git a/English.lproj/EmptyWindow.nib/keyedobjects.nib b/English.lproj/EmptyWindow.nib/keyedobjects.nib new file mode 100644 index 0000000000000000000000000000000000000000..c0f2ad096907269ea3217404ca52a1bd0f9d250f GIT binary patch literal 1940 zcmZWpYitx%6rOwU99jg*w3MZ#QWsb#$Wpf3m6le}wpggJTj{jh2gN$wj%Da}r|e8= z%erz!MFj-W0vaSh3j#rW#`jx%1kj*`7-NVUHEM`4#`uTC7|+ZsRdj#sz31HTob!F> zo;&S5QOz)Yz6*ph5yqrl)9g{=k+s?eHQwaGKSR@F^&V62Y4Ygp>(q#8v`G^~@(Oi8 z?Wjlrvjno`;OFUM*VI%NI-m~4R5*E7nm=xQ(G3f4TwHNW%_?nOmu_shD|yf6d+&ST z!R?Ri-uvXCr;Z*w@yttazV-Gy@1FYTbb}|>8;yP=WlhMKC}n0%%AV|+l9M|%@7ihk z*SV+9nCY1{yI{`T>*smr7cTJGG-@46VI|tDBC*_%ToH+=hM~1W~~#x>b9>CM2g|*2(`n3sW^8zBI*fxn4Kr6(4OcBK$2JCgO$GZVt7bz;#(#uYFF&-5kL9@+Ze8J884T6> zQ1(*QFtwOsVjmkr@=B#$jbc$*?~O-Pehr_(b2zrMnpeb(NWOd{*mA>D1=+Zy+Lceo}v5_NUQutuR_#!&<| z#i7SDu**H`hu6o;ZK+rKd<7-j8;mw%^%g6halWtLRk$%>qpi8BQ;i-y)}h9+;r4BE zfoJlpHYq!iDDt`&UCj)u-Mwje6EDYEwDO_Y(FASMDcEkj#S2tKsb&8XcyQN>ilefEPx#6w$$ zw{Am7Hogk2y|x!`&K&&);Jl)9)I|8hJBD}cwB|U~n2LB@89=4>ibJ?-a7Ybu31=%0 z(R+3d?JP&{#{Wep7u4Ik#$aW~HkJ0x4HwWwNPxNG}j_?(uwjt?HR z_#h+UtB4pUn&S9G)kEM5Hun4935={2Dw_ybf=`Tkt-df)C*g Sd@9&KN}N^rB(186 RubberWindowFrame - 168 349 690 397 0 0 1024 746 + 168 348 690 397 0 0 1024 746 Module PBXSmartGroupTreeModule @@ -324,7 +324,7 @@ Frame {{0, 0}, {482, 0}} RubberWindowFrame - 168 349 690 397 0 0 1024 746 + 168 348 690 397 0 0 1024 746 Module PBXNavigatorGroup @@ -344,7 +344,7 @@ Frame {{0, 5}, {482, 351}} RubberWindowFrame - 168 349 690 397 0 0 1024 746 + 168 348 690 397 0 0 1024 746 Module XCDetailModule @@ -368,9 +368,9 @@ TableOfContents - 1DEB90230C6E044900BB466E + 1DDBEB8A0C7438DA0036EEDD 1CE0B1FE06471DED0097A5F4 - 1DEB90240C6E044900BB466E + 1DDBEB8B0C7438DA0036EEDD 1CE0B20306471E060097A5F4 1CE0B20506471E060097A5F4 @@ -504,12 +504,17 @@ 5 WindowOrderList - 1C0AD2B3069F1EA900FABCE6 + 1DDBEBA70C743B2A0036EEDD + 1DDBEBA80C743B2A0036EEDD + 1DE444730BA4445100C4C77A + 1CD10A99069EF8BA00B06720 + 1DDBEBA50C743B2A0036EEDD 1D16B9EF0BA33E3800A69B33 + 1C0AD2B3069F1EA900FABCE6 /Users/winckler/Projects/vim7/src/MacVim/MacVim.xcodeproj WindowString - 168 349 690 397 0 0 1024 746 + 168 348 690 397 0 0 1024 746 WindowTools @@ -530,7 +535,7 @@ PBXProjectModuleGUID 1CD0528F0623707200166675 PBXProjectModuleLabel - + MMWindowController.m StatusBarVisibility @@ -539,7 +544,7 @@ Frame {{0, 0}, {836, 194}} RubberWindowFrame - 188 225 836 476 0 0 1024 746 + 149 236 836 476 0 0 1024 746 Module PBXNavigatorGroup @@ -565,7 +570,7 @@ Frame {{0, 199}, {836, 236}} RubberWindowFrame - 188 225 836 476 0 0 1024 746 + 149 236 836 476 0 0 1024 746 Module PBXBuildResultsModule @@ -588,14 +593,14 @@ TableOfContents 1D16B9EF0BA33E3800A69B33 - 1DEB90250C6E044900BB466E + 1DDBEB860C7438D80036EEDD 1CD0528F0623707200166675 XCMainBuildResultsModuleGUID ToolbarConfiguration xcode.toolbar.config.build WindowString - 188 225 836 476 0 0 1024 746 + 149 236 836 476 0 0 1024 746 WindowToolGUID 1D16B9EF0BA33E3800A69B33 WindowToolIsVisible @@ -630,8 +635,8 @@ yes sizes - {{0, 0}, {401, 339}} - {{401, 0}, {623, 339}} + {{0, 0}, {391, 339}} + {{391, 0}, {633, 339}} VerticalSplitView @@ -671,7 +676,7 @@ Frame {{0, 0}, {1024, 645}} RubberWindowFrame - 0 60 1024 686 0 0 1024 746 + 1 60 1024 686 0 0 1024 746 Module PBXDebugSessionModule @@ -694,19 +699,19 @@ TableOfContents 1CD10A99069EF8BA00B06720 - 1DB6C9A40C6CE37300DDB514 + 1DDBEB9F0C743B2A0036EEDD 1C162984064C10D400B95A72 - 1DB6C9A50C6CE37300DDB514 - 1DB6C9A60C6CE37300DDB514 - 1DB6C9A70C6CE37300DDB514 - 1DB6C9A80C6CE37300DDB514 - 1DB6C9A90C6CE37300DDB514 - 1DB6C9AA0C6CE37300DDB514 + 1DDBEBA00C743B2A0036EEDD + 1DDBEBA10C743B2A0036EEDD + 1DDBEBA20C743B2A0036EEDD + 1DDBEBA30C743B2A0036EEDD + 1DDBEBA40C743B2A0036EEDD + 1DDBEBA50C743B2A0036EEDD ToolbarConfiguration xcode.toolbar.config.debug WindowString - 0 60 1024 686 0 0 1024 746 + 1 60 1024 686 0 0 1024 746 WindowToolGUID 1CD10A99069EF8BA00B06720 WindowToolIsVisible @@ -842,7 +847,7 @@ Frame {{0, 0}, {836, 380}} RubberWindowFrame - 128 242 836 421 0 0 1024 746 + 137 67 836 421 0 0 1024 746 Module PBXDebugCLIModule @@ -865,11 +870,11 @@ TableOfContents 1DE444730BA4445100C4C77A - 1DB6C9AB0C6CE37300DDB514 + 1DDBEBA60C743B2A0036EEDD 1C78EAAC065D492600B07095 WindowString - 128 242 836 421 0 0 1024 746 + 137 67 836 421 0 0 1024 746 WindowToolGUID 1DE444730BA4445100C4C77A WindowToolIsVisible @@ -960,9 +965,9 @@ TableOfContents 1C0AD2B3069F1EA900FABCE6 - 1DEB902B0C6E050B00BB466E + 1DDBEB870C7438D80036EEDD 1CD0528B0623707200166675 - 1DEB902C0C6E050B00BB466E + 1DDBEB880C7438D80036EEDD ToolbarConfiguration xcode.toolbar.config.run @@ -1139,7 +1144,7 @@ 168 RubberWindowFrame - 61 303 744 409 0 0 1024 746 + 135 179 744 409 0 0 1024 746 Module PBXSmartGroupTreeModule @@ -1147,8 +1152,6 @@ 185pt - BecomeActive - ContentConfiguration PBXProjectModuleGUID @@ -1161,7 +1164,7 @@ Frame {{190, 0}, {554, 368}} RubberWindowFrame - 61 303 744 409 0 0 1024 746 + 135 179 744 409 0 0 1024 746 Module XCDetailModule @@ -1188,17 +1191,17 @@ TableOfContents - 1DDA69300C55296D00F5D112 - 1DDA69310C55296D00F5D112 + 1D6F54660C733FF800D9BDC8 + 1D6F54670C733FF800D9BDC8 1CE0B1FE06471DED0097A5F4 1CA1AED706398EBD00589147 ToolbarConfiguration xcode.toolbar.config.breakpoints WindowString - 61 303 744 409 0 0 1024 746 + 135 179 744 409 0 0 1024 746 WindowToolGUID - 1DDA69300C55296D00F5D112 + 1D6F54660C733FF800D9BDC8 WindowToolIsVisible diff --git a/MacVim.xcodeproj/winckler.pbxuser b/MacVim.xcodeproj/winckler.pbxuser index d6bcbad8a2..908cd852a8 100644 --- a/MacVim.xcodeproj/winckler.pbxuser +++ b/MacVim.xcodeproj/winckler.pbxuser @@ -16,14 +16,6 @@ sepNavWindowFrame = "{{15, 4}, {820, 737}}"; }; }; - 1D0DC9EB0BA34B3D00B6CCFA /* VimWindowController.m */ = { - isa = PBXFileReference; - fileEncoding = 30; - lastKnownFileType = sourcecode.c.objc; - name = VimWindowController.m; - path = /Users/winckler/Projects/vim70/src/MacVim/VimWindowController.m; - sourceTree = ""; - }; 1D14749D0C5673AE0038FA2B /* MMAppController.h */ = { uiCtxt = { sepNavIntBoundsRect = "{{0, 0}, {795, 464}}"; @@ -33,9 +25,10 @@ }; 1D14749E0C5673AE0038FA2B /* MMAppController.m */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {795, 7568}}"; - sepNavSelRange = "{14355, 0}"; - sepNavVisRect = "{{0, 3943}, {795, 162}}"; + sepNavIntBoundsRect = "{{0, 0}, {983, 7600}}"; + sepNavSelRange = "{14399, 0}"; + sepNavVisRect = "{{0, 4078}, {983, 274}}"; + sepNavWindowFrame = "{{15, 4}, {820, 737}}"; }; }; 1D1474A80C5677450038FA2B /* MMTextStorage.m */ = { @@ -56,25 +49,34 @@ }; 1D1474AE0C5678370038FA2B /* MMTextView.m */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {795, 7760}}"; - sepNavSelRange = "{14917, 0}"; - sepNavVisRect = "{{0, 423}, {795, 162}}"; + sepNavIntBoundsRect = "{{0, 0}, {983, 7904}}"; + sepNavSelRange = "{3174, 0}"; + sepNavVisRect = "{{0, 1599}, {983, 274}}"; sepNavWindowFrame = "{{15, 4}, {820, 737}}"; }; }; 1D1474B40C56796D0038FA2B /* MMVimController.m */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {795, 15968}}"; - sepNavSelRange = "{34308, 0}"; - sepNavVisRect = "{{0, 9591}, {795, 162}}"; + sepNavIntBoundsRect = "{{0, 0}, {1637, 17296}}"; + sepNavSelRange = "{3790, 7}"; + sepNavVisRect = "{{0, 1576}, {781, 608}}"; sepNavWindowFrame = "{{15, 4}, {820, 737}}"; }; }; - 1D1474BA0C567A910038FA2B /* MMWindowController.m */ = { + 1D1474B90C567A910038FA2B /* MMWindowController.h */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {795, 18528}}"; + sepNavIntBoundsRect = "{{0, 0}, {781, 1168}}"; sepNavSelRange = "{0, 0}"; - sepNavVisRect = "{{0, 0}, {795, 162}}"; + sepNavVisRect = "{{0, 0}, {781, 608}}"; + sepNavWindowFrame = "{{15, 4}, {820, 737}}"; + }; + }; + 1D1474BA0C567A910038FA2B /* MMWindowController.m */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {1147, 20016}}"; + sepNavSelRange = "{39888, 0}"; + sepNavVisRect = "{{0, 2791}, {795, 162}}"; + sepNavWindowFrame = "{{15, 4}, {820, 737}}"; }; }; 1D16B9CF0BA33BAE00A69B33 /* MacVim */ = { @@ -114,6 +116,17 @@ ); autoAttachOnCrash = 1; configStateDict = { + "PBXLSLaunchAction-0" = { + PBXLSLaunchAction = 0; + PBXLSLaunchStartAction = 1; + PBXLSLaunchStdioStyle = 2; + PBXLSLaunchStyle = 0; + class = PBXLSRunLaunchConfig; + displayName = "Executable Runner"; + identifier = com.apple.Xcode.launch.runConfig; + remoteHostInfo = ""; + startActionInfo = ""; + }; }; customDataFormattersEnabled = 1; debuggerPlugin = GDBDebugging; @@ -121,6 +134,16 @@ dylibVariantSuffix = ""; enableDebugStr = 1; environmentEntries = ( + { + active = NO; + name = DYLD_INSERT_LIBRARIES; + value = /usr/lib/libgmalloc.dylib; + }, + { + active = NO; + name = NSZombieEnabled; + value = YES; + }, ); executableSystemSymbolLevel = 0; executableUserSymbolLevel = 0; @@ -131,6 +154,46 @@ sourceDirectories = ( ); variableFormatDictionary = { + $cr = 1; + $ctr = 1; + $lr = 1; + $mq = 1; + $pc = 1; + $ps = 1; + $r0 = 1; + $r1 = 1; + $r10 = 1; + $r11 = 1; + $r12 = 1; + $r13 = 1; + $r14 = 1; + $r15 = 1; + $r16 = 1; + $r17 = 1; + $r18 = 1; + $r19 = 1; + $r2 = 1; + $r20 = 1; + $r21 = 1; + $r22 = 1; + $r23 = 1; + $r24 = 1; + $r25 = 1; + $r26 = 1; + $r27 = 1; + $r28 = 1; + $r29 = 1; + $r3 = 1; + $r30 = 1; + $r31 = 1; + $r4 = 1; + $r5 = 1; + $r6 = 1; + $r7 = 1; + $r8 = 1; + $r9 = 1; + $xer = 1; + "type-FourCharCode-SendOFAStrikeMessage" = 5; }; }; 1D16B9DD0BA33BB000A69B33 /* Source Control */ = { @@ -145,6 +208,32 @@ isa = PBXCodeSenseManager; indexTemplatePath = ""; }; + 1D6F54990C7358B600D9BDC8 /* [NSView performKeyEquivalent:] */ = { + isa = PBXSymbolicBreakpoint; + actions = ( + ); + breakpointStyle = 1; + continueAfterActions = 0; + delayBeforeContinue = 0; + hitCount = 1; + location = AppKit; + modificationTime = 208946307.079667; + state = 2; + symbolName = "[NSView performKeyEquivalent:]"; + }; + 1D6F54CB0C7371E000D9BDC8 /* -[_NSZombie methodSignatureForSelector:] */ = { + isa = PBXSymbolicBreakpoint; + actions = ( + ); + breakpointStyle = 1; + continueAfterActions = 0; + delayBeforeContinue = 0; + hitCount = 1; + location = Foundation; + modificationTime = 208946315.868945; + state = 1; + symbolName = "-[_NSZombie methodSignatureForSelector:]"; + }; 1D9B9FEF0BB34E7700F878F2 /* [NSException raise] */ = { isa = PBXSymbolicBreakpoint; actions = ( @@ -154,7 +243,7 @@ delayBeforeContinue = 0; hitCount = 1; location = Foundation; - modificationTime = 208462702.108592; + modificationTime = 208946315.819578; state = 1; symbolName = "[NSException raise]"; }; @@ -166,26 +255,13 @@ sepNavWindowFrame = "{{15, 17}, {606, 724}}"; }; }; - 1DDA694B0C552B2B00F5D112 /* VimWindowController.m:539 */ = { - isa = PBXFileBreakpoint; - actions = ( - ); - breakpointStyle = 0; - continueAfterActions = 0; - delayBeforeContinue = 0; - fileReference = 1D0DC9EB0BA34B3D00B6CCFA /* VimWindowController.m */; - functionName = "-windowDidResize:"; - hitCount = 1; - lineNumber = 539; - modificationTime = 208463293.566525; - state = 1; - }; 1DE445650BA493EC00C4C77A /* XCBreakpointsBucket */ = { isa = XCBreakpointsBucket; name = "Project Breakpoints"; objects = ( 1D9B9FEF0BB34E7700F878F2 /* [NSException raise] */, - 1DDA694B0C552B2B00F5D112 /* VimWindowController.m:539 */, + 1D6F54990C7358B600D9BDC8 /* [NSView performKeyEquivalent:] */, + 1D6F54CB0C7371E000D9BDC8 /* -[_NSZombie methodSignatureForSelector:] */, ); }; 29B97313FDCFA39411CA2CEA /* Project object */ = { @@ -197,7 +273,8 @@ ); breakpoints = ( 1D9B9FEF0BB34E7700F878F2 /* [NSException raise] */, - 1DDA694B0C552B2B00F5D112 /* VimWindowController.m:539 */, + 1D6F54990C7358B600D9BDC8 /* [NSView performKeyEquivalent:] */, + 1D6F54CB0C7371E000D9BDC8 /* -[_NSZombie methodSignatureForSelector:] */, ); breakpointsGroup = 1DE445650BA493EC00C4C77A /* XCBreakpointsBucket */; codeSenseManager = 1D16B9DE0BA33BB000A69B33 /* Code sense */; @@ -227,6 +304,20 @@ PBXBreakpointsDataSource_ContinueID, ); }; + PBXConfiguration.PBXFileTableDataSource3.PBXErrorsWarningsDataSource = { + PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; + PBXFileTableDataSourceColumnSortingKey = PBXErrorsWarningsDataSource_LocationID; + PBXFileTableDataSourceColumnWidthsKey = ( + 20, + 300, + 133, + ); + PBXFileTableDataSourceColumnsKey = ( + PBXErrorsWarningsDataSource_TypeID, + PBXErrorsWarningsDataSource_MessageID, + PBXErrorsWarningsDataSource_LocationID, + ); + }; PBXConfiguration.PBXFileTableDataSource3.PBXExecutablesDataSource = { PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; PBXFileTableDataSourceColumnSortingKey = PBXExecutablesDataSource_NameID; @@ -301,8 +392,8 @@ PBXFileDataSource_Warnings_ColumnID, ); }; - PBXPerProjectTemplateStateSaveDate = 208536631; - PBXWorkspaceStateSaveDate = 208536631; + PBXPerProjectTemplateStateSaveDate = 208941697; + PBXWorkspaceStateSaveDate = 208941697; }; sourceControlManager = 1D16B9DD0BA33BB000A69B33 /* Source Control */; userBuildSettings = { From 9973a221fa62549033aace5e012eb8a3f0ab006a Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Thu, 16 Aug 2007 08:56:10 +0000 Subject: [PATCH 0119/1156] - Fixed bug where tab bar controller never removed itself as an observer - Shutdown changed; when connection dies, cleanup is called where all delegates, notifications etc. are reset. - Views are now initialized in the designated initializer of MMWindowController instead of in the nib. For some reason some object in the nib got deallocated more than once and this caused EXC_BAD_ACCESS errors. Hopefully this bug is now fixed. - Put @try/@catch clause around processInput:data: DO call since this can throw an exception if the underlying port is dead. - GUI status line is no longer used. - Added description methods to MMWindowController and MMVimController. git-svn-id: http://macvim.googlecode.com/svn/trunk@144 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMAppController.m | 2 + MMBackend.m | 3 + MMVimController.h | 3 +- MMVimController.m | 86 ++++++++++++--- MMWindowController.h | 5 + MMWindowController.m | 256 +++++++++++++++++++++++++++---------------- 6 files changed, 248 insertions(+), 107 deletions(-) diff --git a/MMAppController.m b/MMAppController.m index df3356be3c..78a4a34226 100644 --- a/MMAppController.m +++ b/MMAppController.m @@ -220,6 +220,8 @@ - (void)applicationWillTerminate:(NSNotification *)aNotification - (void)removeVimController:(id)controller { + [[controller windowController] close]; + [vimControllers removeObject:controller]; if (![vimControllers count]) { diff --git a/MMBackend.m b/MMBackend.m index 71d5edc069..7499695b0c 100644 --- a/MMBackend.m +++ b/MMBackend.m @@ -57,6 +57,8 @@ - (id)init - (void)dealloc { + //NSLog(@"%@ %s", [self className], _cmd); + [[NSNotificationCenter defaultCenter] removeObserver:self]; [queue release]; @@ -295,6 +297,7 @@ - (void)exit // By invalidating the NSConnection the MMWindowController immediately // finds out that the connection is down and as a result // [MMWindowController connectionDidDie:] is invoked. + //NSLog(@"%@ %s", [self className], _cmd); [[NSNotificationCenter defaultCenter] removeObserver:self]; [connection invalidate]; } diff --git a/MMVimController.h b/MMVimController.h index 7024e04cee..2efdbc3901 100644 --- a/MMVimController.h +++ b/MMVimController.h @@ -18,6 +18,7 @@ @interface MMVimController : NSObject { + BOOL isInitialized; MMWindowController *windowController; id backendProxy; BOOL inProcessCommandQueue; @@ -32,7 +33,7 @@ - (id)initWithBackend:(id)backend; - (id)backendProxy; - (MMWindowController *)windowController; -- (void)windowWillClose:(NSNotification *)notification; +- (void)cleanup; - (void)sendMessage:(int)msgid data:(NSData *)data wait:(BOOL)wait; @end diff --git a/MMVimController.m b/MMVimController.m index 99e48fda5e..718b19348c 100644 --- a/MMVimController.m +++ b/MMVimController.m @@ -93,6 +93,23 @@ - (id)initWithBackend:(id)backend [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(connectionDidDie:) name:NSConnectionDidDieNotification object:connection]; + + NSWindow *win = [windowController window]; + +#if 0 + [[NSNotificationCenter defaultCenter] + addObserver:self + selector:@selector(windowWillClose:) + name:NSWindowWillCloseNotification + object:win]; +#endif + [[NSNotificationCenter defaultCenter] + addObserver:self + selector:@selector(windowDidBecomeMain:) + name:NSWindowDidBecomeMainNotification + object:win]; + + isInitialized = YES; } return self; @@ -101,17 +118,16 @@ - (id)initWithBackend:(id)backend - (void)dealloc { //NSLog(@"%@ %s", [self className], _cmd); + isInitialized = NO; - [[NSNotificationCenter defaultCenter] removeObserver:self]; - - [backendProxy release]; - [sendQueue release]; + [backendProxy release]; backendProxy = nil; + [sendQueue release]; sendQueue = nil; - [toolbarItemDict release]; - [toolbar release]; - [popupMenuItems release]; - [mainMenuItems release]; - [windowController release]; + [toolbarItemDict release]; toolbarItemDict = nil; + [toolbar release]; toolbar = nil; + [popupMenuItems release]; popupMenuItems = nil; + [mainMenuItems release]; mainMenuItems = nil; + [windowController release]; windowController = nil; [super dealloc]; } @@ -123,6 +139,8 @@ - (MMWindowController *)windowController - (void)sendMessage:(int)msgid data:(NSData *)data wait:(BOOL)wait { + if (!isInitialized) return; + if (inProcessCommandQueue) { //NSLog(@"In process command queue; delaying message send."); [sendQueue addObject:[NSNumber numberWithInt:msgid]]; @@ -134,7 +152,13 @@ - (void)sendMessage:(int)msgid data:(NSData *)data wait:(BOOL)wait } if (wait) { - [backendProxy processInput:msgid data:data]; + @try { + [backendProxy processInput:msgid data:data]; + } + @catch (NSException *e) { + NSLog(@"%@ %s Exception caught during DO call: %@", + [self className], _cmd, e); + } } else { // Do not wait for the message to be sent, i.e. drop the message if it // can't be delivered immediately. @@ -161,10 +185,23 @@ - (id)backendProxy return backendProxy; } +- (void)cleanup +{ + //NSLog(@"%@ %s", [self className], _cmd); + if (!isInitialized) return; + + isInitialized = NO; + [toolbar setDelegate:nil]; + [[NSNotificationCenter defaultCenter] removeObserver:self]; + [windowController cleanup]; +} + - (oneway void)showSavePanelForDirectory:(in bycopy NSString *)dir title:(in bycopy NSString *)title saving:(int)saving { + if (!isInitialized) return; + [windowController setStatusText:title]; if (saving) { @@ -186,6 +223,8 @@ - (oneway void)showSavePanelForDirectory:(in bycopy NSString *)dir - (oneway void)processCommandQueue:(in NSArray *)queue { + if (!isInitialized) return; + unsigned i, count = [queue count]; if (count % 2) { NSLog(@"WARNING: Uneven number of components (%d) in flush queue " @@ -239,17 +278,24 @@ - (oneway void)processCommandQueue:(in NSArray *)queue } } +#if 0 - (void)windowWillClose:(NSNotification *)notification { + NSLog(@"%@ %s%@", [self className], _cmd, notification); + + //[self cleanup]; + // NOTE! This causes the call to removeVimController: to be delayed. [[NSApp delegate] performSelectorOnMainThread:@selector(removeVimController:) withObject:self waitUntilDone:NO]; } +#endif - (void)windowDidBecomeMain:(NSNotification *)notification { - [self updateMainMenu]; + if (isInitialized) + [self updateMainMenu]; } - (NSToolbarItem *)toolbar:(NSToolbar *)theToolbar @@ -839,6 +885,7 @@ - (void)addMenuItemWithTag:(int)tag parent:(NSMenu *)parent - (void)updateMainMenu { +#if 1 NSMenu *mainMenu = [NSApp mainMenu]; // Stop NSApp from updating the Window menu. @@ -873,6 +920,7 @@ - (void)updateMainMenu [NSApp setWindowsMenu:windowMenu]; } +#endif shouldUpdateMainMenu = NO; } @@ -964,9 +1012,14 @@ - (void)addToolbarItemWithTag:(int)tag label:(NSString *)label tip:(NSString - (void)connectionDidDie:(NSNotification *)notification { - //NSLog(@"A MMVimController lost its connection to the backend; " - // "closing the controller."); - [windowController close]; + //NSLog(@"%@ %s%@", [self className], _cmd, notification); + + [self cleanup]; + + // NOTE! This causes the call to removeVimController: to be delayed. + [[NSApp delegate] + performSelectorOnMainThread:@selector(removeVimController:) + withObject:self waitUntilDone:NO]; } - (BOOL)executeActionWithName:(NSString *)name @@ -1004,6 +1057,11 @@ - (BOOL)executeActionWithName:(NSString *)name return NO; } +- (NSString *)description +{ + return [NSString stringWithFormat:@"%@ : isInitialized=%d inProcessCommandQueue=%d mainMenuItems=%@ popupMenuItems=%@ toolbar=%@", [self className], isInitialized, inProcessCommandQueue, mainMenuItems, popupMenuItems, toolbar]; +} + @end // MMVimController (Private) diff --git a/MMWindowController.h b/MMWindowController.h index 5227c03273..8024334dbe 100644 --- a/MMWindowController.h +++ b/MMWindowController.h @@ -10,6 +10,10 @@ #import + +#define MM_USE_EMPTY_WINDOW 1 + + @class PSMTabBarControl; @class MMTextView; @class MMTextStorage; @@ -40,6 +44,7 @@ - (MMTextStorage *)textStorage; - (NSString *)windowAutosaveKey; - (void)setWindowAutosaveKey:(NSString *)key; +- (void)cleanup; - (void)openWindow; - (void)updateTabsWithData:(NSData *)data; - (void)selectTabWithIndex:(int)idx; diff --git a/MMWindowController.m b/MMWindowController.m index 7cd9e93686..dcb0a94dc3 100644 --- a/MMWindowController.m +++ b/MMWindowController.m @@ -98,7 +98,12 @@ @implementation MMWindowController - (id)initWithVimController:(MMVimController *)controller { - if ((self = [super initWithWindowNibName:@"VimWindow"])) { +#if MM_USE_EMPTY_WINDOW + if ((self = [super initWithWindowNibName:@"EmptyWindow"])) +#else + if ((self = [super initWithWindowNibName:@"VimWindow"])) +#endif + { vimController = controller; scrollbars = [[NSMutableArray alloc] init]; @@ -130,7 +135,8 @@ - (id)initWithVimController:(MMVimController *)controller [textStorage addLayoutManager:lm]; [lm addTextContainer:tc]; - textView = [[MMTextView alloc] initWithFrame:NSZeroRect + NSView *contentView = [[self window] contentView]; + textView = [[MMTextView alloc] initWithFrame:[contentView frame] textContainer:tc]; NSUserDefaults *ud = [NSUserDefaults standardUserDefaults]; @@ -138,10 +144,57 @@ - (id)initWithVimController:(MMVimController *)controller int top = [ud integerForKey:MMTextInsetTopKey]; [textView setTextContainerInset:NSMakeSize(left, top)]; + [contentView addSubview:textView]; + // The text storage retains the layout manager which in turn retains // the text container. [tc release]; [lm release]; + +#if MM_USE_EMPTY_WINDOW + // Create the tabline separator (which may be visible when the tabline + // is hidden). + NSRect tabSepRect = [contentView frame]; + tabSepRect.origin.y = NSMaxY(tabSepRect)-1; + tabSepRect.size.height = 1; + tablineSeparator = [[NSBox alloc] initWithFrame:tabSepRect]; + + // Create the tab view (which is never visible, but the tab bar control + // needs it to function). + tabView = [[NSTabView alloc] initWithFrame:NSZeroRect]; + + // Create the tab bar control (which is responsible for actually + // drawing the tabline and tabs). + NSRect tabFrame = [contentView frame]; + tabFrame.origin.y = NSMaxY(tabFrame) - 22; + tabFrame.size.height = 22; + tabBarControl = [[PSMTabBarControl alloc] initWithFrame:tabFrame]; + + [tabView setDelegate:tabBarControl]; + + [tabBarControl setTabView:tabView]; + [tabBarControl setDelegate:self]; + [tabBarControl setHidden:YES]; + [tabBarControl setAutoresizingMask:NSViewWidthSizable|NSViewMinYMargin]; + [tabBarControl setCellMinWidth:[ud integerForKey:MMTabMinWidthKey]]; + [tabBarControl setCellMaxWidth:[ud integerForKey:MMTabMaxWidthKey]]; + [tabBarControl setCellOptimumWidth: + [ud integerForKey:MMTabOptimumWidthKey]]; + + [tabBarControl setAllowsDragBetweenWindows:NO]; + + [tablineSeparator setBoxType:NSBoxSeparator]; + [tablineSeparator setHidden:NO]; + [tablineSeparator setAutoresizingMask:NSViewWidthSizable + | NSViewMinYMargin]; + + [contentView setAutoresizesSubviews:YES]; + [contentView addSubview:tabBarControl]; + [contentView addSubview:tablineSeparator]; + + [[self window] setDelegate:self]; + [[self window] setInitialFirstResponder:textView]; +#endif } return self; @@ -151,29 +204,33 @@ - (void)dealloc { //NSLog(@"%@ %s", [self className], _cmd); - // TODO: release tabBarControl and tabView? - - vimController = nil; - - [tabBarControl setDelegate:nil]; - [[self window] setDelegate:nil]; - - [tabView removeAllTabViewItems]; +#if MM_USE_EMPTY_WINDOW + [tabBarControl release]; tabBarControl = nil; + [tabView release]; tabView = nil; + [tablineSeparator release]; tablineSeparator = nil; +#endif + [windowAutosaveKey release]; windowAutosaveKey = nil; + [scrollbars release]; scrollbars = nil; + [textView release]; textView = nil; + [textStorage release]; textStorage = nil; - [scrollbars release]; - [textView release]; - [textStorage release]; + //[tabBarControl release]; tabBarControl = nil; + //[tabView release]; tabView = nil; [super dealloc]; } -- (void)windowDidLoad +- (NSString *)description { - NSWindow *win = [self window]; + return [NSString stringWithFormat:@"%@ : setupDone=%d windowAutosaveKey=%@ vimController=%@", [self className], setupDone, windowAutosaveKey, vimController]; +} +#if !MM_USE_EMPTY_WINDOW +- (void)windowDidLoad +{ // Called after window nib file is loaded. - [tablineSeparator setHidden:NO]; + [tablineSeparator setHidden:([[self window] toolbar] == nil)]; [tabBarControl setHidden:YES]; // NOTE: Size to fit looks good, but not many tabs will fit and there are @@ -186,29 +243,15 @@ - (void)windowDidLoad [tabBarControl setCellOptimumWidth:[ud integerForKey:MMTabOptimumWidthKey]]; [tabBarControl setAllowsDragBetweenWindows:NO]; - [tabBarControl setShowAddTabButton:YES]; - [[tabBarControl addTabButton] setTarget:self]; - [[tabBarControl addTabButton] setAction:@selector(addNewTab:)]; + //[tabBarControl setShowAddTabButton:YES]; + //[[tabBarControl addTabButton] setTarget:self]; + //[[tabBarControl addTabButton] setAction:@selector(addNewTab:)]; // HACK! remove any tabs present in the nib [tabView removeAllTabViewItems]; - - // HACK! These observers used to be set in the designated init of - // MMVimController, but this occasionally caused exceptions from within the - // AppKit to be raised. The problem seemed related to the fact that the - // window got loaded 'too early'; adding the observers here seems to - // alleviate this problem. - [[NSNotificationCenter defaultCenter] - addObserver:vimController - selector:@selector(windowWillClose:) - name:NSWindowWillCloseNotification - object:win]; - [[NSNotificationCenter defaultCenter] - addObserver:vimController - selector:@selector(windowDidBecomeMain:) - name:NSWindowDidBecomeMainNotification - object:win]; + [tabView setHidden:YES]; } +#endif - (MMVimController *)vimController { @@ -236,6 +279,44 @@ - (void)setWindowAutosaveKey:(NSString *)key windowAutosaveKey = [key copy]; } +- (void)cleanup +{ + //NSLog(@"%@ %s", [self className], _cmd); + + setupDone = NO; + vimController = nil; + + // NOTE! There is a bug in PSMTabBarControl in that it retains the delegate + // (which is the MMWindowController) so reset the delegate here, otherwise + // the MMWindowController never gets released resulting in a pretty serious + // memory leak. + [tabView setDelegate:nil]; + [tabBarControl setDelegate:nil]; + [tabBarControl setTabView:nil]; + [[self window] setDelegate:nil]; + + // NOTE! There is another bug in PSMTabBarControl where the control is not + // removed as an observer, so remove it here (else lots of evil nasty bugs + // will come and gnaw at your feet while you are sleeping). + [[NSNotificationCenter defaultCenter] removeObserver:tabBarControl]; + +#if MM_USE_EMPTY_WINDOW + [tabBarControl removeFromSuperviewWithoutNeedingDisplay]; + [tablineSeparator removeFromSuperviewWithoutNeedingDisplay]; +#endif + [textView removeFromSuperviewWithoutNeedingDisplay]; + + unsigned i, count = [scrollbars count]; + for (i = 0; i < count; ++i) { + MMScroller *sb = [scrollbars objectAtIndex:i]; + [sb removeFromSuperviewWithoutNeedingDisplay]; + } + + [tabView removeAllTabViewItems]; + + [[self window] orderOut:self]; +} + - (void)openWindow { [[NSApp delegate] windowControllerWillOpen:self]; @@ -245,15 +326,17 @@ - (void)openWindow // NOTE! This flag is set once the entire text system is set up. setupDone = YES; - [self updateResizeIncrements]; - [self resizeWindowToFit:self]; - [[self window] makeKeyAndOrderFront:self]; - +#if !MM_USE_EMPTY_WINDOW BOOL statusOff = [[NSUserDefaults standardUserDefaults] boolForKey:MMStatuslineOffKey]; [statusTextField setHidden:statusOff]; [statusSeparator setHidden:statusOff]; [self flashStatusText:@"Welcome to MacVim!"]; +#endif + + [self updateResizeIncrements]; + [self resizeWindowToFit:self]; + [[self window] makeKeyAndOrderFront:self]; } - (void)updateTabsWithData:(NSData *)data @@ -339,14 +422,17 @@ - (void)setTextDimensionsWithRows:(int)rows columns:(int)cols - (void)setStatusText:(NSString *)text { +#if !MM_USE_EMPTY_WINDOW if (text) [statusTextField setStringValue:text]; else [statusTextField setStringValue:@""]; +#endif } - (void)flashStatusText:(NSString *)text { +#if !MM_USE_EMPTY_WINDOW if ([[NSUserDefaults standardUserDefaults] boolForKey:MMStatuslineOffKey]) return; @@ -362,6 +448,7 @@ - (void)flashStatusText:(NSString *)text selector:@selector(statusTimerFired:) userInfo:nil repeats:NO] retain]; +#endif } - (void)createScrollbarWithIdentifier:(long)ident type:(int)type @@ -517,15 +604,15 @@ - (void)showToolbar:(BOOL)on size:(int)size mode:(int)mode - (IBAction)addNewTab:(id)sender { -// NOTE! This can get called a lot if the user holds down the key -// equivalent for this action, which causes the ports to fill up. If we -// wait for the message to be sent then the app might become unresponsive. -[vimController sendMessage:AddNewTabMsgID data:nil wait:NO]; + // NOTE! This can get called a lot if the user holds down the key + // equivalent for this action, which causes the ports to fill up. If we + // wait for the message to be sent then the app might become unresponsive. + [vimController sendMessage:AddNewTabMsgID data:nil wait:NO]; } - (IBAction)toggleToolbar:(id)sender { -[vimController sendMessage:ToggleToolbarMsgID data:nil wait:NO]; + [vimController sendMessage:ToggleToolbarMsgID data:nil wait:NO]; } @@ -536,14 +623,16 @@ - (IBAction)toggleToolbar:(id)sender - (void)tabView:(NSTabView *)theTabView didSelectTabViewItem: (NSTabViewItem *)tabViewItem { -// HACK! There seem to be a bug in NSTextView which results in the first -// responder not being set to the view of the tab item so it is done -// manually here. -[[self window] makeFirstResponder:[tabViewItem view]]; - -// HACK! The selection message should not be propagated to the VimTask if -// the VimTask selected the tab (e.g. as opposed the user clicking the -// tab). The delegate method has no way of knowing who initiated the +#if !MM_USE_EMPTY_WINDOW + // HACK! There seem to be a bug in NSTabView which results in the first + // responder not being set to the view of the tab item so it is done + // manually here. + //[[self window] makeFirstResponder:[tabViewItem view]]; +#endif + + // HACK! The selection message should not be propagated to the VimTask if + // the VimTask selected the tab (e.g. as opposed the user clicking the + // tab). The delegate method has no way of knowing who initiated the // selection so a flag is set when the VimTask initiated the selection. if (!vimTaskSelectedTab) { // Propagate the selection message to the VimTask. @@ -590,17 +679,6 @@ - (BOOL)windowShouldClose:(id)sender return NO; } -- (void)windowWillClose:(NSNotification *)notification -{ - //NSLog(@"%@ %s", [self className], _cmd); - - // NOTE! There is a bug in PSMTabBarControl in that it retains the delegate - // (which is the MMWindowController) so reset the delegate here, otherwise - // the MMWindowController never gets released resulting in a pretty serious - // memory leak. - [tabBarControl setDelegate:nil]; -} - - (void)windowDidMove:(NSNotification *)notification { if (setupDone && windowAutosaveKey) { @@ -846,11 +924,6 @@ - (NSTabViewItem *)addNewTabViewItem // will automatically select the first tab added to a tab view. NSTabViewItem *tvi = [[NSTabViewItem alloc] initWithIdentifier:nil]; - [tvi setView:textView]; - - // BUG! This call seems to have no effect; see comment in - // tabView:didSelectTabViewItem:. - //[tvi setInitialFirstResponder:textView]; // NOTE: If this is the first tab it will be automatically selected. vimTaskSelectedTab = YES; @@ -939,8 +1012,7 @@ - (void)placeScrollbars { if (!setupDone) return; - NSRect tabViewFrame = [tabView frame]; - NSView *contentView = [[self window] contentView]; + NSRect textViewFrame = [textView frame]; BOOL lsbVisible = [self leftScrollbarVisible]; BOOL statusVisible = ![[NSUserDefaults standardUserDefaults] boolForKey:MMStatuslineOffKey]; @@ -994,28 +1066,28 @@ - (void)placeScrollbars // text view all the way to the right, otherwise it looks ugly when // the user drags the window to resize. if (i == leftmostSbIdx) { - float w = NSMaxX(tabViewFrame) - NSMaxX(rect); + float w = NSMaxX(textViewFrame) - NSMaxX(rect); if (w > 0) rect.size.width += w; } - // Make sure scrollbar rect is bounded by the tab view frame. - if (rect.origin.x < tabViewFrame.origin.x) - rect.origin.x = tabViewFrame.origin.x; - else if (rect.origin.x > NSMaxX(tabViewFrame)) - rect.origin.x = NSMaxX(tabViewFrame); - if (NSMaxX(rect) > NSMaxX(tabViewFrame)) - rect.size.width -= NSMaxX(rect) - NSMaxX(tabViewFrame); + // Make sure scrollbar rect is bounded by the text view frame. + if (rect.origin.x < textViewFrame.origin.x) + rect.origin.x = textViewFrame.origin.x; + else if (rect.origin.x > NSMaxX(textViewFrame)) + rect.origin.x = NSMaxX(textViewFrame); + if (NSMaxX(rect) > NSMaxX(textViewFrame)) + rect.size.width -= NSMaxX(rect) - NSMaxX(textViewFrame); if (rect.size.width < 0) rect.size.width = 0; } else { rect = [textStorage rectForRowsInRange:[scroller range]]; // Adjust for the fact that text layout is flipped. - rect.origin.y = NSMaxY(tabViewFrame) - rect.origin.y + rect.origin.y = NSMaxY(textViewFrame) - rect.origin.y - rect.size.height; rect.size.width = [NSScroller scrollerWidth]; if ([scroller type] == MMScrollerTypeRight) - rect.origin.x = NSMaxX(tabViewFrame); + rect.origin.x = NSMaxX(textViewFrame); // HACK! Make sure the lowest vertical scrollbar covers the text // view all the way to the bottom. This is done because Vim only @@ -1025,9 +1097,9 @@ - (void)placeScrollbars // TODO! Find a nicer way to do this. if (i == lowestLeftSbIdx || i == lowestRightSbIdx) { float h = rect.origin.y + rect.size.height - - tabViewFrame.origin.y; + - textViewFrame.origin.y; if (rect.size.height < h) { - rect.origin.y = tabViewFrame.origin.y; + rect.origin.y = textViewFrame.origin.y; rect.size.height = h; } } @@ -1039,14 +1111,14 @@ - (void)placeScrollbars rect.origin.y = [NSScroller scrollerWidth]; } - // Make sure scrollbar rect is bounded by the tab view frame. - if (rect.origin.y < tabViewFrame.origin.y) { - rect.size.height -= tabViewFrame.origin.y - rect.origin.y; - rect.origin.y = tabViewFrame.origin.y; - } else if (rect.origin.y > NSMaxY(tabViewFrame)) - rect.origin.y = NSMaxY(tabViewFrame); - if (NSMaxY(rect) > NSMaxY(tabViewFrame)) - rect.size.height -= NSMaxY(rect) - NSMaxY(tabViewFrame); + // Make sure scrollbar rect is bounded by the text view frame. + if (rect.origin.y < textViewFrame.origin.y) { + rect.size.height -= textViewFrame.origin.y - rect.origin.y; + rect.origin.y = textViewFrame.origin.y; + } else if (rect.origin.y > NSMaxY(textViewFrame)) + rect.origin.y = NSMaxY(textViewFrame); + if (NSMaxY(rect) > NSMaxY(textViewFrame)) + rect.size.height -= NSMaxY(rect) - NSMaxY(textViewFrame); if (rect.size.height < 0) rect.size.height = 0; } @@ -1057,7 +1129,7 @@ - (void)placeScrollbars [scroller setFrame:rect]; // Clear behind the old scroller frame, or parts of the old // scroller might still be visible after setFrame:. - [contentView setNeedsDisplayInRect:oldRect]; + [[[self window] contentView] setNeedsDisplayInRect:oldRect]; [scroller setNeedsDisplay:YES]; } } @@ -1108,7 +1180,7 @@ - (void)placeViews wait:![textView inLiveResize]]; } - [tabView setFrame:textViewRect]; + [textView setFrame:textViewRect]; [self placeScrollbars]; } From 1c50cfa265b535dae4398f8cbb4f78cadffae376 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Thu, 16 Aug 2007 08:56:39 +0000 Subject: [PATCH 0120/1156] Added note on PSMTabBarControl bugs and updated feature list git-svn-id: http://macvim.googlecode.com/svn/trunk@145 96c4425d-ca35-0410-94e5-3396d5c13a8f --- README | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/README b/README index 8127760786..241dfb592a 100644 --- a/README +++ b/README @@ -130,6 +130,10 @@ Bugs: title. - NSTabViewItem setInitialFirstResponder: seems to have no effect, so we manually set the first responder when the tab item selection changes. +- PSMTabBarControl never removes itself as an observer, which can cause all + sort of weird problems (crashes etc.), so this is taken care of at cleanup. +- PSMTabBarControl retains its delegate, so the delegate is forcibly set to nil + at cleanup, else there will be a memory leak. Features (!supp indicates that a feature is not supported): @@ -158,14 +162,17 @@ Features (!supp indicates that a feature is not supported): higher than can fit the screen (no such restrictions on width at the moment) - Pasteboard: star-register works with the mac os x pasteboard - Open/Save dialog: use with :browse -- Fonts: bold/italic/underline traits supported, font changes with ':set gfn' +- Fonts: bold/italic/underline traits supported, font changes with ':set gfn', + or use font panel - File type associations: add more associations by editing Info.plist - Start GUI from terminal, type :gui - Scroll bars -- Wide characters: poor support, do not render at right width/height +- Wide characters: but composed characters !supp - Printing: !supp - Find/Replace dialog: !supp - Gui dialogs: !supp - External editor protocol: !supp -- Services menu: !supp +- Services menu: some simple minded provider entries - Encodings: !supp (enc, tenc always set to utf-8) +- Autosave window position +- Smart cascading of new windows From 1ff9d92d410c3a76c36e28050611e86ff2532d10 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Thu, 16 Aug 2007 14:56:32 +0000 Subject: [PATCH 0121/1156] Fixed "Open selection ..." Services menu entry (now works if MacVim is not open) git-svn-id: http://macvim.googlecode.com/svn/trunk@146 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMAppController.h | 1 + MMAppController.m | 27 +++++++++++++++++++++++++-- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/MMAppController.h b/MMAppController.h index 85b0b8a57b..55d412a0f5 100644 --- a/MMAppController.h +++ b/MMAppController.h @@ -17,6 +17,7 @@ @interface MMAppController : NSObject { NSMutableArray *vimControllers; + NSString *openSelectionString; } - (void)removeVimController:(id)controller; diff --git a/MMAppController.m b/MMAppController.m index 78a4a34226..1d7ef24e67 100644 --- a/MMAppController.m +++ b/MMAppController.m @@ -93,6 +93,7 @@ - (void)dealloc //NSLog(@"MMAppController dealloc"); [vimControllers release]; + [openSelectionString release]; [super dealloc]; } @@ -262,6 +263,23 @@ - (void)windowControllerWillOpen:(MMWindowController *)windowController [win setFrameTopLeftPoint:topLeft]; } + + if (openSelectionString) { + // There is some text to paste into this window as a result of the + // services menu "Open selection ..." being used. + NSMutableData *data = [NSMutableData data]; + int len = [openSelectionString + lengthOfBytesUsingEncoding:NSUTF8StringEncoding] + 1; + + [data appendBytes:&len length:sizeof(int)]; + [data appendBytes:[openSelectionString UTF8String] length:len]; + + MMVimController *vc = [windowController vimController]; + [vc sendMessage:DropStringMsgID data:data wait:NO]; + + [openSelectionString release]; + openSelectionString = nil; + } } - (IBAction)newVimWindow:(id)sender @@ -373,8 +391,13 @@ - (void)openSelection:(NSPasteboard *)pboard userData:(NSString *)userData [vc sendMessage:AddNewTabMsgID data:nil wait:NO]; [vc sendMessage:DropStringMsgID data:data wait:NO]; } else { - // TODO: Open the selection in the new window. - *error = @"ERROR: No window found to open selection in."; + // NOTE: There is no window to paste the selection into, so save the + // text, open a new window, and paste the text when the next window + // opens. (If this is called several times in a row, then all but the + // last call might be ignored.) + if (openSelectionString) [openSelectionString release]; + openSelectionString = [[pboard stringForType:NSStringPboardType] copy]; + [self newVimWindow:self]; } } From 0d336c2bf52431025daa74ad7d0ac7d1307cff03 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Fri, 17 Aug 2007 06:27:31 +0000 Subject: [PATCH 0122/1156] Disabled zero-link because it was driving me nuts! git-svn-id: http://macvim.googlecode.com/svn/trunk@147 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MacVim.xcodeproj/project.pbxproj | 40 ++----------------------------- MacVim.xcodeproj/winckler.mode1 | 11 ++------- MacVim.xcodeproj/winckler.pbxuser | 4 ++-- 3 files changed, 6 insertions(+), 49 deletions(-) diff --git a/MacVim.xcodeproj/project.pbxproj b/MacVim.xcodeproj/project.pbxproj index f4d3b16df5..11f241cae1 100644 --- a/MacVim.xcodeproj/project.pbxproj +++ b/MacVim.xcodeproj/project.pbxproj @@ -521,41 +521,6 @@ /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ - 1DF7D93A0BC05175006CF13F /* My Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ARCHS = "$(NATIVE_ARCH)"; - COPY_PHASE_STRIP = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(FRAMEWORK_SEARCH_PATHS_QUOTED_1)", - "$(FRAMEWORK_SEARCH_PATHS_QUOTED_2)", - "$(FRAMEWORK_SEARCH_PATHS_QUOTED_3)", - ); - FRAMEWORK_SEARCH_PATHS_QUOTED_1 = "\"$(SRCROOT)/../../../../Library/Frameworks\""; - GCC_DYNAMIC_NO_PIC = NO; - GCC_ENABLE_OBJC_EXCEPTIONS = YES; - GCC_GENERATE_DEBUGGING_SYMBOLS = YES; - GCC_MODEL_TUNING = G5; - GCC_OPTIMIZATION_LEVEL = 0; - HEADER_SEARCH_PATHS = PSMTabBarControl/source/; - INFOPLIST_FILE = Info.plist; - INSTALL_PATH = "$(HOME)/Applications"; - PRODUCT_NAME = MacVim; - WRAPPER_EXTENSION = app; - }; - name = "My Release"; - }; - 1DF7D93B0BC05175006CF13F /* My Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - PREBINDING = NO; - SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk; - }; - name = "My Release"; - }; C01FCF4B08A954540054247B /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -578,7 +543,7 @@ INSTALL_PATH = "$(HOME)/Applications"; PRODUCT_NAME = MacVim; WRAPPER_EXTENSION = app; - ZERO_LINK = YES; + ZERO_LINK = NO; }; name = Debug; }; @@ -604,6 +569,7 @@ INSTALL_PATH = "$(HOME)/Applications"; PRODUCT_NAME = MacVim; WRAPPER_EXTENSION = app; + ZERO_LINK = NO; }; name = Release; }; @@ -635,7 +601,6 @@ buildConfigurations = ( C01FCF4B08A954540054247B /* Debug */, C01FCF4C08A954540054247B /* Release */, - 1DF7D93A0BC05175006CF13F /* My Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -645,7 +610,6 @@ buildConfigurations = ( C01FCF4F08A954540054247B /* Debug */, C01FCF5008A954540054247B /* Release */, - 1DF7D93B0BC05175006CF13F /* My Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; diff --git a/MacVim.xcodeproj/winckler.mode1 b/MacVim.xcodeproj/winckler.mode1 index 83c74852cf..df318deb0e 100644 --- a/MacVim.xcodeproj/winckler.mode1 +++ b/MacVim.xcodeproj/winckler.mode1 @@ -368,9 +368,9 @@ TableOfContents - 1DDBEB8A0C7438DA0036EEDD + 1DE5E6960C75770B0027A2B1 1CE0B1FE06471DED0097A5F4 - 1DDBEB8B0C7438DA0036EEDD + 1DE5E6970C75770B0027A2B1 1CE0B20306471E060097A5F4 1CE0B20506471E060097A5F4 @@ -504,13 +504,6 @@ 5 WindowOrderList - 1DDBEBA70C743B2A0036EEDD - 1DDBEBA80C743B2A0036EEDD - 1DE444730BA4445100C4C77A - 1CD10A99069EF8BA00B06720 - 1DDBEBA50C743B2A0036EEDD - 1D16B9EF0BA33E3800A69B33 - 1C0AD2B3069F1EA900FABCE6 /Users/winckler/Projects/vim7/src/MacVim/MacVim.xcodeproj WindowString diff --git a/MacVim.xcodeproj/winckler.pbxuser b/MacVim.xcodeproj/winckler.pbxuser index 908cd852a8..cee65d47b5 100644 --- a/MacVim.xcodeproj/winckler.pbxuser +++ b/MacVim.xcodeproj/winckler.pbxuser @@ -392,8 +392,8 @@ PBXFileDataSource_Warnings_ColumnID, ); }; - PBXPerProjectTemplateStateSaveDate = 208941697; - PBXWorkspaceStateSaveDate = 208941697; + PBXPerProjectTemplateStateSaveDate = 209024719; + PBXWorkspaceStateSaveDate = 209024719; }; sourceControlManager = 1D16B9DD0BA33BB000A69B33 /* Source Control */; userBuildSettings = { From 980078e79c1645fa7609723ccc6b6085be94785d Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Fri, 17 Aug 2007 07:22:04 +0000 Subject: [PATCH 0123/1156] Add tab button on tabline is back git-svn-id: http://macvim.googlecode.com/svn/trunk@148 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMWindowController.m | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/MMWindowController.m b/MMWindowController.m index dcb0a94dc3..c921088e01 100644 --- a/MMWindowController.m +++ b/MMWindowController.m @@ -180,7 +180,9 @@ - (id)initWithVimController:(MMVimController *)controller [tabBarControl setCellMaxWidth:[ud integerForKey:MMTabMaxWidthKey]]; [tabBarControl setCellOptimumWidth: [ud integerForKey:MMTabOptimumWidthKey]]; - + [tabBarControl setShowAddTabButton:YES]; + [[tabBarControl addTabButton] setTarget:self]; + [[tabBarControl addTabButton] setAction:@selector(addNewTab:)]; [tabBarControl setAllowsDragBetweenWindows:NO]; [tablineSeparator setBoxType:NSBoxSeparator]; From b3ff443cd435d2ee94a91ee8cf09c2a9d6f31bb9 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Fri, 17 Aug 2007 07:22:52 +0000 Subject: [PATCH 0124/1156] Ctrl-C is intercepted in MacVim and sends SIGINT to Vim process. git-svn-id: http://macvim.googlecode.com/svn/trunk@149 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMAppController.m | 6 +++--- MMBackend.m | 12 +++--------- MMTextView.m | 7 +++++++ MMVimController.h | 4 +++- MMVimController.m | 8 +++++++- MacVim.h | 2 +- 6 files changed, 24 insertions(+), 15 deletions(-) diff --git a/MMAppController.m b/MMAppController.m index 1d7ef24e67..573b12e057 100644 --- a/MMAppController.m +++ b/MMAppController.m @@ -336,7 +336,7 @@ - (IBAction)selectPreviousWindow:(id)sender } - (byref id )connectBackend: - (byref in id )backend; + (byref in id )backend pid:(int)pid { //NSLog(@"Frontend got connection request from backend...adding new " // "MMVimController"); @@ -344,8 +344,8 @@ - (IBAction)selectPreviousWindow:(id)sender [(NSDistantObject*)backend setProtocolForProxy:@protocol(MMBackendProtocol)]; - MMVimController *vc = [[[MMVimController alloc] initWithBackend:backend] - autorelease]; + MMVimController *vc = [[[MMVimController alloc] + initWithBackend:backend pid:pid] autorelease]; if (![vimControllers count]) { // The first window autosaves its position. (The autosaving features diff --git a/MMBackend.m b/MMBackend.m index 7499695b0c..3369f5d89b 100644 --- a/MMBackend.m +++ b/MMBackend.m @@ -160,7 +160,9 @@ - (BOOL)checkin selector:@selector(connectionDidDie:) name:NSConnectionDidDieNotification object:connection]; - frontendProxy = [(NSDistantObject*)[proxy connectBackend:self] retain]; + int pid = [[NSProcessInfo processInfo] processIdentifier]; + frontendProxy = [(NSDistantObject*)[proxy connectBackend:self + pid:pid] retain]; if (frontendProxy) { [frontendProxy setProtocolForProxy:@protocol(MMAppProtocol)]; } @@ -1121,14 +1123,6 @@ - (void)handleKeyDown:(NSString *)key modifiers:(int)mods length = [key lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; unichar c = [key characterAtIndex:0]; - if ((c == Ctrl_C && ctrl_c_interrupts) - || (c == intr_char && intr_char != Ctrl_C)) { - // TODO: The run loop is not touched while Vim is processing, so - // effectively it is impossible to interrupt Vim. - trash_input_buf(); - got_int = TRUE; - } - //NSLog(@"non-special: %@ (hex=%x, mods=%d)", key, // [key characterAtIndex:0], mods); diff --git a/MMTextView.m b/MMTextView.m index ee227e4f85..b7da8f8100 100644 --- a/MMTextView.m +++ b/MMTextView.m @@ -461,6 +461,13 @@ - (void)dispatchKeyEvent:(NSEvent *)event // handle it separately (else Ctrl-C doesn't work). static char enter[2] = { 'K', 'A' }; len = 2; bytes = enter; + } else if (c == 0x3 && imc == 0x63) { + // HACK! Intercept Ctrl-C and send SIGINT to Vim. + int pid = [[self vimController] pid]; + if (pid > 0) { + kill(pid, SIGINT); + return; + } } else { len = [chars lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; bytes = [chars UTF8String]; diff --git a/MMVimController.h b/MMVimController.h index 2efdbc3901..1550c6dc25 100644 --- a/MMVimController.h +++ b/MMVimController.h @@ -28,10 +28,12 @@ BOOL shouldUpdateMainMenu; NSToolbar *toolbar; NSMutableDictionary *toolbarItemDict; + int pid; } -- (id)initWithBackend:(id)backend; +- (id)initWithBackend:(id)backend pid:(int)processIdentifier; - (id)backendProxy; +- (int)pid; - (MMWindowController *)windowController; - (void)cleanup; - (void)sendMessage:(int)msgid data:(NSData *)data wait:(BOOL)wait; diff --git a/MMVimController.m b/MMVimController.m index 718b19348c..6eed985e61 100644 --- a/MMVimController.m +++ b/MMVimController.m @@ -78,7 +78,7 @@ + (NSColor *)colorWithRgbInt:(int)rgb; @implementation MMVimController -- (id)initWithBackend:(id)backend +- (id)initWithBackend:(id)backend pid:(int)processIdentifier { if ((self = [super init])) { windowController = @@ -88,6 +88,7 @@ - (id)initWithBackend:(id)backend mainMenuItems = [[NSMutableArray alloc] init]; popupMenuItems = [[NSMutableArray alloc] init]; toolbarItemDict = [[NSMutableDictionary alloc] init]; + pid = processIdentifier; NSConnection *connection = [backendProxy connectionForProxy]; [[NSNotificationCenter defaultCenter] addObserver:self @@ -137,6 +138,11 @@ - (MMWindowController *)windowController return windowController; } +- (int)pid +{ + return pid; +} + - (void)sendMessage:(int)msgid data:(NSData *)data wait:(BOOL)wait { if (!isInitialized) return; diff --git a/MacVim.h b/MacVim.h index 71affc1279..cdab0ff12c 100644 --- a/MacVim.h +++ b/MacVim.h @@ -46,7 +46,7 @@ // @protocol MMAppProtocol - (byref id )connectBackend: - (byref in id )backend; + (byref in id )backend pid:(int)pid; @end From e4813adad0ff2cbdcfaf285e20000222c00a1979 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Fri, 17 Aug 2007 09:11:31 +0000 Subject: [PATCH 0125/1156] Fixed out of range exception in insertText: git-svn-id: http://macvim.googlecode.com/svn/trunk@150 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMTextView.m | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/MMTextView.m b/MMTextView.m index b7da8f8100..69b2f79ef0 100644 --- a/MMTextView.m +++ b/MMTextView.m @@ -57,20 +57,19 @@ - (void)insertText:(id)string // modifiers are already included and should not be added to the input // buffer using CSI, K_MODIFIER). - //NSLog(@"%s%@ (%x)", _cmd, string, [string characterAtIndex:0]); - NSEvent *event = [NSApp currentEvent]; - if ([event type] == NSKeyDown) { - unsigned mods = [event modifierFlags]; - unichar c = [[event charactersIgnoringModifiers] characterAtIndex:0]; - - if (mods & (NSShiftKeyMask|NSControlKeyMask|NSAlternateKeyMask) - && ' ' == c) { - // HACK! In order to be able to bind to etc. we have to - // watch for when space was pressed. - [self dispatchKeyEvent:event]; - return; - } + //NSLog(@"%s%@ (event=%@)", _cmd, string, event); + + // HACK! In order to be able to bind to etc. we have to watch + // for when space was pressed. + if ([event type] == NSKeyDown + && [[event charactersIgnoringModifiers] length] > 0 + && [[event charactersIgnoringModifiers] characterAtIndex:0] == ' ' + && [event modifierFlags] + & (NSShiftKeyMask|NSControlKeyMask|NSAlternateKeyMask)) + { + [self dispatchKeyEvent:event]; + return; } [NSCursor setHiddenUntilMouseMoves:YES]; From b97fa8a1b1357605c3cb18b031651a203cb68b8d Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Fri, 17 Aug 2007 09:38:52 +0000 Subject: [PATCH 0126/1156] Append KS_EXTRA, KE_CSI, to CSI byte added to input buffer when inserting text git-svn-id: http://macvim.googlecode.com/svn/trunk@151 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMBackend.m | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/MMBackend.m b/MMBackend.m index 3369f5d89b..c98e6d51f9 100644 --- a/MMBackend.m +++ b/MMBackend.m @@ -765,9 +765,20 @@ - (void)handleMessage:(int)msgid data:(NSData *)data if (!data) return; NSString *key = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; - //NSLog(@"insert text: %@ (hex=%x)", key, [key characterAtIndex:0]); - add_to_input_buf((char_u*)[key UTF8String], - [key lengthOfBytesUsingEncoding:NSUTF8StringEncoding]); + char_u *chars = (char_u*)[key UTF8String]; + int i, len = [key lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; + + for (i = 0; i < len; ++i) { + add_to_input_buf(chars+i, 1); + if (CSI == chars[i]) { + // NOTE: If the converted string contains the byte CSI, then it + // must be followed by the bytes KS_EXTRA, KE_CSI or things + // won't work. + static char_u extra[2] = { KS_EXTRA, KE_CSI }; + add_to_input_buf(extra, 2); + } + } + [key release]; } else if (KeyDownMsgID == msgid || CmdKeyMsgID == msgid) { if (!data) return; @@ -1155,6 +1166,7 @@ - (void)handleKeyDown:(NSString *)key modifiers:(int)mods } //NSLog(@"add to input buf: 0x%x", chars[0]); + // TODO: Check for CSI bytes? add_to_input_buf(chars, length); } } From 0c5f83c1fe39f573b4b59f2e04107e60e9eadb7f Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Fri, 17 Aug 2007 14:59:45 +0000 Subject: [PATCH 0127/1156] Added "Close Window" menu item with key equivalent git-svn-id: http://macvim.googlecode.com/svn/trunk@152 96c4425d-ca35-0410-94e5-3396d5c13a8f --- gvimrc | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/gvimrc b/gvimrc index e22bfc3c43..872e7eb77b 100644 --- a/gvimrc +++ b/gvimrc @@ -1,7 +1,7 @@ " System gvimrc file for MacVim " " Maintainer: Björn Winckler -" Last Change: Sat Aug 11 2007 +" Last Change: Fri Aug 17 2007 " " This is a work in progress. If you feel so inclined, please help me improve " this file. @@ -35,11 +35,11 @@ aunmenu File.-SEP4- aunmenu File.Exit aunmenu File.Save-Exit -an 10.290 File.New\ Window :action newVimWindow: -an 10.295 File.New\ Tab :tabnew -an 10.328 File.-SEP0- -an 10.330 File.Close:q :confirm q -"an 10.330 File.Close\ Window :confirm qa +an 10.290 File.New\ Window :action newVimWindow: +an 10.295 File.New\ Tab :tabnew +an 10.328 File.-SEP0- +an 10.330 File.Close\ Window:qa :confirm qa +an 10.331 File.Close:q :confirm q "an 10.331 File.Close\ Tab :tabclose an 20.460 Edit.-SEP4- @@ -107,7 +107,7 @@ menukeyequiv File.New\ Tab menukeyequiv File.Open\.\.\. menukeyequiv File.Open\ Tab\.\.\. -"menukeyequiv File.Close\ Window +menukeyequiv File.Close\ Window "menukeyequiv File.Close\ Tab menukeyequiv File.Close menukeyequiv File.Save From bf2497087ed223ba27bb0c30226d6e46c8d734e8 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Fri, 17 Aug 2007 20:15:33 +0000 Subject: [PATCH 0128/1156] Give error instead of throw exception if Vim exe is not in app bundle. git-svn-id: http://macvim.googlecode.com/svn/trunk@153 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMAppController.m | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/MMAppController.m b/MMAppController.m index 573b12e057..41a90d9b8b 100644 --- a/MMAppController.m +++ b/MMAppController.m @@ -154,6 +154,7 @@ - (void)application:(NSApplication *)sender openFiles:(NSArray *)filenames [alert runModal]; [alert release]; + [NSApp replyToOpenOrPrint:NSApplicationDelegateReplyFailure]; return; } @@ -162,6 +163,11 @@ - (void)application:(NSApplication *)sender openFiles:(NSArray *)filenames NSString *path = [[NSBundle mainBundle] pathForAuxiliaryExecutable:@"Vim"]; + if (!path) { + NSLog(@"ERROR: Vim executable could not be found inside app bundle!"); + [NSApp replyToOpenOrPrint:NSApplicationDelegateReplyFailure]; + return; + } [NSTask launchedTaskWithLaunchPath:path arguments:args]; @@ -287,6 +293,11 @@ - (IBAction)newVimWindow:(id)sender NSMutableArray *args = [NSMutableArray arrayWithObject:@"-g"]; NSString *path = [[NSBundle mainBundle] pathForAuxiliaryExecutable:@"Vim"]; + if (!path) { + NSLog(@"ERROR: Vim executable could not be found inside app bundle!"); + return; + } + //NSLog(@"Launching a new VimTask..."); [NSTask launchedTaskWithLaunchPath:path arguments:args]; From 90e76984a40951751e4f464513586d64580b1fd1 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Fri, 17 Aug 2007 20:30:35 +0000 Subject: [PATCH 0129/1156] - MacVim sends focus change messages to Vim - Partial implementation of GUI dialogs git-svn-id: http://macvim.googlecode.com/svn/trunk@154 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMBackend.h | 3 ++ MMBackend.m | 42 +++++++++++++++++++++++++ MMVimController.m | 73 +++++++++++++++++++------------------------- MMWindowController.m | 9 ++++++ MacVim.h | 8 +++-- MacVim.m | 4 +-- gui_macvim.m | 16 ++++++++-- 7 files changed, 108 insertions(+), 47 deletions(-) diff --git a/MMBackend.h b/MMBackend.h index d0a577f3e8..efbc9f2564 100644 --- a/MMBackend.h +++ b/MMBackend.h @@ -27,6 +27,7 @@ int defaultBackgroundColor; int defaultForegroundColor; NSDate *lastFlushDate; + int alertReturn; } + (MMBackend *)sharedInstance; @@ -57,6 +58,8 @@ - (void)setVimWindowTitle:(char *)title; - (char *)browseForFileInDirectory:(char *)dir title:(char *)title saving:(int)saving; +- (int)presentDialogWithType:(int)type title:(char *)title message:(char *)msg + buttons:(char *)btns; - (void)updateInsertionPoint; - (void)addMenuWithTag:(int)tag parent:(int)parentTag name:(char *)name atIndex:(int)index; diff --git a/MMBackend.m b/MMBackend.m index c98e6d51f9..d288322c58 100644 --- a/MMBackend.m +++ b/MMBackend.m @@ -409,6 +409,44 @@ - (char *)browseForFileInDirectory:(char *)dir title:(char *)title return (char *)s; } +- (oneway void)setAlertReturn:(int)val +{ + alertReturn = val; +} + +- (int)presentDialogWithType:(int)type title:(char *)title message:(char *)msg + buttons:(char *)btns +{ + int style = NSInformationalAlertStyle; + if (VIM_WARNING == type) style = NSWarningAlertStyle; + else if (VIM_ERROR == type) style = NSCriticalAlertStyle; + + NSString *hotkey = [NSString stringWithFormat:@"%c", DLG_HOTKEY_CHAR]; + NSMutableString *btnString = [NSMutableString stringWithUTF8String:btns]; + [btnString replaceOccurrencesOfString:hotkey + withString:@"" + options:0 + range:NSMakeRange(0, [btnString length])]; + + NSString *separator = [NSString stringWithFormat:@"%c", DLG_BUTTON_SEP]; + NSArray *buttons = [btnString componentsSeparatedByString:separator]; + + NSString *message = [NSString stringWithUTF8String:title]; + NSString *text = [NSString stringWithUTF8String:msg]; + + [frontendProxy presentDialogWithStyle:style message:message + informativeText:text buttons:buttons]; + + // Wait until a reply is sent from MMVimController. + [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode + beforeDate:[NSDate distantFuture]]; + + int ret = alertReturn; + alertReturn = 0; + + return ret; +} + - (void)updateInsertionPoint { NSMutableData *data = [NSMutableData data]; @@ -1084,6 +1122,10 @@ - (void)handleMessage:(int)msgid data:(NSData *)data dnd_yank_drag_data((char_u*)[string UTF8String], len); add_to_input_buf(dropkey, sizeof(dropkey)); #endif // FEAT_DND + } else if (GotFocusMsgID == msgid) { + gui_focus_change(YES); + } else if (LostFocusMsgID == msgid) { + gui_focus_change(NO); } else { NSLog(@"WARNING: Unknown message received (msgid=%d)", msgid); } diff --git a/MMVimController.m b/MMVimController.m index 6eed985e61..559ce0e71b 100644 --- a/MMVimController.m +++ b/MMVimController.m @@ -24,6 +24,7 @@ - (void)handleMessage:(int)msgid data:(NSData *)data; - (void)performBatchDrawWithData:(NSData *)data; - (void)panelDidEnd:(NSSavePanel *)panel code:(int)code context:(void *)context; +- (void)alertDidEnd:(NSAlert *)panel code:(int)code context:(void *)context; - (NSMenuItem *)menuItemForTag:(int)tag; - (NSMenu *)menuForTag:(int)tag; - (NSMenu *)topLevelMenuForTitle:(NSString *)title; @@ -227,6 +228,32 @@ - (oneway void)showSavePanelForDirectory:(in bycopy NSString *)dir } } +- (oneway void)presentDialogWithStyle:(int)style message:(NSString *)message + informativeText:(NSString *)text + buttons:(NSArray *)buttons +{ + if (!windowController) return; + + NSAlert *alert = [[NSAlert alloc] init]; + + [alert setAlertStyle:style]; + [alert setMessageText:message]; + [alert setInformativeText:text]; + + unsigned i, count = [buttons count]; + for (i = 0; i < count; ++i) { + NSString *title = [buttons objectAtIndex:i]; + [alert addButtonWithTitle:title]; + } + + [alert beginSheetModalForWindow:[windowController window] + modalDelegate:self + didEndSelector:@selector(alertDidEnd:code:context:) + contextInfo:NULL]; + + [alert release]; +} + - (oneway void)processCommandQueue:(in NSArray *)queue { if (!isInitialized) return; @@ -378,47 +405,6 @@ - (void)handleMessage:(int)msgid data:(NSData *)data [[windowController window] setTitle:string]; [string release]; - } else if (BrowseForFileMsgID == msgid) { - const void *bytes = [data bytes]; - int save = *((int*)bytes); bytes += sizeof(int); - - int len = *((int*)bytes); bytes += sizeof(int); - NSString *dir = nil; - if (len > 0) { - dir = [[NSString alloc] initWithBytes:(void*)bytes - length:len - encoding:NSUTF8StringEncoding]; - bytes += len; - } - - len = *((int*)bytes); bytes += sizeof(int); - if (len > 0) { - NSString *title = [[NSString alloc] - initWithBytes:(void*)bytes length:len - encoding:NSUTF8StringEncoding]; - bytes += len; - - [windowController setStatusText:title]; - [title release]; - } - - if (save) { - [[NSSavePanel savePanel] beginSheetForDirectory:dir file:nil - modalForWindow:[windowController window] - modalDelegate:self - didEndSelector:@selector(panelDidEnd:code:context:) - contextInfo:NULL]; - } else { - NSOpenPanel *panel = [NSOpenPanel openPanel]; - [panel setAllowsMultipleSelection:NO]; - [panel beginSheetForDirectory:dir file:nil types:nil - modalForWindow:[windowController window] - modalDelegate:self - didEndSelector:@selector(panelDidEnd:code:context:) - contextInfo:NULL]; - } - - [dir release]; } else if (UpdateInsertionPointMsgID == msgid) { const void *bytes = [data bytes]; int color = *((int*)bytes); bytes += sizeof(int); @@ -765,6 +751,11 @@ - (void)panelDidEnd:(NSSavePanel *)panel code:(int)code context:(void *)context [backendProxy setBrowseForFileString:string]; } +- (void)alertDidEnd:(NSAlert *)panel code:(int)code context:(void *)context +{ + [backendProxy setAlertReturn:(code - NSAlertFirstButtonReturn + 1)]; +} + - (NSMenuItem *)menuItemForTag:(int)tag { // Search the main menu. diff --git a/MMWindowController.m b/MMWindowController.m index c921088e01..b48edc3ced 100644 --- a/MMWindowController.m +++ b/MMWindowController.m @@ -674,6 +674,15 @@ - (void)tabView:(NSTabView *)theTabView didDragTabViewItem: // -- NSWindow delegate ------------------------------------------------------ +- (void)windowDidBecomeMain:(NSNotification *)notification +{ + [vimController sendMessage:GotFocusMsgID data:nil wait:YES]; +} + +- (void)windowDidResignMain:(NSNotification *)notification +{ + [vimController sendMessage:LostFocusMsgID data:nil wait:YES]; +} - (BOOL)windowShouldClose:(id)sender { diff --git a/MacVim.h b/MacVim.h index cdab0ff12c..5e4fb2d76d 100644 --- a/MacVim.h +++ b/MacVim.h @@ -23,6 +23,7 @@ - (oneway void)processInput:(int)msgid data:(in NSData *)data; - (BOOL)checkForModifiedBuffers; - (oneway void)setBrowseForFileString:(in bycopy NSString *)string; +- (oneway void)setAlertReturn:(int)val; - (BOOL)starRegisterToPasteboard:(byref NSPasteboard *)pboard; - (BOOL)starRegisterFromPasteboard:(byref NSPasteboard *)pboard; @end @@ -36,6 +37,9 @@ - (oneway void)showSavePanelForDirectory:(in bycopy NSString *)dir title:(in bycopy NSString *)title saving:(int)saving; +- (oneway void)presentDialogWithStyle:(int)style message:(NSString *)message + informativeText:(NSString *)text + buttons:(NSArray *)buttons; @end @@ -82,8 +86,6 @@ enum { MouseDownMsgID, MouseUpMsgID, MouseDraggedMsgID, - BrowseForFileMsgID, - BrowseForFileReplyMsgID, FlushQueueMsgID, UpdateInsertionPointMsgID, AddMenuMsgID, @@ -106,6 +108,8 @@ enum { DropFilesMsgID, DropStringMsgID, ShowPopupMenuMsgID, + GotFocusMsgID, + LostFocusMsgID, }; diff --git a/MacVim.m b/MacVim.m index 0d02be4e8a..93539efebc 100644 --- a/MacVim.m +++ b/MacVim.m @@ -35,8 +35,6 @@ "MouseDownMsgID", "MouseUpMsgID", "MouseDraggedMsgID", - "BrowseForFileMsgID", - "BrowseForFileReplyMsgID", "FlushQueueMsgID", "UpdateInsertionPointMsgID", "AddMenuMsgID", @@ -58,6 +56,8 @@ "DropFilesMsgID", "DropStringMsgID", "ShowPopupMenuMsgID", + "GotFocusMsgID", + "LostFocusMsgID", }; diff --git a/gui_macvim.m b/gui_macvim.m index dcf8253527..ca8865b5a4 100644 --- a/gui_macvim.m +++ b/gui_macvim.m @@ -157,7 +157,7 @@ int gui_mch_wait_for_chars(int wtime) { - // NOTE! In all likelyhood Vim will take a nap when waitForInput: is + // NOTE! In all likelihood Vim will take a nap when waitForInput: is // called, so force a flush of the command queue here. [[MMBackend sharedInstance] flushQueue:YES]; @@ -953,7 +953,19 @@ int dfltbutton, char_u *textfield) { - return 0; + //NSLog(@"gui_mch_dialog(type=%d title=%s message=%s buttons=%s " + // "dfltbutton=%d textfield=%s)", type, title, message, buttons, + // dfltbutton, textfield); + + if (textfield) { + NSLog(@"gui_mch_dialog() Textfiled support not implemented"); + return 0; + } + + return [[MMBackend sharedInstance] presentDialogWithType:type + title:(char*)title + message:(char*)message + buttons:(char*)buttons]; } From 7c1e81dc5d5c994eaf211e0a878b98a79dc5a336 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Fri, 17 Aug 2007 20:50:21 +0000 Subject: [PATCH 0130/1156] Don't wait on focus change messages (also added hack to make sure gui.in_focus is set whenever input is received). git-svn-id: http://macvim.googlecode.com/svn/trunk@155 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMBackend.m | 11 +++++++++-- MMWindowController.m | 4 ++-- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/MMBackend.m b/MMBackend.m index d288322c58..06ae1ebca8 100644 --- a/MMBackend.m +++ b/MMBackend.m @@ -728,6 +728,11 @@ - (oneway void)processInput:(int)msgid data:(in NSData *)data [lastFlushDate release]; lastFlushDate = [[NSDate date] retain]; + // HACK! A focus message might get lost, but whenever we get here the GUI + // is in focus. + if (!gui.in_focus && GotFocusMsgID != msgid && LostFocusMsgID != msgid) + gui_focus_change(TRUE); + [self handleMessage:msgid data:data]; inputReceived = YES; } @@ -1123,9 +1128,11 @@ - (void)handleMessage:(int)msgid data:(NSData *)data add_to_input_buf(dropkey, sizeof(dropkey)); #endif // FEAT_DND } else if (GotFocusMsgID == msgid) { - gui_focus_change(YES); + if (!gui.in_focus) + gui_focus_change(YES); } else if (LostFocusMsgID == msgid) { - gui_focus_change(NO); + if (gui.in_focus) + gui_focus_change(NO); } else { NSLog(@"WARNING: Unknown message received (msgid=%d)", msgid); } diff --git a/MMWindowController.m b/MMWindowController.m index b48edc3ced..b26cdc9330 100644 --- a/MMWindowController.m +++ b/MMWindowController.m @@ -676,12 +676,12 @@ - (void)tabView:(NSTabView *)theTabView didDragTabViewItem: - (void)windowDidBecomeMain:(NSNotification *)notification { - [vimController sendMessage:GotFocusMsgID data:nil wait:YES]; + [vimController sendMessage:GotFocusMsgID data:nil wait:NO]; } - (void)windowDidResignMain:(NSNotification *)notification { - [vimController sendMessage:LostFocusMsgID data:nil wait:YES]; + [vimController sendMessage:LostFocusMsgID data:nil wait:NO]; } - (BOOL)windowShouldClose:(id)sender From 8d0f043ffe98bb28d17f44641a87f9312934dcd0 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sat, 18 Aug 2007 10:52:04 +0000 Subject: [PATCH 0131/1156] Dialog buttons are assigned key equivalents git-svn-id: http://macvim.googlecode.com/svn/trunk@156 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMBackend.m | 12 ++---------- MMVimController.m | 26 ++++++++++++++++++++++++++ 2 files changed, 28 insertions(+), 10 deletions(-) diff --git a/MMBackend.m b/MMBackend.m index 06ae1ebca8..8e342263cc 100644 --- a/MMBackend.m +++ b/MMBackend.m @@ -421,16 +421,8 @@ - (int)presentDialogWithType:(int)type title:(char *)title message:(char *)msg if (VIM_WARNING == type) style = NSWarningAlertStyle; else if (VIM_ERROR == type) style = NSCriticalAlertStyle; - NSString *hotkey = [NSString stringWithFormat:@"%c", DLG_HOTKEY_CHAR]; - NSMutableString *btnString = [NSMutableString stringWithUTF8String:btns]; - [btnString replaceOccurrencesOfString:hotkey - withString:@"" - options:0 - range:NSMakeRange(0, [btnString length])]; - - NSString *separator = [NSString stringWithFormat:@"%c", DLG_BUTTON_SEP]; - NSArray *buttons = [btnString componentsSeparatedByString:separator]; - + NSString *btnString = [NSString stringWithUTF8String:btns]; + NSArray *buttons = [btnString componentsSeparatedByString:@"\n"]; NSString *message = [NSString stringWithUTF8String:title]; NSString *text = [NSString stringWithUTF8String:msg]; diff --git a/MMVimController.m b/MMVimController.m index 559ce0e71b..d245887905 100644 --- a/MMVimController.m +++ b/MMVimController.m @@ -243,7 +243,33 @@ - (oneway void)presentDialogWithStyle:(int)style message:(NSString *)message unsigned i, count = [buttons count]; for (i = 0; i < count; ++i) { NSString *title = [buttons objectAtIndex:i]; + // NOTE: The title of the button may contain the character '&' to + // indicate that the following letter should be the key equivalent + // associated with the button. Extract this letter and lowercase it. + NSString *keyEquivalent = nil; + NSRange hotkeyRange = [title rangeOfString:@"&"]; + if (NSNotFound != hotkeyRange.location) { + if ([title length] > NSMaxRange(hotkeyRange)) { + NSRange keyEquivRange = NSMakeRange(hotkeyRange.location+1, 1); + keyEquivalent = [[title substringWithRange:keyEquivRange] + lowercaseString]; + } + + NSMutableString *string = [NSMutableString stringWithString:title]; + [string deleteCharactersInRange:hotkeyRange]; + title = string; + } + [alert addButtonWithTitle:title]; + + // Set key equivalent for the button, but only if NSAlert hasn't + // already done so. (Check the documentation for + // - [NSAlert addButtonWithTitle:] to see what key equivalents are + // automatically assigned.) + NSButton *btn = [[alert buttons] lastObject]; + if ([[btn keyEquivalent] length] == 0 && keyEquivalent) { + [btn setKeyEquivalent:keyEquivalent]; + } } [alert beginSheetModalForWindow:[windowController window] From b9e6968baeae391fede3788d64c90822085e374b Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sat, 18 Aug 2007 13:46:32 +0000 Subject: [PATCH 0132/1156] Initial support for alert panels with text fields git-svn-id: http://macvim.googlecode.com/svn/trunk@157 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMBackend.h | 4 +- MMBackend.m | 68 +++++++++++++++++++---------- MMVimController.m | 107 +++++++++++++++++++++++++++++++++++++++++----- MacVim.h | 6 +-- gui_macvim.m | 8 +--- 5 files changed, 148 insertions(+), 45 deletions(-) diff --git a/MMBackend.h b/MMBackend.h index efbc9f2564..bca3b03abf 100644 --- a/MMBackend.h +++ b/MMBackend.h @@ -27,7 +27,7 @@ int defaultBackgroundColor; int defaultForegroundColor; NSDate *lastFlushDate; - int alertReturn; + id dialogReturn; } + (MMBackend *)sharedInstance; @@ -59,7 +59,7 @@ - (char *)browseForFileInDirectory:(char *)dir title:(char *)title saving:(int)saving; - (int)presentDialogWithType:(int)type title:(char *)title message:(char *)msg - buttons:(char *)btns; + buttons:(char *)btns textField:(char *)txtfield; - (void)updateInsertionPoint; - (void)addMenuWithTag:(int)tag parent:(int)parentTag name:(char *)name atIndex:(int)index; diff --git a/MMBackend.m b/MMBackend.m index 8e342263cc..ca2a54705c 100644 --- a/MMBackend.m +++ b/MMBackend.m @@ -375,14 +375,6 @@ - (void)setVimWindowTitle:(char *)title [self queueMessage:SetVimWindowTitleMsgID data:data]; } -- (oneway void)setBrowseForFileString:(in bycopy NSString *)string -{ - // NOTE: This is called by [MMVimController panelDidEnd:::] to indicate - // that the save/open panel has finished. If 'string == nil' that means - // the user pressed cancel. - browseForFileString = string ? [string copy] : nil; -} - - (char *)browseForFileInDirectory:(char *)dir title:(char *)title saving:(int)saving { @@ -400,43 +392,73 @@ - (char *)browseForFileInDirectory:(char *)dir title:(char *)title // Wait until a reply is sent from MMVimController. [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]; - if (!browseForFileString) - return nil; - char_u *s = vim_strsave((char_u*)[browseForFileString UTF8String]); - [browseForFileString release]; browseForFileString = nil; + char_u *s = NULL; + if (dialogReturn && [dialogReturn isKindOfClass:[NSString class]]) { + s = vim_strsave((char_u*)[dialogReturn UTF8String]); + } + + [dialogReturn release]; dialogReturn = nil; return (char *)s; } -- (oneway void)setAlertReturn:(int)val +- (oneway void)setDialogReturn:(in bycopy id)obj { - alertReturn = val; + // NOTE: This is called by + // - [MMVimController panelDidEnd:::], and + // - [MMVimController alertDidEnd:::], + // to indicate that a save/open panel or alert has finished. + + if (obj != dialogReturn) { + [dialogReturn release]; + dialogReturn = [obj retain]; + } } - (int)presentDialogWithType:(int)type title:(char *)title message:(char *)msg - buttons:(char *)btns + buttons:(char *)btns textField:(char *)txtfield { + NSString *message = nil, *text = nil, *textFieldString = nil; + NSArray *buttons = nil; int style = NSInformationalAlertStyle; + if (VIM_WARNING == type) style = NSWarningAlertStyle; else if (VIM_ERROR == type) style = NSCriticalAlertStyle; - NSString *btnString = [NSString stringWithUTF8String:btns]; - NSArray *buttons = [btnString componentsSeparatedByString:@"\n"]; - NSString *message = [NSString stringWithUTF8String:title]; - NSString *text = [NSString stringWithUTF8String:msg]; + if (btns) { + NSString *btnString = [NSString stringWithUTF8String:btns]; + buttons = [btnString componentsSeparatedByString:@"\n"]; + } + if (title) + message = [NSString stringWithUTF8String:title]; + if (msg) + text = [NSString stringWithUTF8String:msg]; + if (txtfield) + textFieldString = [NSString stringWithUTF8String:txtfield]; [frontendProxy presentDialogWithStyle:style message:message - informativeText:text buttons:buttons]; + informativeText:text buttonTitles:buttons + textFieldString:textFieldString]; // Wait until a reply is sent from MMVimController. [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]; - int ret = alertReturn; - alertReturn = 0; + int retval = 0; + if (dialogReturn && [dialogReturn isKindOfClass:[NSArray class]] + && [dialogReturn count]) { + retval = [[dialogReturn objectAtIndex:0] intValue]; + if (txtfield && [dialogReturn count] > 1) { + NSString *retString = [dialogReturn objectAtIndex:1]; + vim_strncpy((char_u*)txtfield, (char_u*)[retString UTF8String], + IOSIZE - 1); + } + } + + [dialogReturn release]; dialogReturn = nil; - return ret; + return retval; } - (void)updateInsertionPoint diff --git a/MMVimController.m b/MMVimController.m index d245887905..69f1baac46 100644 --- a/MMVimController.m +++ b/MMVimController.m @@ -19,12 +19,20 @@ static NSString *DefaultToolbarImageName = @"Attention"; +@interface MMAlert : NSAlert { + NSTextField *textField; +} +- (void)setTextFieldString:(NSString *)textFieldString; +- (NSTextField *)textField; +@end + + @interface MMVimController (Private) - (void)handleMessage:(int)msgid data:(NSData *)data; - (void)performBatchDrawWithData:(NSData *)data; - (void)panelDidEnd:(NSSavePanel *)panel code:(int)code context:(void *)context; -- (void)alertDidEnd:(NSAlert *)panel code:(int)code context:(void *)context; +- (void)alertDidEnd:(MMAlert *)alert code:(int)code context:(void *)context; - (NSMenuItem *)menuItemForTag:(int)tag; - (NSMenu *)menuForTag:(int)tag; - (NSMenu *)topLevelMenuForTitle:(NSString *)title; @@ -230,19 +238,26 @@ - (oneway void)showSavePanelForDirectory:(in bycopy NSString *)dir - (oneway void)presentDialogWithStyle:(int)style message:(NSString *)message informativeText:(NSString *)text - buttons:(NSArray *)buttons + buttonTitles:(NSArray *)buttonTitles + textFieldString:(NSString *)textFieldString { - if (!windowController) return; + if (!(windowController && buttonTitles && [buttonTitles count])) return; + + MMAlert *alert = [[MMAlert alloc] init]; - NSAlert *alert = [[NSAlert alloc] init]; + // NOTE! This has to be done before setting the informative text. + if (textFieldString) + [alert setTextFieldString:textFieldString]; [alert setAlertStyle:style]; - [alert setMessageText:message]; - [alert setInformativeText:text]; - unsigned i, count = [buttons count]; + if (message) [alert setMessageText:message]; + else [alert setMessageText:@""]; + if (text) [alert setInformativeText:text]; + + unsigned i, count = [buttonTitles count]; for (i = 0; i < count; ++i) { - NSString *title = [buttons objectAtIndex:i]; + NSString *title = [buttonTitles objectAtIndex:i]; // NOTE: The title of the button may contain the character '&' to // indicate that the following letter should be the key equivalent // associated with the button. Extract this letter and lowercase it. @@ -774,12 +789,23 @@ - (void)panelDidEnd:(NSSavePanel *)panel code:(int)code context:(void *)context [windowController setStatusText:@""]; NSString *string = (code == NSOKButton) ? [panel filename] : nil; - [backendProxy setBrowseForFileString:string]; + [backendProxy setDialogReturn:string]; } -- (void)alertDidEnd:(NSAlert *)panel code:(int)code context:(void *)context +- (void)alertDidEnd:(MMAlert *)alert code:(int)code context:(void *)context { - [backendProxy setAlertReturn:(code - NSAlertFirstButtonReturn + 1)]; + NSArray *ret = nil; + + code = code - NSAlertFirstButtonReturn + 1; + + if ([alert isKindOfClass:[MMAlert class]] && [alert textField]) { + ret = [NSArray arrayWithObjects:[NSNumber numberWithInt:code], + [[alert textField] stringValue], nil]; + } else { + ret = [NSArray arrayWithObject:[NSNumber numberWithInt:code]]; + } + + [backendProxy setDialogReturn:ret]; } - (NSMenuItem *)menuItemForTag:(int)tag @@ -1101,3 +1127,62 @@ + (NSColor *)colorWithRgbInt:(int)rgb } @end // NSColor (MMProtocol) + + + +@implementation MMAlert +- (void)dealloc +{ + [textField release]; + [super dealloc]; +} + +- (void)setTextFieldString:(NSString *)textFieldString +{ + textField = [[NSTextField alloc] init]; + [textField setStringValue:textFieldString]; +} + +- (NSTextField *)textField +{ + return textField; +} + +- (void)setInformativeText:(NSString *)text +{ + if (textField) { + // HACK! Add some space for the text field. + [super setInformativeText:[text stringByAppendingString:@"\n\n\n"]]; + } else { + [super setInformativeText:text]; + } +} + +- (void)beginSheetModalForWindow:(NSWindow *)window + modalDelegate:(id)delegate + didEndSelector:(SEL)didEndSelector + contextInfo:(void *)contextInfo +{ + [super beginSheetModalForWindow:window + modalDelegate:delegate + didEndSelector:didEndSelector + contextInfo:contextInfo]; + + NSView *contentView = [[self window] contentView]; + NSRect rect = NSZeroRect; + NSArray *subviews = [contentView subviews]; + unsigned i, count = [subviews count]; + for (i = 0; i < count; ++i) { + NSView *view = [subviews objectAtIndex:i]; + if ([view isKindOfClass:[NSTextField class]]) { + rect = [view frame]; + } + } + + rect.size.height = 22; + [textField setFrame:rect]; + [contentView addSubview:textField]; + [textField becomeFirstResponder]; +} + +@end // MMAlert diff --git a/MacVim.h b/MacVim.h index 5e4fb2d76d..79fe2bb546 100644 --- a/MacVim.h +++ b/MacVim.h @@ -22,8 +22,7 @@ @protocol MMBackendProtocol - (oneway void)processInput:(int)msgid data:(in NSData *)data; - (BOOL)checkForModifiedBuffers; -- (oneway void)setBrowseForFileString:(in bycopy NSString *)string; -- (oneway void)setAlertReturn:(int)val; +- (oneway void)setDialogReturn:(in bycopy id)obj; - (BOOL)starRegisterToPasteboard:(byref NSPasteboard *)pboard; - (BOOL)starRegisterFromPasteboard:(byref NSPasteboard *)pboard; @end @@ -39,7 +38,8 @@ saving:(int)saving; - (oneway void)presentDialogWithStyle:(int)style message:(NSString *)message informativeText:(NSString *)text - buttons:(NSArray *)buttons; + buttonTitles:(NSArray *)buttonTitles + textFieldString:(NSString *)textFieldString; @end diff --git a/gui_macvim.m b/gui_macvim.m index ca8865b5a4..8056e9c4a0 100644 --- a/gui_macvim.m +++ b/gui_macvim.m @@ -957,15 +957,11 @@ // "dfltbutton=%d textfield=%s)", type, title, message, buttons, // dfltbutton, textfield); - if (textfield) { - NSLog(@"gui_mch_dialog() Textfiled support not implemented"); - return 0; - } - return [[MMBackend sharedInstance] presentDialogWithType:type title:(char*)title message:(char*)message - buttons:(char*)buttons]; + buttons:(char*)buttons + textField:(char*)textfield]; } From b1790524df66d6030c533f417b9ac993face144b Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sat, 18 Aug 2007 13:56:50 +0000 Subject: [PATCH 0133/1156] git-svn-id: http://macvim.googlecode.com/svn/trunk@158 96c4425d-ca35-0410-94e5-3396d5c13a8f --- TODO | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/TODO b/TODO index daffd8bc22..186a169811 100644 --- a/TODO +++ b/TODO @@ -1,13 +1,11 @@ Active: -- ability to interrupt vim (needs to check the run-loop for interrupts) +- scrolling when mouse is over scrollbar doesn't work - let user choose file encoding and format in open/save dialogs - view menu option to show/hide gui status line - autosave settings ? - encoding -- convert strings from vim to utf-8 - main menu (buffers menu, window menu) -- gui dialogs (FEAT_GUI_DIALOG) - no warning when buffer modified outside vim (implement gui_mch_dialog()) - standardize NSString usage (initialization & how it is passed in messages) - autosave window rows&columns? - set gfn=* ? @@ -29,9 +27,6 @@ Active: - change building procedure so that the Makefile compiles and links VimTask and then calls pbxbuild to build MacVim (and put MacVim.app) in the src folder - icons for all built in toolbar items -- hide baseline separator when tabbar is visible (and make sure clicking the - hide/show toolbar button in the top right of the corner does not show it - again) - window title is never set when starting with terminal vim and typing :gui - forking doesn't work with :gui (i think) - make sure [NSMutableData appendByte:length:] is never called with 0 length @@ -50,6 +45,14 @@ Active: - got this error when clicking to close second last tab: 2007-07-23 08:19:29.398 MacVim[335] *** Assertion failure in -[PSMTabBarControl lockFocus], AppKit.subproj/NSView.m:3248 2007-07-23 08:19:29.410 MacVim[335] lockFocus sent to a view whose window is deferred and does not yet have a corresponding platform window + + +Pending: + +- gui dialogs (FEAT_GUI_DIALOG) +- no warning when buffer modified outside vim (implement gui_mch_dialog()) +- call gui_focus_change() when appropriate +- ability to interrupt vim (needs to check the run-loop for interrupts) - got this error on Cmd-N with no other windows open: 2007-07-27 22:00:17.680 MacVim[454] *** -[NSToolbarView frameDidChange:]: selector not recognized [self = 0x39ba80] 2007-07-27 22:00:17.690 MacVim[454] Exception raised during posting of notification. Ignored. exception: *** -[NSToolbarView frameDidChange:]: selector not recognized [self = 0x39ba80] @@ -60,11 +63,9 @@ Active: 2007-08-05 13:25:01.156 MacVim[223] Exception raised during posting of notification. Ignored. exception: *** -[NSThemeFrame frameDidChange:]: selector not recognized [self = 0x3baa30] 2007-08-05 13:25:01.246 MacVim[223] *** -[NSThemeFrame frameDidChange:]: selector not recognized [self = 0x3baa30] 2007-08-05 13:25:01.247 MacVim[223] Exception raised during posting of notification. Ignored. exception: *** -[NSThemeFrame frameDidChange:]: selector not recognized [self = 0x3baa30] - - - -Pending: - +- hide baseline separator when tabbar is visible (and make sure clicking the + hide/show toolbar button in the top right of the corner does not show it + again) - toogle toolbar off, maximize window, toolbar on -> text view under toolbar - clicking pill button does not update 'guioptions' - detect Cmd-. (and Ctrl-C) for interrupt From e33692a5eea49ba9b236dbf1b5cd6ccf7f4672aa Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sat, 18 Aug 2007 16:41:46 +0000 Subject: [PATCH 0134/1156] - Changed the way input text field is place in dialogs - If a dialog has no title but a message with newlines, then use the first line of the message as a title (this makes dialogs look better) git-svn-id: http://macvim.googlecode.com/svn/trunk@159 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMBackend.m | 17 ++++++++++++++++- MMVimController.m | 31 +++++++++++++++++++++++++------ 2 files changed, 41 insertions(+), 7 deletions(-) diff --git a/MMBackend.m b/MMBackend.m index ca2a54705c..250f6043a9 100644 --- a/MMBackend.m +++ b/MMBackend.m @@ -432,8 +432,23 @@ - (int)presentDialogWithType:(int)type title:(char *)title message:(char *)msg } if (title) message = [NSString stringWithUTF8String:title]; - if (msg) + if (msg) { text = [NSString stringWithUTF8String:msg]; + if (!message) { + // HACK! If there is a '\n\n' or '\n' sequence in the message, then + // make the part up to there into the title. We only do this + // because Vim has lots of dialogs without a title and they look + // ugly that way. + // TODO: Fix the actual dialog texts. + NSRange eolRange = [text rangeOfString:@"\n\n"]; + if (NSNotFound == eolRange.location) + eolRange = [text rangeOfString:@"\n"]; + if (NSNotFound != eolRange.location) { + message = [text substringToIndex:eolRange.location]; + text = [text substringFromIndex:NSMaxRange(eolRange)]; + } + } + } if (txtfield) textFieldString = [NSString stringWithUTF8String:txtfield]; diff --git a/MMVimController.m b/MMVimController.m index 69f1baac46..c4e868e1d2 100644 --- a/MMVimController.m +++ b/MMVimController.m @@ -18,6 +18,8 @@ //static NSString *AttentionToolbarItemID = @"Attention"; static NSString *DefaultToolbarImageName = @"Attention"; +static int MMAlertTextFieldHeight = 22; + @interface MMAlert : NSAlert { NSTextField *textField; @@ -251,9 +253,19 @@ - (oneway void)presentDialogWithStyle:(int)style message:(NSString *)message [alert setAlertStyle:style]; - if (message) [alert setMessageText:message]; - else [alert setMessageText:@""]; - if (text) [alert setInformativeText:text]; + if (message) { + [alert setMessageText:message]; + } else { + // If no message text is specified 'Alert' is used. + [alert setMessageText:@""]; + } + + if (text) { + [alert setInformativeText:text]; + } else if (textFieldString) { + // Make sure there is always room for the input text field. + [alert setInformativeText:@""]; + } unsigned i, count = [buttonTitles count]; for (i = 0; i < count; ++i) { @@ -1168,18 +1180,25 @@ - (void)beginSheetModalForWindow:(NSWindow *)window didEndSelector:didEndSelector contextInfo:contextInfo]; + // HACK! Place the input text field at the bottom of the informative text + // (which has been made a bit larger by adding newline characters). NSView *contentView = [[self window] contentView]; - NSRect rect = NSZeroRect; + NSRect rect = [contentView frame]; + rect.origin.y = rect.size.height; + NSArray *subviews = [contentView subviews]; unsigned i, count = [subviews count]; for (i = 0; i < count; ++i) { NSView *view = [subviews objectAtIndex:i]; - if ([view isKindOfClass:[NSTextField class]]) { + if ([view isKindOfClass:[NSTextField class]] + && [view frame].origin.y < rect.origin.y) { + // NOTE: The informative text field is the lowest NSTextField in + // the alert dialog. rect = [view frame]; } } - rect.size.height = 22; + rect.size.height = MMAlertTextFieldHeight; [textField setFrame:rect]; [contentView addSubview:textField]; [textField becomeFirstResponder]; From 2e2ee9fa7e280faafe49ca0a4f6df5a08ef6482c Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sat, 18 Aug 2007 16:54:01 +0000 Subject: [PATCH 0135/1156] Scroll wheel message sent to scrollers are passed on to text view. git-svn-id: http://macvim.googlecode.com/svn/trunk@160 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMWindowController.m | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/MMWindowController.m b/MMWindowController.m index b26cdc9330..e966a24c44 100644 --- a/MMWindowController.m +++ b/MMWindowController.m @@ -1258,4 +1258,11 @@ - (void)setRange:(NSRange)newRange range = newRange; } +- (void)scrollWheel:(NSEvent *)event +{ + // HACK! Pass message on to the text view. + MMWindowController *wc = [[self window] windowController]; + [[wc textView] scrollWheel:event]; +} + @end // MMScroller From eda16bf9f68718ddb9faf0b4bc4a6c020800f581 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sat, 18 Aug 2007 17:36:08 +0000 Subject: [PATCH 0136/1156] Code cleanup git-svn-id: http://macvim.googlecode.com/svn/trunk@161 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMVimController.m | 117 +++++++------------------------------------ MMWindowController.h | 29 ++++------- MMWindowController.m | 116 +++--------------------------------------- MacVim.h | 9 ++-- 4 files changed, 41 insertions(+), 230 deletions(-) diff --git a/MMVimController.m b/MMVimController.m index c4e868e1d2..eab1848e17 100644 --- a/MMVimController.m +++ b/MMVimController.m @@ -15,9 +15,7 @@ #import "MMTextStorage.h" -//static NSString *AttentionToolbarItemID = @"Attention"; -static NSString *DefaultToolbarImageName = @"Attention"; - +static NSString *MMDefaultToolbarImageName = @"Attention"; static int MMAlertTextFieldHeight = 22; @@ -32,8 +30,8 @@ - (NSTextField *)textField; @interface MMVimController (Private) - (void)handleMessage:(int)msgid data:(NSData *)data; - (void)performBatchDrawWithData:(NSData *)data; -- (void)panelDidEnd:(NSSavePanel *)panel code:(int)code - context:(void *)context; +- (void)savePanelDidEnd:(NSSavePanel *)panel code:(int)code + context:(void *)context; - (void)alertDidEnd:(MMAlert *)alert code:(int)code context:(void *)context; - (NSMenuItem *)menuItemForTag:(int)tag; - (NSMenu *)menuForTag:(int)tag; @@ -46,14 +44,12 @@ - (void)addMenuItemWithTag:(int)tag parent:(NSMenu *)parent action:(NSString *)action atIndex:(int)idx; - (void)updateMainMenu; - (NSToolbarItem *)toolbarItemForTag:(int)tag index:(int *)index; -- (IBAction)toolbarAction:(id)sender; - (void)addToolbarItemToDictionaryWithTag:(int)tag label:(NSString *)title toolTip:(NSString *)tip icon:(NSString *)icon; - (void)addToolbarItemWithTag:(int)tag label:(NSString *)label tip:(NSString *)tip icon:(NSString *)icon atIndex:(int)idx; - (void)connectionDidDie:(NSNotification *)notification; -- (BOOL)executeActionWithName:(NSString *)name; @end @@ -108,13 +104,6 @@ - (id)initWithBackend:(id)backend pid:(int)processIdentifier NSWindow *win = [windowController window]; -#if 0 - [[NSNotificationCenter defaultCenter] - addObserver:self - selector:@selector(windowWillClose:) - name:NSWindowWillCloseNotification - object:win]; -#endif [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(windowDidBecomeMain:) @@ -219,13 +208,11 @@ - (oneway void)showSavePanelForDirectory:(in bycopy NSString *)dir { if (!isInitialized) return; - [windowController setStatusText:title]; - if (saving) { [[NSSavePanel savePanel] beginSheetForDirectory:dir file:nil modalForWindow:[windowController window] modalDelegate:self - didEndSelector:@selector(panelDidEnd:code:context:) + didEndSelector:@selector(savePanelDidEnd:code:context:) contextInfo:NULL]; } else { NSOpenPanel *panel = [NSOpenPanel openPanel]; @@ -233,15 +220,16 @@ - (oneway void)showSavePanelForDirectory:(in bycopy NSString *)dir [panel beginSheetForDirectory:dir file:nil types:nil modalForWindow:[windowController window] modalDelegate:self - didEndSelector:@selector(panelDidEnd:code:context:) + didEndSelector:@selector(savePanelDidEnd:code:context:) contextInfo:NULL]; } } -- (oneway void)presentDialogWithStyle:(int)style message:(NSString *)message - informativeText:(NSString *)text - buttonTitles:(NSArray *)buttonTitles - textFieldString:(NSString *)textFieldString +- (oneway void)presentDialogWithStyle:(int)style + message:(in bycopy NSString *)message + informativeText:(in bycopy NSString *)text + buttonTitles:(in bycopy NSArray *)buttonTitles + textFieldString:(in bycopy NSString *)textFieldString { if (!(windowController && buttonTitles && [buttonTitles count])) return; @@ -256,7 +244,8 @@ - (oneway void)presentDialogWithStyle:(int)style message:(NSString *)message if (message) { [alert setMessageText:message]; } else { - // If no message text is specified 'Alert' is used. + // If no message text is specified 'Alert' is used, which we don't + // want, so set an empty string as message text. [alert setMessageText:@""]; } @@ -364,20 +353,6 @@ - (oneway void)processCommandQueue:(in NSArray *)queue } } -#if 0 -- (void)windowWillClose:(NSNotification *)notification -{ - NSLog(@"%@ %s%@", [self className], _cmd, notification); - - //[self cleanup]; - - // NOTE! This causes the call to removeVimController: to be delayed. - [[NSApp delegate] - performSelectorOnMainThread:@selector(removeVimController:) - withObject:self waitUntilDone:NO]; -} -#endif - - (void)windowDidBecomeMain:(NSNotification *)notification { if (isInitialized) @@ -388,8 +363,6 @@ - (NSToolbarItem *)toolbar:(NSToolbar *)theToolbar itemForItemIdentifier:(NSString *)itemId willBeInsertedIntoToolbar:(BOOL)flag { - //NSLog(@"%s", _cmd); - NSToolbarItem *item = [toolbarItemDict objectForKey:itemId]; if (!item) { NSLog(@"WARNING: No toolbar item with id '%@'", itemId); @@ -400,13 +373,11 @@ - (NSToolbarItem *)toolbar:(NSToolbar *)theToolbar - (NSArray *)toolbarAllowedItemIdentifiers:(NSToolbar *)theToolbar { - //NSLog(@"%s", _cmd); return nil; } - (NSArray *)toolbarDefaultItemIdentifiers:(NSToolbar *)theToolbar { - //NSLog(@"%s", _cmd); return nil; } @@ -423,8 +394,6 @@ - (void)handleMessage:(int)msgid data:(NSData *)data if (OpenVimWindowMsgID == msgid) { [windowController openWindow]; } else if (BatchDrawMsgID == msgid) { - //NSLog(@"Received batch draw message from VimTask."); - [self performBatchDrawWithData:data]; } else if (SelectTabMsgID == msgid) { #if 0 // NOTE: Tab selection is done inside updateTabsWithData:. @@ -434,13 +403,10 @@ - (void)handleMessage:(int)msgid data:(NSData *)data [windowController selectTabWithIndex:idx]; #endif } else if (UpdateTabBarMsgID == msgid) { - //NSLog(@"Updating tabs"); [windowController updateTabsWithData:data]; } else if (ShowTabBarMsgID == msgid) { - //NSLog(@"Showing tab bar"); [windowController showTabBar:YES]; } else if (HideTabBarMsgID == msgid) { - //NSLog(@"Hiding tab bar"); [windowController showTabBar:NO]; } else if (SetTextDimensionsMsgID == msgid) { const void *bytes = [data bytes]; @@ -490,9 +456,10 @@ - (void)handleMessage:(int)msgid data:(NSData *)data if (MenuToolbarType == parentTag) { if (!toolbar) { + // NOTE! Each toolbar must have a unique identifier, else each + // window will have the same toolbar. NSString *ident = [NSString stringWithFormat:@"%d.%d", (int)self, tag]; - //NSLog(@"Creating toolbar with identifier %@", ident); toolbar = [[NSToolbar alloc] initWithIdentifier:ident]; [toolbar setShowsBaselineSeparator:NO]; @@ -580,7 +547,6 @@ - (void)handleMessage:(int)msgid data:(NSData *)data [item retain]; if ([item menu] == [NSApp mainMenu] || ![item menu]) { - //NSLog(@"Removing menu: %@", item); // NOTE: To be on the safe side we try to remove the item from // both arrays (it is ok to call removeObject: even if an array // does not contain the object to remove). @@ -724,9 +690,7 @@ - (void)performBatchDrawWithData:(NSData *)data [textStorage beginEditing]; - // TODO: - // 1. Sanity check input - // 2. Cache rgb -> NSColor lookups? + // TODO: Sanity check input while (bytes < end) { int type = *((int*)bytes); bytes += sizeof(int); @@ -796,10 +760,9 @@ - (void)performBatchDrawWithData:(NSData *)data [textStorage endEditing]; } -- (void)panelDidEnd:(NSSavePanel *)panel code:(int)code context:(void *)context +- (void)savePanelDidEnd:(NSSavePanel *)panel code:(int)code + context:(void *)context { - [windowController setStatusText:@""]; - NSString *string = (code == NSOKButton) ? [panel filename] : nil; [backendProxy setDialogReturn:string]; } @@ -946,7 +909,6 @@ - (void)addMenuItemWithTag:(int)tag parent:(NSMenu *)parent - (void)updateMainMenu { -#if 1 NSMenu *mainMenu = [NSApp mainMenu]; // Stop NSApp from updating the Window menu. @@ -981,7 +943,6 @@ - (void)updateMainMenu [NSApp setWindowsMenu:windowMenu]; } -#endif shouldUpdateMainMenu = NO; } @@ -1002,11 +963,6 @@ - (NSToolbarItem *)toolbarItemForTag:(int)tag index:(int *)index return nil; } -- (IBAction)toolbarAction:(id)sender -{ - NSLog(@"%s%@", _cmd, sender); -} - - (void)addToolbarItemToDictionaryWithTag:(int)tag label:(NSString *)title toolTip:(NSString *)tip icon:(NSString *)icon { @@ -1029,9 +985,9 @@ - (void)addToolbarItemToDictionaryWithTag:(int)tag label:(NSString *)title NSLog(@"WARNING: Could not find image with name '%@' to use as toolbar" " image for identifier '%@';" " using default toolbar icon '%@' instead.", - icon, title, DefaultToolbarImageName); + icon, title, MMDefaultToolbarImageName); - img = [NSImage imageNamed:DefaultToolbarImageName]; + img = [NSImage imageNamed:MMDefaultToolbarImageName]; } [item setImage:img]; @@ -1083,41 +1039,6 @@ - (void)connectionDidDie:(NSNotification *)notification withObject:self waitUntilDone:NO]; } -- (BOOL)executeActionWithName:(NSString *)name -{ -#if 0 - static NSDictionary *actionDict = nil; - - if (!actionDict) { - NSBundle *mainBundle = [NSBundle mainBundle]; - NSString *path = [mainBundle pathForResource:@"Actions" - ofType:@"plist"]; - if (path) { - actionDict = [[NSDictionary alloc] initWithContentsOfFile:path]; - NSLog(@"Actions = %@", actionDict); - } else { - NSLog(@"WARNING: Failed to load dictionary of actions " - "(Actions.plist)."); - return NO; - } - } - - if ([actionDict objectForKey:name]) { - NSLog(@"Executing action %@", name); - SEL sel = NSSelectorFromString(name); - - if ([NSApp sendAction:sel to:nil from:self]) - return YES; - - NSLog(@"WARNING: Failed to send action"); - } else { - NSLog(@"WARNING: Action with name '%@' cannot be executed.", name); - } - -#endif - return NO; -} - - (NSString *)description { return [NSString stringWithFormat:@"%@ : isInitialized=%d inProcessCommandQueue=%d mainMenuItems=%@ popupMenuItems=%@ toolbar=%@", [self className], isInitialized, inProcessCommandQueue, mainMenuItems, popupMenuItems, toolbar]; diff --git a/MMWindowController.h b/MMWindowController.h index 8024334dbe..deb975deef 100644 --- a/MMWindowController.h +++ b/MMWindowController.h @@ -11,8 +11,6 @@ #import -#define MM_USE_EMPTY_WINDOW 1 - @class PSMTabBarControl; @class MMTextView; @@ -21,21 +19,18 @@ @interface MMWindowController : NSWindowController { - IBOutlet PSMTabBarControl *tabBarControl; - IBOutlet NSTabView *tabView; - IBOutlet NSTextField *statusTextField; - IBOutlet NSBox *statusSeparator; - IBOutlet NSBox *tablineSeparator; + PSMTabBarControl *tabBarControl; + NSTabView *tabView; + NSBox *tablineSeparator; - MMVimController *vimController; - BOOL vimTaskSelectedTab; - NSTimer *statusTimer; - MMTextView *textView; - MMTextStorage *textStorage; - NSMutableArray *scrollbars; - BOOL setupDone; - BOOL shouldUpdateWindowSize; - NSString *windowAutosaveKey; + MMVimController *vimController; + BOOL vimTaskSelectedTab; + MMTextView *textView; + MMTextStorage *textStorage; + NSMutableArray *scrollbars; + BOOL setupDone; + BOOL shouldUpdateWindowSize; + NSString *windowAutosaveKey; } - (id)initWithVimController:(MMVimController *)controller; @@ -49,8 +44,6 @@ - (void)updateTabsWithData:(NSData *)data; - (void)selectTabWithIndex:(int)idx; - (void)setTextDimensionsWithRows:(int)rows columns:(int)cols; -- (void)setStatusText:(NSString *)text; -- (void)flashStatusText:(NSString *)text; - (void)createScrollbarWithIdentifier:(long)ident type:(int)type; - (void)destroyScrollbarWithIdentifier:(long)ident; - (void)showScrollbarWithIdentifier:(long)ident state:(BOOL)visible; diff --git a/MMWindowController.m b/MMWindowController.m index e966a24c44..a42a32be92 100644 --- a/MMWindowController.m +++ b/MMWindowController.m @@ -57,7 +57,6 @@ - (void)resizeWindowToFit:(id)sender; - (NSRect)fitWindowToFrame:(NSRect)frame; - (void)updateResizeIncrements; - (NSTabViewItem *)addNewTabViewItem; -- (void)statusTimerFired:(NSTimer *)timer; - (int)representedIndexOfTabViewItem:(NSTabViewItem *)tvi; - (IBAction)vimMenuItemAction:(id)sender; - (MMScroller *)scrollbarForIdentifier:(long)ident index:(unsigned *)idx; @@ -98,12 +97,7 @@ @implementation MMWindowController - (id)initWithVimController:(MMVimController *)controller { -#if MM_USE_EMPTY_WINDOW - if ((self = [super initWithWindowNibName:@"EmptyWindow"])) -#else - if ((self = [super initWithWindowNibName:@"VimWindow"])) -#endif - { + if ((self = [super initWithWindowNibName:@"EmptyWindow"])) { vimController = controller; scrollbars = [[NSMutableArray alloc] init]; @@ -151,7 +145,6 @@ - (id)initWithVimController:(MMVimController *)controller [tc release]; [lm release]; -#if MM_USE_EMPTY_WINDOW // Create the tabline separator (which may be visible when the tabline // is hidden). NSRect tabSepRect = [contentView frame]; @@ -196,7 +189,6 @@ - (id)initWithVimController:(MMVimController *)controller [[self window] setDelegate:self]; [[self window] setInitialFirstResponder:textView]; -#endif } return self; @@ -206,19 +198,14 @@ - (void)dealloc { //NSLog(@"%@ %s", [self className], _cmd); -#if MM_USE_EMPTY_WINDOW [tabBarControl release]; tabBarControl = nil; [tabView release]; tabView = nil; [tablineSeparator release]; tablineSeparator = nil; -#endif [windowAutosaveKey release]; windowAutosaveKey = nil; [scrollbars release]; scrollbars = nil; [textView release]; textView = nil; [textStorage release]; textStorage = nil; - //[tabBarControl release]; tabBarControl = nil; - //[tabView release]; tabView = nil; - [super dealloc]; } @@ -227,34 +214,6 @@ - (NSString *)description return [NSString stringWithFormat:@"%@ : setupDone=%d windowAutosaveKey=%@ vimController=%@", [self className], setupDone, windowAutosaveKey, vimController]; } -#if !MM_USE_EMPTY_WINDOW -- (void)windowDidLoad -{ - // Called after window nib file is loaded. - - [tablineSeparator setHidden:([[self window] toolbar] == nil)]; - [tabBarControl setHidden:YES]; - - // NOTE: Size to fit looks good, but not many tabs will fit and there are - // quite a few drawing bugs in this code, so it is disabled for now. - //[tabBarControl setSizeCellsToFit:YES]; - - NSUserDefaults *ud = [NSUserDefaults standardUserDefaults]; - [tabBarControl setCellMinWidth:[ud integerForKey:MMTabMinWidthKey]]; - [tabBarControl setCellMaxWidth:[ud integerForKey:MMTabMaxWidthKey]]; - [tabBarControl setCellOptimumWidth:[ud integerForKey:MMTabOptimumWidthKey]]; - - [tabBarControl setAllowsDragBetweenWindows:NO]; - //[tabBarControl setShowAddTabButton:YES]; - //[[tabBarControl addTabButton] setTarget:self]; - //[[tabBarControl addTabButton] setAction:@selector(addNewTab:)]; - - // HACK! remove any tabs present in the nib - [tabView removeAllTabViewItems]; - [tabView setHidden:YES]; -} -#endif - - (MMVimController *)vimController { return vimController; @@ -302,10 +261,8 @@ - (void)cleanup // will come and gnaw at your feet while you are sleeping). [[NSNotificationCenter defaultCenter] removeObserver:tabBarControl]; -#if MM_USE_EMPTY_WINDOW [tabBarControl removeFromSuperviewWithoutNeedingDisplay]; [tablineSeparator removeFromSuperviewWithoutNeedingDisplay]; -#endif [textView removeFromSuperviewWithoutNeedingDisplay]; unsigned i, count = [scrollbars count]; @@ -325,17 +282,8 @@ - (void)openWindow [self addNewTabViewItem]; - // NOTE! This flag is set once the entire text system is set up. setupDone = YES; -#if !MM_USE_EMPTY_WINDOW - BOOL statusOff = [[NSUserDefaults standardUserDefaults] - boolForKey:MMStatuslineOffKey]; - [statusTextField setHidden:statusOff]; - [statusSeparator setHidden:statusOff]; - [self flashStatusText:@"Welcome to MacVim!"]; -#endif - [self updateResizeIncrements]; [self resizeWindowToFit:self]; [[self window] makeKeyAndOrderFront:self]; @@ -422,37 +370,6 @@ - (void)setTextDimensionsWithRows:(int)rows columns:(int)cols shouldUpdateWindowSize = YES; } -- (void)setStatusText:(NSString *)text -{ -#if !MM_USE_EMPTY_WINDOW - if (text) - [statusTextField setStringValue:text]; - else - [statusTextField setStringValue:@""]; -#endif -} - -- (void)flashStatusText:(NSString *)text -{ -#if !MM_USE_EMPTY_WINDOW - if ([[NSUserDefaults standardUserDefaults] boolForKey:MMStatuslineOffKey]) - return; - - [self setStatusText:text]; - - if (statusTimer) { - [statusTimer invalidate]; - [statusTimer release]; - } - - statusTimer = [[NSTimer scheduledTimerWithTimeInterval:3 - target:self - selector:@selector(statusTimerFired:) - userInfo:nil - repeats:NO] retain]; -#endif -} - - (void)createScrollbarWithIdentifier:(long)ident type:(int)type { //NSLog(@"Create scroller %d of type %d", ident, type); @@ -625,13 +542,6 @@ - (IBAction)toggleToolbar:(id)sender - (void)tabView:(NSTabView *)theTabView didSelectTabViewItem: (NSTabViewItem *)tabViewItem { -#if !MM_USE_EMPTY_WINDOW - // HACK! There seem to be a bug in NSTabView which results in the first - // responder not being set to the view of the tab item so it is done - // manually here. - //[[self window] makeFirstResponder:[tabViewItem view]]; -#endif - // HACK! The selection message should not be propagated to the VimTask if // the VimTask selected the tab (e.g. as opposed the user clicking the // tab). The delegate method has no way of knowing who initiated the @@ -750,8 +660,6 @@ - (NSRect)windowWillUseStandardFrame:(NSWindow *)win - (id)validRequestorForSendType:(NSString *)sendType returnType:(NSString *)returnType { - //NSLog(@"validRequestorForSendType:%@ returnType:%@", sendType, returnType); - id backendProxy = [vimController backendProxy]; if ((!sendType || [sendType isEqual:NSStringPboardType]) @@ -770,8 +678,6 @@ - (id)validRequestorForSendType:(NSString *)sendType - (BOOL)writeSelectionToPasteboard:(NSPasteboard *)pboard types:(NSArray *)types { - //NSLog(@"writeSelectionToPasteboard:%@ types:%@", pboard, types); - if (![types containsObject:NSStringPboardType]) return NO; @@ -946,13 +852,6 @@ - (NSTabViewItem *)addNewTabViewItem return tvi; } -- (void)statusTimerFired:(NSTimer *)timer -{ - [self setStatusText:@""]; - [statusTimer release]; - statusTimer = nil; -} - - (int)representedIndexOfTabViewItem:(NSTabViewItem *)tvi { NSArray *tabViewItems = [tabBarControl representedTabViewItems]; @@ -1029,13 +928,13 @@ - (void)placeScrollbars boolForKey:MMStatuslineOffKey]; // HACK! Find the lowest left&right vertical scrollbars, as well as the - // leftmost horizontal scrollbar. This hack continues further down. + // rightmost horizontal scrollbar. This hack continues further down. // // TODO! Can there be no more than one horizontal scrollbar? If so, the // code can be simplified. unsigned lowestLeftSbIdx = (unsigned)-1; unsigned lowestRightSbIdx = (unsigned)-1; - unsigned leftmostSbIdx = (unsigned)-1; + unsigned rightmostSbIdx = (unsigned)-1; unsigned rowMaxLeft = 0, rowMaxRight = 0, colMax = 0; unsigned i, count = [scrollbars count]; for (i = 0; i < count; ++i) { @@ -1053,7 +952,7 @@ - (void)placeScrollbars } else if ([scroller type] == MMScrollerTypeBottom && range.location >= colMax) { colMax = range.location; - leftmostSbIdx = i; + rightmostSbIdx = i; } } } @@ -1073,10 +972,10 @@ - (void)placeScrollbars if (lsbVisible) rect.origin.x += [NSScroller scrollerWidth]; - // HACK! Make sure the leftmost horizontal scrollbar covers the + // HACK! Make sure the rightmost horizontal scrollbar covers the // text view all the way to the right, otherwise it looks ugly when // the user drags the window to resize. - if (i == leftmostSbIdx) { + if (i == rightmostSbIdx) { float w = NSMaxX(textViewFrame) - NSMaxX(rect); if (w > 0) rect.size.width += w; @@ -1177,9 +1076,6 @@ - (void)placeViews [textStorage fitToSize:tsSize rows:&dim[0] columns:&dim[1]]; if (dim[0] != rows || dim[1] != cols) { - NSString *sdim = [NSString stringWithFormat:@"%dx%d", dim[1], dim[0]]; - [self flashStatusText:sdim]; - //NSLog(@"Notify Vim that text storage dimensions changed to %dx%d", // dim[0], dim[1]); NSData *data = [NSData dataWithBytes:dim length:2*sizeof(int)]; diff --git a/MacVim.h b/MacVim.h index 79fe2bb546..5808d67b2b 100644 --- a/MacVim.h +++ b/MacVim.h @@ -36,10 +36,11 @@ - (oneway void)showSavePanelForDirectory:(in bycopy NSString *)dir title:(in bycopy NSString *)title saving:(int)saving; -- (oneway void)presentDialogWithStyle:(int)style message:(NSString *)message - informativeText:(NSString *)text - buttonTitles:(NSArray *)buttonTitles - textFieldString:(NSString *)textFieldString; +- (oneway void)presentDialogWithStyle:(int)style + message:(in bycopy NSString *)message + informativeText:(in bycopy NSString *)text + buttonTitles:(in bycopy NSArray *)buttonTitles + textFieldString:(in bycopy NSString *)textFieldString; @end From 12a4710db44f43b86660490714e96345aaa0ca92 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sun, 19 Aug 2007 14:12:44 +0000 Subject: [PATCH 0137/1156] Changed key equivalents for 'next/prev error' and 'older/newer list' git-svn-id: http://macvim.googlecode.com/svn/trunk@162 96c4425d-ca35-0410-94e5-3396d5c13a8f --- gvimrc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/gvimrc b/gvimrc index 872e7eb77b..db3005b0d6 100644 --- a/gvimrc +++ b/gvimrc @@ -125,10 +125,10 @@ menukeyequiv Edit.Special\ Characters\.\.\. menukeyequiv Tools.Make menukeyequiv Tools.List\ Errors menukeyequiv Tools.List\ Messages -menukeyequiv Tools.Next\ Error -menukeyequiv Tools.Previous\ Error -menukeyequiv Tools.Older\ List -menukeyequiv Tools.Newer\ List +menukeyequiv Tools.Next\ Error +menukeyequiv Tools.Previous\ Error +menukeyequiv Tools.Older\ List +menukeyequiv Tools.Newer\ List menukeyequiv Window.Minimize menukeyequiv Window.Previous\ Tab From 3c50385282d73ca15942f6872ae81abfe72c061a Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sun, 19 Aug 2007 14:47:17 +0000 Subject: [PATCH 0138/1156] - Request/reply timeout set on root connection object - Check for unresponsive Vim processes in applicationShouldTerminate: and present alert if any are detectd - Send SIGINT to all Vim processes in applicationWillTerminate: - Started adding support for 'enc' (set MM_ENABLE_CONV in MacVim.h) - Cmd-. sends SIGINT to Vim - Use @try/@catch for starRegisterToPasteboard: calls - Removed starRegisterFromPasteboard: message git-svn-id: http://macvim.googlecode.com/svn/trunk@163 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMAppController.m | 72 +++++++++++++++++++++++++++++++++++++---- MMBackend.m | 28 +++++++++------- MMTextView.m | 18 ++++++++--- MMWindowController.m | 25 +++++++++----- MacVim.h | 13 ++++++-- gui_macvim.m | 77 +++++++++++++++++++++++++++++++++++--------- 6 files changed, 183 insertions(+), 50 deletions(-) diff --git a/MMAppController.m b/MMAppController.m index 41a90d9b8b..695edff41e 100644 --- a/MMAppController.m +++ b/MMAppController.m @@ -14,6 +14,14 @@ +// Default timeout intervals on all connections. +static NSTimeInterval MMRequestTimeout = 5; +static NSTimeInterval MMReplyTimeout = 5; + +// Timeout used when the app should terminate. +static NSTimeInterval MMTerminateTimeout = 3; + + @interface MMAppController (MMServices) - (void)openSelection:(NSPasteboard *)pboard userData:(NSString *)userData @@ -73,6 +81,8 @@ - (id)init [[NSBundle mainBundle] bundleIdentifier]]; //NSLog(@"Registering connection with name '%@'", name); if ([connection registerName:name]) { + [connection setRequestTimeout:MMRequestTimeout]; + [connection setReplyTimeout:MMReplyTimeout]; [connection setRootObject:self]; // NOTE: When the user is resizing the window the AppKit puts the @@ -188,24 +198,53 @@ - (NSApplicationTerminateReply)applicationShouldTerminate: { int reply = NSTerminateNow; BOOL modifiedBuffers = NO; + BOOL notResponding = NO; + // Go through vim controllers, checking for modified buffers. If a process + // is not responding then note this as well. unsigned i, count = [vimControllers count]; for (i = 0; i < count; ++i) { MMVimController *controller = [vimControllers objectAtIndex:i]; id proxy = [controller backendProxy]; - if (proxy && [proxy checkForModifiedBuffers]) { - modifiedBuffers = YES; - break; + NSConnection *connection = [proxy connectionForProxy]; + if (connection) { + NSTimeInterval req = [connection requestTimeout]; + NSTimeInterval rep = [connection replyTimeout]; + [connection setRequestTimeout:MMTerminateTimeout]; + [connection setReplyTimeout:MMTerminateTimeout]; + + @try { + if ([proxy checkForModifiedBuffers]) + modifiedBuffers = YES; + } + @catch (NSException *e) { + NSLog(@"WARNING: Got exception while waiting for " + "checkForModifiedBuffers: \"%@\"", e); + notResponding = YES; + } + @finally { + [connection setRequestTimeout:req]; + [connection setReplyTimeout:rep]; + if (modifiedBuffers || notResponding) + break; + } } } - if (modifiedBuffers) { + if (modifiedBuffers || notResponding) { NSAlert *alert = [[NSAlert alloc] init]; [alert addButtonWithTitle:@"Quit"]; [alert addButtonWithTitle:@"Cancel"]; - [alert setMessageText:@"Quit without saving?"]; - [alert setInformativeText:@"There are modified buffers, " - " if you quit now all changes will be lost. Quit anyway?"]; + if (modifiedBuffers) { + [alert setMessageText:@"Quit without saving?"]; + [alert setInformativeText:@"There are modified buffers, " + "if you quit now all changes will be lost. Quit anyway?"]; + } else { + [alert setMessageText:@"Force Quit?"]; + [alert setInformativeText:@"At least one Vim process is not " + "responding, if you quit now any changes you have made " + "will be lost. Quit anyway?"]; + } [alert setAlertStyle:NSWarningAlertStyle]; if ([alert runModal] != NSAlertFirstButtonReturn) { @@ -220,6 +259,23 @@ - (NSApplicationTerminateReply)applicationShouldTerminate: - (void)applicationWillTerminate:(NSNotification *)aNotification { + // Send a SIGINT to all running Vim processes, so that they are sure to + // receive the connectionDidDie: notification (a process has to checking + // the run-loop for this to happen). + unsigned i, count = [vimControllers count]; + for (i = 0; i < count; ++i) { + MMVimController *controller = [vimControllers objectAtIndex:i]; + int pid = [controller pid]; + if (pid > 0) + kill(pid, SIGINT); + + id proxy = [controller backendProxy]; + NSConnection *connection = [proxy connectionForProxy]; + if (connection) { + [connection invalidate]; + } + } + // NOTE! Is this a correct way of releasing the MMAppController? [NSApp setDelegate:nil]; [self autorelease]; @@ -227,6 +283,8 @@ - (void)applicationWillTerminate:(NSNotification *)aNotification - (void)removeVimController:(id)controller { + //NSLog(@"%s%@", _cmd, controller); + [[controller windowController] close]; [vimControllers removeObject:controller]; diff --git a/MMBackend.m b/MMBackend.m index 250f6043a9..7b32b92e5b 100644 --- a/MMBackend.m +++ b/MMBackend.m @@ -810,15 +810,6 @@ - (BOOL)starRegisterToPasteboard:(byref NSPasteboard *)pboard return NO; } -- (BOOL)starRegisterFromPasteboard:(byref NSPasteboard *)pboard -{ - if (curbuf && !curbuf->b_p_ro) { - return YES; - } - - return NO; -} - @end // MMBackend @@ -837,12 +828,21 @@ - (void)handleMessage:(int)msgid data:(NSData *)data if (!data) return; NSString *key = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; - char_u *chars = (char_u*)[key UTF8String]; + char_u *str = (char_u*)[key UTF8String]; int i, len = [key lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; +#if MM_ENABLE_CONV + char_u *conv_str = NULL; + if (input_conv.vc_type != CONV_NONE) { + conv_str = string_convert(&input_conv, str, &len); + if (conv_str) + str = conv_str; + } +#endif + for (i = 0; i < len; ++i) { - add_to_input_buf(chars+i, 1); - if (CSI == chars[i]) { + add_to_input_buf(str+i, 1); + if (CSI == str[i]) { // NOTE: If the converted string contains the byte CSI, then it // must be followed by the bytes KS_EXTRA, KE_CSI or things // won't work. @@ -851,6 +851,10 @@ - (void)handleMessage:(int)msgid data:(NSData *)data } } +#if MM_ENABLE_CONV + if (conv_str) + vim_free(conv_str); +#endif [key release]; } else if (KeyDownMsgID == msgid || CmdKeyMsgID == msgid) { if (!data) return; diff --git a/MMTextView.m b/MMTextView.m index 69b2f79ef0..fb9b363323 100644 --- a/MMTextView.m +++ b/MMTextView.m @@ -118,16 +118,24 @@ - (BOOL)performKeyEquivalent:(NSEvent *)event //NSLog(@"%s%@", _cmd, event); - NSMutableData *data = [NSMutableData data]; NSString *string = [event charactersIgnoringModifiers]; int flags = [event modifierFlags]; int len = [string lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; - [data appendBytes:&flags length:sizeof(int)]; - [data appendBytes:&len length:sizeof(int)]; - [data appendBytes:[string UTF8String] length:len]; + if (len > 0 && [string characterAtIndex:0] == '.') { + // HACK! Intercept Cmd-. and send SIGINT to Vim. + int pid = [[self vimController] pid]; + if (pid > 0) + kill(pid, SIGINT); + } else { + NSMutableData *data = [NSMutableData data]; - [[self vimController] sendMessage:CmdKeyMsgID data:data wait:NO]; + [data appendBytes:&flags length:sizeof(int)]; + [data appendBytes:&len length:sizeof(int)]; + [data appendBytes:[string UTF8String] length:len]; + + [[self vimController] sendMessage:CmdKeyMsgID data:data wait:NO]; + } return YES; } diff --git a/MMWindowController.m b/MMWindowController.m index a42a32be92..46bf965a84 100644 --- a/MMWindowController.m +++ b/MMWindowController.m @@ -662,13 +662,13 @@ - (id)validRequestorForSendType:(NSString *)sendType { id backendProxy = [vimController backendProxy]; - if ((!sendType || [sendType isEqual:NSStringPboardType]) - && (!returnType || [returnType isEqual:NSStringPboardType])) - { - if ((!sendType || [backendProxy starRegisterToPasteboard:nil]) && - (!returnType || [backendProxy starRegisterFromPasteboard:nil])) - { - return self; + if (backendProxy && [sendType isEqual:NSStringPboardType]) { + @try { + if ([backendProxy starRegisterToPasteboard:nil]) + return self; + } + @catch (NSException *e) { + NSLog(@"WARNING: Caught exception in %s: \"%@\"", _cmd, e); } } @@ -682,7 +682,16 @@ - (BOOL)writeSelectionToPasteboard:(NSPasteboard *)pboard return NO; id backendProxy = [vimController backendProxy]; - return [backendProxy starRegisterToPasteboard:pboard]; + if (backendProxy) { + @try { + return [backendProxy starRegisterToPasteboard:pboard]; + } + @catch (NSException *e) { + NSLog(@"WARNING: Caught exception in %s: \"%@\"", _cmd, e); + } + } + + return NO; } @end // MMWindowController diff --git a/MacVim.h b/MacVim.h index 5808d67b2b..334c6e710a 100644 --- a/MacVim.h +++ b/MacVim.h @@ -11,20 +11,29 @@ #import +// Enable to use experimental 'enc' support. +#define MM_ENABLE_CONV 0 + // // This is the protocol MMBackend implements. // // Only processInput:data: is allowed to cause state changes in Vim; all other -// messages should only read the Vim state. +// messages should only read the Vim state. (Note that setDialogReturn: is an +// exception to this rule; there really is no other way to deal with dialogs +// since they work with callbacks, so we cannot wait for them to return.) +// +// Be careful with messages with return type other than 'oneway void' -- there +// is a reply timeout set in MMAppController, if a message fails to get a +// response within the given timeout an exception will be thrown. Use +// @try/@catch/@finally to deal with timeouts. // @protocol MMBackendProtocol - (oneway void)processInput:(int)msgid data:(in NSData *)data; - (BOOL)checkForModifiedBuffers; - (oneway void)setDialogReturn:(in bycopy id)obj; - (BOOL)starRegisterToPasteboard:(byref NSPasteboard *)pboard; -- (BOOL)starRegisterFromPasteboard:(byref NSPasteboard *)pboard; @end diff --git a/gui_macvim.m b/gui_macvim.m index 8056e9c4a0..d7f6414ac9 100644 --- a/gui_macvim.m +++ b/gui_macvim.m @@ -305,6 +305,15 @@ BOOL outPad = NO; MMBackend *backend = [MMBackend sharedInstance]; static char ZeroWidthSpace[] = { 0xe2, 0x80, 0x8b }; +#if MM_ENABLE_CONV + char_u *conv_str = NULL; + + if (output_conv.vc_type != CONV_NONE) { + char_u *conv_str = string_convert(&output_conv, s, &len); + if (conv_str) + s = conv_str; + } +#endif for (i = 0; i < len; i += cl) { c = utf_ptr2char(s + i); @@ -375,6 +384,11 @@ row:row column:endcol-1 flags:flags]; } +#if MM_ENABLE_CONV + if (conv_str) + vim_free(conv_str); +#endif + return endcol - col; #else // This will fail abysmally when wide or composing characters are used. @@ -475,9 +489,9 @@ clip_mch_request_selection(VimClipboard *cbd) { NSPasteboard *pb = [NSPasteboard generalPasteboard]; - NSString *type = [pb availableTypeFromArray: + NSString *pbType = [pb availableTypeFromArray: [NSArray arrayWithObject:NSStringPboardType]]; - if (type) { + if (pbType) { NSMutableString *string = [[pb stringForType:NSStringPboardType] mutableCopy]; @@ -496,9 +510,24 @@ int type = MCHAR; if (0 < n || NSNotFound != [string rangeOfString:@"\n"].location) type = MLINE; - - const char *utf8chars = [string UTF8String]; - clip_yank_selection(type, (char_u*)utf8chars, strlen(utf8chars), cbd); + + char_u *str = (char_u*)[string UTF8String]; + int len = [string lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; + +#if MM_ENABLE_CONV + if (input_conv.vc_type != CONV_NONE) { + NSLog(@"Converting from: '%@'", string); + char_u *conv_str = string_convert(&input_conv, str, &len); + if (conv_str) { + NSLog(@" to: '%s'", conv_str); + clip_yank_selection(type, conv_str, len, cbd); + vim_free(conv_str); + return; + } + } +#endif + + clip_yank_selection(type, str, len, cbd); } } @@ -515,19 +544,35 @@ cbd->owned = FALSE; // Get the text to put on the pasteboard. - long_u len = 0; char_u *str = 0; - int type = clip_convert_selection(&str, &len, cbd); + long_u llen = 0; char_u *str = 0; + int type = clip_convert_selection(&str, &llen, cbd); if (type < 0) return; - - NSString *string = [[NSString alloc] initWithBytes:str length:len - encoding:NSUTF8StringEncoding]; - - NSPasteboard *pb = [NSPasteboard generalPasteboard]; - [pb declareTypes:[NSArray arrayWithObject:NSStringPboardType] owner:nil]; - [pb setString:string forType:NSStringPboardType]; - - [string release]; + + // TODO: Avoid overflow. + int len = (int)llen; +#if MM_ENABLE_CONV + if (output_conv.vc_type != CONV_NONE) { + char_u *conv_str = string_convert(&output_conv, str, &len); + if (conv_str) { + vim_free(str); + str = conv_str; + } + } +#endif + + if (len > 0) { + NSString *string = [[NSString alloc] + initWithBytes:str length:len encoding:NSUTF8StringEncoding]; + + NSPasteboard *pb = [NSPasteboard generalPasteboard]; + [pb declareTypes:[NSArray arrayWithObject:NSStringPboardType] + owner:nil]; + [pb setString:string forType:NSStringPboardType]; + + [string release]; + } + vim_free(str); } From 6bc27d1ddeb17cc7e60ad82850ad13be4f3fd44c Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sun, 19 Aug 2007 14:49:52 +0000 Subject: [PATCH 0139/1156] git-svn-id: http://macvim.googlecode.com/svn/trunk@164 96c4425d-ca35-0410-94e5-3396d5c13a8f --- TODO | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/TODO b/TODO index 186a169811..00e02aedab 100644 --- a/TODO +++ b/TODO @@ -1,6 +1,10 @@ Active: -- scrolling when mouse is over scrollbar doesn't work +- Press Cmd-n multiple times and quickly press Cmd-q; sometimes two or more + instance of MacVim opens up +- hide toolbar, open new tab, show toolbar: baseline sepearator still visible + (seems like a drawing bug in PSMTabBarControl) +- file modified outside vim dialog sometimes only appear after pressing a key - let user choose file encoding and format in open/save dialogs - view menu option to show/hide gui status line - autosave settings ? @@ -49,6 +53,7 @@ Active: Pending: +- scrolling when mouse is over scrollbar doesn't work - gui dialogs (FEAT_GUI_DIALOG) - no warning when buffer modified outside vim (implement gui_mch_dialog()) - call gui_focus_change() when appropriate @@ -63,9 +68,6 @@ Pending: 2007-08-05 13:25:01.156 MacVim[223] Exception raised during posting of notification. Ignored. exception: *** -[NSThemeFrame frameDidChange:]: selector not recognized [self = 0x3baa30] 2007-08-05 13:25:01.246 MacVim[223] *** -[NSThemeFrame frameDidChange:]: selector not recognized [self = 0x3baa30] 2007-08-05 13:25:01.247 MacVim[223] Exception raised during posting of notification. Ignored. exception: *** -[NSThemeFrame frameDidChange:]: selector not recognized [self = 0x3baa30] -- hide baseline separator when tabbar is visible (and make sure clicking the - hide/show toolbar button in the top right of the corner does not show it - again) - toogle toolbar off, maximize window, toolbar on -> text view under toolbar - clicking pill button does not update 'guioptions' - detect Cmd-. (and Ctrl-C) for interrupt @@ -85,6 +87,9 @@ Pending: Done: +- hide baseline separator when tabbar is visible (and make sure clicking the + hide/show toolbar button in the top right of the corner does not show it + again) - toolbar drawing bug - Cmd-zoom -> no input received, drawing broken - scrollbars not positioned over resize box From ed50e5f5873863610112b0a0e9833c8414d8960f Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Mon, 20 Aug 2007 17:34:04 +0000 Subject: [PATCH 0140/1156] git-svn-id: http://macvim.googlecode.com/svn/trunk@166 96c4425d-ca35-0410-94e5-3396d5c13a8f --- TODO | 1 + 1 file changed, 1 insertion(+) diff --git a/TODO b/TODO index 00e02aedab..40407f48c4 100644 --- a/TODO +++ b/TODO @@ -1,5 +1,6 @@ Active: +- Terminal support. :!bash -> no cursor, arrow keys mucks up display - Press Cmd-n multiple times and quickly press Cmd-q; sometimes two or more instance of MacVim opens up - hide toolbar, open new tab, show toolbar: baseline sepearator still visible From 0592ddc98fdde53f4e45b0852d1f43af70392937 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Mon, 20 Aug 2007 17:53:44 +0000 Subject: [PATCH 0141/1156] Showing arrow cursor instead of ibeam cursor git-svn-id: http://macvim.googlecode.com/svn/trunk@167 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMTextView.m | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/MMTextView.m b/MMTextView.m index fb9b363323..2fda921e38 100644 --- a/MMTextView.m +++ b/MMTextView.m @@ -387,6 +387,11 @@ - (void)changeFont:(id)sender } } +- (void)resetCursorRects +{ + // No need to set up cursor rects...Vim is in control of cursor changes. +} + @end // MMTextView From 52d0bf3706af9c18851971ccad02664c9d0fb0ad Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Tue, 21 Aug 2007 18:55:53 +0000 Subject: [PATCH 0142/1156] - Added processInputAndData to process multiple input in bulk\ - By default request timeout is 0 (MM_NO_REQUEST_TIMEOUT); this is to try to combat the 'beachball'. This has the side-effect that deliveries of messages to Vim are not guaranteed. - All backendProxy communication is inside @try/@catch git-svn-id: http://macvim.googlecode.com/svn/trunk@168 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMBackend.m | 28 +++++++++++++++ MMVimController.m | 83 ++++++++++++++++++++++++++++++++++++-------- MMWindowController.m | 44 +++++++++++------------ MacVim.h | 1 + 4 files changed, 120 insertions(+), 36 deletions(-) diff --git a/MMBackend.m b/MMBackend.m index 7b32b92e5b..056f51abe3 100644 --- a/MMBackend.m +++ b/MMBackend.m @@ -766,6 +766,34 @@ - (oneway void)processInput:(int)msgid data:(in NSData *)data inputReceived = YES; } +- (oneway void)processInputAndData:(in NSArray *)messages +{ + unsigned i, count = [messages count]; + if (count % 2) { + NSLog(@"WARNING: [messages count] is odd in %s", _cmd); + return; + } + + [lastFlushDate release]; + lastFlushDate = [[NSDate date] retain]; + + for (i = 0; i < count; i += 2) { + int msgid = [[messages objectAtIndex:i] intValue]; + id data = [messages objectAtIndex:i+1]; + if ([data isEqual:[NSNull null]]) + data = nil; + + [self handleMessage:msgid data:data]; + } + + // HACK! A focus message might get lost, but whenever we get here the GUI + // is in focus. + if (!gui.in_focus) + gui_focus_change(TRUE); + + inputReceived = YES; +} + - (BOOL)checkForModifiedBuffers { buf_T *buf; diff --git a/MMVimController.m b/MMVimController.m index eab1848e17..c176a6db99 100644 --- a/MMVimController.m +++ b/MMVimController.m @@ -15,9 +15,21 @@ #import "MMTextStorage.h" +#define MM_NO_REQUEST_TIMEOUT 1 + + static NSString *MMDefaultToolbarImageName = @"Attention"; static int MMAlertTextFieldHeight = 22; +#if MM_NO_REQUEST_TIMEOUT +// NOTE: By default a message sent to the backend will be dropped if it cannot +// be delivered instantly; otherwise there is a possibility that MacVim will +// 'beachball' while waiting to deliver DO messages to an unresponsive Vim +// process. This means that you cannot rely on any message sent with +// sendMessage:: to actually reach Vim. +static NSTimeInterval MMBackendProxyRequestTimeout = 0; +#endif + @interface MMAlert : NSAlert { NSTextField *textField; @@ -98,10 +110,18 @@ - (id)initWithBackend:(id)backend pid:(int)processIdentifier pid = processIdentifier; NSConnection *connection = [backendProxy connectionForProxy]; + +#if MM_NO_REQUEST_TIMEOUT + // TODO: Check that this will not set the timeout for the root proxy + // (in MMAppController). + [connection setRequestTimeout:MMBackendProxyRequestTimeout]; +#endif + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(connectionDidDie:) name:NSConnectionDidDieNotification object:connection]; + NSWindow *win = [windowController window]; [[NSNotificationCenter defaultCenter] @@ -157,6 +177,15 @@ - (void)sendMessage:(int)msgid data:(NSData *)data wait:(BOOL)wait return; } +#if MM_NO_REQUEST_TIMEOUT + @try { + [backendProxy processInput:msgid data:data]; + } + @catch (NSException *e) { + //NSLog(@"%@ %s Exception caught during DO call: %@", + // [self className], _cmd, e); + } +#else if (wait) { @try { [backendProxy processInput:msgid data:data]; @@ -184,6 +213,7 @@ - (void)sendMessage:(int)msgid data:(NSData *)data wait:(BOOL)wait } } } +#endif } - (id)backendProxy @@ -334,20 +364,34 @@ - (oneway void)processCommandQueue:(in NSArray *)queue inProcessCommandQueue = NO; - count = [sendQueue count]; - if (count > 0) { - if (count % 2 == 0) { - //NSLog(@"%s Sending %d queued messages", _cmd, count/2); - - for (i = 0; i < count; i += 2) { - int msgid = [[sendQueue objectAtIndex:i] intValue]; - id data = [sendQueue objectAtIndex:i+1]; - if ([data isEqual:[NSNull null]]) - data = nil; - - [backendProxy processInput:msgid data:data]; + if ([sendQueue count] > 0) { +#if MM_NO_REQUEST_TIMEOUT + @try { + [backendProxy processInputAndData:sendQueue]; + } + @catch (NSException *e) { + // Connection timed out, just ignore this. + //NSLog(@"WARNING! Connection timed out in %s", _cmd); + } +#else + // Do not wait for the message to be sent, i.e. drop the message if it + // can't be delivered immediately. + NSConnection *connection = [backendProxy connectionForProxy]; + if (connection) { + NSTimeInterval req = [connection requestTimeout]; + [connection setRequestTimeout:0]; + @try { + [backendProxy processInputAndData:sendQueue]; + } + @catch (NSException *e) { + // Connection timed out, just ignore this. + //NSLog(@"WARNING! Connection timed out in %s", _cmd); + } + @finally { + [connection setRequestTimeout:req]; } } +#endif [sendQueue removeAllObjects]; } @@ -764,7 +808,12 @@ - (void)savePanelDidEnd:(NSSavePanel *)panel code:(int)code context:(void *)context { NSString *string = (code == NSOKButton) ? [panel filename] : nil; - [backendProxy setDialogReturn:string]; + @try { + [backendProxy setDialogReturn:string]; + } + @catch (NSException *e) { + NSLog(@"Exception caught in %s %@", _cmd, e); + } } - (void)alertDidEnd:(MMAlert *)alert code:(int)code context:(void *)context @@ -780,7 +829,12 @@ - (void)alertDidEnd:(MMAlert *)alert code:(int)code context:(void *)context ret = [NSArray arrayWithObject:[NSNumber numberWithInt:code]]; } - [backendProxy setDialogReturn:ret]; + @try { + [backendProxy setDialogReturn:ret]; + } + @catch (NSException *e) { + NSLog(@"Exception caught in %s %@", _cmd, e); + } } - (NSMenuItem *)menuItemForTag:(int)tag @@ -1072,6 +1126,7 @@ - (void)dealloc - (void)setTextFieldString:(NSString *)textFieldString { + [textField release]; textField = [[NSTextField alloc] init]; [textField setStringValue:textFieldString]; } diff --git a/MMWindowController.m b/MMWindowController.m index 46bf965a84..efff40fe10 100644 --- a/MMWindowController.m +++ b/MMWindowController.m @@ -66,6 +66,7 @@ - (BOOL)rightScrollbarVisible; - (void)placeScrollbars; - (void)scroll:(id)sender; - (void)placeViews; +- (BOOL)askBackendForStarRegister:(NSPasteboard *)pb; @end @@ -660,17 +661,9 @@ - (NSRect)windowWillUseStandardFrame:(NSWindow *)win - (id)validRequestorForSendType:(NSString *)sendType returnType:(NSString *)returnType { - id backendProxy = [vimController backendProxy]; - - if (backendProxy && [sendType isEqual:NSStringPboardType]) { - @try { - if ([backendProxy starRegisterToPasteboard:nil]) - return self; - } - @catch (NSException *e) { - NSLog(@"WARNING: Caught exception in %s: \"%@\"", _cmd, e); - } - } + if ([sendType isEqual:NSStringPboardType] + && [self askBackendForStarRegister:nil]) + return self; return [super validRequestorForSendType:sendType returnType:returnType]; } @@ -681,17 +674,7 @@ - (BOOL)writeSelectionToPasteboard:(NSPasteboard *)pboard if (![types containsObject:NSStringPboardType]) return NO; - id backendProxy = [vimController backendProxy]; - if (backendProxy) { - @try { - return [backendProxy starRegisterToPasteboard:pboard]; - } - @catch (NSException *e) { - NSLog(@"WARNING: Caught exception in %s: \"%@\"", _cmd, e); - } - } - - return NO; + return [self askBackendForStarRegister:pboard]; } @end // MMWindowController @@ -1101,6 +1084,23 @@ - (void)placeViews [self placeScrollbars]; } +- (BOOL)askBackendForStarRegister:(NSPasteboard *)pb +{ + BOOL reply = NO; + id backendProxy = [vimController backendProxy]; + + if (backendProxy) { + @try { + reply = [backendProxy starRegisterToPasteboard:pb]; + } + @catch (NSException *e) { + NSLog(@"WARNING: Caught exception in %s: \"%@\"", _cmd, e); + } + } + + return reply; +} + @end // MMWindowController (Private) diff --git a/MacVim.h b/MacVim.h index 334c6e710a..6c6bafa9ea 100644 --- a/MacVim.h +++ b/MacVim.h @@ -31,6 +31,7 @@ // @protocol MMBackendProtocol - (oneway void)processInput:(int)msgid data:(in NSData *)data; +- (oneway void)processInputAndData:(in NSArray *)messages; - (BOOL)checkForModifiedBuffers; - (oneway void)setDialogReturn:(in bycopy id)obj; - (BOOL)starRegisterToPasteboard:(byref NSPasteboard *)pboard; From c879f094008c9b4729864bd227a88f6bb410ee95 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Tue, 21 Aug 2007 18:59:42 +0000 Subject: [PATCH 0143/1156] Increased flush timeout constant git-svn-id: http://macvim.googlecode.com/svn/trunk@169 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMBackend.m | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/MMBackend.m b/MMBackend.m index 056f51abe3..30f5ded0a2 100644 --- a/MMBackend.m +++ b/MMBackend.m @@ -13,7 +13,9 @@ -static float MMFlushTimeoutInterval = 0.1f; +// This constant controls how often the command queue may be flushed. (The +// unit is seconds.) +static float MMFlushTimeoutInterval = 0.5f; // TODO: Move to separate file. From 3b4c40a98ca972fd3189a76de9fe7e94ad3b71b6 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Tue, 21 Aug 2007 19:11:33 +0000 Subject: [PATCH 0144/1156] Respond to 'shouldSelectTab...', return NO, and let Vim decide whether or not to select the tab. This fixes a tab selection bug (tab selection disallowed after q:). git-svn-id: http://macvim.googlecode.com/svn/trunk@170 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMWindowController.m | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/MMWindowController.m b/MMWindowController.m index efff40fe10..b8f4d19951 100644 --- a/MMWindowController.m +++ b/MMWindowController.m @@ -540,9 +540,14 @@ - (IBAction)toggleToolbar:(id)sender // -- PSMTabBarControl delegate ---------------------------------------------- -- (void)tabView:(NSTabView *)theTabView didSelectTabViewItem: +- (BOOL)tabView:(NSTabView *)theTabView shouldSelectTabViewItem: (NSTabViewItem *)tabViewItem { + // NOTE: It would be reasonable to think that 'shouldSelect...' implies + // that this message only gets sent when the user clicks the tab. + // Unfortunately it is not so, which is why we need the + // 'vimTaskSelectedTab' flag. + // // HACK! The selection message should not be propagated to the VimTask if // the VimTask selected the tab (e.g. as opposed the user clicking the // tab). The delegate method has no way of knowing who initiated the @@ -555,6 +560,10 @@ - (void)tabView:(NSTabView *)theTabView didSelectTabViewItem: [vimController sendMessage:SelectTabMsgID data:data wait:YES]; } } + + // Unless Vim selected the tab, return NO, and let Vim decide if the tab + // should get selected or not. + return vimTaskSelectedTab; } - (BOOL)tabView:(NSTabView *)theTabView shouldCloseTabViewItem: From ee148b2a1f753eb0307a1a67747c537d0876d9a7 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Wed, 22 Aug 2007 08:01:24 +0000 Subject: [PATCH 0145/1156] gui_mch_update() now checks the run-loop git-svn-id: http://macvim.googlecode.com/svn/trunk@171 96c4425d-ca35-0410-94e5-3396d5c13a8f --- gui_macvim.m | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/gui_macvim.m b/gui_macvim.m index d7f6414ac9..fc11ac8a42 100644 --- a/gui_macvim.m +++ b/gui_macvim.m @@ -133,7 +133,9 @@ void gui_mch_update(void) { - [[MMBackend sharedInstance] flushQueue:NO]; + // TODO: Ensure that this causes no problems. + [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode + beforeDate:[NSDate distantPast]]; } From 70f011e901377dfc00797e320cb471cf85a4bde3 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Wed, 22 Aug 2007 08:03:31 +0000 Subject: [PATCH 0146/1156] Updated MessageStrings[] git-svn-id: http://macvim.googlecode.com/svn/trunk@172 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MacVim.m | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/MacVim.m b/MacVim.m index 93539efebc..55e32d5cf5 100644 --- a/MacVim.m +++ b/MacVim.m @@ -12,7 +12,7 @@ char *MessageStrings[] = { - "BadMsgID", + "INVALID MESSAGE ID", "CheckinMsgID", "ConnectedMsgID", "KillTaskMsgID", @@ -43,6 +43,7 @@ "EnableMenuItemMsgID", "ExecuteMenuMsgID", "ShowToolbarMsgID", + "ToggleToolbarMsgID", "CreateScrollbarMsgID", "DestroyScrollbarMsgID", "ShowScrollbarMsgID", From 6d5cdb9be58adde024eb4ef6a2b1dce2be51f2b9 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Wed, 22 Aug 2007 08:04:04 +0000 Subject: [PATCH 0147/1156] Put @try/@catch around DO calls git-svn-id: http://macvim.googlecode.com/svn/trunk@173 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMBackend.m | 91 ++++++++++++++++++++++++++++++++++------------------- 1 file changed, 58 insertions(+), 33 deletions(-) diff --git a/MMBackend.m b/MMBackend.m index 30f5ded0a2..a0a88e6320 100644 --- a/MMBackend.m +++ b/MMBackend.m @@ -13,9 +13,11 @@ -// This constant controls how often the command queue may be flushed. (The -// unit is seconds.) -static float MMFlushTimeoutInterval = 0.5f; +// This constant controls how often the command queue may be flushed. If it is +// too small the app might feel unresponsive; if it is too large there might be +// long periods without the screen updating (e.g. when sourcing a large session +// file). (The unit is seconds.) +static float MMFlushTimeoutInterval = 0.1f; // TODO: Move to separate file. @@ -163,8 +165,15 @@ - (BOOL)checkin name:NSConnectionDidDieNotification object:connection]; int pid = [[NSProcessInfo processInfo] processIdentifier]; - frontendProxy = [(NSDistantObject*)[proxy connectBackend:self - pid:pid] retain]; + + @try { + frontendProxy = [(NSDistantObject*)[proxy connectBackend:self + pid:pid] retain]; + } + @catch (NSException *e) { + NSLog(@"Exception caught when trying to connect backend: \"%@\"", e); + } + if (frontendProxy) { [frontendProxy setProtocolForProxy:@protocol(MMAppProtocol)]; } @@ -270,7 +279,13 @@ - (void)flushQueue:(BOOL)force // TODO: Come up with a better way to handle the insertion point. [self updateInsertionPoint]; - [frontendProxy processCommandQueue:queue]; + @try { + [frontendProxy processCommandQueue:queue]; + } + @catch (NSException *e) { + NSLog(@"Exception caught when processing command queue: \"%@\"", e); + } + [queue removeAllObjects]; [lastFlushDate release]; @@ -383,24 +398,29 @@ - (char *)browseForFileInDirectory:(char *)dir title:(char *)title //NSLog(@"browseForFileInDirectory:%s title:%s saving:%d", dir, title, // saving); + char_u *s = NULL; NSString *ds = dir ? [NSString stringWithCString:dir encoding:NSUTF8StringEncoding] : nil; NSString *ts = title ? [NSString stringWithCString:title encoding:NSUTF8StringEncoding] : nil; - [frontendProxy showSavePanelForDirectory:ds title:ts saving:saving]; + @try { + [frontendProxy showSavePanelForDirectory:ds title:ts saving:saving]; - // Wait until a reply is sent from MMVimController. - [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode - beforeDate:[NSDate distantFuture]]; + // Wait until a reply is sent from MMVimController. + [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode + beforeDate:[NSDate distantFuture]]; - char_u *s = NULL; - if (dialogReturn && [dialogReturn isKindOfClass:[NSString class]]) { - s = vim_strsave((char_u*)[dialogReturn UTF8String]); - } + if (dialogReturn && [dialogReturn isKindOfClass:[NSString class]]) { + s = vim_strsave((char_u*)[dialogReturn UTF8String]); + } - [dialogReturn release]; dialogReturn = nil; + [dialogReturn release]; dialogReturn = nil; + } + @catch (NSException *e) { + NSLog(@"Exception caught when showing save panel: \"%@\"", e); + } return (char *)s; } @@ -421,6 +441,7 @@ - (oneway void)setDialogReturn:(in bycopy id)obj - (int)presentDialogWithType:(int)type title:(char *)title message:(char *)msg buttons:(char *)btns textField:(char *)txtfield { + int retval = 0; NSString *message = nil, *text = nil, *textFieldString = nil; NSArray *buttons = nil; int style = NSInformationalAlertStyle; @@ -454,26 +475,30 @@ - (int)presentDialogWithType:(int)type title:(char *)title message:(char *)msg if (txtfield) textFieldString = [NSString stringWithUTF8String:txtfield]; - [frontendProxy presentDialogWithStyle:style message:message - informativeText:text buttonTitles:buttons - textFieldString:textFieldString]; - - // Wait until a reply is sent from MMVimController. - [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode - beforeDate:[NSDate distantFuture]]; - - int retval = 0; - if (dialogReturn && [dialogReturn isKindOfClass:[NSArray class]] - && [dialogReturn count]) { - retval = [[dialogReturn objectAtIndex:0] intValue]; - if (txtfield && [dialogReturn count] > 1) { - NSString *retString = [dialogReturn objectAtIndex:1]; - vim_strncpy((char_u*)txtfield, (char_u*)[retString UTF8String], - IOSIZE - 1); + @try { + [frontendProxy presentDialogWithStyle:style message:message + informativeText:text buttonTitles:buttons + textFieldString:textFieldString]; + + // Wait until a reply is sent from MMVimController. + [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode + beforeDate:[NSDate distantFuture]]; + + if (dialogReturn && [dialogReturn isKindOfClass:[NSArray class]] + && [dialogReturn count]) { + retval = [[dialogReturn objectAtIndex:0] intValue]; + if (txtfield && [dialogReturn count] > 1) { + NSString *retString = [dialogReturn objectAtIndex:1]; + vim_strncpy((char_u*)txtfield, (char_u*)[retString UTF8String], + IOSIZE - 1); + } } - } - [dialogReturn release]; dialogReturn = nil; + [dialogReturn release]; dialogReturn = nil; + } + @catch (NSException *e) { + NSLog(@"Exception caught while showing alert dialog: \"%@\"", e); + } return retval; } From 142bbbf4883b93169e21ed3346b396a1e034ce8c Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Wed, 22 Aug 2007 08:06:41 +0000 Subject: [PATCH 0148/1156] git-svn-id: http://macvim.googlecode.com/svn/trunk@174 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMVimController.m | 3 +++ 1 file changed, 3 insertions(+) diff --git a/MMVimController.m b/MMVimController.m index c176a6db99..b657c666bc 100644 --- a/MMVimController.m +++ b/MMVimController.m @@ -165,6 +165,9 @@ - (int)pid - (void)sendMessage:(int)msgid data:(NSData *)data wait:(BOOL)wait { + //NSLog(@"sendMessage:%s (isInitialized=%d inProcessCommandQueue=%d)", + // MessageStrings[msgid], isInitialized, inProcessCommandQueue); + if (!isInitialized) return; if (inProcessCommandQueue) { From 6a500c45ba234eda04a527dc093ce89cf442ddb3 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Wed, 22 Aug 2007 15:56:31 +0000 Subject: [PATCH 0149/1156] - Ctrl-C is passed on to Vim and handled there (does not send SIGINT) - Cmd-. no longer sends SIGINT git-svn-id: http://macvim.googlecode.com/svn/trunk@175 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMBackend.m | 6 ++++++ MMTextView.m | 25 +++++-------------------- 2 files changed, 11 insertions(+), 20 deletions(-) diff --git a/MMBackend.m b/MMBackend.m index a0a88e6320..64e9a42186 100644 --- a/MMBackend.m +++ b/MMBackend.m @@ -1274,6 +1274,12 @@ - (void)handleKeyDown:(NSString *)key modifiers:(int)mods //NSLog(@"non-special: %@ (hex=%x, mods=%d)", key, // [key characterAtIndex:0], mods); + if (length == 1 && ((c == Ctrl_C && ctrl_c_interrupts) + || (c == intr_char && intr_char != Ctrl_C))) { + trash_input_buf(); + got_int = TRUE; + } + // HACK! In most circumstances the Ctrl and Shift modifiers should be // cleared since they are already added to the key by the AppKit. // Unfortunately, the only way to deal with when to clear the modifiers diff --git a/MMTextView.m b/MMTextView.m index 2fda921e38..595fc3754c 100644 --- a/MMTextView.m +++ b/MMTextView.m @@ -121,21 +121,13 @@ - (BOOL)performKeyEquivalent:(NSEvent *)event NSString *string = [event charactersIgnoringModifiers]; int flags = [event modifierFlags]; int len = [string lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; + NSMutableData *data = [NSMutableData data]; - if (len > 0 && [string characterAtIndex:0] == '.') { - // HACK! Intercept Cmd-. and send SIGINT to Vim. - int pid = [[self vimController] pid]; - if (pid > 0) - kill(pid, SIGINT); - } else { - NSMutableData *data = [NSMutableData data]; - - [data appendBytes:&flags length:sizeof(int)]; - [data appendBytes:&len length:sizeof(int)]; - [data appendBytes:[string UTF8String] length:len]; + [data appendBytes:&flags length:sizeof(int)]; + [data appendBytes:&len length:sizeof(int)]; + [data appendBytes:[string UTF8String] length:len]; - [[self vimController] sendMessage:CmdKeyMsgID data:data wait:NO]; - } + [[self vimController] sendMessage:CmdKeyMsgID data:data wait:NO]; return YES; } @@ -473,13 +465,6 @@ - (void)dispatchKeyEvent:(NSEvent *)event // handle it separately (else Ctrl-C doesn't work). static char enter[2] = { 'K', 'A' }; len = 2; bytes = enter; - } else if (c == 0x3 && imc == 0x63) { - // HACK! Intercept Ctrl-C and send SIGINT to Vim. - int pid = [[self vimController] pid]; - if (pid > 0) { - kill(pid, SIGINT); - return; - } } else { len = [chars lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; bytes = [chars UTF8String]; From 26698eed826544838af283230ce0db5f2db9d5ba Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Wed, 22 Aug 2007 16:10:46 +0000 Subject: [PATCH 0150/1156] Special color is used (underlines now have color) git-svn-id: http://macvim.googlecode.com/svn/trunk@176 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMBackend.h | 2 ++ MMBackend.m | 6 ++++++ MMTextStorage.h | 6 +++--- MMTextStorage.m | 16 +++++++++------- MMVimController.m | 4 +++- gui_macvim.m | 1 + 6 files changed, 24 insertions(+), 11 deletions(-) diff --git a/MMBackend.h b/MMBackend.h index bca3b03abf..c2fe4159ce 100644 --- a/MMBackend.h +++ b/MMBackend.h @@ -24,6 +24,7 @@ BOOL tabBarVisible; int backgroundColor; int foregroundColor; + int specialColor; int defaultBackgroundColor; int defaultForegroundColor; NSDate *lastFlushDate; @@ -34,6 +35,7 @@ - (void)setBackgroundColor:(int)color; - (void)setForegroundColor:(int)color; +- (void)setSpecialColor:(int)color; - (void)setDefaultColorsBackground:(int)bg foreground:(int)fg; - (BOOL)checkin; diff --git a/MMBackend.m b/MMBackend.m index 64e9a42186..7ba66cfbbf 100644 --- a/MMBackend.m +++ b/MMBackend.m @@ -84,6 +84,11 @@ - (void)setForegroundColor:(int)color foregroundColor = color; } +- (void)setSpecialColor:(int)color +{ + specialColor = color; +} + - (void)setDefaultColorsBackground:(int)bg foreground:(int)fg { defaultBackgroundColor = bg; @@ -239,6 +244,7 @@ - (void)replaceString:(char*)s length:(int)len row:(int)row column:(int)col [drawData appendBytes:&backgroundColor length:sizeof(int)]; [drawData appendBytes:&foregroundColor length:sizeof(int)]; + [drawData appendBytes:&specialColor length:sizeof(int)]; [drawData appendBytes:&row length:sizeof(int)]; [drawData appendBytes:&col length:sizeof(int)]; [drawData appendBytes:&flags length:sizeof(int)]; diff --git a/MMTextStorage.h b/MMTextStorage.h index dd7c765805..457e195f24 100644 --- a/MMTextStorage.h +++ b/MMTextStorage.h @@ -34,9 +34,9 @@ - (int)maxColumns; - (void)getMaxRows:(int*)rows columns:(int*)cols; - (void)setMaxRows:(int)rows columns:(int)cols; -- (void)replaceString:(NSString*)string atRow:(int)row column:(int)col - withFlags:(int)flags foregroundColor:(NSColor*)fg - backgroundColor:(NSColor*)bg; +- (void)replaceString:(NSString *)string atRow:(int)row column:(int)col + withFlags:(int)flags foregroundColor:(NSColor *)fg + backgroundColor:(NSColor *)bg specialColor:(NSColor *)sp; - (void)deleteLinesFromRow:(int)row lineCount:(int)count scrollBottom:(int)bottom left:(int)left right:(int)right color:(NSColor *)color; diff --git a/MMTextStorage.m b/MMTextStorage.m index ed29f4d87a..97ae7f2c0e 100644 --- a/MMTextStorage.m +++ b/MMTextStorage.m @@ -154,9 +154,9 @@ - (void)setMaxRows:(int)rows columns:(int)cols maxColumns = cols; } -- (void)replaceString:(NSString*)string atRow:(int)row column:(int)col - withFlags:(int)flags foregroundColor:(NSColor*)fg - backgroundColor:(NSColor*)bg +- (void)replaceString:(NSString *)string atRow:(int)row column:(int)col + withFlags:(int)flags foregroundColor:(NSColor *)fg + backgroundColor:(NSColor *)bg specialColor:(NSColor *)sp { //NSLog(@"replaceString:atRow:%d column:%d withFlags:%d", row, col, flags); [self lazyResize]; @@ -169,9 +169,9 @@ - (void)replaceString:(NSString*)string atRow:(int)row column:(int)col return; } - if (!(fg && bg)) { - NSLog(@"[%s] WARNING: background or foreground color not specified", - _cmd); + if (!(fg && bg && sp)) { + NSLog(@"[%s] WARNING: background, foreground or special color not " + "specified", _cmd); return; } @@ -183,7 +183,9 @@ - (void)replaceString:(NSString*)string atRow:(int)row column:(int)col #if !HEED_DRAW_TRANSP bg, NSBackgroundColorAttributeName, #endif - fg, NSForegroundColorAttributeName, nil]; + fg, NSForegroundColorAttributeName, + sp, NSUnderlineColorAttributeName, + nil]; [attribString setAttributes:attributes range:range]; #if HEED_DRAW_TRANSP diff --git a/MMVimController.m b/MMVimController.m index b657c666bc..4b257d56ec 100644 --- a/MMVimController.m +++ b/MMVimController.m @@ -770,6 +770,7 @@ - (void)performBatchDrawWithData:(NSData *)data } else if (ReplaceStringDrawType == type) { int bg = *((int*)bytes); bytes += sizeof(int); int fg = *((int*)bytes); bytes += sizeof(int); + int sp = *((int*)bytes); bytes += sizeof(int); int row = *((int*)bytes); bytes += sizeof(int); int col = *((int*)bytes); bytes += sizeof(int); int flags = *((int*)bytes); bytes += sizeof(int); @@ -785,7 +786,8 @@ - (void)performBatchDrawWithData:(NSData *)data atRow:row column:col withFlags:flags foregroundColor:[NSColor colorWithRgbInt:fg] - backgroundColor:[NSColor colorWithRgbInt:bg]]; + backgroundColor:[NSColor colorWithRgbInt:bg] + specialColor:[NSColor colorWithRgbInt:sp]]; [string release]; } else if (InsertLinesDrawType == type) { diff --git a/gui_macvim.m b/gui_macvim.m index fc11ac8a42..704eaa3146 100644 --- a/gui_macvim.m +++ b/gui_macvim.m @@ -1226,6 +1226,7 @@ void gui_mch_set_sp_color(guicolor_T color) { + [[MMBackend sharedInstance] setSpecialColor:color]; } From 49506e8e996801be756e086d70f03a5090590760 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Wed, 22 Aug 2007 16:22:32 +0000 Subject: [PATCH 0151/1156] Dragging text-clippings onto window now pastes text instead of trying to open file. git-svn-id: http://macvim.googlecode.com/svn/trunk@177 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMTextView.m | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/MMTextView.m b/MMTextView.m index 595fc3754c..dca2f19d0c 100644 --- a/MMTextView.m +++ b/MMTextView.m @@ -278,7 +278,17 @@ - (BOOL)performDragOperation:(id )sender { NSPasteboard *pboard = [sender draggingPasteboard]; - if ([[pboard types] containsObject:NSFilenamesPboardType]) { + if ([[pboard types] containsObject:NSStringPboardType]) { + NSString *string = [pboard stringForType:NSStringPboardType]; + NSMutableData *data = [NSMutableData data]; + int len = [string lengthOfBytesUsingEncoding:NSUTF8StringEncoding] + 1; + + [data appendBytes:&len length:sizeof(int)]; + [data appendBytes:[string UTF8String] length:len]; + + [[self vimController] sendMessage:DropStringMsgID data:data wait:NO]; + return YES; + } else if ([[pboard types] containsObject:NSFilenamesPboardType]) { NSArray *files = [pboard propertyListForType:NSFilenamesPboardType]; int i, numberOfFiles = [files count]; NSMutableData *data = [NSMutableData data]; @@ -308,16 +318,6 @@ - (BOOL)performDragOperation:(id )sender [[self vimController] sendMessage:DropFilesMsgID data:data wait:NO]; return YES; - } else if ([[pboard types] containsObject:NSStringPboardType]) { - NSString *string = [pboard stringForType:NSStringPboardType]; - NSMutableData *data = [NSMutableData data]; - int len = [string lengthOfBytesUsingEncoding:NSUTF8StringEncoding] + 1; - - [data appendBytes:&len length:sizeof(int)]; - [data appendBytes:[string UTF8String] length:len]; - - [[self vimController] sendMessage:DropStringMsgID data:data wait:NO]; - return YES; } return NO; From bbaf848f8c039c33ecf6be74afc61c1818fd66aa Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Wed, 22 Aug 2007 17:15:59 +0000 Subject: [PATCH 0152/1156] Fixed bugs where potentially zero-length data could be added to NSMutableData. git-svn-id: http://macvim.googlecode.com/svn/trunk@178 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMBackend.m | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/MMBackend.m b/MMBackend.m index 7ba66cfbbf..d153a3ea32 100644 --- a/MMBackend.m +++ b/MMBackend.m @@ -238,6 +238,8 @@ - (void)deleteLinesFromRow:(int)row count:(int)count - (void)replaceString:(char*)s length:(int)len row:(int)row column:(int)col flags:(int)flags { + if (len <= 0) return; + int type = ReplaceStringDrawType; [drawData appendBytes:&type length:sizeof(int)]; @@ -350,6 +352,7 @@ - (void)updateTabBar // This function puts the label of the tab in the global 'NameBuff'. get_tabline_label(tp, FALSE); int len = strlen((char*)NameBuff); + if (len <= 0) continue; // Count the number of windows in the tabpage. //win_T *wp = tp->tp_firstwin; @@ -391,6 +394,7 @@ - (void)setVimWindowTitle:(char *)title { NSMutableData *data = [NSMutableData data]; int len = strlen(title); + if (len <= 0) return; [data appendBytes:&len length:sizeof(int)]; [data appendBytes:title length:len]; @@ -596,15 +600,18 @@ - (void)enableMenuItemWithTag:(int)tag state:(int)enabled - (void)showPopupMenuWithName:(char *)name atMouseLocation:(BOOL)mouse { - NSMutableData *data = [NSMutableData data]; int len = strlen(name); int row = -1, col = -1; + if (len <= 0) return; + if (!mouse && curwin) { row = curwin->w_wrow; col = curwin->w_wcol; } + NSMutableData *data = [NSMutableData data]; + [data appendBytes:&row length:sizeof(int)]; [data appendBytes:&col length:sizeof(int)]; [data appendBytes:&len length:sizeof(int)]; @@ -719,16 +726,18 @@ - (BOOL)setFontWithName:(char *)name NSFont *font = [NSFont fontWithName:fontName size:size]; if (font) { //NSLog(@"Setting font '%@' of size %.2f", fontName, size); - NSMutableData *data = [NSMutableData data]; int len = [fontName lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; + if (len > 0) { + NSMutableData *data = [NSMutableData data]; - [data appendBytes:&size length:sizeof(float)]; - [data appendBytes:&len length:sizeof(int)]; - [data appendBytes:[fontName UTF8String] length:len]; + [data appendBytes:&size length:sizeof(float)]; + [data appendBytes:&len length:sizeof(int)]; + [data appendBytes:[fontName UTF8String] length:len]; - [self queueMessage:SetFontMsgID data:data]; - return YES; + [self queueMessage:SetFontMsgID data:data]; + return YES; + } } } From e71f402b6de71412178c5fbaaab1fc8ec6a93032 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Wed, 22 Aug 2007 17:19:09 +0000 Subject: [PATCH 0153/1156] Check for nil string argument in replaceString::::::: git-svn-id: http://macvim.googlecode.com/svn/trunk@179 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMTextStorage.m | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/MMTextStorage.m b/MMTextStorage.m index 97ae7f2c0e..adeae57ad3 100644 --- a/MMTextStorage.m +++ b/MMTextStorage.m @@ -169,6 +169,11 @@ - (void)replaceString:(NSString *)string atRow:(int)row column:(int)col return; } + // NOTE: If 'string' was initialized with bad data it might be nil; this + // may be due to 'enc' being set to an unsupported value, so don't print an + // error message or stdout will most likely get flooded. + if (!string) return; + if (!(fg && bg && sp)) { NSLog(@"[%s] WARNING: background, foreground or special color not " "specified", _cmd); From 4b6211600234de624390e3586e780395f0acc325 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Wed, 22 Aug 2007 18:51:49 +0000 Subject: [PATCH 0154/1156] Added mouse shape support git-svn-id: http://macvim.googlecode.com/svn/trunk@180 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMBackend.h | 1 + MMBackend.m | 13 +++++++++++ MMTextView.h | 5 +++-- MMTextView.m | 51 ++++++++++++++++++++++++++++++++++++++++++++ MMVimController.m | 5 +++++ MMWindowController.h | 1 + MMWindowController.m | 23 ++++++++++++++++++++ MacVim.h | 2 ++ MacVim.m | 2 ++ gui_macvim.m | 1 + 10 files changed, 102 insertions(+), 2 deletions(-) diff --git a/MMBackend.h b/MMBackend.h index c2fe4159ce..562e26a13f 100644 --- a/MMBackend.h +++ b/MMBackend.h @@ -81,6 +81,7 @@ identifier:(long)ident; - (BOOL)setFontWithName:(char *)name; - (void)executeActionWithName:(NSString *)name; +- (void)setMouseShape:(int)shape; - (int)lookupColorWithKey:(NSString *)key; diff --git a/MMBackend.m b/MMBackend.m index d153a3ea32..aae22afe67 100644 --- a/MMBackend.m +++ b/MMBackend.m @@ -760,6 +760,13 @@ - (void)executeActionWithName:(NSString *)name } } +- (void)setMouseShape:(int)shape +{ + NSMutableData *data = [NSMutableData data]; + [data appendBytes:&shape length:sizeof(int)]; + [self queueMessage:SetMouseShapeMsgID data:data]; +} + - (int)lookupColorWithKey:(NSString *)key { if (!(key && [key length] > 0)) @@ -1236,6 +1243,12 @@ - (void)handleMessage:(int)msgid data:(NSData *)data } else if (LostFocusMsgID == msgid) { if (gui.in_focus) gui_focus_change(NO); + } else if (MouseMovedMsgID == msgid) { + const void *bytes = [data bytes]; + int row = *((int*)bytes); bytes += sizeof(int); + int col = *((int*)bytes); bytes += sizeof(int); + + gui_mouse_moved(col, row); } else { NSLog(@"WARNING: Unknown message received (msgid=%d)", msgid); } diff --git a/MMTextView.h b/MMTextView.h index 67ffdb1f0e..8bc50ca70c 100644 --- a/MMTextView.h +++ b/MMTextView.h @@ -12,8 +12,9 @@ @interface MMTextView : NSTextView { - BOOL shouldDrawInsertionPoint; - NSEvent *lastMouseDownEvent; + BOOL shouldDrawInsertionPoint; + NSEvent *lastMouseDownEvent; + //NSTrackingRectTag trackingRectTag; } - (NSEvent *)lastMouseDownEvent; diff --git a/MMTextView.m b/MMTextView.m index dca2f19d0c..f8d9b48f11 100644 --- a/MMTextView.m +++ b/MMTextView.m @@ -260,6 +260,57 @@ - (void)otherMouseDragged:(NSEvent *)event [self mouseDragged:event]; } +- (void)mouseMoved:(NSEvent *)event +{ + NSPoint pt = [self convertPoint:[event locationInWindow] fromView:nil]; + int row, col; + if (![self convertPoint:pt toRow:&row column:&col]) + return; + + NSMutableData *data = [NSMutableData data]; + + [data appendBytes:&row length:sizeof(int)]; + [data appendBytes:&col length:sizeof(int)]; + + [[self vimController] sendMessage:MouseMovedMsgID data:data wait:NO]; +} + +#if 0 +- (void)mouseEntered:(NSEvent *)event +{ + NSLog(@"%s", _cmd); + [[self window] setAcceptsMouseMovedEvents:YES]; +} + +- (void)mouseExited:(NSEvent *)event +{ + NSLog(@"%s", _cmd); + [[self window] setAcceptsMouseMovedEvents:NO]; + [[NSCursor arrowCursor] set]; +} + +- (void)setFrame:(NSRect)frame +{ + NSLog(@"%s", _cmd); + + // NOTE: Set a tracking rect which covers the text view. While the mouse + // cursor is in this rect the view will receive 'mouseMoved:' events so + // that Vim can take care of updating the mouse cursor. + [super setFrame:frame]; + [self removeTrackingRect:trackingRectTag]; + trackingRectTag = [self addTrackingRect:frame owner:self userData:NULL + assumeInside:YES]; +} + +- (void)viewWillMoveToWindow:(NSWindow *)newWindow +{ + // Remove tracking rect if view moves or is removed. + if ([self window] && trackingRectTag) { + [self removeTrackingRect:trackingRectTag]; + } +} +#endif + - (NSMenu*)menuForEvent:(NSEvent *)event { // HACK! Return nil to disable NSTextView's popup menus (Vim provides its diff --git a/MMVimController.m b/MMVimController.m index 4b257d56ec..c43250c3bc 100644 --- a/MMVimController.m +++ b/MMVimController.m @@ -720,6 +720,11 @@ - (void)handleMessage:(int)msgid data:(NSData *)data } [title release]; + } else if (SetMouseShapeMsgID == msgid) { + const void *bytes = [data bytes]; + int shape = *((int*)bytes); bytes += sizeof(int); + + [windowController setMouseShape:shape]; } else { NSLog(@"WARNING: Unknown message received (msgid=%d)", msgid); } diff --git a/MMWindowController.h b/MMWindowController.h index deb975deef..7ec973be9d 100644 --- a/MMWindowController.h +++ b/MMWindowController.h @@ -56,6 +56,7 @@ - (void)popupMenu:(NSMenu *)menu atRow:(int)row column:(int)col; - (void)showTabBar:(BOOL)on; - (void)showToolbar:(BOOL)on size:(int)size mode:(int)mode; +- (void)setMouseShape:(int)shape; - (IBAction)addNewTab:(id)sender; - (IBAction)toggleToolbar:(id)sender; diff --git a/MMWindowController.m b/MMWindowController.m index b8f4d19951..3a72e87eb9 100644 --- a/MMWindowController.m +++ b/MMWindowController.m @@ -283,6 +283,8 @@ - (void)openWindow [self addNewTabViewItem]; + [[self window] setAcceptsMouseMovedEvents:YES]; + setupDone = YES; [self updateResizeIncrements]; @@ -522,6 +524,27 @@ - (void)showToolbar:(BOOL)on size:(int)size mode:(int)mode } } +- (void)setMouseShape:(int)shape +{ + // This switch should match mshape_names[] in misc2.c. + // + // TODO: Add missing cursor shapes. + switch (shape) { + case 2: [[NSCursor IBeamCursor] set]; break; + case 3: case 4: [[NSCursor resizeUpDownCursor] set]; break; + case 5: case 6: [[NSCursor resizeLeftRightCursor] set]; break; + case 9: [[NSCursor crosshairCursor] set]; break; + case 10: [[NSCursor pointingHandCursor] set]; break; + case 11: [[NSCursor openHandCursor] set]; break; + default: + [[NSCursor arrowCursor] set]; break; + } + + // Shape 1 indicates that the mouse cursor should be hidden. + if (1 == shape) + [NSCursor setHiddenUntilMouseMoves:YES]; +} + - (IBAction)addNewTab:(id)sender { // NOTE! This can get called a lot if the user holds down the key diff --git a/MacVim.h b/MacVim.h index 6c6bafa9ea..5566d92296 100644 --- a/MacVim.h +++ b/MacVim.h @@ -121,6 +121,8 @@ enum { ShowPopupMenuMsgID, GotFocusMsgID, LostFocusMsgID, + MouseMovedMsgID, + SetMouseShapeMsgID, }; diff --git a/MacVim.m b/MacVim.m index 55e32d5cf5..7af91552b7 100644 --- a/MacVim.m +++ b/MacVim.m @@ -59,6 +59,8 @@ "ShowPopupMenuMsgID", "GotFocusMsgID", "LostFocusMsgID", + "MouseMovedMsgID", + "SetMouseShapeMsgID", }; diff --git a/gui_macvim.m b/gui_macvim.m index 704eaa3146..73a30da602 100644 --- a/gui_macvim.m +++ b/gui_macvim.m @@ -1294,6 +1294,7 @@ void mch_set_mouse_shape(int shape) { + [[MMBackend sharedInstance] setMouseShape:shape]; } From fdc0627d4d141f33705aba780d911eead0f6228f Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Thu, 23 Aug 2007 07:38:58 +0000 Subject: [PATCH 0155/1156] Mouse cursor is set to arrow when outside text view git-svn-id: http://macvim.googlecode.com/svn/trunk@181 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMBackend.m | 4 ++ MMTextView.h | 2 +- MMTextView.m | 98 +++++++++++++++++++++++++++++++++++++------- MMWindowController.m | 2 +- gui_macvim.m | 2 + 5 files changed, 91 insertions(+), 17 deletions(-) diff --git a/MMBackend.m b/MMBackend.m index aae22afe67..99b9bfa49c 100644 --- a/MMBackend.m +++ b/MMBackend.m @@ -1249,6 +1249,10 @@ - (void)handleMessage:(int)msgid data:(NSData *)data int col = *((int*)bytes); bytes += sizeof(int); gui_mouse_moved(col, row); + } else if (SetMouseShapeMsgID == msgid) { + const void *bytes = [data bytes]; + int shape = *((int*)bytes); bytes += sizeof(int); + update_mouseshape(shape); } else { NSLog(@"WARNING: Unknown message received (msgid=%d)", msgid); } diff --git a/MMTextView.h b/MMTextView.h index 8bc50ca70c..41bc3742f8 100644 --- a/MMTextView.h +++ b/MMTextView.h @@ -14,7 +14,7 @@ @interface MMTextView : NSTextView { BOOL shouldDrawInsertionPoint; NSEvent *lastMouseDownEvent; - //NSTrackingRectTag trackingRectTag; + NSTrackingRectTag trackingRectTag; } - (NSEvent *)lastMouseDownEvent; diff --git a/MMTextView.m b/MMTextView.m index f8d9b48f11..0f968d87ee 100644 --- a/MMTextView.m +++ b/MMTextView.m @@ -18,6 +18,7 @@ @interface MMTextView (Private) - (BOOL)convertPoint:(NSPoint)point toRow:(int *)row column:(int *)column; +- (NSRect)trackingRect; - (void)dispatchKeyEvent:(NSEvent *)event; - (MMVimController *)vimController; @end @@ -262,54 +263,85 @@ - (void)otherMouseDragged:(NSEvent *)event - (void)mouseMoved:(NSEvent *)event { + MMTextStorage *ts = (MMTextStorage*)[self textStorage]; + if (!ts) return; + NSPoint pt = [self convertPoint:[event locationInWindow] fromView:nil]; int row, col; if (![self convertPoint:pt toRow:&row column:&col]) return; - NSMutableData *data = [NSMutableData data]; + // HACK! It seems impossible to get the tracking rects set up before the + // view is visible, which means that the first mouseEntered: or + // mouseExited: events are never received. This forces us to check if the + // mouseMoved: event really happened over the text. + int rows, cols; + [ts getMaxRows:&rows columns:&cols]; + if (row >= 0 && row < rows && col >= 0 && col < cols) { + NSMutableData *data = [NSMutableData data]; - [data appendBytes:&row length:sizeof(int)]; - [data appendBytes:&col length:sizeof(int)]; + [data appendBytes:&row length:sizeof(int)]; + [data appendBytes:&col length:sizeof(int)]; - [[self vimController] sendMessage:MouseMovedMsgID data:data wait:NO]; + [[self vimController] sendMessage:MouseMovedMsgID data:data wait:NO]; + } } -#if 0 - (void)mouseEntered:(NSEvent *)event { - NSLog(@"%s", _cmd); + //NSLog(@"%s", _cmd); [[self window] setAcceptsMouseMovedEvents:YES]; } - (void)mouseExited:(NSEvent *)event { - NSLog(@"%s", _cmd); + //NSLog(@"%s", _cmd); + + int shape = 0; + NSMutableData *data = [NSMutableData data]; + [[self window] setAcceptsMouseMovedEvents:NO]; - [[NSCursor arrowCursor] set]; + + [data appendBytes:&shape length:sizeof(int)]; + [[self vimController] sendMessage:SetMouseShapeMsgID data:data wait:NO]; } - (void)setFrame:(NSRect)frame { - NSLog(@"%s", _cmd); + //NSLog(@"%s", _cmd); - // NOTE: Set a tracking rect which covers the text view. While the mouse - // cursor is in this rect the view will receive 'mouseMoved:' events so - // that Vim can take care of updating the mouse cursor. + // When the frame changes we also need to update the tracking rect. [super setFrame:frame]; [self removeTrackingRect:trackingRectTag]; - trackingRectTag = [self addTrackingRect:frame owner:self userData:NULL - assumeInside:YES]; + trackingRectTag = [self addTrackingRect:[self trackingRect] owner:self + userData:NULL assumeInside:YES]; +} + +- (void)viewDidMoveToWindow +{ + //NSLog(@"%s (window=%@)", _cmd, [self window]); + + // Set a tracking rect which covers the text. + // NOTE: While the mouse cursor is in this rect the view will receive + // 'mouseMoved:' events so that Vim can take care of updating the mouse + // cursor. + if ([self window]) { + [[self window] setAcceptsMouseMovedEvents:YES]; + trackingRectTag = [self addTrackingRect:[self trackingRect] owner:self + userData:NULL assumeInside:YES]; + } } - (void)viewWillMoveToWindow:(NSWindow *)newWindow { + //NSLog(@"%s%@", _cmd, newWindow); + // Remove tracking rect if view moves or is removed. if ([self window] && trackingRectTag) { [self removeTrackingRect:trackingRectTag]; + trackingRectTag = 0; } } -#endif - (NSMenu*)menuForEvent:(NSEvent *)event { @@ -444,6 +476,7 @@ @implementation MMTextView (Private) - (BOOL)convertPoint:(NSPoint)point toRow:(int *)row column:(int *)column { +#if 0 NSLayoutManager *lm = [self layoutManager]; NSTextContainer *tc = [self textContainer]; MMTextStorage *ts = (MMTextStorage*)[self textStorage]; @@ -459,7 +492,42 @@ - (BOOL)convertPoint:(NSPoint)point toRow:(int *)row column:(int *)column if (row) *row = (int)(charIdx / mod); if (column) *column = (int)(charIdx % mod); + NSLog(@"convertPoint:%@ toRow:%d column:%d", NSStringFromPoint(point), + *row, *column); + + return YES; +#else + MMTextStorage *ts = (MMTextStorage*)[self textStorage]; + NSSize cellSize = [ts cellSize]; + if (!(cellSize.width > 0 && cellSize.height > 0)) + return NO; + NSPoint origin = [self textContainerOrigin]; + + if (row) *row = floor((point.y-origin.y-1) / cellSize.height); + if (column) *column = floor((point.x-origin.x-1) / cellSize.width); + + //NSLog(@"convertPoint:%@ toRow:%d column:%d", NSStringFromPoint(point), + // *row, *column); + return YES; +#endif +} + +- (NSRect)trackingRect +{ + NSRect rect = [self frame]; + NSUserDefaults *ud = [NSUserDefaults standardUserDefaults]; + int left = [ud integerForKey:MMTextInsetLeftKey]; + int top = [ud integerForKey:MMTextInsetTopKey]; + int right = [ud integerForKey:MMTextInsetRightKey]; + int bot = [ud integerForKey:MMTextInsetBottomKey]; + + rect.origin.x = left; + rect.origin.y = top; + rect.size.width -= left + right - 1; + rect.size.height -= top + bot - 1; + + return rect; } - (void)keyDown:(NSEvent *)event diff --git a/MMWindowController.m b/MMWindowController.m index 3a72e87eb9..1a6b0d6bc7 100644 --- a/MMWindowController.m +++ b/MMWindowController.m @@ -283,7 +283,7 @@ - (void)openWindow [self addNewTabViewItem]; - [[self window] setAcceptsMouseMovedEvents:YES]; + //[[self window] setAcceptsMouseMovedEvents:YES]; setupDone = YES; diff --git a/gui_macvim.m b/gui_macvim.m index 73a30da602..5ef871b915 100644 --- a/gui_macvim.m +++ b/gui_macvim.m @@ -1097,6 +1097,7 @@ void gui_mch_getmouse(int *x, int *y) { + //NSLog(@"gui_mch_getmouse()"); } @@ -1248,6 +1249,7 @@ void gui_mch_setmouse(int x, int y) { + //NSLog(@"gui_mch_setmouse(x=%d, y=%d)", x, y); } From 0301e9bad8cecfc7b1ef0b583b8888f7b23dd6d8 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Thu, 23 Aug 2007 16:20:09 +0000 Subject: [PATCH 0156/1156] - Now possible to have 'openFiles' events to open the files in tabs in the topmost window by enabling MMOpenFilesInTabsKey user deafult - Removed MMStatuslineOffKey user default git-svn-id: http://macvim.googlecode.com/svn/trunk@182 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMAppController.m | 63 ++++++++++++++++++-------------------------- MMTextView.m | 36 ++----------------------- MMVimController.h | 2 ++ MMVimController.m | 34 ++++++++++++++++++++++++ MMWindowController.m | 16 ----------- MacVim.h | 2 +- MacVim.m | 2 +- 7 files changed, 65 insertions(+), 90 deletions(-) diff --git a/MMAppController.m b/MMAppController.m index 695edff41e..25b07ef075 100644 --- a/MMAppController.m +++ b/MMAppController.m @@ -51,7 +51,6 @@ + (void)initialize [NSNumber numberWithInt:64], MMTabMinWidthKey, [NSNumber numberWithInt:6*64], MMTabMaxWidthKey, [NSNumber numberWithInt:132], MMTabOptimumWidthKey, - [NSNumber numberWithBool:NO], MMStatuslineOffKey, [NSNumber numberWithInt:2], MMTextInsetLeftKey, [NSNumber numberWithInt:1], MMTextInsetRightKey, [NSNumber numberWithInt:1], MMTextInsetTopKey, @@ -61,6 +60,7 @@ + (void)initialize [NSNumber numberWithFloat:1], MMCellWidthMultiplierKey, [NSNumber numberWithFloat:-1], MMBaselineOffsetKey, [NSNumber numberWithBool:YES], MMTranslateCtrlClickKey, + [NSNumber numberWithBool:NO], MMOpenFilesInTabsKey, nil]; [[NSUserDefaults standardUserDefaults] registerDefaults:dict]; @@ -168,18 +168,28 @@ - (void)application:(NSApplication *)sender openFiles:(NSArray *)filenames return; } - NSMutableArray *args = [NSMutableArray arrayWithObjects:@"-g", @"-p", nil]; - [args addObjectsFromArray:files]; + MMVimController *vc; + BOOL openInTabs = [[NSUserDefaults standardUserDefaults] + boolForKey:MMOpenFilesInTabsKey]; - NSString *path = [[NSBundle mainBundle] - pathForAuxiliaryExecutable:@"Vim"]; - if (!path) { - NSLog(@"ERROR: Vim executable could not be found inside app bundle!"); - [NSApp replyToOpenOrPrint:NSApplicationDelegateReplyFailure]; - return; - } + if (openInTabs && (vc = [self topmostVimController])) { + [vc dropFiles:files]; + } else { + NSMutableArray *args = [NSMutableArray arrayWithObjects: + @"-g", @"-p", nil]; + [args addObjectsFromArray:files]; + + NSString *path = [[NSBundle mainBundle] + pathForAuxiliaryExecutable:@"Vim"]; + if (!path) { + NSLog(@"ERROR: Vim executable could not be found inside app " + "bundle!"); + [NSApp replyToOpenOrPrint:NSApplicationDelegateReplyFailure]; + return; + } - [NSTask launchedTaskWithLaunchPath:path arguments:args]; + [NSTask launchedTaskWithLaunchPath:path arguments:args]; + } [NSApp replyToOpenOrPrint:NSApplicationDelegateReplySuccess]; // NSApplicationDelegateReplySuccess = 0, @@ -331,16 +341,7 @@ - (void)windowControllerWillOpen:(MMWindowController *)windowController if (openSelectionString) { // There is some text to paste into this window as a result of the // services menu "Open selection ..." being used. - NSMutableData *data = [NSMutableData data]; - int len = [openSelectionString - lengthOfBytesUsingEncoding:NSUTF8StringEncoding] + 1; - - [data appendBytes:&len length:sizeof(int)]; - [data appendBytes:[openSelectionString UTF8String] length:len]; - - MMVimController *vc = [windowController vimController]; - [vc sendMessage:DropStringMsgID data:data wait:NO]; - + [[windowController vimController] dropString:openSelectionString]; [openSelectionString release]; openSelectionString = nil; } @@ -450,15 +451,9 @@ - (void)openSelection:(NSPasteboard *)pboard userData:(NSString *)userData MMVimController *vc = [self topmostVimController]; if (vc) { - NSString *string = [pboard stringForType:NSStringPboardType]; - NSMutableData *data = [NSMutableData data]; - int len = [string lengthOfBytesUsingEncoding:NSUTF8StringEncoding] + 1; - - [data appendBytes:&len length:sizeof(int)]; - [data appendBytes:[string UTF8String] length:len]; - + // Open a new tab first, since dropString: does not do this. [vc sendMessage:AddNewTabMsgID data:nil wait:NO]; - [vc sendMessage:DropStringMsgID data:data wait:NO]; + [vc dropString:[pboard stringForType:NSStringPboardType]]; } else { // NOTE: There is no window to paste the selection into, so save the // text, open a new window, and paste the text when the next window @@ -481,7 +476,6 @@ - (void)openFile:(NSPasteboard *)pboard userData:(NSString *)userData } // TODO: Parse multiple filenames and create array with names. - int numberOfFiles = 1; NSString *string = [pboard stringForType:NSStringPboardType]; string = [string stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]]; @@ -492,14 +486,7 @@ - (void)openFile:(NSPasteboard *)pboard userData:(NSString *)userData vc = [self topmostVimController]; if (vc) { - NSMutableData *data = [NSMutableData data]; - int len = [string lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; - - [data appendBytes:&numberOfFiles length:sizeof(int)]; - [data appendBytes:&len length:sizeof(int)]; - [data appendBytes:[string UTF8String] length:len]; - - [vc sendMessage:DropFilesMsgID data:data wait:NO]; + [vc dropFiles:[NSArray arrayWithObject:string]]; } else { [self application:NSApp openFiles:[NSArray arrayWithObject:string]]; } diff --git a/MMTextView.m b/MMTextView.m index 0f968d87ee..62bc238a21 100644 --- a/MMTextView.m +++ b/MMTextView.m @@ -363,43 +363,11 @@ - (BOOL)performDragOperation:(id )sender if ([[pboard types] containsObject:NSStringPboardType]) { NSString *string = [pboard stringForType:NSStringPboardType]; - NSMutableData *data = [NSMutableData data]; - int len = [string lengthOfBytesUsingEncoding:NSUTF8StringEncoding] + 1; - - [data appendBytes:&len length:sizeof(int)]; - [data appendBytes:[string UTF8String] length:len]; - - [[self vimController] sendMessage:DropStringMsgID data:data wait:NO]; + [[self vimController] dropString:string]; return YES; } else if ([[pboard types] containsObject:NSFilenamesPboardType]) { NSArray *files = [pboard propertyListForType:NSFilenamesPboardType]; - int i, numberOfFiles = [files count]; - NSMutableData *data = [NSMutableData data]; - - [data appendBytes:&numberOfFiles length:sizeof(int)]; - -#if 0 - int row, col; - NSPoint pt = [self convertPoint:[sender draggingLocation] fromView:nil]; - if (![self convertPoint:pt toRow:&row column:&col]) - return NO; - - [data appendBytes:&row length:sizeof(int)]; - [data appendBytes:&col length:sizeof(int)]; -#endif - - for (i = 0; i < numberOfFiles; ++i) { - NSString *file = [files objectAtIndex:i]; - int len = [file lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; - - if (len > 0) { - ++len; // append NUL as well - [data appendBytes:&len length:sizeof(int)]; - [data appendBytes:[file UTF8String] length:len]; - } - } - - [[self vimController] sendMessage:DropFilesMsgID data:data wait:NO]; + [[self vimController] dropFiles:files]; return YES; } diff --git a/MMVimController.h b/MMVimController.h index 1550c6dc25..8c7f863c62 100644 --- a/MMVimController.h +++ b/MMVimController.h @@ -36,6 +36,8 @@ - (int)pid; - (MMWindowController *)windowController; - (void)cleanup; +- (void)dropFiles:(NSArray *)filenames; +- (void)dropString:(NSString *)string; - (void)sendMessage:(int)msgid data:(NSData *)data wait:(BOOL)wait; @end diff --git a/MMVimController.m b/MMVimController.m index c43250c3bc..4b61572530 100644 --- a/MMVimController.m +++ b/MMVimController.m @@ -163,6 +163,40 @@ - (int)pid return pid; } +- (void)dropFiles:(NSArray *)filenames +{ + int i, numberOfFiles = [filenames count]; + NSMutableData *data = [NSMutableData data]; + + [data appendBytes:&numberOfFiles length:sizeof(int)]; + + for (i = 0; i < numberOfFiles; ++i) { + NSString *file = [filenames objectAtIndex:i]; + int len = [file lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; + + if (len > 0) { + ++len; // append NUL as well + [data appendBytes:&len length:sizeof(int)]; + [data appendBytes:[file UTF8String] length:len]; + } + } + + [self sendMessage:DropFilesMsgID data:data wait:NO]; +} + +- (void)dropString:(NSString *)string +{ + int len = [string lengthOfBytesUsingEncoding:NSUTF8StringEncoding] + 1; + if (len > 0) { + NSMutableData *data = [NSMutableData data]; + + [data appendBytes:&len length:sizeof(int)]; + [data appendBytes:[string UTF8String] length:len]; + + [self sendMessage:DropStringMsgID data:data wait:NO]; + } +} + - (void)sendMessage:(int)msgid data:(NSData *)data wait:(BOOL)wait { //NSLog(@"sendMessage:%s (isInitialized=%d inProcessCommandQueue=%d)", diff --git a/MMWindowController.m b/MMWindowController.m index 1a6b0d6bc7..baef30b1db 100644 --- a/MMWindowController.m +++ b/MMWindowController.m @@ -25,9 +25,6 @@ MMScrollerTypeBottom }; -// NOTE! This value must match the actual position of the status line -// separator in VimWindow.nib. -static float StatusLineHeight = 16.0f; // TODO: Move! @@ -731,9 +728,6 @@ - (NSSize)contentSizeForTextStorageSize:(NSSize)textViewSize if (![tabBarControl isHidden]) size.height += [tabBarControl frame].size.height; - if (![ud boolForKey:MMStatuslineOffKey]) - size.height += StatusLineHeight; - if ([self bottomScrollbarVisible]) size.height += [NSScroller scrollerWidth]; if ([self leftScrollbarVisible]) @@ -753,12 +747,6 @@ - (NSRect)textViewRectForContentSize:(NSSize)contentSize if (![tabBarControl isHidden]) rect.size.height -= [tabBarControl frame].size.height; - if (![[NSUserDefaults standardUserDefaults] - boolForKey:MMStatuslineOffKey]) { - rect.size.height -= StatusLineHeight; - rect.origin.y += StatusLineHeight; - } - if ([self bottomScrollbarVisible]) { rect.size.height -= [NSScroller scrollerWidth]; rect.origin.y += [NSScroller scrollerWidth]; @@ -948,8 +936,6 @@ - (void)placeScrollbars NSRect textViewFrame = [textView frame]; BOOL lsbVisible = [self leftScrollbarVisible]; - BOOL statusVisible = ![[NSUserDefaults standardUserDefaults] - boolForKey:MMStatuslineOffKey]; // HACK! Find the lowest left&right vertical scrollbars, as well as the // rightmost horizontal scrollbar. This hack continues further down. @@ -991,8 +977,6 @@ - (void)placeScrollbars if ([scroller type] == MMScrollerTypeBottom) { rect = [textStorage rectForColumnsInRange:[scroller range]]; rect.size.height = [NSScroller scrollerWidth]; - if (statusVisible) - rect.origin.y += StatusLineHeight; if (lsbVisible) rect.origin.x += [NSScroller scrollerWidth]; diff --git a/MacVim.h b/MacVim.h index 5566d92296..f585f1226d 100644 --- a/MacVim.h +++ b/MacVim.h @@ -156,7 +156,6 @@ extern NSString *MMNoWindowKey; extern NSString *MMTabMinWidthKey; extern NSString *MMTabMaxWidthKey; extern NSString *MMTabOptimumWidthKey; -extern NSString *MMStatuslineOffKey; extern NSString *MMTextInsetLeftKey; extern NSString *MMTextInsetRightKey; extern NSString *MMTextInsetTopKey; @@ -167,6 +166,7 @@ extern NSString *MMCellWidthMultiplierKey; extern NSString *MMBaselineOffsetKey; extern NSString *MMTranslateCtrlClickKey; extern NSString *MMTopLeftPointKey; +extern NSString *MMOpenFilesInTabsKey; diff --git a/MacVim.m b/MacVim.m index 7af91552b7..e31ca47995 100644 --- a/MacVim.m +++ b/MacVim.m @@ -71,7 +71,6 @@ NSString *MMTabMinWidthKey = @"MMTabMinWidth"; NSString *MMTabMaxWidthKey = @"MMTabMaxWidth"; NSString *MMTabOptimumWidthKey = @"MMTabOptimumWidth"; -NSString *MMStatuslineOffKey = @"MMStatuslineOff"; NSString *MMTextInsetLeftKey = @"MMTextInsetLeft"; NSString *MMTextInsetRightKey = @"MMTextInsetRight"; NSString *MMTextInsetTopKey = @"MMTextInsetTop"; @@ -83,3 +82,4 @@ NSString *MMBaselineOffsetKey = @"MMBaselineOffset"; NSString *MMTranslateCtrlClickKey = @"MMTranslateCtrlClick"; NSString *MMTopLeftPointKey = @"MMTopLeftPoint"; +NSString *MMOpenFilesInTabsKey = @"MMOpenFilesInTabs"; From f4be07f6ad39f0d8cd3af261e025e52755b43b59 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Thu, 23 Aug 2007 18:58:37 +0000 Subject: [PATCH 0157/1156] Added autoscrolling whilst dragging the mouse git-svn-id: http://macvim.googlecode.com/svn/trunk@184 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMTextView.h | 5 ++++ MMTextView.m | 74 +++++++++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 73 insertions(+), 6 deletions(-) diff --git a/MMTextView.h b/MMTextView.h index 41bc3742f8..850f8e9b26 100644 --- a/MMTextView.h +++ b/MMTextView.h @@ -15,6 +15,11 @@ BOOL shouldDrawInsertionPoint; NSEvent *lastMouseDownEvent; NSTrackingRectTag trackingRectTag; + BOOL isDragging; + BOOL isAutoscrolling; + int dragRow; + int dragColumn; + int dragFlags; } - (NSEvent *)lastMouseDownEvent; diff --git a/MMTextView.m b/MMTextView.m index 62bc238a21..4853fac1ef 100644 --- a/MMTextView.m +++ b/MMTextView.m @@ -21,6 +21,8 @@ - (BOOL)convertPoint:(NSPoint)point toRow:(int *)row column:(int *)column; - (NSRect)trackingRect; - (void)dispatchKeyEvent:(NSEvent *)event; - (MMVimController *)vimController; +- (void)startDragTimerWithInterval:(NSTimeInterval)t; +- (void)dragTimerFired:(NSTimer *)timer; @end @@ -222,6 +224,8 @@ - (void)mouseUp:(NSEvent *)event [data appendBytes:&flags length:sizeof(int)]; [[self vimController] sendMessage:MouseUpMsgID data:data wait:NO]; + + isDragging = NO; } - (void)rightMouseUp:(NSEvent *)event @@ -236,19 +240,28 @@ - (void)otherMouseUp:(NSEvent *)event - (void)mouseDragged:(NSEvent *)event { + int flags = [event modifierFlags]; int row, col; NSPoint pt = [self convertPoint:[event locationInWindow] fromView:nil]; if (![self convertPoint:pt toRow:&row column:&col]) return; - int flags = [event modifierFlags]; - NSMutableData *data = [NSMutableData data]; + // Autoscrolling is done in dragTimerFired: + if (!isAutoscrolling) { + NSMutableData *data = [NSMutableData data]; - [data appendBytes:&row length:sizeof(int)]; - [data appendBytes:&col length:sizeof(int)]; - [data appendBytes:&flags length:sizeof(int)]; + [data appendBytes:&row length:sizeof(int)]; + [data appendBytes:&col length:sizeof(int)]; + [data appendBytes:&flags length:sizeof(int)]; + + [[self vimController] sendMessage:MouseDraggedMsgID data:data wait:NO]; + } - [[self vimController] sendMessage:MouseDraggedMsgID data:data wait:NO]; + dragRow = row; dragColumn = col; dragFlags = flags; + if (!isDragging) { + [self startDragTimerWithInterval:.5]; + isDragging = YES; + } } - (void)rightMouseDragged:(NSEvent *)event @@ -304,6 +317,9 @@ - (void)mouseExited:(NSEvent *)event [data appendBytes:&shape length:sizeof(int)]; [[self vimController] sendMessage:SetMouseShapeMsgID data:data wait:NO]; + + if (isDragging) { + } } - (void)setFrame:(NSRect)frame @@ -581,4 +597,50 @@ - (MMVimController *)vimController return [(MMWindowController*)windowController vimController]; } +- (void)startDragTimerWithInterval:(NSTimeInterval)t +{ + [NSTimer scheduledTimerWithTimeInterval:t target:self + selector:@selector(dragTimerFired:) + userInfo:nil repeats:NO]; +} + +- (void)dragTimerFired:(NSTimer *)timer +{ + static unsigned tick = 1; + MMTextStorage *ts = (MMTextStorage *)[self textStorage]; + + isAutoscrolling = NO; + + if (isDragging && ts && (dragRow < 0 || dragRow >= [ts maxRows])) { + // HACK! If the mouse cursor is outside the text area, then send a + // dragged event. However, if row&col hasn't changed since the last + // dragged event, Vim won't do anything (see gui_send_mouse_event()). + // Thus we fiddle with the column to make sure something happens. + int col = dragColumn + (dragRow < 0 ? -(tick % 2) : +(tick % 2)); + NSMutableData *data = [NSMutableData data]; + + [data appendBytes:&dragRow length:sizeof(int)]; + [data appendBytes:&col length:sizeof(int)]; + [data appendBytes:&dragFlags length:sizeof(int)]; + + [[self vimController] sendMessage:MouseDraggedMsgID data:data wait:NO]; + + isAutoscrolling = YES; + } + + if (isDragging) { + // The timer only fires once, so we have to keep rescheduling it while + // the user is dragging. + NSTimeInterval t = .3; + int delta = dragRow < 0 ? -dragRow : dragRow - [ts maxRows] + 1; + if (delta > 0) + t -= .01*delta*delta; + if (t < .05) t = .05; + + [self startDragTimerWithInterval:t]; + } + + ++tick; +} + @end // MMTextView (Private) From 19da3b8d4bb957f69b9eb7d05d867860a2900487 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Fri, 24 Aug 2007 06:43:32 +0000 Subject: [PATCH 0158/1156] Change algorithm for computing drag timer interval git-svn-id: http://macvim.googlecode.com/svn/trunk@185 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMTextView.h | 1 + MMTextView.m | 29 ++++++++++++++++++++++------- 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/MMTextView.h b/MMTextView.h index 850f8e9b26..08f9d2e75a 100644 --- a/MMTextView.h +++ b/MMTextView.h @@ -20,6 +20,7 @@ int dragRow; int dragColumn; int dragFlags; + NSPoint dragPoint; } - (NSEvent *)lastMouseDownEvent; diff --git a/MMTextView.m b/MMTextView.m index 4853fac1ef..96b85c80e5 100644 --- a/MMTextView.m +++ b/MMTextView.m @@ -16,6 +16,15 @@ +// The max/min drag timer interval in seconds +static NSTimeInterval MMDragTimerMaxInterval = .3f; +static NSTimeInterval MMDragTimerMinInterval = .01f; + +// The number of pixels in which the drag timer interval changes +static int MMDragAreaSize = 73; + + + @interface MMTextView (Private) - (BOOL)convertPoint:(NSPoint)point toRow:(int *)row column:(int *)column; - (NSRect)trackingRect; @@ -257,6 +266,7 @@ - (void)mouseDragged:(NSEvent *)event [[self vimController] sendMessage:MouseDraggedMsgID data:data wait:NO]; } + dragPoint = pt; dragRow = row; dragColumn = col; dragFlags = flags; if (!isDragging) { [self startDragTimerWithInterval:.5]; @@ -606,6 +616,7 @@ - (void)startDragTimerWithInterval:(NSTimeInterval)t - (void)dragTimerFired:(NSTimer *)timer { + // TODO: Autoscroll in horizontal direction? static unsigned tick = 1; MMTextStorage *ts = (MMTextStorage *)[self textStorage]; @@ -629,13 +640,17 @@ - (void)dragTimerFired:(NSTimer *)timer } if (isDragging) { - // The timer only fires once, so we have to keep rescheduling it while - // the user is dragging. - NSTimeInterval t = .3; - int delta = dragRow < 0 ? -dragRow : dragRow - [ts maxRows] + 1; - if (delta > 0) - t -= .01*delta*delta; - if (t < .05) t = .05; + // Compute timer interval depending on how far away the mouse cursor is + // from the text view. + NSRect rect = [self trackingRect]; + float dy = 0; + if (dragPoint.y < rect.origin.y) dy = rect.origin.y - dragPoint.y; + else if (dragPoint.y > NSMaxY(rect)) dy = dragPoint.y - NSMaxY(rect); + + NSTimeInterval t = MMDragTimerMaxInterval * + (1.0f - dy/(float)MMDragAreaSize); + if (t < MMDragTimerMinInterval) + t = MMDragTimerMinInterval; [self startDragTimerWithInterval:t]; } From 6352ff194c273a1107a98af7aac7d6b4b653651d Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Fri, 24 Aug 2007 07:07:32 +0000 Subject: [PATCH 0159/1156] Drag timer interval calculation now works as intended git-svn-id: http://macvim.googlecode.com/svn/trunk@186 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMTextView.m | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/MMTextView.m b/MMTextView.m index 96b85c80e5..906de0f07a 100644 --- a/MMTextView.m +++ b/MMTextView.m @@ -21,7 +21,7 @@ static NSTimeInterval MMDragTimerMinInterval = .01f; // The number of pixels in which the drag timer interval changes -static int MMDragAreaSize = 73; +static float MMDragAreaSize = 73.0f; @@ -646,11 +646,10 @@ - (void)dragTimerFired:(NSTimer *)timer float dy = 0; if (dragPoint.y < rect.origin.y) dy = rect.origin.y - dragPoint.y; else if (dragPoint.y > NSMaxY(rect)) dy = dragPoint.y - NSMaxY(rect); + if (dy > MMDragAreaSize) dy = MMDragAreaSize; - NSTimeInterval t = MMDragTimerMaxInterval * - (1.0f - dy/(float)MMDragAreaSize); - if (t < MMDragTimerMinInterval) - t = MMDragTimerMinInterval; + NSTimeInterval t = MMDragTimerMaxInterval - + dy*(MMDragTimerMaxInterval-MMDragTimerMinInterval)/MMDragAreaSize; [self startDragTimerWithInterval:t]; } From c8e1fb4fc2ae84a0d930c969ea8a84ccea370cf1 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Fri, 24 Aug 2007 08:09:10 +0000 Subject: [PATCH 0160/1156] Changed "older/newer list" key equivalent git-svn-id: http://macvim.googlecode.com/svn/trunk@187 96c4425d-ca35-0410-94e5-3396d5c13a8f --- gvimrc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gvimrc b/gvimrc index db3005b0d6..7f20f9ca3f 100644 --- a/gvimrc +++ b/gvimrc @@ -127,8 +127,8 @@ menukeyequiv Tools.List\ Errors menukeyequiv Tools.List\ Messages menukeyequiv Tools.Next\ Error menukeyequiv Tools.Previous\ Error -menukeyequiv Tools.Older\ List -menukeyequiv Tools.Newer\ List +menukeyequiv Tools.Older\ List +menukeyequiv Tools.Newer\ List menukeyequiv Window.Minimize menukeyequiv Window.Previous\ Tab From 1cd2bc7548666663411a17f49de651d2bbb5aadf Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Fri, 24 Aug 2007 08:09:46 +0000 Subject: [PATCH 0161/1156] Code cleanup git-svn-id: http://macvim.googlecode.com/svn/trunk@188 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMBackend.h | 2 -- MMBackend.m | 8 +------- MacVim.h | 6 +----- MacVim.m | 4 ---- gui_macvim.m | 8 ++++---- 5 files changed, 6 insertions(+), 22 deletions(-) diff --git a/MMBackend.h b/MMBackend.h index 562e26a13f..f30850f093 100644 --- a/MMBackend.h +++ b/MMBackend.h @@ -17,10 +17,8 @@ NSMutableData *drawData; NSConnection *connection; id frontendProxy; - NSString *browseForFileString; NSDictionary *colorDict; BOOL inputReceived; - BOOL receivedKillTaskMsg; BOOL tabBarVisible; int backgroundColor; int foregroundColor; diff --git a/MMBackend.m b/MMBackend.m index 99b9bfa49c..de05cc6243 100644 --- a/MMBackend.m +++ b/MMBackend.m @@ -895,13 +895,7 @@ @implementation MMBackend (Private) - (void)handleMessage:(int)msgid data:(NSData *)data { - if (KillTaskMsgID == msgid) { - //NSLog(@"VimTask received kill message; exiting now."); - // Set this flag here so that exit does not send TaskExitedMsgID back - // to MMVimController. - receivedKillTaskMsg = YES; - getout(0); - } else if (InsertTextMsgID == msgid) { + if (InsertTextMsgID == msgid) { if (!data) return; NSString *key = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; diff --git a/MacVim.h b/MacVim.h index f585f1226d..d97b120559 100644 --- a/MacVim.h +++ b/MacVim.h @@ -75,11 +75,7 @@ extern char *MessageStrings[]; enum { - CheckinMsgID = 1, - ConnectedMsgID, - KillTaskMsgID, - TaskExitedMsgID, - OpenVimWindowMsgID, + OpenVimWindowMsgID = 1, InsertTextMsgID, KeyDownMsgID, CmdKeyMsgID, diff --git a/MacVim.m b/MacVim.m index e31ca47995..b8aa07822f 100644 --- a/MacVim.m +++ b/MacVim.m @@ -13,10 +13,6 @@ char *MessageStrings[] = { "INVALID MESSAGE ID", - "CheckinMsgID", - "ConnectedMsgID", - "KillTaskMsgID", - "TaskExitedMsgID", "OpenVimWindowMsgID", "InsertTextMsgID", "KeyDownMsgID", diff --git a/gui_macvim.m b/gui_macvim.m index 5ef871b915..c9bdd65452 100644 --- a/gui_macvim.m +++ b/gui_macvim.m @@ -14,7 +14,7 @@ #import "vim.h" -static BOOL gui_cocoa_is_valid_action(NSString *action); +static BOOL gui_macvim_is_valid_action(NSString *action); // -- Initialization -------------------------------------------------------- @@ -641,7 +641,7 @@ action = [parts objectAtIndex:1]; action = [action stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]]; - if (!gui_cocoa_is_valid_action(action)) + if (!gui_macvim_is_valid_action(action)) action = nil; } } @@ -925,7 +925,7 @@ NSString *name = [NSString stringWithCString:(char*)eap->arg encoding:NSUTF8StringEncoding]; - if (gui_cocoa_is_valid_action(name)) { + if (gui_macvim_is_valid_action(name)) { [[MMBackend sharedInstance] executeActionWithName:name]; } else { EMSG2(_("E???: \"%s\" is not a valid action"), eap->arg); @@ -1301,7 +1301,7 @@ static BOOL -gui_cocoa_is_valid_action(NSString *action) +gui_macvim_is_valid_action(NSString *action) { static NSDictionary *actionDict = nil; From a62901521e67cab9fd4c8508d506c5271caf554c Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Fri, 24 Aug 2007 20:34:41 +0000 Subject: [PATCH 0162/1156] Manual drawing of the insertion point (now also works in replace mode) git-svn-id: http://macvim.googlecode.com/svn/trunk@189 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMBackend.h | 3 ++- MMBackend.m | 31 ++++++++++------------ MMTextStorage.h | 2 +- MMTextStorage.m | 2 +- MMTextView.h | 6 ++++- MMTextView.m | 66 ++++++++++++++++++++++++++++++++++++++++++++--- MMVimController.m | 28 +++++++------------- MacVim.h | 11 ++++++-- MacVim.m | 1 - gui_macvim.m | 15 +++++++++++ 10 files changed, 118 insertions(+), 47 deletions(-) diff --git a/MMBackend.h b/MMBackend.h index f30850f093..42c2a742ad 100644 --- a/MMBackend.h +++ b/MMBackend.h @@ -47,6 +47,8 @@ flags:(int)flags; - (void)insertLinesFromRow:(int)row count:(int)count scrollBottom:(int)bottom left:(int)left right:(int)right; +- (void)drawCursorAtRow:(int)row column:(int)col shape:(int)shape + color:(int)color; - (void)flushQueue:(BOOL)force; - (BOOL)waitForInput:(int)milliseconds; - (void)exit; @@ -60,7 +62,6 @@ saving:(int)saving; - (int)presentDialogWithType:(int)type title:(char *)title message:(char *)msg buttons:(char *)btns textField:(char *)txtfield; -- (void)updateInsertionPoint; - (void)addMenuWithTag:(int)tag parent:(int)parentTag name:(char *)name atIndex:(int)index; - (void)addMenuItemWithTag:(int)tag parent:(int)parentTag name:(char *)name diff --git a/MMBackend.m b/MMBackend.m index de05cc6243..992f05e8d8 100644 --- a/MMBackend.m +++ b/MMBackend.m @@ -269,6 +269,19 @@ - (void)insertLinesFromRow:(int)row count:(int)count [drawData appendBytes:&right length:sizeof(int)]; } +- (void)drawCursorAtRow:(int)row column:(int)col shape:(int)shape + color:(int)color +{ + int type = DrawCursorDrawType; + + [drawData appendBytes:&type length:sizeof(int)]; + + [drawData appendBytes:&color length:sizeof(int)]; + [drawData appendBytes:&row length:sizeof(int)]; + [drawData appendBytes:&col length:sizeof(int)]; + [drawData appendBytes:&shape length:sizeof(int)]; +} + - (void)flushQueue:(BOOL)force { // NOTE! This method gets called a lot; if we were to flush every time it @@ -284,9 +297,6 @@ - (void)flushQueue:(BOOL)force } if ([queue count] > 0) { - // TODO: Come up with a better way to handle the insertion point. - [self updateInsertionPoint]; - @try { [frontendProxy processCommandQueue:queue]; } @@ -513,21 +523,6 @@ - (int)presentDialogWithType:(int)type title:(char *)title message:(char *)msg return retval; } -- (void)updateInsertionPoint -{ - NSMutableData *data = [NSMutableData data]; - - int state = get_shape_idx(FALSE); - state = (state == SHAPE_IDX_I) || (state == SHAPE_IDX_CI); - - [data appendBytes:&defaultForegroundColor length:sizeof(int)]; - [data appendBytes:&gui.row length:sizeof(int)]; - [data appendBytes:&gui.col length:sizeof(int)]; - [data appendBytes:&state length:sizeof(int)]; - - [self queueMessage:UpdateInsertionPointMsgID data:data]; -} - - (void)addMenuWithTag:(int)tag parent:(int)parentTag name:(char *)name atIndex:(int)index { diff --git a/MMTextStorage.h b/MMTextStorage.h index 457e195f24..1a87213a00 100644 --- a/MMTextStorage.h +++ b/MMTextStorage.h @@ -54,7 +54,7 @@ - (NSSize)cellSize; - (NSRect)rectForRowsInRange:(NSRange)range; - (NSRect)rectForColumnsInRange:(NSRange)range; -- (unsigned)offsetFromRow:(int)row column:(int)col; +- (unsigned)characterIndexForRow:(int)row column:(int)col; - (BOOL)resizeToFitSize:(NSSize)size; - (NSSize)fitToSize:(NSSize)size; - (NSSize)fitToSize:(NSSize)size rows:(int *)rows columns:(int *)columns; diff --git a/MMTextStorage.m b/MMTextStorage.m index adeae57ad3..51a9a2d6c7 100644 --- a/MMTextStorage.m +++ b/MMTextStorage.m @@ -454,7 +454,7 @@ - (NSRect)rectForColumnsInRange:(NSRange)range return rect; } -- (unsigned)offsetFromRow:(int)row column:(int)col +- (unsigned)characterIndexForRow:(int)row column:(int)col { // Ensure the offset returned is valid. // This code also works if maxRows and/or maxColumns is 0. diff --git a/MMTextView.h b/MMTextView.h index 08f9d2e75a..911c63ee46 100644 --- a/MMTextView.h +++ b/MMTextView.h @@ -21,9 +21,13 @@ int dragColumn; int dragFlags; NSPoint dragPoint; + int insertionPointRow; + int insertionPointColumn; + int insertionPointShape; } - (NSEvent *)lastMouseDownEvent; -- (void)setShouldDrawInsertionPoint:(BOOL)enable; +- (void)drawInsertionPointAtRow:(int)row column:(int)col shape:(int)shape + color:(NSColor *)color; @end diff --git a/MMTextView.m b/MMTextView.m index 906de0f07a..e8c8b158f6 100644 --- a/MMTextView.m +++ b/MMTextView.m @@ -49,14 +49,72 @@ - (NSEvent *)lastMouseDownEvent return lastMouseDownEvent; } -- (void)setShouldDrawInsertionPoint:(BOOL)enable +- (BOOL)shouldDrawInsertionPoint { - shouldDrawInsertionPoint = enable; + // NOTE: The insertion point is drawn manually in drawRect:. It would be + // nice to be able to use the insertion point related methods of + // NSTextView, but it seems impossible to get them to work properly (search + // the cocoabuilder archives). + return NO; } -- (BOOL)shouldDrawInsertionPoint +- (void)drawInsertionPointAtRow:(int)row column:(int)col shape:(int)shape + color:(NSColor *)color +{ + // This only stores where to draw the insertion point, the actual drawing + // is done in drawRect:. + shouldDrawInsertionPoint = YES; + insertionPointRow = row; + insertionPointColumn = col; + insertionPointShape = shape; + + [self setInsertionPointColor:color]; +} + +- (void)drawRect:(NSRect)rect { - return shouldDrawInsertionPoint; + [super drawRect:rect]; + + if (shouldDrawInsertionPoint) { + MMTextStorage *ts = (MMTextStorage*)[self textStorage]; + NSLayoutManager *lm = [self layoutManager]; + NSTextContainer *tc = [self textContainer]; + + // Given (row,column), calculate the bounds of the glyph at that spot. + // We use the layout manager because this gives us exactly the size and + // location of the glyph so that we can match the insertion point to + // it. + unsigned charIdx = [ts characterIndexForRow:insertionPointRow + column:insertionPointColumn]; + NSRange glyphRange = + [lm glyphRangeForCharacterRange:NSMakeRange(charIdx,1) + actualCharacterRange:NULL]; + NSRect glyphRect = [lm boundingRectForGlyphRange:glyphRange + inTextContainer:tc]; + glyphRect.origin.x += [self textContainerOrigin].x; + glyphRect.origin.y += [self textContainerOrigin].y; + + if (MMInsertionPointHorizontal == insertionPointShape) { + glyphRect.origin.y += glyphRect.size.height - 1; + glyphRect.size.height = 2; + } else if (MMInsertionPointVertical == insertionPointShape) { + glyphRect.size.width = 2; + } + + if (MMInsertionPointHollow == insertionPointShape) { + // This looks very ugly. + [[self insertionPointColor] set]; + //[NSBezierPath setDefaultLineWidth:2.0]; + //[NSBezierPath setDefaultLineJoinStyle:NSRoundLineJoinStyle]; + [NSBezierPath strokeRect:glyphRect]; + } else { + NSRectFill(glyphRect); + } + + // NOTE: We only draw the cursor once and rely on Vim to say when it + // should be drawn again. + shouldDrawInsertionPoint = NO; + } } - (void)insertText:(id)string diff --git a/MMVimController.m b/MMVimController.m index 4b61572530..5a8106c494 100644 --- a/MMVimController.m +++ b/MMVimController.m @@ -505,23 +505,6 @@ - (void)handleMessage:(int)msgid data:(NSData *)data [[windowController window] setTitle:string]; [string release]; - } else if (UpdateInsertionPointMsgID == msgid) { - const void *bytes = [data bytes]; - int color = *((int*)bytes); bytes += sizeof(int); - int row = *((int*)bytes); bytes += sizeof(int); - int col = *((int*)bytes); bytes += sizeof(int); - int state = *((int*)bytes); bytes += sizeof(int); - - // TODO! Move to window controller. - MMTextView *textView = [windowController textView]; - if (textView) { - MMTextStorage *textStorage = (MMTextStorage*)[textView textStorage]; - unsigned off = [textStorage offsetFromRow:row column:col]; - - [textView setInsertionPointColor:[NSColor colorWithRgbInt:color]]; - [textView setSelectedRange:NSMakeRange(off, 0)]; - [textView setShouldDrawInsertionPoint:state]; - } } else if (AddMenuMsgID == msgid) { NSString *title = nil; const void *bytes = [data bytes]; @@ -768,7 +751,8 @@ - (void)performBatchDrawWithData:(NSData *)data { // TODO! Move to window controller. MMTextStorage *textStorage = [windowController textStorage]; - if (!textStorage) + MMTextView *textView = [windowController textView]; + if (!(textStorage && textView)) return; const void *bytes = [data bytes]; @@ -840,6 +824,14 @@ - (void)performBatchDrawWithData:(NSData *)data [textStorage insertLinesAtRow:row lineCount:count scrollBottom:bot left:left right:right color:[NSColor colorWithRgbInt:color]]; + } else if (DrawCursorDrawType == type) { + int color = *((int*)bytes); bytes += sizeof(int); + int row = *((int*)bytes); bytes += sizeof(int); + int col = *((int*)bytes); bytes += sizeof(int); + int shape = *((int*)bytes); bytes += sizeof(int); + + [textView drawInsertionPointAtRow:row column:col shape:shape + color:[NSColor colorWithRgbInt:color]]; } else { NSLog(@"WARNING: Unknown draw type (type=%d)", type); } diff --git a/MacVim.h b/MacVim.h index d97b120559..4bead2863a 100644 --- a/MacVim.h +++ b/MacVim.h @@ -94,7 +94,6 @@ enum { MouseUpMsgID, MouseDraggedMsgID, FlushQueueMsgID, - UpdateInsertionPointMsgID, AddMenuMsgID, AddMenuItemMsgID, RemoveMenuItemMsgID, @@ -127,7 +126,15 @@ enum { ClearBlockDrawType, DeleteLinesDrawType, ReplaceStringDrawType, - InsertLinesDrawType + InsertLinesDrawType, + DrawCursorDrawType +}; + +enum { + MMInsertionPointBlock, + MMInsertionPointHorizontal, + MMInsertionPointVertical, + MMInsertionPointHollow, }; diff --git a/MacVim.m b/MacVim.m index b8aa07822f..ed967924d1 100644 --- a/MacVim.m +++ b/MacVim.m @@ -32,7 +32,6 @@ "MouseUpMsgID", "MouseDraggedMsgID", "FlushQueueMsgID", - "UpdateInsertionPointMsgID", "AddMenuMsgID", "AddMenuItemMsgID", "RemoveMenuItemMsgID", diff --git a/gui_macvim.m b/gui_macvim.m index c9bdd65452..c811c440dc 100644 --- a/gui_macvim.m +++ b/gui_macvim.m @@ -1018,6 +1018,11 @@ void gui_mch_draw_hollow_cursor(guicolor_T color) { + //NSLog(@"gui_mch_draw_hollow_cursor(color=0x%x)", color); + + return [[MMBackend sharedInstance] drawCursorAtRow:gui.row column:gui.col + shape:MMInsertionPointHollow + color:color]; } @@ -1027,6 +1032,16 @@ void gui_mch_draw_part_cursor(int w, int h, guicolor_T color) { + //NSLog(@"gui_mch_draw_part_cursor(w=%d, h=%d, color=0x%x)", w, h, color); + + int shape = MMInsertionPointBlock; + switch (shape_table[get_shape_idx(FALSE)].shape) { + case SHAPE_HOR: shape = MMInsertionPointHorizontal; break; + case SHAPE_VER: shape = MMInsertionPointVertical; break; + } + + return [[MMBackend sharedInstance] drawCursorAtRow:gui.row column:gui.col + shape:shape color:color]; } From 8370deb9d7b5b6c99c5d164dd3e76c37301e84ca Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Fri, 24 Aug 2007 20:37:59 +0000 Subject: [PATCH 0163/1156] git-svn-id: http://macvim.googlecode.com/svn/trunk@190 96c4425d-ca35-0410-94e5-3396d5c13a8f --- TODO | 34 ++++++++++++++++++++++------------ 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/TODO b/TODO index 40407f48c4..026bed2295 100644 --- a/TODO +++ b/TODO @@ -1,8 +1,12 @@ Active: +- Hollow insertion point drawing does not always work +- Insertion point blinking +- Build Vim (make) from Xcode project +- Cmd-W in about box sends vimMenuAction: instead of performClose: - Terminal support. :!bash -> no cursor, arrow keys mucks up display - Press Cmd-n multiple times and quickly press Cmd-q; sometimes two or more - instance of MacVim opens up + instances of MacVim opens up - hide toolbar, open new tab, show toolbar: baseline sepearator still visible (seems like a drawing bug in PSMTabBarControl) - file modified outside vim dialog sometimes only appear after pressing a key @@ -21,11 +25,8 @@ Active: - drag-to-resize, delay if mouse button held down - ability to modify key equivalents at any time - validate menu actions for when no windows are open (e.g. selectNextWindow:) -- application:openFiles: should open in tabs in current window instead of in a - new window, only if user default is set - need E??? numbers for vim errors - tab-completion for :action command? -- should ignore action message if is called too often (e.g. in addNewTab:) - proper font handling - check for memory leaks - i8n @@ -37,12 +38,11 @@ Active: - make sure [NSMutableData appendByte:length:] is never called with 0 length (this will lead to a crash) - update speed whilst resizing with mouse is excruciatingly slow -- window count should be typeset nicely in tab -- put marked text in status line (?) +- window count should be typeset nicely in tab ? +- marked text - track pad scrolling is jerky - sanity check all input in handlePortMessage: etc. -- cursor in replace mode -- nice looking cursors (both the block and in insert mode) +- nice looking cursors (both the block and in insert mode) ? - support project builder external editor http://www.codingmonkeys.de/techpubs/externaleditor/pbxexternaleditor.html - dock icon menu @@ -54,6 +54,16 @@ Active: Pending: +- cursor in replace mode +- should ignore action message if is called too often (e.g. in addNewTab:) +- application:openFiles: should open in tabs in current window instead of in a + new window, only if user default is set +- Mouse cursor changes depeding on context +- Ctrl-C does not update screen until another key press (in command window) +- Underline color is never set properly (sp_color) +- Lock up when opening large session files (increasing MMFlushTimeoutInterval + alleviates this problem) +- Respond to "should change" instead of "will change" tab messages - scrolling when mouse is over scrollbar doesn't work - gui dialogs (FEAT_GUI_DIALOG) - no warning when buffer modified outside vim (implement gui_mch_dialog()) @@ -72,6 +82,10 @@ Pending: - toogle toolbar off, maximize window, toolbar on -> text view under toolbar - clicking pill button does not update 'guioptions' - detect Cmd-. (and Ctrl-C) for interrupt + + +Done: + - :popup - popup menus - when only one tab open make close window @@ -84,10 +98,6 @@ Pending: - dropping directories does not work - memory leak with text view? (need to release text storage) - drag and drop inside view (FEAT_GUI_DND, gui_handle_drop()) - - -Done: - - hide baseline separator when tabbar is visible (and make sure clicking the hide/show toolbar button in the top right of the corner does not show it again) From 12cf71954f7de783ea110bbb237ce93c0305a32c Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sat, 25 Aug 2007 11:02:35 +0000 Subject: [PATCH 0164/1156] Added 'help' key entry git-svn-id: http://macvim.googlecode.com/svn/trunk@191 96c4425d-ca35-0410-94e5-3396d5c13a8f --- Info.plist | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Info.plist b/Info.plist index 6787e125d9..1d24daeb97 100644 --- a/Info.plist +++ b/Info.plist @@ -545,7 +545,7 @@ NSMainNibFile MainMenu NSPrincipalClass - NSApplication + MMApplication NSServices From 8a79fbaa43bb0853d2867121464e3c400635b81e Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sat, 25 Aug 2007 11:03:06 +0000 Subject: [PATCH 0165/1156] Added 'help' key entry git-svn-id: http://macvim.googlecode.com/svn/trunk@192 96c4425d-ca35-0410-94e5-3396d5c13a8f --- SpecialKeys.plist | 2 ++ 1 file changed, 2 insertions(+) diff --git a/SpecialKeys.plist b/SpecialKeys.plist index c4e0419713..180302d040 100644 --- a/SpecialKeys.plist +++ b/SpecialKeys.plist @@ -58,5 +58,7 @@ kP  kN + ï† + %1 From 99b1200af47d4b5d04d410f67e720281b39f6672 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sat, 25 Aug 2007 11:04:21 +0000 Subject: [PATCH 0166/1156] Added MMApplication.[h|m] to project and made it the 'Principal Class' of the application. git-svn-id: http://macvim.googlecode.com/svn/trunk@193 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MacVim.xcodeproj/project.pbxproj | 6 +++ MacVim.xcodeproj/winckler.mode1 | 52 +++++++++--------- MacVim.xcodeproj/winckler.pbxuser | 90 +++++++++++++++++++++++-------- 3 files changed, 101 insertions(+), 47 deletions(-) diff --git a/MacVim.xcodeproj/project.pbxproj b/MacVim.xcodeproj/project.pbxproj index 11f241cae1..8e40b55e90 100644 --- a/MacVim.xcodeproj/project.pbxproj +++ b/MacVim.xcodeproj/project.pbxproj @@ -30,6 +30,7 @@ 1D71ACBE0BC702AC002F2B60 /* doc-bm.icns in Resources */ = {isa = PBXBuildFile; fileRef = 1D71ACB30BC702AB002F2B60 /* doc-bm.icns */; }; 1DD04DEC0C529C5E006CDC2B /* Credits.rtf in Resources */ = {isa = PBXBuildFile; fileRef = 1DD04DEB0C529C5E006CDC2B /* Credits.rtf */; }; 1DD0C20C0C60FFB4008CD84A /* gvimrc in CopyFiles */ = {isa = PBXBuildFile; fileRef = 1DD0C20A0C60FF9A008CD84A /* gvimrc */; }; + 1DD66ECE0C803D3600EBDAB3 /* MMApplication.m in Sources */ = {isa = PBXBuildFile; fileRef = 1DD66ECC0C803D3600EBDAB3 /* MMApplication.m */; }; 1DD703B90BA9D15D008679E9 /* vim_gloss.icns in Resources */ = {isa = PBXBuildFile; fileRef = 1DD703B80BA9D15D008679E9 /* vim_gloss.icns */; }; 1DD704310BA9F9C2008679E9 /* SpecialKeys.plist in Resources */ = {isa = PBXBuildFile; fileRef = 1DD704300BA9F9C2008679E9 /* SpecialKeys.plist */; }; 1DDBEB6D0C7434150036EEDD /* EmptyWindow.nib in Resources */ = {isa = PBXBuildFile; fileRef = 1DDBEB6B0C7434150036EEDD /* EmptyWindow.nib */; }; @@ -150,6 +151,8 @@ 1D71ACB30BC702AB002F2B60 /* doc-bm.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = "doc-bm.icns"; sourceTree = ""; }; 1DD04DEB0C529C5E006CDC2B /* Credits.rtf */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; path = Credits.rtf; sourceTree = ""; }; 1DD0C20A0C60FF9A008CD84A /* gvimrc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = gvimrc; sourceTree = ""; }; + 1DD66ECB0C803D3600EBDAB3 /* MMApplication.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = MMApplication.h; sourceTree = ""; }; + 1DD66ECC0C803D3600EBDAB3 /* MMApplication.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = MMApplication.m; sourceTree = ""; }; 1DD703B80BA9D15D008679E9 /* vim_gloss.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = vim_gloss.icns; sourceTree = ""; }; 1DD704300BA9F9C2008679E9 /* SpecialKeys.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = SpecialKeys.plist; sourceTree = ""; }; 1DDBEB6C0C7434150036EEDD /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = English.lproj/EmptyWindow.nib; sourceTree = ""; }; @@ -202,6 +205,8 @@ 080E96DDFE201D6D7F000001 /* MacVim Source */ = { isa = PBXGroup; children = ( + 1DD66ECB0C803D3600EBDAB3 /* MMApplication.h */, + 1DD66ECC0C803D3600EBDAB3 /* MMApplication.m */, 1D09AB3F0C6A4D520045497E /* MMTypesetter.h */, 1D09AB400C6A4D520045497E /* MMTypesetter.m */, 1D1474B90C567A910038FA2B /* MMWindowController.h */, @@ -480,6 +485,7 @@ 1D1474B60C56796D0038FA2B /* MMVimController.m in Sources */, 1D1474BC0C567A910038FA2B /* MMWindowController.m in Sources */, 1D09AB420C6A4D520045497E /* MMTypesetter.m in Sources */, + 1DD66ECE0C803D3600EBDAB3 /* MMApplication.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/MacVim.xcodeproj/winckler.mode1 b/MacVim.xcodeproj/winckler.mode1 index df318deb0e..b402d34291 100644 --- a/MacVim.xcodeproj/winckler.mode1 +++ b/MacVim.xcodeproj/winckler.mode1 @@ -287,7 +287,7 @@ 186 RubberWindowFrame - 168 348 690 397 0 0 1024 746 + 165 349 690 397 0 0 1024 746 Module PBXSmartGroupTreeModule @@ -324,7 +324,7 @@ Frame {{0, 0}, {482, 0}} RubberWindowFrame - 168 348 690 397 0 0 1024 746 + 165 349 690 397 0 0 1024 746 Module PBXNavigatorGroup @@ -344,7 +344,7 @@ Frame {{0, 5}, {482, 351}} RubberWindowFrame - 168 348 690 397 0 0 1024 746 + 165 349 690 397 0 0 1024 746 Module XCDetailModule @@ -368,9 +368,9 @@ TableOfContents - 1DE5E6960C75770B0027A2B1 + 1DFB82D80C80441E00085E92 1CE0B1FE06471DED0097A5F4 - 1DE5E6970C75770B0027A2B1 + 1DFB82D90C80441E00085E92 1CE0B20306471E060097A5F4 1CE0B20506471E060097A5F4 @@ -507,7 +507,7 @@ /Users/winckler/Projects/vim7/src/MacVim/MacVim.xcodeproj WindowString - 168 348 690 397 0 0 1024 746 + 165 349 690 397 0 0 1024 746 WindowTools @@ -528,7 +528,7 @@ PBXProjectModuleGUID 1CD0528F0623707200166675 PBXProjectModuleLabel - MMWindowController.m + MMApplication.m StatusBarVisibility @@ -586,7 +586,7 @@ TableOfContents 1D16B9EF0BA33E3800A69B33 - 1DDBEB860C7438D80036EEDD + 1DD66EA90C802F9300EBDAB3 1CD0528F0623707200166675 XCMainBuildResultsModuleGUID @@ -628,8 +628,8 @@ yes sizes - {{0, 0}, {391, 339}} - {{391, 0}, {633, 339}} + {{0, 0}, {378, 339}} + {{378, 0}, {646, 339}} VerticalSplitView @@ -692,14 +692,14 @@ TableOfContents 1CD10A99069EF8BA00B06720 - 1DDBEB9F0C743B2A0036EEDD + 1DD66EAA0C802F9300EBDAB3 1C162984064C10D400B95A72 - 1DDBEBA00C743B2A0036EEDD - 1DDBEBA10C743B2A0036EEDD - 1DDBEBA20C743B2A0036EEDD - 1DDBEBA30C743B2A0036EEDD - 1DDBEBA40C743B2A0036EEDD - 1DDBEBA50C743B2A0036EEDD + 1DD66EAB0C802F9300EBDAB3 + 1DD66EAC0C802F9300EBDAB3 + 1DD66EAD0C802F9300EBDAB3 + 1DD66EAE0C802F9300EBDAB3 + 1DD66EAF0C802F9300EBDAB3 + 1DD66EB00C802F9300EBDAB3 ToolbarConfiguration xcode.toolbar.config.debug @@ -840,7 +840,7 @@ Frame {{0, 0}, {836, 380}} RubberWindowFrame - 137 67 836 421 0 0 1024 746 + 201 95 836 421 0 0 1024 746 Module PBXDebugCLIModule @@ -863,11 +863,11 @@ TableOfContents 1DE444730BA4445100C4C77A - 1DDBEBA60C743B2A0036EEDD + 1DD66EB10C802F9300EBDAB3 1C78EAAC065D492600B07095 WindowString - 137 67 836 421 0 0 1024 746 + 201 95 836 421 0 0 1024 746 WindowToolGUID 1DE444730BA4445100C4C77A WindowToolIsVisible @@ -958,9 +958,9 @@ TableOfContents 1C0AD2B3069F1EA900FABCE6 - 1DDBEB870C7438D80036EEDD + 1DD66EDD0C803D7000EBDAB3 1CD0528B0623707200166675 - 1DDBEB880C7438D80036EEDD + 1DD66EDE0C803D7000EBDAB3 ToolbarConfiguration xcode.toolbar.config.run @@ -1084,6 +1084,8 @@ Dock + BecomeActive + ContentConfiguration PBXBottomSmartGroupGIDs @@ -1184,8 +1186,8 @@ TableOfContents - 1D6F54660C733FF800D9BDC8 - 1D6F54670C733FF800D9BDC8 + 1DD66EC50C80374400EBDAB3 + 1DD66EC60C80374400EBDAB3 1CE0B1FE06471DED0097A5F4 1CA1AED706398EBD00589147 @@ -1194,7 +1196,7 @@ WindowString 135 179 744 409 0 0 1024 746 WindowToolGUID - 1D6F54660C733FF800D9BDC8 + 1DD66EC50C80374400EBDAB3 WindowToolIsVisible diff --git a/MacVim.xcodeproj/winckler.pbxuser b/MacVim.xcodeproj/winckler.pbxuser index cee65d47b5..1a3d6a7dd5 100644 --- a/MacVim.xcodeproj/winckler.pbxuser +++ b/MacVim.xcodeproj/winckler.pbxuser @@ -25,9 +25,9 @@ }; 1D14749E0C5673AE0038FA2B /* MMAppController.m */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {983, 7600}}"; - sepNavSelRange = "{14399, 0}"; - sepNavVisRect = "{{0, 4078}, {983, 274}}"; + sepNavIntBoundsRect = "{{0, 0}, {795, 8864}}"; + sepNavSelRange = "{17491, 0}"; + sepNavVisRect = "{{0, 5415}, {795, 162}}"; sepNavWindowFrame = "{{15, 4}, {820, 737}}"; }; }; @@ -49,17 +49,17 @@ }; 1D1474AE0C5678370038FA2B /* MMTextView.m */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {983, 7904}}"; - sepNavSelRange = "{3174, 0}"; - sepNavVisRect = "{{0, 1599}, {983, 274}}"; + sepNavIntBoundsRect = "{{0, 0}, {781, 11504}}"; + sepNavSelRange = "{18031, 7}"; + sepNavVisRect = "{{0, 9245}, {781, 608}}"; sepNavWindowFrame = "{{15, 4}, {820, 737}}"; }; }; 1D1474B40C56796D0038FA2B /* MMVimController.m */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {1637, 17296}}"; - sepNavSelRange = "{3790, 7}"; - sepNavVisRect = "{{0, 1576}, {781, 608}}"; + sepNavIntBoundsRect = "{{0, 0}, {1637, 19840}}"; + sepNavSelRange = "{42712, 0}"; + sepNavVisRect = "{{0, 13527}, {795, 162}}"; sepNavWindowFrame = "{{15, 4}, {820, 737}}"; }; }; @@ -73,9 +73,9 @@ }; 1D1474BA0C567A910038FA2B /* MMWindowController.m */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {1147, 20016}}"; - sepNavSelRange = "{39888, 0}"; - sepNavVisRect = "{{0, 2791}, {795, 162}}"; + sepNavIntBoundsRect = "{{0, 0}, {1147, 19040}}"; + sepNavSelRange = "{38061, 0}"; + sepNavVisRect = "{{0, 15143}, {795, 162}}"; sepNavWindowFrame = "{{15, 4}, {820, 737}}"; }; }; @@ -99,13 +99,13 @@ NO, ); argumentStrings = ( - "-MMTextInsetLeft 2", - "-MMTextInsetRight 1", - "-MMTextInsetTop 1", - "-MMTextInsetBottom 1", + "-MMTextInsetLeft 10", + "-MMTextInsetRight 5", + "-MMTextInsetTop 10", + "-MMTextInsetBottom 5", "-MMTabMaxWidth 384", "-MMTabOptimumWidth 132", - "-MMStatuslineOff 1", + "-MMOpenFilesInTabs 1", "-MMNoWindow 1", "-MMTabMinWidth 32", "-MMCellWidthMultiplier 1.414", @@ -144,6 +144,11 @@ name = NSZombieEnabled; value = YES; }, + { + active = NO; + name = NSObjCMessageLoggingEnabled; + value = YES; + }, ); executableSystemSymbolLevel = 0; executableUserSymbolLevel = 0; @@ -217,7 +222,7 @@ delayBeforeContinue = 0; hitCount = 1; location = AppKit; - modificationTime = 208946307.079667; + modificationTime = 209732042.802391; state = 2; symbolName = "[NSView performKeyEquivalent:]"; }; @@ -230,7 +235,7 @@ delayBeforeContinue = 0; hitCount = 1; location = Foundation; - modificationTime = 208946315.868945; + modificationTime = 209732047.262262; state = 1; symbolName = "-[_NSZombie methodSignatureForSelector:]"; }; @@ -243,10 +248,47 @@ delayBeforeContinue = 0; hitCount = 1; location = Foundation; - modificationTime = 208946315.819578; + modificationTime = 209732047.175895; state = 1; symbolName = "[NSException raise]"; }; + 1DD66EA30C802F2D00EBDAB3 /* MMTextView.m:594 */ = { + isa = PBXFileBreakpoint; + actions = ( + ); + breakpointStyle = 0; + continueAfterActions = 0; + delayBeforeContinue = 0; + fileReference = 1D1474AE0C5678370038FA2B /* MMTextView.m */; + functionName = "-keyDown:"; + hitCount = 1; + lineNumber = 594; + location = MacVim; + modificationTime = 209732042.795645; + state = 2; + }; + 1DD66EB70C80301100EBDAB3 /* MMTextView.m:172 */ = { + isa = PBXFileBreakpoint; + actions = ( + ); + breakpointStyle = 0; + continueAfterActions = 0; + delayBeforeContinue = 0; + fileReference = 1D1474AE0C5678370038FA2B /* MMTextView.m */; + functionName = "-performKeyEquivalent:"; + hitCount = 3; + lineNumber = 172; + location = MacVim; + modificationTime = 209732165.15915; + state = 2; + }; + 1DD66ECC0C803D3600EBDAB3 /* MMApplication.m */ = { + uiCtxt = { + sepNavIntBoundsRect = "{{0, 0}, {795, 736}}"; + sepNavSelRange = "{1597, 0}"; + sepNavVisRect = "{{0, 247}, {795, 162}}"; + }; + }; 1DD704300BA9F9C2008679E9 /* SpecialKeys.plist */ = { uiCtxt = { sepNavIntBoundsRect = "{{0, 0}, {797, 1008}}"; @@ -262,6 +304,8 @@ 1D9B9FEF0BB34E7700F878F2 /* [NSException raise] */, 1D6F54990C7358B600D9BDC8 /* [NSView performKeyEquivalent:] */, 1D6F54CB0C7371E000D9BDC8 /* -[_NSZombie methodSignatureForSelector:] */, + 1DD66EA30C802F2D00EBDAB3 /* MMTextView.m:594 */, + 1DD66EB70C80301100EBDAB3 /* MMTextView.m:172 */, ); }; 29B97313FDCFA39411CA2CEA /* Project object */ = { @@ -275,6 +319,8 @@ 1D9B9FEF0BB34E7700F878F2 /* [NSException raise] */, 1D6F54990C7358B600D9BDC8 /* [NSView performKeyEquivalent:] */, 1D6F54CB0C7371E000D9BDC8 /* -[_NSZombie methodSignatureForSelector:] */, + 1DD66EA30C802F2D00EBDAB3 /* MMTextView.m:594 */, + 1DD66EB70C80301100EBDAB3 /* MMTextView.m:172 */, ); breakpointsGroup = 1DE445650BA493EC00C4C77A /* XCBreakpointsBucket */; codeSenseManager = 1D16B9DE0BA33BB000A69B33 /* Code sense */; @@ -392,8 +438,8 @@ PBXFileDataSource_Warnings_ColumnID, ); }; - PBXPerProjectTemplateStateSaveDate = 209024719; - PBXWorkspaceStateSaveDate = 209024719; + PBXPerProjectTemplateStateSaveDate = 209732622; + PBXWorkspaceStateSaveDate = 209732622; }; sourceControlManager = 1D16B9DD0BA33BB000A69B33 /* Source Control */; userBuildSettings = { From 4cf33421e594a432616af80ec3490c41ded4babc Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sat, 25 Aug 2007 11:05:08 +0000 Subject: [PATCH 0167/1156] Intercept 'help' key presses and clear the NSHelpKeyMask modifier flag git-svn-id: http://macvim.googlecode.com/svn/trunk@194 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMApplication.h | 18 ++++++++++++++++++ MMApplication.m | 45 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+) create mode 100644 MMApplication.h create mode 100644 MMApplication.m diff --git a/MMApplication.h b/MMApplication.h new file mode 100644 index 0000000000..fcae57fc35 --- /dev/null +++ b/MMApplication.h @@ -0,0 +1,18 @@ +/* vi:set ts=8 sts=4 sw=4 ft=objc: + * + * VIM - Vi IMproved by Bram Moolenaar + * MacVim GUI port by Bjorn Winckler + * + * Do ":help uganda" in Vim to read copying and usage conditions. + * Do ":help credits" in Vim to see a list of people who contributed. + * See README.txt for an overview of the Vim source code. + */ + +#import +#import "MacVim.h" + + +@interface MMApplication : NSApplication { +} + +@end diff --git a/MMApplication.m b/MMApplication.m new file mode 100644 index 0000000000..3a9723a477 --- /dev/null +++ b/MMApplication.m @@ -0,0 +1,45 @@ +/* vi:set ts=8 sts=4 sw=4 ft=objc: + * + * VIM - Vi IMproved by Bram Moolenaar + * MacVim GUI port by Bjorn Winckler + * + * Do ":help uganda" in Vim to read copying and usage conditions. + * Do ":help credits" in Vim to see a list of people who contributed. + * See README.txt for an overview of the Vim source code. + */ + +#import "MMApplication.h" + + + + +@implementation MMApplication + +- (void)sendEvent:(NSEvent *)event +{ + NSEventType type = [event type]; + unsigned flags = [event modifierFlags]; + + // HACK! Intercept 'help' key presses and clear the 'help key flag', else + // Cocoa turns the mouse cursor into a question mark and goes into 'context + // help mode' (the keyDown: event itself never reaches the text view). By + // clearing the 'help key flag' this event will be treated like a normal + // key event. + if ((NSKeyDown == type || NSKeyUp == type) && (flags & NSHelpKeyMask)) { + flags &= ~NSHelpKeyMask; + event = [NSEvent keyEventWithType:[event type] + location:[event locationInWindow] + modifierFlags:flags + timestamp:[event timestamp] + windowNumber:[event windowNumber] + context:[event context] + characters:[event characters] + charactersIgnoringModifiers:[event charactersIgnoringModifiers] + isARepeat:[event isARepeat] + keyCode:[event keyCode]]; + } + + [super sendEvent:event]; +} + +@end From 4ebf957309ac7dd597b43ca85c58f915fda6d76d Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sat, 25 Aug 2007 20:07:01 +0000 Subject: [PATCH 0168/1156] Fixed various bugs related to insertion point drawing git-svn-id: http://macvim.googlecode.com/svn/trunk@195 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMApplication.h | 1 - MMTextStorage.m | 9 ++++++--- MMTextView.h | 1 + MMTextView.m | 47 +++++++++++++++++++++++++++-------------------- MMVimController.m | 41 +++++++++++++++++++++++++++++++++++++++++ gui_macvim.m | 7 +++++++ 6 files changed, 82 insertions(+), 24 deletions(-) diff --git a/MMApplication.h b/MMApplication.h index fcae57fc35..28937e9745 100644 --- a/MMApplication.h +++ b/MMApplication.h @@ -9,7 +9,6 @@ */ #import -#import "MacVim.h" @interface MMApplication : NSApplication { diff --git a/MMTextStorage.m b/MMTextStorage.m index 51a9a2d6c7..7574f13a6a 100644 --- a/MMTextStorage.m +++ b/MMTextStorage.m @@ -14,7 +14,7 @@ // If 0 DRAW_TRANSP flag will be ignored. Setting it to 1 causes the cursor -// background to be drawn in white. +// background to be drawn in white. TODO: Figure out why this flag is set. #define HEED_DRAW_TRANSP 0 #define DRAW_TRANSP 0x01 /* draw with transparant bg */ @@ -161,6 +161,11 @@ - (void)replaceString:(NSString *)string atRow:(int)row column:(int)col //NSLog(@"replaceString:atRow:%d column:%d withFlags:%d", row, col, flags); [self lazyResize]; +#if !HEED_DRAW_TRANSP + if (flags & DRAW_TRANSP) + return; +#endif + if (row < 0 || row >= maxRows || col < 0 || col >= maxColumns || col+[string length] > maxColumns) { //NSLog(@"[%s] WARNING : out of range, row=%d (%d) col=%d (%d) " @@ -185,9 +190,7 @@ - (void)replaceString:(NSString *)string atRow:(int)row column:(int)col NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys: font, NSFontAttributeName, -#if !HEED_DRAW_TRANSP bg, NSBackgroundColorAttributeName, -#endif fg, NSForegroundColorAttributeName, sp, NSUnderlineColorAttributeName, nil]; diff --git a/MMTextView.h b/MMTextView.h index 911c63ee46..816c3c5477 100644 --- a/MMTextView.h +++ b/MMTextView.h @@ -27,6 +27,7 @@ } - (NSEvent *)lastMouseDownEvent; +- (void)setShouldDrawInsertionPoint:(BOOL)on; - (void)drawInsertionPointAtRow:(int)row column:(int)col shape:(int)shape color:(NSColor *)color; diff --git a/MMTextView.m b/MMTextView.m index e8c8b158f6..3dd8f72d49 100644 --- a/MMTextView.m +++ b/MMTextView.m @@ -58,9 +58,17 @@ - (BOOL)shouldDrawInsertionPoint return NO; } +- (void)setShouldDrawInsertionPoint:(BOOL)on +{ + shouldDrawInsertionPoint = on; +} + - (void)drawInsertionPointAtRow:(int)row column:(int)col shape:(int)shape color:(NSColor *)color { + //NSLog(@"drawInsertionPointAtRow:%d column:%d shape:%d color:%@", + // row, col, shape, color); + // This only stores where to draw the insertion point, the actual drawing // is done in drawRect:. shouldDrawInsertionPoint = YES; @@ -89,31 +97,32 @@ - (void)drawRect:(NSRect)rect NSRange glyphRange = [lm glyphRangeForCharacterRange:NSMakeRange(charIdx,1) actualCharacterRange:NULL]; - NSRect glyphRect = [lm boundingRectForGlyphRange:glyphRange - inTextContainer:tc]; - glyphRect.origin.x += [self textContainerOrigin].x; - glyphRect.origin.y += [self textContainerOrigin].y; + NSRect ipRect = [lm boundingRectForGlyphRange:glyphRange + inTextContainer:tc]; + ipRect.origin.x += [self textContainerOrigin].x; + ipRect.origin.y += [self textContainerOrigin].y; if (MMInsertionPointHorizontal == insertionPointShape) { - glyphRect.origin.y += glyphRect.size.height - 1; - glyphRect.size.height = 2; + ipRect.origin.y += ipRect.size.height - 2; + ipRect.size.height = 2; } else if (MMInsertionPointVertical == insertionPointShape) { - glyphRect.size.width = 2; + ipRect.size.width = 2; } + [[self insertionPointColor] set]; if (MMInsertionPointHollow == insertionPointShape) { - // This looks very ugly. - [[self insertionPointColor] set]; - //[NSBezierPath setDefaultLineWidth:2.0]; - //[NSBezierPath setDefaultLineJoinStyle:NSRoundLineJoinStyle]; - [NSBezierPath strokeRect:glyphRect]; + NSFrameRect(ipRect); } else { - NSRectFill(glyphRect); + NSRectFill(ipRect); } // NOTE: We only draw the cursor once and rely on Vim to say when it // should be drawn again. shouldDrawInsertionPoint = NO; + + //NSLog(@"%s draw insertion point %@ shape=%d color=%@", _cmd, + // NSStringFromRect(ipRect), insertionPointShape, + // [self insertionPointColor]); } } @@ -378,15 +387,13 @@ - (void)mouseExited:(NSEvent *)event { //NSLog(@"%s", _cmd); - int shape = 0; - NSMutableData *data = [NSMutableData data]; - [[self window] setAcceptsMouseMovedEvents:NO]; - [data appendBytes:&shape length:sizeof(int)]; - [[self vimController] sendMessage:SetMouseShapeMsgID data:data wait:NO]; - - if (isDragging) { + if ([[self window] isKeyWindow]) { + int shape = 0; + NSMutableData *data = [NSMutableData data]; + [data appendBytes:&shape length:sizeof(int)]; + [[self vimController] sendMessage:SetMouseShapeMsgID data:data wait:NO]; } } diff --git a/MMVimController.m b/MMVimController.m index 5a8106c494..83c7025b2e 100644 --- a/MMVimController.m +++ b/MMVimController.m @@ -17,6 +17,8 @@ #define MM_NO_REQUEST_TIMEOUT 1 +// This is taken from gui.h +#define DRAW_CURSOR 0x20 static NSString *MMDefaultToolbarImageName = @"Attention"; static int MMAlertTextFieldHeight = 22; @@ -747,6 +749,9 @@ - (void)handleMessage:(int)msgid data:(NSData *)data } } + +#define MM_DEBUG_DRAWING 0 + - (void)performBatchDrawWithData:(NSData *)data { // TODO! Move to window controller. @@ -758,6 +763,9 @@ - (void)performBatchDrawWithData:(NSData *)data const void *bytes = [data bytes]; const void *end = bytes + [data length]; +#if MM_DEBUG_DRAWING + NSLog(@"====> BEGIN %s", _cmd); +#endif [textStorage beginEditing]; // TODO: Sanity check input @@ -768,6 +776,9 @@ - (void)performBatchDrawWithData:(NSData *)data if (ClearAllDrawType == type) { int color = *((int*)bytes); bytes += sizeof(int); +#if MM_DEBUG_DRAWING + NSLog(@" Clear all"); +#endif [textStorage clearAllWithColor:[NSColor colorWithRgbInt:color]]; } else if (ClearBlockDrawType == type) { int color = *((int*)bytes); bytes += sizeof(int); @@ -776,6 +787,10 @@ - (void)performBatchDrawWithData:(NSData *)data int row2 = *((int*)bytes); bytes += sizeof(int); int col2 = *((int*)bytes); bytes += sizeof(int); +#if MM_DEBUG_DRAWING + NSLog(@" Clear block (%d,%d) -> (%d,%d)", row1, col1, + row2,col2); +#endif [textStorage clearBlockFromRow:row1 column:col1 toRow:row2 column:col2 color:[NSColor colorWithRgbInt:color]]; @@ -787,6 +802,9 @@ - (void)performBatchDrawWithData:(NSData *)data int left = *((int*)bytes); bytes += sizeof(int); int right = *((int*)bytes); bytes += sizeof(int); +#if MM_DEBUG_DRAWING + NSLog(@" Delete %d line(s) from %d", count, row); +#endif [textStorage deleteLinesFromRow:row lineCount:count scrollBottom:bot left:left right:right color:[NSColor colorWithRgbInt:color]]; @@ -805,6 +823,20 @@ - (void)performBatchDrawWithData:(NSData *)data freeWhenDone:NO]; bytes += len; +#if MM_DEBUG_DRAWING + NSLog(@" Draw string at (%d,%d) length=%d flags=%d fg=0x%x " + "bg=0x%x sp=0x%x (%@)", row, col, len, flags, fg, bg, sp, + len > 0 ? [string substringToIndex:1] : @""); +#endif + // NOTE: If this is a call to draw the (block) cursor, then cancel + // any previous request to draw the insertion point, or it might + // get drawn as well. + if (flags & DRAW_CURSOR) { + [textView setShouldDrawInsertionPoint:NO]; + //[textView drawInsertionPointAtRow:row column:col + // shape:MMInsertionPointBlock + // color:[NSColor colorWithRgbInt:bg]]; + } [textStorage replaceString:string atRow:row column:col withFlags:flags @@ -821,6 +853,9 @@ - (void)performBatchDrawWithData:(NSData *)data int left = *((int*)bytes); bytes += sizeof(int); int right = *((int*)bytes); bytes += sizeof(int); +#if MM_DEBUG_DRAWING + NSLog(@" Insert %d line(s) at row %d", count, row); +#endif [textStorage insertLinesAtRow:row lineCount:count scrollBottom:bot left:left right:right color:[NSColor colorWithRgbInt:color]]; @@ -830,6 +865,9 @@ - (void)performBatchDrawWithData:(NSData *)data int col = *((int*)bytes); bytes += sizeof(int); int shape = *((int*)bytes); bytes += sizeof(int); +#if MM_DEBUG_DRAWING + NSLog(@" Draw cursor at (%d,%d)", row, col); +#endif [textView drawInsertionPointAtRow:row column:col shape:shape color:[NSColor colorWithRgbInt:color]]; } else { @@ -838,6 +876,9 @@ - (void)performBatchDrawWithData:(NSData *)data } [textStorage endEditing]; +#if MM_DEBUG_DRAWING + NSLog(@"<==== END %s", _cmd); +#endif } - (void)savePanelDidEnd:(NSSavePanel *)panel code:(int)code diff --git a/gui_macvim.m b/gui_macvim.m index c811c440dc..61cdd987e5 100644 --- a/gui_macvim.m +++ b/gui_macvim.m @@ -1034,6 +1034,13 @@ { //NSLog(@"gui_mch_draw_part_cursor(w=%d, h=%d, color=0x%x)", w, h, color); + // HACK! 'w' and 'h' are always 1 since we do not tell Vim about the exact + // font dimensions. Thus these parameters are useless. For the moment we + // just check if the cursor should be vertical or horizontal and pass this + // info on to MacVim. This means that the cursor does not look the way it + // is supposed to e.g. after pressing 'd' in normal mode. + // + // TODO: fix this int shape = MMInsertionPointBlock; switch (shape_table[get_shape_idx(FALSE)].shape) { case SHAPE_HOR: shape = MMInsertionPointHorizontal; break; From a7fd626eb0bb850bc792c1cbbb179a952db8673e Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sat, 25 Aug 2007 20:08:26 +0000 Subject: [PATCH 0169/1156] git-svn-id: http://macvim.googlecode.com/svn/trunk@196 96c4425d-ca35-0410-94e5-3396d5c13a8f --- README | 25 +++++++++++++++---------- TODO | 2 +- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/README b/README index 241dfb592a..54115e773a 100644 --- a/README +++ b/README @@ -36,9 +36,9 @@ Weirdness: - The way delegate messages from the tab bar are handled are based on lots of assumptions on how the code works. See comments in tabView:... delegate messages in MMWindowController. -- The insertion point is automatically moved to wherever changes are made in - the text storage. To set the position manually (via setSelectedRange:), - first call endEditing on the text storage. +- [obsolete] The insertion point is automatically moved to wherever changes are + made in the text storage. To set the position manually (via + setSelectedRange:), first call endEditing on the text storage. - Delegate messages from the tab view need to be able to differentiate whether the message was sent due to the user clicking a tab with the mouse, or if the vim task initiated the change. To facilitate this, flags must be set @@ -65,13 +65,18 @@ Weirdness: sent to Vim asking it to change the "shell size". Otherwise, a message asking Vim to change the shell size might get lost and Vim and MacVim will have inconsistent states. -- gui_mch_browse() is a blocking call, but you can't put up dialogs in Cocoa - which block until the user dismisses them (it uses callbacks). This - complicates the browsing somewhat. +- gui_mch_browse() and gui_mch_dialog() are blocking calls, but you can't put + up dialogs in Cocoa which block until the user dismisses them (it uses + callbacks). This complicates the browsing somewhat. - When binding menus to :action note that that action will be used for all modes. The reason for this is that MacVim needs to be able to execute such menu items even when no windows are open (e.g. newVimWindow:) and the default menu action relies on Vim to deal with it. +- The 'help' key is treated as a special key by Cocoa; when the user presses + this key the mouse cursor changes to a question mark and the application is + put into 'context help mode'. The key down event is never sent down the + responder chain. To get around this problem we are forced to subclass + NSApplication and look for the 'help' key in sendEvent: (see MMApplication). Design decisions: @@ -120,7 +125,7 @@ Keyboard stuff: returns 1, charactersIgnoringModifiers returns . - (2) handles: Ctrl+key, enter, backspace, escape. same note on translation of Ctrl+key as above holds true. -- (3) handles: Cmd+key, arrow keys, function keys +- (3) handles: Cmd+key, arrow keys, function keys, help key - and are two different characters (the former is 0xa0) @@ -152,8 +157,8 @@ Features (!supp indicates that a feature is not supported): - Cocoa input protocols: input managers, character palette input etc. supported, marked text !supp, cocoa key bindings (DefaultKeyBinding.dict) are disabled -- Mouse: resize (vim) windows, selection, different mouse cursors !supp, - autoscrolling whilst selecting works poorly +- Mouse: resize (vim) windows, selection, different mouse cursors, + autoscrolling whilst selecting (horizontal autoscroll !supp) - Drag and Drop: drag files onto dock icon to open in tabs, drag text and files onto text view - Zoom: Command-click to zoom to fill window, otherwise only zoom height, @@ -162,6 +167,7 @@ Features (!supp indicates that a feature is not supported): higher than can fit the screen (no such restrictions on width at the moment) - Pasteboard: star-register works with the mac os x pasteboard - Open/Save dialog: use with :browse +- Gui dialogs - Fonts: bold/italic/underline traits supported, font changes with ':set gfn', or use font panel - File type associations: add more associations by editing Info.plist @@ -170,7 +176,6 @@ Features (!supp indicates that a feature is not supported): - Wide characters: but composed characters !supp - Printing: !supp - Find/Replace dialog: !supp -- Gui dialogs: !supp - External editor protocol: !supp - Services menu: some simple minded provider entries - Encodings: !supp (enc, tenc always set to utf-8) diff --git a/TODO b/TODO index 026bed2295..6168eddf67 100644 --- a/TODO +++ b/TODO @@ -1,6 +1,5 @@ Active: -- Hollow insertion point drawing does not always work - Insertion point blinking - Build Vim (make) from Xcode project - Cmd-W in about box sends vimMenuAction: instead of performClose: @@ -54,6 +53,7 @@ Active: Pending: +- Hollow insertion point drawing does not always work - cursor in replace mode - should ignore action message if is called too often (e.g. in addNewTab:) - application:openFiles: should open in tabs in current window instead of in a From d3cf683553521ef4a4b06d8348d2104934ad77a7 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sun, 26 Aug 2007 11:22:55 +0000 Subject: [PATCH 0170/1156] Size of partial cursor is determined by shape_table instead of having a fixed size of 2 pixels. git-svn-id: http://macvim.googlecode.com/svn/trunk@198 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMBackend.h | 2 +- MMBackend.m | 3 ++- MMTextView.h | 3 ++- MMTextView.m | 11 +++++++---- MMVimController.m | 2 ++ gui_macvim.m | 25 +++++++++++-------------- 6 files changed, 25 insertions(+), 21 deletions(-) diff --git a/MMBackend.h b/MMBackend.h index 42c2a742ad..6e043ad757 100644 --- a/MMBackend.h +++ b/MMBackend.h @@ -48,7 +48,7 @@ - (void)insertLinesFromRow:(int)row count:(int)count scrollBottom:(int)bottom left:(int)left right:(int)right; - (void)drawCursorAtRow:(int)row column:(int)col shape:(int)shape - color:(int)color; + fraction:(int)percent color:(int)color; - (void)flushQueue:(BOOL)force; - (BOOL)waitForInput:(int)milliseconds; - (void)exit; diff --git a/MMBackend.m b/MMBackend.m index 992f05e8d8..3c2c0d408e 100644 --- a/MMBackend.m +++ b/MMBackend.m @@ -270,7 +270,7 @@ - (void)insertLinesFromRow:(int)row count:(int)count } - (void)drawCursorAtRow:(int)row column:(int)col shape:(int)shape - color:(int)color + fraction:(int)percent color:(int)color { int type = DrawCursorDrawType; @@ -280,6 +280,7 @@ - (void)drawCursorAtRow:(int)row column:(int)col shape:(int)shape [drawData appendBytes:&row length:sizeof(int)]; [drawData appendBytes:&col length:sizeof(int)]; [drawData appendBytes:&shape length:sizeof(int)]; + [drawData appendBytes:&percent length:sizeof(int)]; } - (void)flushQueue:(BOOL)force diff --git a/MMTextView.h b/MMTextView.h index 816c3c5477..d5ff079020 100644 --- a/MMTextView.h +++ b/MMTextView.h @@ -24,11 +24,12 @@ int insertionPointRow; int insertionPointColumn; int insertionPointShape; + int insertionPointFraction; } - (NSEvent *)lastMouseDownEvent; - (void)setShouldDrawInsertionPoint:(BOOL)on; - (void)drawInsertionPointAtRow:(int)row column:(int)col shape:(int)shape - color:(NSColor *)color; + fraction:(int)percent color:(NSColor *)color; @end diff --git a/MMTextView.m b/MMTextView.m index 3dd8f72d49..7ed96f43b9 100644 --- a/MMTextView.m +++ b/MMTextView.m @@ -64,7 +64,7 @@ - (void)setShouldDrawInsertionPoint:(BOOL)on } - (void)drawInsertionPointAtRow:(int)row column:(int)col shape:(int)shape - color:(NSColor *)color + fraction:(int)percent color:(NSColor *)color { //NSLog(@"drawInsertionPointAtRow:%d column:%d shape:%d color:%@", // row, col, shape, color); @@ -75,6 +75,7 @@ - (void)drawInsertionPointAtRow:(int)row column:(int)col shape:(int)shape insertionPointRow = row; insertionPointColumn = col; insertionPointShape = shape; + insertionPointFraction = percent; [self setInsertionPointColor:color]; } @@ -103,10 +104,12 @@ - (void)drawRect:(NSRect)rect ipRect.origin.y += [self textContainerOrigin].y; if (MMInsertionPointHorizontal == insertionPointShape) { - ipRect.origin.y += ipRect.size.height - 2; - ipRect.size.height = 2; + int frac = (ipRect.size.height * insertionPointFraction + 99)/100; + ipRect.origin.y += ipRect.size.height - frac; + ipRect.size.height = frac; } else if (MMInsertionPointVertical == insertionPointShape) { - ipRect.size.width = 2; + int frac = (ipRect.size.width * insertionPointFraction + 99)/100; + ipRect.size.width = frac; } [[self insertionPointColor] set]; diff --git a/MMVimController.m b/MMVimController.m index 83c7025b2e..0de871d11e 100644 --- a/MMVimController.m +++ b/MMVimController.m @@ -864,11 +864,13 @@ - (void)performBatchDrawWithData:(NSData *)data int row = *((int*)bytes); bytes += sizeof(int); int col = *((int*)bytes); bytes += sizeof(int); int shape = *((int*)bytes); bytes += sizeof(int); + int percent = *((int*)bytes); bytes += sizeof(int); #if MM_DEBUG_DRAWING NSLog(@" Draw cursor at (%d,%d)", row, col); #endif [textView drawInsertionPointAtRow:row column:col shape:shape + fraction:percent color:[NSColor colorWithRgbInt:color]]; } else { NSLog(@"WARNING: Unknown draw type (type=%d)", type); diff --git a/gui_macvim.m b/gui_macvim.m index 61cdd987e5..e293ac111b 100644 --- a/gui_macvim.m +++ b/gui_macvim.m @@ -1020,9 +1020,9 @@ { //NSLog(@"gui_mch_draw_hollow_cursor(color=0x%x)", color); - return [[MMBackend sharedInstance] drawCursorAtRow:gui.row column:gui.col - shape:MMInsertionPointHollow - color:color]; + return [[MMBackend sharedInstance] + drawCursorAtRow:gui.row column:gui.col shape:MMInsertionPointHollow + fraction:100 color:color]; } @@ -1032,23 +1032,20 @@ void gui_mch_draw_part_cursor(int w, int h, guicolor_T color) { - //NSLog(@"gui_mch_draw_part_cursor(w=%d, h=%d, color=0x%x)", w, h, color); - // HACK! 'w' and 'h' are always 1 since we do not tell Vim about the exact - // font dimensions. Thus these parameters are useless. For the moment we - // just check if the cursor should be vertical or horizontal and pass this - // info on to MacVim. This means that the cursor does not look the way it - // is supposed to e.g. after pressing 'd' in normal mode. - // - // TODO: fix this + // font dimensions. Thus these parameters are useless. Instead we look at + // the shape_table to determine the shape and size of the cursor (just like + // gui_update_cursor() does). + int idx = get_shape_idx(FALSE); int shape = MMInsertionPointBlock; - switch (shape_table[get_shape_idx(FALSE)].shape) { + switch (shape_table[idx].shape) { case SHAPE_HOR: shape = MMInsertionPointHorizontal; break; case SHAPE_VER: shape = MMInsertionPointVertical; break; } - return [[MMBackend sharedInstance] drawCursorAtRow:gui.row column:gui.col - shape:shape color:color]; + return [[MMBackend sharedInstance] + drawCursorAtRow:gui.row column:gui.col shape:shape + fraction:shape_table[idx].percentage color:color]; } From 739b023c51514fbd319f06e1270334ffa637855f Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sun, 26 Aug 2007 13:19:52 +0000 Subject: [PATCH 0171/1156] Cursor blinking now supported git-svn-id: http://macvim.googlecode.com/svn/trunk@199 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMBackend.h | 8 ++ MMBackend.m | 84 ++++++++++++- gui_macvim.m | 347 ++++++++++++++++++++++++--------------------------- 3 files changed, 248 insertions(+), 191 deletions(-) diff --git a/MMBackend.h b/MMBackend.h index 6e043ad757..f348ec5fbf 100644 --- a/MMBackend.h +++ b/MMBackend.h @@ -27,6 +27,11 @@ int defaultForegroundColor; NSDate *lastFlushDate; id dialogReturn; + NSTimer *blinkTimer; + int blinkState; + NSTimeInterval blinkWaitInterval; + NSTimeInterval blinkOnInterval; + NSTimeInterval blinkOffInterval; } + (MMBackend *)sharedInstance; @@ -81,6 +86,9 @@ - (BOOL)setFontWithName:(char *)name; - (void)executeActionWithName:(NSString *)name; - (void)setMouseShape:(int)shape; +- (void)setBlinkWait:(int)wait on:(int)on off:(int)off; +- (void)startBlink; +- (void)stopBlink; - (int)lookupColorWithKey:(NSString *)key; diff --git a/MMBackend.m b/MMBackend.m index 3c2c0d408e..b44be40e6c 100644 --- a/MMBackend.m +++ b/MMBackend.m @@ -27,6 +27,12 @@ static int eventButtonNumberToVimMouseButton(int buttonNumber); static int specialKeyToNSKey(int key); +enum { + MMBlinkStateNone = 0, + MMBlinkStateOn, + MMBlinkStateOff +}; + @interface MMBackend (Private) - (void)handleMessage:(int)msgid data:(NSData *)data; @@ -34,6 +40,7 @@ + (NSDictionary *)specialKeys; - (void)handleKeyDown:(NSString *)key modifiers:(int)mods; - (void)queueMessage:(int)msgid data:(NSData *)data; - (void)connectionDidDie:(NSNotification *)notification; +- (void)blinkTimerFired:(NSTimer *)timer; @end @@ -65,11 +72,12 @@ - (void)dealloc [[NSNotificationCenter defaultCenter] removeObserver:self]; - [queue release]; - [drawData release]; - [frontendProxy release]; - [connection release]; - [colorDict release]; + [blinkTimer release]; blinkTimer = nil; + [queue release]; queue = nil; + [drawData release]; drawData = nil; + [frontendProxy release]; frontendProxy = nil; + [connection release]; connection = nil; + [colorDict release]; colorDict = nil; [super dealloc]; } @@ -763,6 +771,46 @@ - (void)setMouseShape:(int)shape [self queueMessage:SetMouseShapeMsgID data:data]; } +- (void)setBlinkWait:(int)wait on:(int)on off:(int)off +{ + // Vim specifies times in milliseconds, whereas Cocoa wants them in + // seconds. + blinkWaitInterval = .001f*wait; + blinkOnInterval = .001f*on; + blinkOffInterval = .001f*off; +} + +- (void)startBlink +{ + if (blinkTimer) { + [blinkTimer invalidate]; + [blinkTimer release]; + blinkTimer = nil; + } + + if (blinkWaitInterval > 0 && blinkOnInterval > 0 && blinkOffInterval > 0 + && gui.in_focus) { + blinkState = MMBlinkStateOn; + blinkTimer = + [[NSTimer scheduledTimerWithTimeInterval:blinkWaitInterval + target:self + selector:@selector(blinkTimerFired:) + userInfo:nil repeats:NO] retain]; + gui_update_cursor(TRUE, FALSE); + [self flushQueue:YES]; + } +} + +- (void)stopBlink +{ + if (MMBlinkStateOff == blinkState) { + gui_update_cursor(TRUE, FALSE); + [self flushQueue:YES]; + } + + blinkState = MMBlinkStateNone; +} + - (int)lookupColorWithKey:(NSString *)key { if (!(key && [key length] > 0)) @@ -1356,6 +1404,32 @@ - (void)connectionDidDie:(NSNotification *)notification getout(0); } +- (void)blinkTimerFired:(NSTimer *)timer +{ + NSTimeInterval timeInterval = 0; + + [blinkTimer release]; + blinkTimer = nil; + + if (MMBlinkStateOn == blinkState) { + gui_undraw_cursor(); + blinkState = MMBlinkStateOff; + timeInterval = blinkOffInterval; + } else if (MMBlinkStateOff == blinkState) { + gui_update_cursor(TRUE, FALSE); + blinkState = MMBlinkStateOn; + timeInterval = blinkOnInterval; + } + + if (timeInterval > 0) { + blinkTimer = + [[NSTimer scheduledTimerWithTimeInterval:timeInterval target:self + selector:@selector(blinkTimerFired:) + userInfo:nil repeats:NO] retain]; + [self flushQueue:YES]; + } +} + @end // MMBackend (Private) diff --git a/gui_macvim.m b/gui_macvim.m index e293ac111b..de49b6f52a 100644 --- a/gui_macvim.m +++ b/gui_macvim.m @@ -426,7 +426,67 @@ } -// -- Tab line -------------------------------------------------------------- +/* + * Set the current text foreground color. + */ + void +gui_mch_set_fg_color(guicolor_T color) +{ + [[MMBackend sharedInstance] setForegroundColor:color]; +} + + +/* + * Set the current text background color. + */ + void +gui_mch_set_bg_color(guicolor_T color) +{ + [[MMBackend sharedInstance] setBackgroundColor:color]; +} + + +/* + * Set the current text special color (used for underlines). + */ + void +gui_mch_set_sp_color(guicolor_T color) +{ + [[MMBackend sharedInstance] setSpecialColor:color]; +} + + +/* + * Set default colors. + */ + void +gui_mch_def_colors() +{ + // Default foreground and background colors are black and white. + gui.def_norm_pixel = gui.norm_pixel = 0; + gui.def_back_pixel = gui.back_pixel = 0xffffff; +} + + +/* + * Called when the foreground or background color has been changed. + */ + void +gui_mch_new_colors(void) +{ + gui.def_back_pixel = gui.back_pixel; + gui.def_norm_pixel = gui.norm_pixel; + + //NSLog(@"gui_mch_new_colors(back=%x, norm=%x)", gui.def_back_pixel, + // gui.def_norm_pixel); + + [[MMBackend sharedInstance] + setDefaultColorsBackground:gui.def_back_pixel + foreground:gui.def_norm_pixel]; +} + + +// -- Tabline --------------------------------------------------------------- /* @@ -435,7 +495,6 @@ void gui_mch_set_curtab(int nr) { - //NSLog(@"gui_mch_set_curtab(nr=%d)", nr); [[MMBackend sharedInstance] selectTab:nr]; } @@ -446,7 +505,6 @@ int gui_mch_showing_tabline(void) { - //NSLog(@"gui_mch_showing_tabline()"); return [[MMBackend sharedInstance] tabBarVisible]; } @@ -456,7 +514,6 @@ void gui_mch_update_tabline(void) { - //NSLog(@"gui_mch_update_tabline()"); [[MMBackend sharedInstance] updateTabBar]; } @@ -466,7 +523,6 @@ void gui_mch_show_tabline(int showit) { - //NSLog(@"gui_mch_show_tabline(showit=%d)", showit); [[MMBackend sharedInstance] showTabBar:showit]; } @@ -588,8 +644,6 @@ void gui_mch_add_menu(vimmenu_T *menu, int idx) { - //NSLog(@"gui_mch_add_menu(name=%s, idx=%d)", menu->name, idx); - // HACK! If menu has no parent, then we set the parent tag to the type of // menu it is. This will not mix up tag and type because pointers can not // take values close to zero (and the tag is simply the value of the @@ -613,9 +667,6 @@ void gui_mch_add_menu_item(vimmenu_T *menu, int idx) { - //NSLog(@"gui_mch_add_menu_item(name=%s, accel=%s idx=%d)", menu->dname, - // menu->actext, idx); - // NOTE! If 'iconfile' is not set but 'iconidx' is, use the name of the // menu item. (Should correspond to a stock item.) char *icon = menu->iconfile ? (char*)menu->iconfile : @@ -665,8 +716,6 @@ void gui_mch_destroy_menu(vimmenu_T *menu) { - //NSLog(@"gui_mch_destroy_menu(name=%s)", menu->name); - [[MMBackend sharedInstance] removeMenuItemWithTag:(int)menu]; } @@ -677,7 +726,6 @@ void gui_mch_menu_grey(vimmenu_T *menu, int grey) { - //NSLog(@"gui_mch_menu_grey(name=%s, grey=%d)", menu->name, grey); [[MMBackend sharedInstance] enableMenuItemWithTag:(int)menu state:!grey]; } @@ -689,8 +737,6 @@ void gui_mch_menu_hidden(vimmenu_T *menu, int hidden) { - //NSLog(@"gui_mch_menu_hidden(name=%s, hidden=%d)", menu->name, hidden); - // HACK! There is no (obvious) way to hide a menu item, so simply // enable/disable it instead. [[MMBackend sharedInstance] @@ -704,8 +750,6 @@ void gui_mch_show_popupmenu(vimmenu_T *menu) { - //NSLog(@"gui_mch_show_popupmenu(name=%s)", menu->name); - [[MMBackend sharedInstance] showPopupMenuWithName:(char*)menu->name atMouseLocation:YES]; } @@ -717,7 +761,6 @@ void gui_make_popup(char_u *path_name, int mouse_pos) { - // TODO: Unless mouse_pos set, popup at cursor location. [[MMBackend sharedInstance] showPopupMenuWithName:(char*)path_name atMouseLocation:mouse_pos]; } @@ -757,8 +800,6 @@ if (toolbar_flags & TOOLBAR_ICONS) flags |= ToolbarIconFlag; if (tbis_flags & (TBIS_MEDIUM|TBIS_LARGE)) flags |= ToolbarSizeRegularFlag; - //NSLog(@"gui_mch_show_toolbar(showit=%d, flags=%d)", showit, flags); - [[MMBackend sharedInstance] showToolbar:showit flags:flags]; } @@ -830,8 +871,6 @@ } - - // -- Scrollbars ------------------------------------------------------------ @@ -840,9 +879,6 @@ scrollbar_T *sb, int orient) /* SBAR_VERT or SBAR_HORIZ */ { - //NSLog(@"gui_mch_create_scrollbar(id=%d, orient=%d, type=%d)", - // sb->ident, orient, sb->type); - [[MMBackend sharedInstance] createScrollbarWithIdentifier:sb->ident type:sb->type]; } @@ -851,8 +887,6 @@ void gui_mch_destroy_scrollbar(scrollbar_T *sb) { - //NSLog(@"gui_mch_destroy_scrollbar(id=%d)", sb->ident); - [[MMBackend sharedInstance] destroyScrollbarWithIdentifier:sb->ident]; } @@ -863,8 +897,6 @@ scrollbar_T *sb, int flag) { - //NSLog(@"gui_mch_enable_scrollbar(id=%d, flag=%d)", sb->ident, flag); - [[MMBackend sharedInstance] showScrollbarWithIdentifier:sb->ident state:flag]; } @@ -878,9 +910,6 @@ int w, int h) { - //NSLog(@"gui_mch_set_scrollbar_pos(id=%d, x=%d, y=%d, w=%d, h=%d)", - // sb->ident, x, y, w, h); - int pos = y; int len = h; if (SBAR_BOTTOM == sb->type) { @@ -900,14 +929,111 @@ long size, long max) { - //NSLog(@"gui_mch_set_scrollbar_thumb(id=%d, val=%d, size=%d, max=%d)", - // sb->ident, val, size, max); - [[MMBackend sharedInstance] setScrollbarThumbValue:val size:size max:max identifier:sb->ident]; } +// -- Cursor ---------------------------------------------------------------- + + +/* + * Draw a cursor without focus. + */ + void +gui_mch_draw_hollow_cursor(guicolor_T color) +{ + return [[MMBackend sharedInstance] + drawCursorAtRow:gui.row column:gui.col shape:MMInsertionPointHollow + fraction:100 color:color]; +} + + +/* + * Draw part of a cursor, only w pixels wide, and h pixels high. + */ + void +gui_mch_draw_part_cursor(int w, int h, guicolor_T color) +{ + // HACK! 'w' and 'h' are always 1 since we do not tell Vim about the exact + // font dimensions. Thus these parameters are useless. Instead we look at + // the shape_table to determine the shape and size of the cursor (just like + // gui_update_cursor() does). + int idx = get_shape_idx(FALSE); + int shape = MMInsertionPointBlock; + switch (shape_table[idx].shape) { + case SHAPE_HOR: shape = MMInsertionPointHorizontal; break; + case SHAPE_VER: shape = MMInsertionPointVertical; break; + } + + return [[MMBackend sharedInstance] + drawCursorAtRow:gui.row column:gui.col shape:shape + fraction:shape_table[idx].percentage color:color]; +} + + +/* + * Cursor blink functions. + * + * This is a simple state machine: + * BLINK_NONE not blinking at all + * BLINK_OFF blinking, cursor is not shown + * BLINK_ON blinking, cursor is shown + */ + void +gui_mch_set_blinking(long wait, long on, long off) +{ + [[MMBackend sharedInstance] setBlinkWait:wait on:on off:off]; +} + + +/* + * Start the cursor blinking. If it was already blinking, this restarts the + * waiting time and shows the cursor. + */ + void +gui_mch_start_blink(void) +{ + [[MMBackend sharedInstance] startBlink]; +} + + +/* + * Stop the cursor blinking. Show the cursor if it wasn't shown. + */ + void +gui_mch_stop_blink(void) +{ + [[MMBackend sharedInstance] stopBlink]; +} + + +// -- Mouse ----------------------------------------------------------------- + + +/* + * Get current mouse coordinates in text window. + */ + void +gui_mch_getmouse(int *x, int *y) +{ + //NSLog(@"gui_mch_getmouse()"); +} + + + void +gui_mch_setmouse(int x, int y) +{ + //NSLog(@"gui_mch_setmouse(x=%d, y=%d)", x, y); +} + + + void +mch_set_mouse_shape(int shape) +{ + [[MMBackend sharedInstance] setMouseShape:shape]; +} + @@ -1012,43 +1138,6 @@ } -/* - * Draw a cursor without focus. - */ - void -gui_mch_draw_hollow_cursor(guicolor_T color) -{ - //NSLog(@"gui_mch_draw_hollow_cursor(color=0x%x)", color); - - return [[MMBackend sharedInstance] - drawCursorAtRow:gui.row column:gui.col shape:MMInsertionPointHollow - fraction:100 color:color]; -} - - -/* - * Draw part of a cursor, only w pixels wide, and h pixels high. - */ - void -gui_mch_draw_part_cursor(int w, int h, guicolor_T color) -{ - // HACK! 'w' and 'h' are always 1 since we do not tell Vim about the exact - // font dimensions. Thus these parameters are useless. Instead we look at - // the shape_table to determine the shape and size of the cursor (just like - // gui_update_cursor() does). - int idx = get_shape_idx(FALSE); - int shape = MMInsertionPointBlock; - switch (shape_table[idx].shape) { - case SHAPE_HOR: shape = MMInsertionPointHorizontal; break; - case SHAPE_VER: shape = MMInsertionPointVertical; break; - } - - return [[MMBackend sharedInstance] - drawCursorAtRow:gui.row column:gui.col shape:shape - fraction:shape_table[idx].percentage color:color]; -} - - void gui_mch_flash(int msec) { @@ -1110,16 +1199,6 @@ } -/* - * Get current mouse coordinates in text window. - */ - void -gui_mch_getmouse(int *x, int *y) -{ - //NSLog(@"gui_mch_getmouse()"); -} - - /* * Return OK if the key with the termcap name "name" is supported. */ @@ -1149,67 +1228,6 @@ } -/* - * Called when the foreground or background color has been changed. - */ - void -gui_mch_new_colors(void) -{ - gui.def_back_pixel = gui.back_pixel; - gui.def_norm_pixel = gui.norm_pixel; - - //NSLog(@"gui_mch_new_colors(back=%x, norm=%x)", gui.def_back_pixel, - // gui.def_norm_pixel); - - [[MMBackend sharedInstance] - setDefaultColorsBackground:gui.def_back_pixel - foreground:gui.def_norm_pixel]; -} - - - void -gui_mch_def_colors() -{ - // Default foreground and background colors are black and white. - gui.def_norm_pixel = gui.norm_pixel = 0; - gui.def_back_pixel = gui.back_pixel = 0xffffff; -} - - -/* - * Set the current text background color. - */ - void -gui_mch_set_bg_color(guicolor_T color) -{ - [[MMBackend sharedInstance] setBackgroundColor:color]; -} - - -/* - * Cursor blink functions. - * - * This is a simple state machine: - * BLINK_NONE not blinking at all - * BLINK_OFF blinking, cursor is not shown - * BLINK_ON blinking, cursor is shown - */ - void -gui_mch_set_blinking(long wait, long on, long off) -{ -} - - -/* - * Set the current text foreground color. - */ - void -gui_mch_set_fg_color(guicolor_T color) -{ - [[MMBackend sharedInstance] setForegroundColor:color]; -} - - #if defined(FEAT_EVAL) || defined(PROTO) /* * Bring the Vim window to the foreground. @@ -1240,16 +1258,6 @@ } -/* - * Set the current text special color. - */ - void -gui_mch_set_sp_color(guicolor_T color) -{ - [[MMBackend sharedInstance] setSpecialColor:color]; -} - - void gui_mch_set_text_area_pos(int x, int y, int w, int h) { @@ -1265,13 +1273,6 @@ } - void -gui_mch_setmouse(int x, int y) -{ - //NSLog(@"gui_mch_setmouse(x=%d, y=%d)", x, y); -} - - #ifdef FEAT_TITLE /* * Set the window title and icon. @@ -1287,38 +1288,12 @@ #endif -/* - * Start the cursor blinking. If it was already blinking, this restarts the - * waiting time and shows the cursor. - */ - void -gui_mch_start_blink(void) -{ -} - - -/* - * Stop the cursor blinking. Show the cursor if it wasn't shown. - */ - void -gui_mch_stop_blink(void) -{ -} - - void gui_mch_toggle_tearoffs(int enable) { } - void -mch_set_mouse_shape(int shape) -{ - [[MMBackend sharedInstance] setMouseShape:shape]; -} - - static BOOL gui_macvim_is_valid_action(NSString *action) { From 5bc6d68fa3b3a44d181283cd93cb728860e9facb Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sun, 26 Aug 2007 14:07:04 +0000 Subject: [PATCH 0172/1156] The font panel is updated when the font changes. git-svn-id: http://macvim.googlecode.com/svn/trunk@200 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMTextView.m | 37 +++++++++++++++++++++---------------- MMWindowController.m | 1 + 2 files changed, 22 insertions(+), 16 deletions(-) diff --git a/MMTextView.m b/MMTextView.m index 7ed96f43b9..88ca43146a 100644 --- a/MMTextView.m +++ b/MMTextView.m @@ -129,6 +129,21 @@ - (void)drawRect:(NSRect)rect } } +- (void)keyDown:(NSEvent *)event +{ + // HACK! If a modifier is held, don't pass the event along to + // interpretKeyEvents: since some keys are bound to multiple commands which + // means doCommandBySelector: is called several times. + // + // TODO: Figure out a way to disable Cocoa key bindings entirely, without + // affecting input management. + + if ([event modifierFlags] & NSControlKeyMask) + [self dispatchKeyEvent:event]; + else + [super keyDown:event]; +} + - (void)insertText:(id)string { // NOTE! This method is called for normal key presses but also for @@ -526,7 +541,12 @@ - (void)changeFont:(id)sender - (void)resetCursorRects { - // No need to set up cursor rects...Vim is in control of cursor changes. + // No need to set up cursor rects since Vim handles cursor changes. +} + +- (void)updateFontPanel +{ + // The font panel is updated whenever the font is set. } @end // MMTextView @@ -592,21 +612,6 @@ - (NSRect)trackingRect return rect; } -- (void)keyDown:(NSEvent *)event -{ - // HACK! If a modifier is held, don't pass the event along to - // interpretKeyEvents: since some keys are bound to multiple commands which - // means doCommandBySelector: is called several times. - // - // TODO: Figure out a way to disable Cocoa key bindings entirely, without - // affecting input management. - - if ([event modifierFlags] & NSControlKeyMask) - [self dispatchKeyEvent:event]; - else - [super keyDown:event]; -} - - (void)dispatchKeyEvent:(NSEvent *)event { // Only handle the command if it came from a keyDown event diff --git a/MMWindowController.m b/MMWindowController.m index baef30b1db..d4a9b4192e 100644 --- a/MMWindowController.m +++ b/MMWindowController.m @@ -452,6 +452,7 @@ - (void)setDefaultColorsBackground:(NSColor *)back foreground:(NSColor *)fore - (void)setFont:(NSFont *)font { + [[NSFontManager sharedFontManager] setSelectedFont:font isMultiple:NO]; [textStorage setFont:font]; [self updateResizeIncrements]; } From a2af9a3633912c9cfe1039a325b1abdcba8f1dc4 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sun, 26 Aug 2007 17:30:28 +0000 Subject: [PATCH 0173/1156] Arrow key related mappings added git-svn-id: http://macvim.googlecode.com/svn/trunk@201 96c4425d-ca35-0410-94e5-3396d5c13a8f --- gvimrc | 88 ++++++++++++++++++++++++++++++++++++---------------------- 1 file changed, 55 insertions(+), 33 deletions(-) diff --git a/gvimrc b/gvimrc index 7f20f9ca3f..629b20309b 100644 --- a/gvimrc +++ b/gvimrc @@ -1,7 +1,7 @@ " System gvimrc file for MacVim " " Maintainer: Björn Winckler -" Last Change: Fri Aug 17 2007 +" Last Change: Sun Aug 26 2007 " " This is a work in progress. If you feel so inclined, please help me improve " this file. @@ -92,9 +92,29 @@ aunmenu ToolBar.FindHelp " -" Keyboard mappings +" HIG insertion point related mappings " +no +no! +no +no! + +no +no! +no +no! + +no +ino +map { +imap { + +no +ino +map } +imap } + @@ -102,37 +122,39 @@ aunmenu ToolBar.FindHelp " Menu key equivalents (these should always have the 'D' modifier set) " -menukeyequiv File.New\ Window -menukeyequiv File.New\ Tab - -menukeyequiv File.Open\.\.\. -menukeyequiv File.Open\ Tab\.\.\. -menukeyequiv File.Close\ Window -"menukeyequiv File.Close\ Tab -menukeyequiv File.Close -menukeyequiv File.Save -menukeyequiv File.Save\ As\.\.\. -menukeyequiv File.Print - -menukeyequiv Edit.Undo -menukeyequiv Edit.Redo -menukeyequiv Edit.Cut -menukeyequiv Edit.Copy -menukeyequiv Edit.Paste -menukeyequiv Edit.Select\ All -menukeyequiv Edit.Special\ Characters\.\.\. - -menukeyequiv Tools.Make -menukeyequiv Tools.List\ Errors -menukeyequiv Tools.List\ Messages -menukeyequiv Tools.Next\ Error -menukeyequiv Tools.Previous\ Error -menukeyequiv Tools.Older\ List -menukeyequiv Tools.Newer\ List - -menukeyequiv Window.Minimize -menukeyequiv Window.Previous\ Tab -menukeyequiv Window.Next\ Tab +menukeyequiv File.New\ Window +menukeyequiv File.New\ Tab + +menukeyequiv File.Open\.\.\. +menukeyequiv File.Open\ Tab\.\.\. +menukeyequiv File.Close\ Window +"menukeyequiv File.Close\ Tab +menukeyequiv File.Close +menukeyequiv File.Save +menukeyequiv File.Save\ As\.\.\. +menukeyequiv File.Print + +menukeyequiv Edit.Undo +menukeyequiv Edit.Redo +menukeyequiv Edit.Cut +menukeyequiv Edit.Copy +menukeyequiv Edit.Paste +menukeyequiv Edit.Select\ All +menukeyequiv Edit.Special\ Characters\.\.\. + +menukeyequiv Tools.Spelling.To\ Next\ error +menukeyequiv Tools.Spelling.Suggest\ Corrections +menukeyequiv Tools.Make +menukeyequiv Tools.List\ Errors +menukeyequiv Tools.List\ Messages +menukeyequiv Tools.Next\ Error +menukeyequiv Tools.Previous\ Error +menukeyequiv Tools.Older\ List +menukeyequiv Tools.Newer\ List + +menukeyequiv Window.Minimize +menukeyequiv Window.Previous\ Tab +menukeyequiv Window.Next\ Tab " Restore the previous value of 'cpoptions'. From 80940e699f4681a2cb9373023e008a413d11d834 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sun, 26 Aug 2007 18:01:19 +0000 Subject: [PATCH 0174/1156] Shifted special keys enter select mode git-svn-id: http://macvim.googlecode.com/svn/trunk@202 96c4425d-ca35-0410-94e5-3396d5c13a8f --- gvimrc | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/gvimrc b/gvimrc index 629b20309b..e4084e4c50 100644 --- a/gvimrc +++ b/gvimrc @@ -21,6 +21,9 @@ if !exists("syntax_on") syntax on endif +" Shift + special movement key starts selection mode (, etc.) +set keymodel=startsel,stopsel selectmode=key + " " Extra menus @@ -99,21 +102,39 @@ no no! no no! +nn +vn +ino +nn +vn +ino no no! no no! +nn +vn +ino +nn +vn +ino no ino map { imap { +nn +vn +ino no ino map } imap } +nn +vn +ino From 816b31faba0aa4d90304c6435a39962afc48c783 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sun, 26 Aug 2007 18:12:58 +0000 Subject: [PATCH 0175/1156] git-svn-id: http://macvim.googlecode.com/svn/trunk@203 96c4425d-ca35-0410-94e5-3396d5c13a8f --- TODO | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/TODO b/TODO index 6168eddf67..244cc849b0 100644 --- a/TODO +++ b/TODO @@ -1,6 +1,5 @@ Active: -- Insertion point blinking - Build Vim (make) from Xcode project - Cmd-W in about box sends vimMenuAction: instead of performClose: - Terminal support. :!bash -> no cursor, arrow keys mucks up display @@ -53,6 +52,8 @@ Active: Pending: +- Select-mode for +- Insertion point blinking - Hollow insertion point drawing does not always work - cursor in replace mode - should ignore action message if is called too often (e.g. in addNewTab:) From a5bc4a731136a61c9803ecbf4ec53053fce9e2eb Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Mon, 27 Aug 2007 13:55:58 +0000 Subject: [PATCH 0176/1156] Font panel is updated when a window becomes main. git-svn-id: http://macvim.googlecode.com/svn/trunk@204 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMWindowController.m | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/MMWindowController.m b/MMWindowController.m index d4a9b4192e..f653eae78b 100644 --- a/MMWindowController.m +++ b/MMWindowController.m @@ -618,6 +618,10 @@ - (void)tabView:(NSTabView *)theTabView didDragTabViewItem: - (void)windowDidBecomeMain:(NSNotification *)notification { [vimController sendMessage:GotFocusMsgID data:nil wait:NO]; + + if (textStorage) + [[NSFontManager sharedFontManager] setSelectedFont:[textStorage font] + isMultiple:NO]; } - (void)windowDidResignMain:(NSNotification *)notification From c66692f0a6ff52b2895af27094fcccb8925ff771 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Mon, 27 Aug 2007 14:10:33 +0000 Subject: [PATCH 0177/1156] Mouse moved events not sent unless a window is key. git-svn-id: http://macvim.googlecode.com/svn/trunk@205 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMTextView.m | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/MMTextView.m b/MMTextView.m index 88ca43146a..4aae2bfe88 100644 --- a/MMTextView.m +++ b/MMTextView.m @@ -398,7 +398,12 @@ - (void)mouseMoved:(NSEvent *)event - (void)mouseEntered:(NSEvent *)event { //NSLog(@"%s", _cmd); - [[self window] setAcceptsMouseMovedEvents:YES]; + + // NOTE: This event is received even when the window is not key; thus we + // have to take care not to enable mouse moved events unless our window is + // key. + if ([[self window] isKeyWindow]) + [[self window] setAcceptsMouseMovedEvents:YES]; } - (void)mouseExited:(NSEvent *)event @@ -407,6 +412,9 @@ - (void)mouseExited:(NSEvent *)event [[self window] setAcceptsMouseMovedEvents:NO]; + // NOTE: This event is received even when the window is not key; if the + // mouse shape is set when our window is not key, the hollow (unfocused) + // cursor will become a block (focused) cursor. if ([[self window] isKeyWindow]) { int shape = 0; NSMutableData *data = [NSMutableData data]; From 20c400959b6f074285e14e67416431cbc48eae9b Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Mon, 27 Aug 2007 14:24:59 +0000 Subject: [PATCH 0178/1156] git-svn-id: http://macvim.googlecode.com/svn/trunk@206 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMTextView.m | 2 ++ TODO | 1 + 2 files changed, 3 insertions(+) diff --git a/MMTextView.m b/MMTextView.m index 4aae2bfe88..2ff092279d 100644 --- a/MMTextView.m +++ b/MMTextView.m @@ -169,6 +169,7 @@ - (void)insertText:(id)string return; } + // TODO: Support 'mousehide' (check p_mh) [NSCursor setHiddenUntilMouseMoves:YES]; [[self vimController] sendMessage:InsertTextMsgID @@ -672,6 +673,7 @@ - (void)dispatchKeyEvent:(NSEvent *)event [data appendBytes:&len length:sizeof(int)]; [data appendBytes:bytes length:len]; + // TODO: Support 'mousehide' (check p_mh) [NSCursor setHiddenUntilMouseMoves:YES]; //NSLog(@"%s len=%d bytes=0x%x", _cmd, len, bytes[0]); diff --git a/TODO b/TODO index 244cc849b0..f8fd9e8c6b 100644 --- a/TODO +++ b/TODO @@ -1,5 +1,6 @@ Active: +- Add support for 'mousehide' (needs to check p_mh) - Build Vim (make) from Xcode project - Cmd-W in about box sends vimMenuAction: instead of performClose: - Terminal support. :!bash -> no cursor, arrow keys mucks up display From 277754b543030de8e07b3a12063683859fd2f6f8 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Mon, 27 Aug 2007 14:37:52 +0000 Subject: [PATCH 0179/1156] Use 'behave mswin' instead of setting 'keymodel' and 'selectmode'. git-svn-id: http://macvim.googlecode.com/svn/trunk@207 96c4425d-ca35-0410-94e5-3396d5c13a8f --- gvimrc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gvimrc b/gvimrc index e4084e4c50..fb516ab6fa 100644 --- a/gvimrc +++ b/gvimrc @@ -22,7 +22,7 @@ if !exists("syntax_on") endif " Shift + special movement key starts selection mode (, etc.) -set keymodel=startsel,stopsel selectmode=key +behave mswin " From 19d29d252a62127ff0838ca5f0851b3227948707 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Mon, 27 Aug 2007 18:07:16 +0000 Subject: [PATCH 0180/1156] Update the selected range whenver the cursor position changes. git-svn-id: http://macvim.googlecode.com/svn/trunk@208 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMTextView.m | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/MMTextView.m b/MMTextView.m index 2ff092279d..931e752ba4 100644 --- a/MMTextView.m +++ b/MMTextView.m @@ -77,6 +77,14 @@ - (void)drawInsertionPointAtRow:(int)row column:(int)col shape:(int)shape insertionPointShape = shape; insertionPointFraction = percent; + // Update the selected range so that the AppKit knows where the insertion + // point is. (The input manager sometimes likes to popup a window near the + // insertion point.) + MMTextStorage *ts = (MMTextStorage*)[self textStorage]; + unsigned charIdx = [ts characterIndexForRow:insertionPointRow + column:insertionPointColumn]; + [self setSelectedRange:NSMakeRange(charIdx,0)]; + [self setInsertionPointColor:color]; } From 08131ebe16b2710acabfd6426277b6e741892f00 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Wed, 29 Aug 2007 09:20:02 +0000 Subject: [PATCH 0181/1156] Added default background color accessor. git-svn-id: http://macvim.googlecode.com/svn/trunk@209 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMTextStorage.h | 5 +++-- MMTextStorage.m | 5 +++++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/MMTextStorage.h b/MMTextStorage.h index 1a87213a00..f40fb69a44 100644 --- a/MMTextStorage.h +++ b/MMTextStorage.h @@ -48,8 +48,9 @@ - (void)clearAllWithColor:(NSColor *)color; - (void)setDefaultColorsBackground:(NSColor *)bgColor foreground:(NSColor *)fgColor; -- (void)setFont:(NSFont*)newFont; -- (NSFont*)font; +- (void)setFont:(NSFont *)newFont; +- (NSFont *)font; +- (NSColor *)defaultBackgroundColor; - (NSSize)size; - (NSSize)cellSize; - (NSRect)rectForRowsInRange:(NSRange)range; diff --git a/MMTextStorage.m b/MMTextStorage.m index 7574f13a6a..df11d6ecaf 100644 --- a/MMTextStorage.m +++ b/MMTextStorage.m @@ -417,6 +417,11 @@ - (NSFont*)font return font; } +- (NSColor *)defaultBackgroundColor +{ + return defaultBackgroundColor; +} + - (NSSize)size { return NSMakeSize(maxColumns*cellSize.width, maxRows*cellSize.height); From c10671e6fda0d05ab84823759914a139dafd4920 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Wed, 29 Aug 2007 10:39:36 +0000 Subject: [PATCH 0182/1156] Added defaultForegroundColor git-svn-id: http://macvim.googlecode.com/svn/trunk@210 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMTextStorage.h | 2 ++ MMTextStorage.m | 21 ++++++++++++++++++--- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/MMTextStorage.h b/MMTextStorage.h index f40fb69a44..49fb97eba8 100644 --- a/MMTextStorage.h +++ b/MMTextStorage.h @@ -20,6 +20,7 @@ NSAttributedString *emptyRowString; NSFont *font; NSColor *defaultBackgroundColor; + NSColor *defaultForegroundColor; NSSize cellSize; } @@ -51,6 +52,7 @@ - (void)setFont:(NSFont *)newFont; - (NSFont *)font; - (NSColor *)defaultBackgroundColor; +- (NSColor *)defaultForegroundColor; - (NSSize)size; - (NSSize)cellSize; - (NSRect)rectForRowsInRange:(NSRange)range; diff --git a/MMTextStorage.m b/MMTextStorage.m index df11d6ecaf..8d28834286 100644 --- a/MMTextStorage.m +++ b/MMTextStorage.m @@ -55,6 +55,7 @@ - (void)dealloc [emptyRowString release]; [font release]; [defaultBackgroundColor release]; + [defaultForegroundColor release]; [attribString release]; [super dealloc]; } @@ -374,9 +375,18 @@ - (void)clearAllWithColor:(NSColor *)color - (void)setDefaultColorsBackground:(NSColor *)bgColor foreground:(NSColor *)fgColor { - // NOTE: Foreground color is ignored. - [defaultBackgroundColor release]; - defaultBackgroundColor = bgColor ? [bgColor retain] : nil; + if (defaultBackgroundColor != bgColor) { + [defaultBackgroundColor release]; + defaultBackgroundColor = bgColor ? [bgColor retain] : nil; + } + + // NOTE: The default foreground color isn't actually used for anything, but + // other class instances might want to be able to access it so it is stored + // here. + if (defaultForegroundColor != fgColor) { + [defaultForegroundColor release]; + defaultForegroundColor = fgColor ? [fgColor retain] : nil; + } } - (void)setFont:(NSFont*)newFont @@ -422,6 +432,11 @@ - (NSColor *)defaultBackgroundColor return defaultBackgroundColor; } +- (NSColor *)defaultForegroundColor +{ + return defaultForegroundColor; +} + - (NSSize)size { return NSMakeSize(maxColumns*cellSize.width, maxRows*cellSize.height); From 0616ef9225954ad355cb4ff814220a463aac9b85 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Wed, 29 Aug 2007 10:50:11 +0000 Subject: [PATCH 0183/1156] - Marked text is displayed in a popup window - When calculating the size of a partial cursor, use the size of a cell instead of the size of the glyph under the cursor (if the glyph is wide the cursor becomes twice too wide) - performKeyEquivalent: is disabled, now uses the superclass implementation git-svn-id: http://macvim.googlecode.com/svn/trunk@211 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMTextView.h | 1 + MMTextView.m | 247 ++++++++++++++++++++++++++++++++++++++++++--------- 2 files changed, 205 insertions(+), 43 deletions(-) diff --git a/MMTextView.h b/MMTextView.h index d5ff079020..cbe242556f 100644 --- a/MMTextView.h +++ b/MMTextView.h @@ -25,6 +25,7 @@ int insertionPointColumn; int insertionPointShape; int insertionPointFraction; + NSTextField *markedTextField; } - (NSEvent *)lastMouseDownEvent; diff --git a/MMTextView.m b/MMTextView.m index 931e752ba4..d97c9fa3c0 100644 --- a/MMTextView.m +++ b/MMTextView.m @@ -25,13 +25,17 @@ + @interface MMTextView (Private) - (BOOL)convertPoint:(NSPoint)point toRow:(int *)row column:(int *)column; +- (BOOL)convertRow:(int)row column:(int)column toPoint:(NSPoint *)point; - (NSRect)trackingRect; - (void)dispatchKeyEvent:(NSEvent *)event; - (MMVimController *)vimController; - (void)startDragTimerWithInterval:(NSTimeInterval)t; - (void)dragTimerFired:(NSTimer *)timer; +- (void)hideMarkedTextField; +- (void)sendKeyDown:(const char *)chars length:(int)len modifiers:(int)flags; @end @@ -40,6 +44,12 @@ @implementation MMTextView - (void)dealloc { + if (markedTextField) { + [[markedTextField window] autorelease]; + [markedTextField release]; + markedTextField = nil; + } + [lastMouseDownEvent release]; [super dealloc]; } @@ -77,14 +87,6 @@ - (void)drawInsertionPointAtRow:(int)row column:(int)col shape:(int)shape insertionPointShape = shape; insertionPointFraction = percent; - // Update the selected range so that the AppKit knows where the insertion - // point is. (The input manager sometimes likes to popup a window near the - // insertion point.) - MMTextStorage *ts = (MMTextStorage*)[self textStorage]; - unsigned charIdx = [ts characterIndexForRow:insertionPointRow - column:insertionPointColumn]; - [self setSelectedRange:NSMakeRange(charIdx,0)]; - [self setInsertionPointColor:color]; } @@ -112,11 +114,11 @@ - (void)drawRect:(NSRect)rect ipRect.origin.y += [self textContainerOrigin].y; if (MMInsertionPointHorizontal == insertionPointShape) { - int frac = (ipRect.size.height * insertionPointFraction + 99)/100; + int frac = ([ts cellSize].height * insertionPointFraction + 99)/100; ipRect.origin.y += ipRect.size.height - frac; ipRect.size.height = frac; } else if (MMInsertionPointVertical == insertionPointShape) { - int frac = (ipRect.size.width * insertionPointFraction + 99)/100; + int frac = ([ts cellSize].width* insertionPointFraction + 99)/100; ipRect.size.width = frac; } @@ -139,6 +141,7 @@ - (void)drawRect:(NSRect)rect - (void)keyDown:(NSEvent *)event { + //NSLog(@"%s %@", _cmd, event); // HACK! If a modifier is held, don't pass the event along to // interpretKeyEvents: since some keys are bound to multiple commands which // means doCommandBySelector: is called several times. @@ -154,6 +157,7 @@ - (void)keyDown:(NSEvent *)event - (void)insertText:(id)string { + //NSLog(@"%s %@", _cmd, string); // NOTE! This method is called for normal key presses but also for // Option-key presses --- even when Ctrl is held as well as Option. When // Ctrl is held, the AppKit translates the character to a Ctrl+key stroke, @@ -162,8 +166,9 @@ - (void)insertText:(id)string // modifiers are already included and should not be added to the input // buffer using CSI, K_MODIFIER). + [self hideMarkedTextField]; + NSEvent *event = [NSApp currentEvent]; - //NSLog(@"%s%@ (event=%@)", _cmd, string, event); // HACK! In order to be able to bind to etc. we have to watch // for when space was pressed. @@ -188,6 +193,7 @@ - (void)insertText:(id)string - (void)doCommandBySelector:(SEL)selector { + //NSLog(@"%s %@", _cmd, NSStringFromSelector(selector)); // By ignoring the selector we effectively disable the key binding // mechanism of Cocoa. Hopefully this is what the user will expect // (pressing Ctrl+P would otherwise result in moveUp: instead of previous @@ -196,12 +202,40 @@ - (void)doCommandBySelector:(SEL)selector // We usually end up here if the user pressed Ctrl+key (but not // Ctrl+Option+key). - //NSLog(@"%s%@", _cmd, NSStringFromSelector(selector)); - [self dispatchKeyEvent:[NSApp currentEvent]]; + NSEvent *event = [NSApp currentEvent]; + + if (selector == @selector(cancelOperation:) + || selector == @selector(insertNewline:)) { + // HACK! If there was marked text which got abandoned as a result of + // hitting escape or enter, then 'insertText:' is called with the + // abandoned text but '[event characters]' includes the abandoned text + // as well. Since 'dispatchKeyEvent:' looks at '[event characters]' we + // must intercept these keys here or the abandonded text gets inserted + // twice. + NSString *key = [event charactersIgnoringModifiers]; + const char *chars = [key UTF8String]; + int len = [key lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; + + if (0x3 == chars[0]) { + // HACK! AppKit turns enter (not return) into Ctrl-C, so we need to + // handle it separately (else Ctrl-C doesn't work). + static char keypadEnter[2] = { 'K', 'A' }; + len = 2; chars = keypadEnter; + } + + [self sendKeyDown:chars length:len modifiers:[event modifierFlags]]; + } else { + [self dispatchKeyEvent:event]; + } } +#if 0 +// Confused note to self: Why did I implement this in the first place? Will +// something break if I don't? Input methods that use arrow keys do not work +// properly with this implementation, so it is disabled for now. - (BOOL)performKeyEquivalent:(NSEvent *)event { + NSLog(@"%s %@", _cmd, event); // Called for Cmd+key keystrokes, function keys, arrow keys, page // up/down, home, end. @@ -237,16 +271,120 @@ - (BOOL)performKeyEquivalent:(NSEvent *)event return YES; } +#endif + +- (BOOL)hasMarkedText +{ + //NSLog(@"%s", _cmd); + return markedTextField && [[markedTextField stringValue] length] > 0; +} + +- (NSRange)markedRange +{ + //NSLog(@"%s", _cmd); + // HACK! If a valid range is returned, then NSTextView changes the + // background color of the returned range. Since marked text is displayed + // in a separate popup window this behaviour is not wanted. By setting the + // location of the returned range to NSNotFound NSTextView does nothing. + // This hack is continued in 'firstRectForCharacterRange:'. + return NSMakeRange(NSNotFound, 0); +} - (void)setMarkedText:(id)text selectedRange:(NSRange)range { - // TODO: Figure out a way to handle marked text, at the moment the user - // has no way of knowing what has been added so far in a multi-stroke key. - // E.g. hitting Option-e and then e will result in an 'e' with acute, but - // nothing is displayed immediately after hitting Option-e. + //NSLog(@"setMarkedText:'%@' selectedRange:%@", text, + // NSStringFromRange(range)); + + MMTextStorage *ts = (MMTextStorage*)[self textStorage]; + if (!ts) return; - NSLog(@"setMarkedText:'%@' selectedRange:(%d,%d)", text, range.location, - range.length); + if (!markedTextField) { + // Create a text field and put it inside a floating panel. This field + // is used to display marked text. + NSSize cellSize = [ts cellSize]; + NSRect cellRect = { 0, 0, cellSize.width, cellSize.height }; + + markedTextField = [[NSTextField alloc] initWithFrame:cellRect]; + [markedTextField setEditable:NO]; + [markedTextField setSelectable:NO]; + [markedTextField setBezeled:NO]; + [markedTextField setBordered:YES]; + + NSPanel *panel = [[NSPanel alloc] + initWithContentRect:cellRect + styleMask:NSBorderlessWindowMask|NSUtilityWindowMask + backing:NSBackingStoreBuffered + defer:YES]; + + //[panel setHidesOnDeactivate:NO]; + [panel setFloatingPanel:YES]; + [panel setBecomesKeyOnlyIfNeeded:YES]; + [panel setContentView:markedTextField]; + } + + if (text && [text length] > 0) { + [markedTextField setFont:[ts font]]; + if ([text isKindOfClass:[NSAttributedString class]]) + [markedTextField setAttributedStringValue:text]; + else + [markedTextField setStringValue:text]; + + [markedTextField sizeToFit]; + NSSize size = [markedTextField frame].size; + + // Convert coordinates (row,col) -> view -> window base -> screen + NSPoint origin; + if (![self convertRow:insertionPointRow+1 column:insertionPointColumn + toPoint:&origin]) + return; + origin = [self convertPoint:origin toView:nil]; + origin = [[self window] convertBaseToScreen:origin]; + + NSWindow *win = [markedTextField window]; + [win setContentSize:size]; + [win setFrameOrigin:origin]; + [win orderFront:nil]; + } else { + [self hideMarkedTextField]; + } +} + +- (void)unmarkText +{ + //NSLog(@"%s", _cmd); + [self hideMarkedTextField]; +} + +- (NSRect)firstRectForCharacterRange:(NSRange)range +{ + //NSLog(@"%s%@", _cmd, NSStringFromRange(range)); + + MMTextStorage *ts = (MMTextStorage*)[self textStorage]; + NSLayoutManager *lm = [self layoutManager]; + NSTextContainer *tc = [self textContainer]; + + // HACK! Since we always return marked text to have location NSNotFound, + // this method will be called with 'range.location == NSNotFound' whenever + // the input manager tries to position a popup window near the insertion + // point. For this reason we compute where the insertion point is and + // return a rect which contains it. + if (!(ts && lm && tc) || NSNotFound != range.location) + return [super firstRectForCharacterRange:range]; + + unsigned charIdx = [ts characterIndexForRow:insertionPointRow + column:insertionPointColumn]; + NSRange glyphRange = + [lm glyphRangeForCharacterRange:NSMakeRange(charIdx,1) + actualCharacterRange:NULL]; + NSRect ipRect = [lm boundingRectForGlyphRange:glyphRange + inTextContainer:tc]; + ipRect.origin.x += [self textContainerOrigin].x; + ipRect.origin.y += [self textContainerOrigin].y + [ts cellSize].height; + + ipRect.origin = [self convertPoint:ipRect.origin toView:nil]; + ipRect.origin = [[self window] convertBaseToScreen:ipRect.origin]; + + return ipRect; } - (void)scrollWheel:(NSEvent *)event @@ -612,6 +750,20 @@ - (BOOL)convertPoint:(NSPoint)point toRow:(int *)row column:(int *)column #endif } +- (BOOL)convertRow:(int)row column:(int)column toPoint:(NSPoint *)point +{ + MMTextStorage *ts = (MMTextStorage*)[self textStorage]; + NSSize cellSize = [ts cellSize]; + if (!(point && cellSize.width > 0 && cellSize.height > 0)) + return NO; + + *point = [self textContainerOrigin]; + point->x += column * cellSize.width; + point->y += row * cellSize.height; + + return YES; +} + - (NSRect)trackingRect { NSRect rect = [self frame]; @@ -636,20 +788,21 @@ - (void)dispatchKeyEvent:(NSEvent *)event return; NSString *chars = [event characters]; - NSString *imchars = [event charactersIgnoringModifiers]; + NSString *unmodchars = [event charactersIgnoringModifiers]; unichar c = [chars characterAtIndex:0]; - unichar imc = [imchars characterAtIndex:0]; + unichar imc = [unmodchars characterAtIndex:0]; int len = 0; const char *bytes = 0; - //NSLog(@"%s chars=0x%x unmodchars=0x%x", _cmd, c, imc); + //NSLog(@"%s chars[0]=0x%x unmodchars[0]=0x%x (chars=%@ unmodchars=%@)", + // _cmd, c, imc, chars, unmodchars); if (' ' == imc && 0xa0 != c) { // HACK! The AppKit turns into which is not standard // Vim behaviour, so bypass this problem. (0xa0 is , which // should be passed on as is.) - len = [imchars lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; - bytes = [imchars UTF8String]; + len = [unmodchars lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; + bytes = [unmodchars UTF8String]; } else if (imc == c && '2' == c) { // HACK! Translate Ctrl+2 to . static char ctrl_at = 0; @@ -663,30 +816,12 @@ - (void)dispatchKeyEvent:(NSEvent *)event // separately (else Ctrl-Y doesn't work). static char back_tab[2] = { 'k', 'B' }; len = 2; bytes = back_tab; - } else if (c == 0x3 && imc == 0x3) { - // HACK! AppKit turns enter (not return) into Ctrl-C, so we need to - // handle it separately (else Ctrl-C doesn't work). - static char enter[2] = { 'K', 'A' }; - len = 2; bytes = enter; } else { len = [chars lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; bytes = [chars UTF8String]; } - if (len > 0 && bytes) { - NSMutableData *data = [NSMutableData data]; - int flags = [event modifierFlags]; - - [data appendBytes:&flags length:sizeof(int)]; - [data appendBytes:&len length:sizeof(int)]; - [data appendBytes:bytes length:len]; - - // TODO: Support 'mousehide' (check p_mh) - [NSCursor setHiddenUntilMouseMoves:YES]; - - //NSLog(@"%s len=%d bytes=0x%x", _cmd, len, bytes[0]); - [[self vimController] sendMessage:KeyDownMsgID data:data wait:NO]; - } + [self sendKeyDown:bytes length:len modifiers:[event modifierFlags]]; } - (MMVimController *)vimController @@ -748,4 +883,30 @@ - (void)dragTimerFired:(NSTimer *)timer ++tick; } +- (void)hideMarkedTextField +{ + if (markedTextField) { + NSWindow *win = [markedTextField window]; + [win close]; + [markedTextField setStringValue:@""]; + } +} + +- (void)sendKeyDown:(const char *)chars length:(int)len modifiers:(int)flags +{ + if (chars && len > 0) { + NSMutableData *data = [NSMutableData data]; + + [data appendBytes:&flags length:sizeof(int)]; + [data appendBytes:&len length:sizeof(int)]; + [data appendBytes:chars length:len]; + + // TODO: Support 'mousehide' (check p_mh) + [NSCursor setHiddenUntilMouseMoves:YES]; + + //NSLog(@"%s len=%d chars=0x%x", _cmd, len, chars[0]); + [[self vimController] sendMessage:KeyDownMsgID data:data wait:NO]; + } +} + @end // MMTextView (Private) From 290847c7079cfd0cc9b974b52feccf98cb614773 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Wed, 29 Aug 2007 12:03:22 +0000 Subject: [PATCH 0184/1156] Marked text field is hidden whenever window loses focus git-svn-id: http://macvim.googlecode.com/svn/trunk@212 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMTextView.h | 1 + MMTextView.m | 19 +++++++++---------- MMWindowController.m | 3 +++ 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/MMTextView.h b/MMTextView.h index cbe242556f..69ea8ba0aa 100644 --- a/MMTextView.h +++ b/MMTextView.h @@ -32,5 +32,6 @@ - (void)setShouldDrawInsertionPoint:(BOOL)on; - (void)drawInsertionPointAtRow:(int)row column:(int)col shape:(int)shape fraction:(int)percent color:(NSColor *)color; +- (void)hideMarkedTextField; @end diff --git a/MMTextView.m b/MMTextView.m index d97c9fa3c0..59f91404dc 100644 --- a/MMTextView.m +++ b/MMTextView.m @@ -34,7 +34,6 @@ - (void)dispatchKeyEvent:(NSEvent *)event; - (MMVimController *)vimController; - (void)startDragTimerWithInterval:(NSTimeInterval)t; - (void)dragTimerFired:(NSTimer *)timer; -- (void)hideMarkedTextField; - (void)sendKeyDown:(const char *)chars length:(int)len modifiers:(int)flags; @end @@ -90,6 +89,15 @@ - (void)drawInsertionPointAtRow:(int)row column:(int)col shape:(int)shape [self setInsertionPointColor:color]; } +- (void)hideMarkedTextField +{ + if (markedTextField) { + NSWindow *win = [markedTextField window]; + [win close]; + [markedTextField setStringValue:@""]; + } +} + - (void)drawRect:(NSRect)rect { [super drawRect:rect]; @@ -883,15 +891,6 @@ - (void)dragTimerFired:(NSTimer *)timer ++tick; } -- (void)hideMarkedTextField -{ - if (markedTextField) { - NSWindow *win = [markedTextField window]; - [win close]; - [markedTextField setStringValue:@""]; - } -} - - (void)sendKeyDown:(const char *)chars length:(int)len modifiers:(int)flags { if (chars && len > 0) { diff --git a/MMWindowController.m b/MMWindowController.m index f653eae78b..67c2d98846 100644 --- a/MMWindowController.m +++ b/MMWindowController.m @@ -627,6 +627,9 @@ - (void)windowDidBecomeMain:(NSNotification *)notification - (void)windowDidResignMain:(NSNotification *)notification { [vimController sendMessage:LostFocusMsgID data:nil wait:NO]; + + if (textView) + [textView hideMarkedTextField]; } - (BOOL)windowShouldClose:(id)sender From c49bfffc5e378220d066c8b8429637609af433e2 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Wed, 29 Aug 2007 14:46:55 +0000 Subject: [PATCH 0185/1156] Fixed bug where bold/italic font didn't render at the right width git-svn-id: http://macvim.googlecode.com/svn/trunk@213 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMTextStorage.h | 3 +++ MMTextStorage.m | 64 ++++++++++++++++++++++++++++++------------------- 2 files changed, 42 insertions(+), 25 deletions(-) diff --git a/MMTextStorage.h b/MMTextStorage.h index 49fb97eba8..0768793ca5 100644 --- a/MMTextStorage.h +++ b/MMTextStorage.h @@ -19,6 +19,9 @@ int actualRows, actualColumns; NSAttributedString *emptyRowString; NSFont *font; + NSFont *boldFont; + NSFont *italicFont; + NSFont *boldItalicFont; NSColor *defaultBackgroundColor; NSColor *defaultForegroundColor; NSSize cellSize; diff --git a/MMTextStorage.m b/MMTextStorage.m index 8d28834286..8694d54195 100644 --- a/MMTextStorage.m +++ b/MMTextStorage.m @@ -13,10 +13,8 @@ -// If 0 DRAW_TRANSP flag will be ignored. Setting it to 1 causes the cursor -// background to be drawn in white. TODO: Figure out why this flag is set. -#define HEED_DRAW_TRANSP 0 +// TODO: support DRAW_TRANSP flag #define DRAW_TRANSP 0x01 /* draw with transparant bg */ #define DRAW_BOLD 0x02 /* draw bold text */ #define DRAW_UNDERL 0x04 /* draw underline text */ @@ -53,6 +51,9 @@ - (void)dealloc //NSLog(@"%@ %s", [self className], _cmd); [emptyRowString release]; + [boldItalicFont release]; + [italicFont release]; + [boldFont release]; [font release]; [defaultBackgroundColor release]; [defaultForegroundColor release]; @@ -162,10 +163,9 @@ - (void)replaceString:(NSString *)string atRow:(int)row column:(int)col //NSLog(@"replaceString:atRow:%d column:%d withFlags:%d", row, col, flags); [self lazyResize]; -#if !HEED_DRAW_TRANSP + // TODO: support DRAW_TRANSP if (flags & DRAW_TRANSP) return; -#endif if (row < 0 || row >= maxRows || col < 0 || col >= maxColumns || col+[string length] > maxColumns) { @@ -189,31 +189,20 @@ - (void)replaceString:(NSString *)string atRow:(int)row column:(int)col NSRange range = NSMakeRange(col+row*(maxColumns+1), [string length]); [attribString replaceCharactersInRange:range withString:string]; + NSFont *theFont = font; + if (flags & DRAW_BOLD) + theFont = flags & DRAW_ITALIC ? boldItalicFont : boldFont; + else if (flags & DRAW_ITALIC) + theFont = italicFont; + NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys: - font, NSFontAttributeName, + theFont, NSFontAttributeName, bg, NSBackgroundColorAttributeName, fg, NSForegroundColorAttributeName, sp, NSUnderlineColorAttributeName, nil]; [attribString setAttributes:attributes range:range]; -#if HEED_DRAW_TRANSP - if ( !(flags & DRAW_TRANSP) ) { - [attribString addAttribute:NSBackgroundColorAttributeName value:bg - range:range]; - } -#endif - - // TODO: cache bold font and apply in setAttributes:range: - if (flags & DRAW_BOLD) { - [attribString applyFontTraits:NSBoldFontMask range:range]; - } - - // TODO: cache italic font and apply in setAttributes:range: - if (flags & DRAW_ITALIC) { - [attribString applyFontTraits:NSItalicFontMask range:range]; - } - if (flags & DRAW_UNDERL) { NSNumber *value = [NSNumber numberWithInt:(NSUnderlineStyleSingle | NSUnderlinePatternSolid)]; // | NSUnderlineByWordMask @@ -407,18 +396,43 @@ - (void)setFont:(NSFont*)newFont // width will not match. cellSize.width = ceilf(em * cellWidthMultiplier); + float pointSize = [newFont pointSize]; NSDictionary *dict = [NSDictionary dictionaryWithObject:[NSNumber numberWithFloat:cellSize.width] forKey:NSFontFixedAdvanceAttribute]; + NSFontDescriptor *desc = [newFont fontDescriptor]; desc = [desc fontDescriptorByAddingAttributes:dict]; - - font = [NSFont fontWithDescriptor:desc size:[newFont pointSize]]; + font = [NSFont fontWithDescriptor:desc size:pointSize]; [font retain]; NSLayoutManager *lm = [[self layoutManagers] objectAtIndex:0]; cellSize.height = lm ? [lm defaultLineHeightForFont:font] : [font defaultLineHeightForFont]; + + // NOTE: The font manager does not care about the 'font fixed advance' + // attribute, so after converting the font we have to add this + // attribute again. + boldFont = [[NSFontManager sharedFontManager] + convertFont:font toHaveTrait:NSBoldFontMask]; + desc = [boldFont fontDescriptor]; + desc = [desc fontDescriptorByAddingAttributes:dict]; + boldFont = [NSFont fontWithDescriptor:desc size:pointSize]; + [boldFont retain]; + + italicFont = [[NSFontManager sharedFontManager] + convertFont:font toHaveTrait:NSItalicFontMask]; + desc = [italicFont fontDescriptor]; + desc = [desc fontDescriptorByAddingAttributes:dict]; + italicFont = [NSFont fontWithDescriptor:desc size:pointSize]; + [italicFont retain]; + + boldItalicFont = [[NSFontManager sharedFontManager] + convertFont:italicFont toHaveTrait:NSBoldFontMask]; + desc = [boldItalicFont fontDescriptor]; + desc = [desc fontDescriptorByAddingAttributes:dict]; + boldItalicFont = [NSFont fontWithDescriptor:desc size:pointSize]; + [boldItalicFont retain]; } } From c2f8eb46f05c9eaf8a5cd88e35706cb663a399ff Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Wed, 29 Aug 2007 16:35:31 +0000 Subject: [PATCH 0186/1156] Added SystemColors.plist to project git-svn-id: http://macvim.googlecode.com/svn/trunk@214 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MacVim.xcodeproj/project.pbxproj | 4 ++++ MacVim.xcodeproj/winckler.mode1 | 4 ++-- MacVim.xcodeproj/winckler.pbxuser | 4 ++-- SystemColors.plist | 12 ++++++++++++ 4 files changed, 20 insertions(+), 4 deletions(-) create mode 100644 SystemColors.plist diff --git a/MacVim.xcodeproj/project.pbxproj b/MacVim.xcodeproj/project.pbxproj index 8e40b55e90..8af061e6f2 100644 --- a/MacVim.xcodeproj/project.pbxproj +++ b/MacVim.xcodeproj/project.pbxproj @@ -33,6 +33,7 @@ 1DD66ECE0C803D3600EBDAB3 /* MMApplication.m in Sources */ = {isa = PBXBuildFile; fileRef = 1DD66ECC0C803D3600EBDAB3 /* MMApplication.m */; }; 1DD703B90BA9D15D008679E9 /* vim_gloss.icns in Resources */ = {isa = PBXBuildFile; fileRef = 1DD703B80BA9D15D008679E9 /* vim_gloss.icns */; }; 1DD704310BA9F9C2008679E9 /* SpecialKeys.plist in Resources */ = {isa = PBXBuildFile; fileRef = 1DD704300BA9F9C2008679E9 /* SpecialKeys.plist */; }; + 1DD9F5E50C85D60500E8D5A5 /* SystemColors.plist in Resources */ = {isa = PBXBuildFile; fileRef = 1DD9F5E40C85D60500E8D5A5 /* SystemColors.plist */; }; 1DDBEB6D0C7434150036EEDD /* EmptyWindow.nib in Resources */ = {isa = PBXBuildFile; fileRef = 1DDBEB6B0C7434150036EEDD /* EmptyWindow.nib */; }; 1DE608B40C587FDA0055263D /* runtime in CopyFiles */ = {isa = PBXBuildFile; fileRef = 1DE602470C587FD10055263D /* runtime */; }; 1DE8CC620C5E2AAD003F56E3 /* Actions.plist in Resources */ = {isa = PBXBuildFile; fileRef = 1DE8CC610C5E2AAD003F56E3 /* Actions.plist */; }; @@ -155,6 +156,7 @@ 1DD66ECC0C803D3600EBDAB3 /* MMApplication.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = MMApplication.m; sourceTree = ""; }; 1DD703B80BA9D15D008679E9 /* vim_gloss.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = vim_gloss.icns; sourceTree = ""; }; 1DD704300BA9F9C2008679E9 /* SpecialKeys.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = SpecialKeys.plist; sourceTree = ""; }; + 1DD9F5E40C85D60500E8D5A5 /* SystemColors.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = SystemColors.plist; sourceTree = ""; }; 1DDBEB6C0C7434150036EEDD /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = English.lproj/EmptyWindow.nib; sourceTree = ""; }; 1DE602470C587FD10055263D /* runtime */ = {isa = PBXFileReference; lastKnownFileType = folder; name = runtime; path = ../../runtime; sourceTree = SOURCE_ROOT; }; 1DE8CC610C5E2AAD003F56E3 /* Actions.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = Actions.plist; sourceTree = ""; }; @@ -342,6 +344,7 @@ 29B97317FDCFA39411CA2CEA /* Resources */ = { isa = PBXGroup; children = ( + 1DD9F5E40C85D60500E8D5A5 /* SystemColors.plist */, 1DE8CC610C5E2AAD003F56E3 /* Actions.plist */, 1DD04DEB0C529C5E006CDC2B /* Credits.rtf */, 1DE9726C0C48050600F96A9F /* Toolbar */, @@ -467,6 +470,7 @@ 1DD04DEC0C529C5E006CDC2B /* Credits.rtf in Resources */, 1DE8CC620C5E2AAD003F56E3 /* Actions.plist in Resources */, 1DDBEB6D0C7434150036EEDD /* EmptyWindow.nib in Resources */, + 1DD9F5E50C85D60500E8D5A5 /* SystemColors.plist in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/MacVim.xcodeproj/winckler.mode1 b/MacVim.xcodeproj/winckler.mode1 index b402d34291..d134bd811e 100644 --- a/MacVim.xcodeproj/winckler.mode1 +++ b/MacVim.xcodeproj/winckler.mode1 @@ -368,9 +368,9 @@ TableOfContents - 1DFB82D80C80441E00085E92 + 1DD9F5E60C85D61F00E8D5A5 1CE0B1FE06471DED0097A5F4 - 1DFB82D90C80441E00085E92 + 1DD9F5E70C85D61F00E8D5A5 1CE0B20306471E060097A5F4 1CE0B20506471E060097A5F4 diff --git a/MacVim.xcodeproj/winckler.pbxuser b/MacVim.xcodeproj/winckler.pbxuser index 1a3d6a7dd5..d065e0b1a3 100644 --- a/MacVim.xcodeproj/winckler.pbxuser +++ b/MacVim.xcodeproj/winckler.pbxuser @@ -438,8 +438,8 @@ PBXFileDataSource_Warnings_ColumnID, ); }; - PBXPerProjectTemplateStateSaveDate = 209732622; - PBXWorkspaceStateSaveDate = 209732622; + PBXPerProjectTemplateStateSaveDate = 210097639; + PBXWorkspaceStateSaveDate = 210097639; }; sourceControlManager = 1D16B9DD0BA33BB000A69B33 /* Source Control */; userBuildSettings = { diff --git a/SystemColors.plist b/SystemColors.plist new file mode 100644 index 0000000000..2bb1ef33e3 --- /dev/null +++ b/SystemColors.plist @@ -0,0 +1,12 @@ + + + + + macselectedtextbackgroundcolor + selectedTextBackgroundColor + mactextbackgroundcolor + textBackgroundColor + mactextcolor + textColor + + From 29919395755f5f975fe08623200c03bf0a41621f Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Wed, 29 Aug 2007 16:37:12 +0000 Subject: [PATCH 0187/1156] - Added possibility to look up system colors - The color for the 'Visual' highlight group is taken from the system - The background and foreground colors are taken from the system git-svn-id: http://macvim.googlecode.com/svn/trunk@215 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMBackend.h | 1 + MMBackend.m | 38 +++++++++++++++++++++++++++++++++----- gui_macvim.m | 14 +++++++++++--- 3 files changed, 45 insertions(+), 8 deletions(-) diff --git a/MMBackend.h b/MMBackend.h index f348ec5fbf..6f4f0458f1 100644 --- a/MMBackend.h +++ b/MMBackend.h @@ -18,6 +18,7 @@ NSConnection *connection; id frontendProxy; NSDictionary *colorDict; + NSDictionary *sysColorDict; BOOL inputReceived; BOOL tabBarVisible; int backgroundColor; diff --git a/MMBackend.m b/MMBackend.m index b44be40e6c..4dfdbc9cbd 100644 --- a/MMBackend.m +++ b/MMBackend.m @@ -58,9 +58,24 @@ - (id)init if ((self = [super init])) { queue = [[NSMutableArray alloc] init]; drawData = [[NSMutableData alloc] initWithCapacity:1024]; + NSString *path = [[NSBundle mainBundle] pathForResource:@"Colors" ofType:@"plist"]; - colorDict = [[NSDictionary dictionaryWithContentsOfFile:path] retain]; + if (path) { + colorDict = [[NSDictionary dictionaryWithContentsOfFile:path] + retain]; + } else { + NSLog(@"WARNING: Could not locate Colors.plist."); + } + + path = [[NSBundle mainBundle] pathForResource:@"SystemColors" + ofType:@"plist"]; + if (path) { + sysColorDict = [[NSDictionary dictionaryWithContentsOfFile:path] + retain]; + } else { + NSLog(@"WARNING: Could not locate SystemColors.plist."); + } } return self; @@ -77,6 +92,7 @@ - (void)dealloc [drawData release]; drawData = nil; [frontendProxy release]; frontendProxy = nil; [connection release]; connection = nil; + [sysColorDict release]; sysColorDict = nil; [colorDict release]; colorDict = nil; [super dealloc]; @@ -816,21 +832,19 @@ - (int)lookupColorWithKey:(NSString *)key if (!(key && [key length] > 0)) return INVALCOLOR; - // First of all try to lookup key in the color dictionary; note that all - // keys in this dictionary are lowercase with no whitespace. - NSString *stripKey = [[[[key lowercaseString] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]] componentsSeparatedByString:@" "] componentsJoinedByString:@""]; if (stripKey && [stripKey length] > 0) { + // First of all try to lookup key in the color dictionary; note that + // all keys in this dictionary are lowercase with no whitespace. id obj = [colorDict objectForKey:stripKey]; if (obj) return [obj intValue]; // The key was not in the dictionary; is it perhaps of the form // #rrggbb? - if ([stripKey length] > 1 && [stripKey characterAtIndex:0] == '#') { NSScanner *scanner = [NSScanner scannerWithString:stripKey]; [scanner setScanLocation:1]; @@ -839,6 +853,20 @@ - (int)lookupColorWithKey:(NSString *)key return (int)hex; } } + + // As a last resort, check if it is one of the system defined colors. + // The keys in this dictionary are also lowercase with no whitespace. + obj = [sysColorDict objectForKey:stripKey]; + if (obj) { + NSColor *col = [NSColor performSelector:NSSelectorFromString(obj)]; + if (col) { + float r, g, b, a; + col = [col colorUsingColorSpaceName:NSCalibratedRGBColorSpace]; + [col getRed:&r green:&g blue:&b alpha:&a]; + return ((int)(r*255) << 16) + ((int)(g*255) << 8) + + (int)(b*255); + } + } } NSLog(@"WARNING: No color with key %@ found.", stripKey); diff --git a/gui_macvim.m b/gui_macvim.m index de49b6f52a..b1d23aae2e 100644 --- a/gui_macvim.m +++ b/gui_macvim.m @@ -462,9 +462,17 @@ void gui_mch_def_colors() { - // Default foreground and background colors are black and white. - gui.def_norm_pixel = gui.norm_pixel = 0; - gui.def_back_pixel = gui.back_pixel = 0xffffff; + MMBackend *backend = [MMBackend sharedInstance]; + + // The default colors are taken from system values + gui.def_norm_pixel = gui.norm_pixel = + [backend lookupColorWithKey:@"MacTextColor"]; + gui.def_back_pixel = gui.back_pixel = + [backend lookupColorWithKey:@"MacTextBackgroundColor"]; + + // Set the text selection color to match the system preferences. + // TODO: Is there a better way to do this? + do_cmdline_cmd((char_u*)"hi Visual guibg=MacSelectedTextBackgroundColor"); } From 744abd5a5d2be0b45fc097b38416de1325905660 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Wed, 29 Aug 2007 18:27:03 +0000 Subject: [PATCH 0188/1156] Added selection color for inactive window git-svn-id: http://macvim.googlecode.com/svn/trunk@216 96c4425d-ca35-0410-94e5-3396d5c13a8f --- SystemColors.plist | 2 ++ 1 file changed, 2 insertions(+) diff --git a/SystemColors.plist b/SystemColors.plist index 2bb1ef33e3..cafa8899f2 100644 --- a/SystemColors.plist +++ b/SystemColors.plist @@ -2,6 +2,8 @@ + macsecondaryselectedcontrolcolor + secondarySelectedControlColor macselectedtextbackgroundcolor selectedTextBackgroundColor mactextbackgroundcolor From 20054e92329ece9d02431423efb4de550be8b054 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Wed, 29 Aug 2007 18:30:20 +0000 Subject: [PATCH 0189/1156] - Drop input if received while other input is being processed - Change selection color when focus changes git-svn-id: http://macvim.googlecode.com/svn/trunk@217 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMBackend.h | 12 +++++ MMBackend.m | 132 +++++++++++++++++++++++++++++++++++++++++----------- 2 files changed, 117 insertions(+), 27 deletions(-) diff --git a/MMBackend.h b/MMBackend.h index 6f4f0458f1..92e02a0623 100644 --- a/MMBackend.h +++ b/MMBackend.h @@ -12,6 +12,14 @@ #import "MacVim.h" +// If disabled, all input is dropped if input is already being processed. (If +// enabled, same thing happens at the moment actually. So this is pretty +// useless.) +#define MM_USE_INPUT_QUEUE 0 + + + + @interface MMBackend : NSObject { NSMutableArray *queue; NSMutableData *drawData; @@ -33,6 +41,10 @@ NSTimeInterval blinkWaitInterval; NSTimeInterval blinkOnInterval; NSTimeInterval blinkOffInterval; + BOOL inProcessInput; +#if MM_USE_INPUT_QUEUE + NSMutableArray *inputQueue; +#endif } + (MMBackend *)sharedInstance; diff --git a/MMBackend.m b/MMBackend.m index 4dfdbc9cbd..7b22e99d00 100644 --- a/MMBackend.m +++ b/MMBackend.m @@ -41,6 +41,9 @@ - (void)handleKeyDown:(NSString *)key modifiers:(int)mods; - (void)queueMessage:(int)msgid data:(NSData *)data; - (void)connectionDidDie:(NSNotification *)notification; - (void)blinkTimerFired:(NSTimer *)timer; +- (void)focusChange:(BOOL)on; +- (void)processInputBegin; +- (void)processInputEnd; @end @@ -57,6 +60,9 @@ - (id)init { if ((self = [super init])) { queue = [[NSMutableArray alloc] init]; +#if MM_USE_INPUT_QUEUE + inputQueue = [[NSMutableArray alloc] init]; +#endif drawData = [[NSMutableData alloc] initWithCapacity:1024]; NSString *path = [[NSBundle mainBundle] pathForResource:@"Colors" @@ -88,6 +94,9 @@ - (void)dealloc [[NSNotificationCenter defaultCenter] removeObserver:self]; [blinkTimer release]; blinkTimer = nil; +#if MM_USE_INPUT_QUEUE + [inputQueue release]; inputQueue = nil; +#endif [queue release]; queue = nil; [drawData release]; drawData = nil; [frontendProxy release]; frontendProxy = nil; @@ -875,16 +884,19 @@ - (int)lookupColorWithKey:(NSString *)key - (oneway void)processInput:(int)msgid data:(in NSData *)data { - [lastFlushDate release]; - lastFlushDate = [[NSDate date] retain]; - - // HACK! A focus message might get lost, but whenever we get here the GUI - // is in focus. - if (!gui.in_focus && GotFocusMsgID != msgid && LostFocusMsgID != msgid) - gui_focus_change(TRUE); - - [self handleMessage:msgid data:data]; - inputReceived = YES; + if (inProcessInput) { +#if MM_USE_INPUT_QUEUE + [inputQueue addObject:[NSNumber numberWithInt:msgid]]; + [inputQueue addObject:data]; +#else + // Just drop the input + NSLog(@"WARNING: Dropping input in %s", _cmd); +#endif + } else { + [self processInputBegin]; + [self handleMessage:msgid data:data]; + [self processInputEnd]; + } } - (oneway void)processInputAndData:(in NSArray *)messages @@ -895,24 +907,27 @@ - (oneway void)processInputAndData:(in NSArray *)messages return; } - [lastFlushDate release]; - lastFlushDate = [[NSDate date] retain]; + if (inProcessInput) { +#if MM_USE_INPUT_QUEUE + [inputQueue addObjectsFromArray:messages]; +#else + // Just drop the input + NSLog(@"WARNING: Dropping input in %s", _cmd); +#endif + } else { + [self processInputBegin]; - for (i = 0; i < count; i += 2) { - int msgid = [[messages objectAtIndex:i] intValue]; - id data = [messages objectAtIndex:i+1]; - if ([data isEqual:[NSNull null]]) - data = nil; + for (i = 0; i < count; i += 2) { + int msgid = [[messages objectAtIndex:i] intValue]; + id data = [messages objectAtIndex:i+1]; + if ([data isEqual:[NSNull null]]) + data = nil; - [self handleMessage:msgid data:data]; - } - - // HACK! A focus message might get lost, but whenever we get here the GUI - // is in focus. - if (!gui.in_focus) - gui_focus_change(TRUE); + [self handleMessage:msgid data:data]; + } - inputReceived = YES; + [self processInputEnd]; + } } - (BOOL)checkForModifiedBuffers @@ -1305,10 +1320,10 @@ - (void)handleMessage:(int)msgid data:(NSData *)data #endif // FEAT_DND } else if (GotFocusMsgID == msgid) { if (!gui.in_focus) - gui_focus_change(YES); + [self focusChange:YES]; } else if (LostFocusMsgID == msgid) { if (gui.in_focus) - gui_focus_change(NO); + [self focusChange:NO]; } else if (MouseMovedMsgID == msgid) { const void *bytes = [data bytes]; int row = *((int*)bytes); bytes += sizeof(int); @@ -1458,6 +1473,69 @@ - (void)blinkTimerFired:(NSTimer *)timer } } +- (void)focusChange:(BOOL)on +{ + // This is a bit of an ugly way to change the selection color. + // TODO: Is there a nicer way to do this? + char *cmd = on + ? "hi Visual guibg=MacSelectedTextBackgroundColor" + : "hi Visual guibg=MacSecondarySelectedControlColor"; + + do_cmdline_cmd((char_u*)cmd); + gui_focus_change(on); + + // TODO: Is all this necessary just to get the highlights to update? + redraw_all_later(CLEAR); + update_screen(NOT_VALID); + setcursor(); + out_flush(); + gui_update_cursor(FALSE, FALSE); + gui_mch_flush(); +} + +- (void)processInputBegin +{ + inProcessInput = YES; + [lastFlushDate release]; + lastFlushDate = [[NSDate date] retain]; +} + +- (void)processInputEnd +{ +#if MM_USE_INPUT_QUEUE + int count = [inputQueue count]; + if (count % 2) { + // TODO: This is troubling, but it is not hard to get Vim to end up + // here. Why does this happen? + NSLog(@"WARNING: inputQueue has odd number of objects (%d)", count); + [inputQueue removeAllObjects]; + } else if (count > 0) { + // TODO: Dispatch these messages? Maybe not; usually when the + // 'inputQueue' is non-empty it means that a LOT of messages has been + // sent simultaneously. The only way this happens is when Vim is being + // tormented, e.g. if the user holds down to rapidly switch + // windows. + unsigned i; + for (i = 0; i < count; i+=2) { + int msgid = [[inputQueue objectAtIndex:i] intValue]; + NSLog(@"%s: Dropping message %s", _cmd, MessageStrings[msgid]); + } + + [inputQueue removeAllObjects]; + } +#endif + +#if 0 // This does not work...for now, just don't care if a focus msg was lost. + // HACK! A focus message might get lost, but whenever we get here the GUI + // is in focus. + if (!gui.in_focus) + [self focusChange:TRUE]; +#endif + + inputReceived = YES; + inProcessInput = NO; +} + @end // MMBackend (Private) From 0813a2ff120adb8b7930f26267580cd86cbc6604 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Wed, 29 Aug 2007 18:54:42 +0000 Subject: [PATCH 0190/1156] Use 'keymodel=startsel' instead of 'behave mswin' since the latter ends visual mode when an arrow key is pressed. git-svn-id: http://macvim.googlecode.com/svn/trunk@218 96c4425d-ca35-0410-94e5-3396d5c13a8f --- gvimrc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gvimrc b/gvimrc index fb516ab6fa..513a41f0b3 100644 --- a/gvimrc +++ b/gvimrc @@ -1,7 +1,7 @@ " System gvimrc file for MacVim " " Maintainer: Björn Winckler -" Last Change: Sun Aug 26 2007 +" Last Change: Wed Aug 29 2007 " " This is a work in progress. If you feel so inclined, please help me improve " this file. @@ -21,8 +21,8 @@ if !exists("syntax_on") syntax on endif -" Shift + special movement key starts selection mode (, etc.) -behave mswin +" Shift + special movement key starts visual mode (, etc.) +set keymodel=startsel " From 7b599b706081faf893de5af3ec5e1c662639cc3a Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Thu, 30 Aug 2007 17:22:11 +0000 Subject: [PATCH 0191/1156] Implemented gui_mch_haskey() git-svn-id: http://macvim.googlecode.com/svn/trunk@219 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMBackend.h | 1 + MMBackend.m | 23 +++++++++++++++++++++++ gui_macvim.m | 7 +++++-- 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/MMBackend.h b/MMBackend.h index 92e02a0623..75630e0a32 100644 --- a/MMBackend.h +++ b/MMBackend.h @@ -104,5 +104,6 @@ - (void)stopBlink; - (int)lookupColorWithKey:(NSString *)key; +- (BOOL)hasSpecialKeyWithValue:(NSString *)value; @end diff --git a/MMBackend.m b/MMBackend.m index 7b22e99d00..d2fe34de58 100644 --- a/MMBackend.m +++ b/MMBackend.m @@ -882,8 +882,29 @@ - (int)lookupColorWithKey:(NSString *)key return INVALCOLOR; } +- (BOOL)hasSpecialKeyWithValue:(NSString *)value +{ + NSEnumerator *e = [[MMBackend specialKeys] objectEnumerator]; + id obj; + + while ((obj = [e nextObject])) { + if ([value isEqual:obj]) + return YES; + } + + return NO; +} + - (oneway void)processInput:(int)msgid data:(in NSData *)data { + // NOTE: This method might get called whenever the run loop is tended to. + // Thus it might get called whilst input is being processed. Normally this + // is not a problem, but if it gets called often then it might become + // dangerous. E.g. when a focus messages is received the screen is redrawn + // because the selection color changes and if another focus message is + // received whilst the first one is being processed Vim might crash. To + // deal with this problem at the moment, we simply drop messages that are + // received while other input is being processed. if (inProcessInput) { #if MM_USE_INPUT_QUEUE [inputQueue addObject:[NSNumber numberWithInt:msgid]]; @@ -901,6 +922,7 @@ - (oneway void)processInput:(int)msgid data:(in NSData *)data - (oneway void)processInputAndData:(in NSArray *)messages { + // NOTE: See comment in processInput:data:. unsigned i, count = [messages count]; if (count % 2) { NSLog(@"WARNING: [messages count] is odd in %s", _cmd); @@ -1477,6 +1499,7 @@ - (void)focusChange:(BOOL)on { // This is a bit of an ugly way to change the selection color. // TODO: Is there a nicer way to do this? + // TODO: Store selection color and restore it when focus is regained. char *cmd = on ? "hi Visual guibg=MacSelectedTextBackgroundColor" : "hi Visual guibg=MacSecondarySelectedControlColor"; diff --git a/gui_macvim.m b/gui_macvim.m index b1d23aae2e..39e8499e45 100644 --- a/gui_macvim.m +++ b/gui_macvim.m @@ -1213,8 +1213,11 @@ int gui_mch_haskey(char_u *name) { - NSLog(@"gui_mch_haskey(name=%s)", name); - return 0; + NSString *value = [NSString stringWithUTF8String:(char*)name]; + if (value) + return [[MMBackend sharedInstance] hasSpecialKeyWithValue:value]; + + return NO; } From d2e3b1bc2d8605bfb92c32b4b3ad8f0bc895bbd1 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Thu, 30 Aug 2007 17:47:43 +0000 Subject: [PATCH 0192/1156] git-svn-id: http://macvim.googlecode.com/svn/trunk@220 96c4425d-ca35-0410-94e5-3396d5c13a8f --- README | 4 ++++ TODO | 3 +++ 2 files changed, 7 insertions(+) diff --git a/README b/README index 54115e773a..d2598b7bfc 100644 --- a/README +++ b/README @@ -108,6 +108,10 @@ Design decisions: to MMBackendProtocol, however this must not change the state of Vim! - If MacVim or Vim dies, the NSConnection is invalidated and connectionDidDie: is invoked. +- Input may reach the backend whenever the run loop is updated. This can cause + problems if more input is received whilst already processing other input. At + the moment new input is dropped if the backend is already processing other + input. Keyboard stuff: diff --git a/TODO b/TODO index f8fd9e8c6b..13eaea5fc5 100644 --- a/TODO +++ b/TODO @@ -1,5 +1,8 @@ Active: +- Listen to NSSystemColorsDidChangeNotification and update highlighting +- System colors don't come out the same as in other apps (as measure with + Digital Color Meter) - Add support for 'mousehide' (needs to check p_mh) - Build Vim (make) from Xcode project - Cmd-W in about box sends vimMenuAction: instead of performClose: From bd8505d54fcf8bc52e448c7a64682602e4ac1102 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Thu, 30 Aug 2007 18:31:10 +0000 Subject: [PATCH 0193/1156] Convert NSAttributedString to NSString in insertText: git-svn-id: http://macvim.googlecode.com/svn/trunk@221 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMTextView.m | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/MMTextView.m b/MMTextView.m index 59f91404dc..27afcd2b13 100644 --- a/MMTextView.m +++ b/MMTextView.m @@ -193,6 +193,12 @@ - (void)insertText:(id)string // TODO: Support 'mousehide' (check p_mh) [NSCursor setHiddenUntilMouseMoves:YES]; + // NOTE: 'string' is either an NSString or an NSAttributedString. Since we + // do not support attributes, simply pass the corresponding NSString in the + // latter case. + if ([string isKindOfClass:[NSAttributedString class]]) + string = [string string]; + [[self vimController] sendMessage:InsertTextMsgID data:[string dataUsingEncoding:NSUTF8StringEncoding] wait:NO]; From fb42853d2788c51470a0148b6d95aecb93b027cd Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Fri, 31 Aug 2007 07:37:44 +0000 Subject: [PATCH 0194/1156] U+2028 and U+2029 render as squares instead of causing line break. git-svn-id: http://macvim.googlecode.com/svn/trunk@222 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMTextStorage.h | 2 ++ MMTextStorage.m | 10 ++++++++++ MMTypesetter.m | 18 ++++++++++++++++++ 3 files changed, 30 insertions(+) diff --git a/MMTextStorage.h b/MMTextStorage.h index 0768793ca5..b2b619fd5b 100644 --- a/MMTextStorage.h +++ b/MMTextStorage.h @@ -36,6 +36,8 @@ - (int)maxRows; - (int)maxColumns; +- (int)actualRows; +- (int)actualColumns; - (void)getMaxRows:(int*)rows columns:(int*)cols; - (void)setMaxRows:(int)rows columns:(int)cols; - (void)replaceString:(NSString *)string atRow:(int)row column:(int)col diff --git a/MMTextStorage.m b/MMTextStorage.m index 8694d54195..ede428935a 100644 --- a/MMTextStorage.m +++ b/MMTextStorage.m @@ -143,6 +143,16 @@ - (int)maxColumns return maxColumns; } +- (int)actualRows +{ + return actualRows; +} + +- (int)actualColumns +{ + return actualColumns; +} + - (void)getMaxRows:(int*)rows columns:(int*)cols { if (rows) *rows = maxRows; diff --git a/MMTypesetter.m b/MMTypesetter.m index 388107dd9c..e847892d3d 100644 --- a/MMTypesetter.m +++ b/MMTypesetter.m @@ -13,6 +13,8 @@ #import "MacVim.h" +#define MM_USE_LINERANGE 0 + #if 0 @interface MMTypesetter (Private) @@ -61,6 +63,7 @@ - (void)layoutGlyphsInLayoutManager:(NSLayoutManager *)lm unsigned i, numberOfLines = 0, firstLine = 0; NSRange firstLineRange = { 0, 0 }; +#if MM_USE_LINERANGE // Find the first line and its range, and count the number of lines. (This // info could also be gleaned from MMTextStorage, but we do it here anyway // to make absolutely sure everything is right.) @@ -73,6 +76,14 @@ - (void)layoutGlyphsInLayoutManager:(NSLayoutManager *)lm i = NSMaxRange(lineRange); } +#else + unsigned stride = 1 + [ts actualColumns]; + numberOfLines = [ts actualRows]; + firstLine = (unsigned)(startCharIdx/stride); + firstLineRange.location = firstLine * stride; + unsigned len = [text length] - firstLineRange.location; + firstLineRange.length = len < stride ? len : stride; +#endif // Perform line fragment generation one line at a time. NSRange lineRange = firstLineRange; @@ -105,7 +116,14 @@ - (void)layoutGlyphsInLayoutManager:(NSLayoutManager *)lm } } +#if MM_USE_LINERANGE lineRange = [text lineRangeForRange:NSMakeRange(endLineIdx, 0)]; +#else + lineRange.location = endLineIdx; + len = [text length] - lineRange.location; + if (len < lineRange.length) + lineRange.length = len; +#endif } if (nextGlyph) From ccaaae3c00399787512ebf829514c74910e2c79a Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Fri, 31 Aug 2007 07:40:55 +0000 Subject: [PATCH 0195/1156] Added a comment git-svn-id: http://macvim.googlecode.com/svn/trunk@223 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMTypesetter.m | 3 +++ 1 file changed, 3 insertions(+) diff --git a/MMTypesetter.m b/MMTypesetter.m index e847892d3d..d551f447c9 100644 --- a/MMTypesetter.m +++ b/MMTypesetter.m @@ -13,6 +13,9 @@ #import "MacVim.h" +// The 'linerange' functions count U+2028 and U+2029 as line end characters, +// which causes rendering to be screwed up because Vim does not count them as +// line end characters. #define MM_USE_LINERANGE 0 From 5db52978b5fc67ade9a6f918463d216cf7ef4d6c Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Fri, 31 Aug 2007 17:15:15 +0000 Subject: [PATCH 0196/1156] 'linespace' now supported git-svn-id: http://macvim.googlecode.com/svn/trunk@224 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMBackend.h | 1 + MMBackend.m | 7 +++++++ MMTextStorage.h | 3 +++ MMTextStorage.m | 28 ++++++++++++++++++++++++++-- MMTypesetter.m | 4 +++- MMVimController.m | 5 +++++ MMWindowController.h | 1 + MMWindowController.m | 10 ++++++++-- MacVim.h | 1 + MacVim.m | 1 + gui_macvim.m | 3 ++- 11 files changed, 58 insertions(+), 6 deletions(-) diff --git a/MMBackend.h b/MMBackend.h index 75630e0a32..68cbb6f521 100644 --- a/MMBackend.h +++ b/MMBackend.h @@ -102,6 +102,7 @@ - (void)setBlinkWait:(int)wait on:(int)on off:(int)off; - (void)startBlink; - (void)stopBlink; +- (void)adjustLinespace:(int)linespace; - (int)lookupColorWithKey:(NSString *)key; - (BOOL)hasSpecialKeyWithValue:(NSString *)value; diff --git a/MMBackend.m b/MMBackend.m index d2fe34de58..08f7285181 100644 --- a/MMBackend.m +++ b/MMBackend.m @@ -836,6 +836,13 @@ - (void)stopBlink blinkState = MMBlinkStateNone; } +- (void)adjustLinespace:(int)linespace +{ + NSMutableData *data = [NSMutableData data]; + [data appendBytes:&linespace length:sizeof(int)]; + [self queueMessage:AdjustLinespaceMsgID data:data]; +} + - (int)lookupColorWithKey:(NSString *)key { if (!(key && [key length] > 0)) diff --git a/MMTextStorage.h b/MMTextStorage.h index b2b619fd5b..0f0fbdffd1 100644 --- a/MMTextStorage.h +++ b/MMTextStorage.h @@ -25,6 +25,7 @@ NSColor *defaultBackgroundColor; NSColor *defaultForegroundColor; NSSize cellSize; + float linespace; } - (NSString *)string; @@ -38,6 +39,8 @@ - (int)maxColumns; - (int)actualRows; - (int)actualColumns; +- (float)linespace; +- (void)setLinespace:(float)newLinespace; - (void)getMaxRows:(int*)rows columns:(int*)cols; - (void)setMaxRows:(int)rows columns:(int)cols; - (void)replaceString:(NSString *)string atRow:(int)row column:(int)col diff --git a/MMTextStorage.m b/MMTextStorage.m index ede428935a..89de6b8f0f 100644 --- a/MMTextStorage.m +++ b/MMTextStorage.m @@ -39,6 +39,9 @@ - (id)init // NOTE! It does not matter which font is set here, Vim will set its // own font on startup anyway. Just set some bogus values. font = [[NSFont userFixedPitchFontOfSize:0] retain]; + boldFont = [font retain]; + italicFont = [font retain]; + boldItalicFont = [font retain]; cellSize.height = [font pointSize]; cellSize.width = [font defaultLineHeightForFont]; } @@ -153,6 +156,27 @@ - (int)actualColumns return actualColumns; } +- (float)linespace +{ + return linespace; +} + +- (void)setLinespace:(float)newLinespace +{ + NSLayoutManager *lm = [[self layoutManagers] objectAtIndex:0]; + + linespace = newLinespace; + + // NOTE: The linespace is added to the cell height in order for a multiline + // selection not to have white (background color) gaps between lines. Also + // this simplifies the code a lot because there is no need to check the + // linespace when calculating the size of the text view etc. When the + // linespace is non-zero the baseline will be adjusted as well; check + // MMTypesetter. + cellSize.height = linespace + (lm ? [lm defaultLineHeightForFont:font] + : [font defaultLineHeightForFont]); +} + - (void)getMaxRows:(int*)rows columns:(int*)cols { if (rows) *rows = maxRows; @@ -417,8 +441,8 @@ - (void)setFont:(NSFont*)newFont [font retain]; NSLayoutManager *lm = [[self layoutManagers] objectAtIndex:0]; - cellSize.height = lm ? [lm defaultLineHeightForFont:font] - : [font defaultLineHeightForFont]; + cellSize.height = linespace + (lm ? [lm defaultLineHeightForFont:font] + : [font defaultLineHeightForFont]); // NOTE: The font manager does not care about the 'font fixed advance' // attribute, so after converting the font we have to add this diff --git a/MMTypesetter.m b/MMTypesetter.m index d551f447c9..90a620df49 100644 --- a/MMTypesetter.m +++ b/MMTypesetter.m @@ -52,7 +52,9 @@ - (void)layoutGlyphsInLayoutManager:(NSLayoutManager *)lm NSString *text = [ts string]; unsigned textLen = [text length]; NSSize cellSize = [ts cellSize]; - float baseline = [font descender]; + // NOTE: With non-zero linespace the baseline is adjusted so that the text + // is centered within a line. + float baseline = [font descender] - floor(.5*[ts linespace]); if (!(ts && tv && tc && font && text && textLen)) return; diff --git a/MMVimController.m b/MMVimController.m index 0de871d11e..febdce2a42 100644 --- a/MMVimController.m +++ b/MMVimController.m @@ -744,6 +744,11 @@ - (void)handleMessage:(int)msgid data:(NSData *)data int shape = *((int*)bytes); bytes += sizeof(int); [windowController setMouseShape:shape]; + } else if (AdjustLinespaceMsgID == msgid) { + const void *bytes = [data bytes]; + int linespace = *((int*)bytes); bytes += sizeof(int); + + [windowController adjustLinespace:linespace]; } else { NSLog(@"WARNING: Unknown message received (msgid=%d)", msgid); } diff --git a/MMWindowController.h b/MMWindowController.h index 7ec973be9d..84a46b407d 100644 --- a/MMWindowController.h +++ b/MMWindowController.h @@ -57,6 +57,7 @@ - (void)showTabBar:(BOOL)on; - (void)showToolbar:(BOOL)on size:(int)size mode:(int)mode; - (void)setMouseShape:(int)shape; +- (void)adjustLinespace:(int)linespace; - (IBAction)addNewTab:(id)sender; - (IBAction)toggleToolbar:(id)sender; diff --git a/MMWindowController.m b/MMWindowController.m index 67c2d98846..3f5d923748 100644 --- a/MMWindowController.m +++ b/MMWindowController.m @@ -280,8 +280,6 @@ - (void)openWindow [self addNewTabViewItem]; - //[[self window] setAcceptsMouseMovedEvents:YES]; - setupDone = YES; [self updateResizeIncrements]; @@ -543,6 +541,14 @@ - (void)setMouseShape:(int)shape [NSCursor setHiddenUntilMouseMoves:YES]; } +- (void)adjustLinespace:(int)linespace +{ + if (textStorage) { + [textStorage setLinespace:(float)linespace]; + shouldUpdateWindowSize = YES; + } +} + - (IBAction)addNewTab:(id)sender { // NOTE! This can get called a lot if the user holds down the key diff --git a/MacVim.h b/MacVim.h index 4bead2863a..74d24d079e 100644 --- a/MacVim.h +++ b/MacVim.h @@ -118,6 +118,7 @@ enum { LostFocusMsgID, MouseMovedMsgID, SetMouseShapeMsgID, + AdjustLinespaceMsgID, }; diff --git a/MacVim.m b/MacVim.m index ed967924d1..f8772c3f65 100644 --- a/MacVim.m +++ b/MacVim.m @@ -56,6 +56,7 @@ "LostFocusMsgID", "MouseMovedMsgID", "SetMouseShapeMsgID", + "AdjustLinespaceMsgID", }; diff --git a/gui_macvim.m b/gui_macvim.m index 39e8499e45..66365f487f 100644 --- a/gui_macvim.m +++ b/gui_macvim.m @@ -1073,7 +1073,8 @@ int gui_mch_adjust_charheight(void) { - return 0; + [[MMBackend sharedInstance] adjustLinespace:p_linespace]; + return OK; } From ffa192240ac64dfb7d5b26d22b4c7bf5c8691b5b Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sat, 1 Sep 2007 19:35:31 +0000 Subject: [PATCH 0197/1156] Added partial client/server support (scripting not yet supported) git-svn-id: http://macvim.googlecode.com/svn/trunk@225 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMAppController.m | 37 ++++++++ MMBackend.h | 2 + MMBackend.m | 43 +++++++++- MMVimController.m | 3 + MacVim.h | 4 + MacVim.m | 2 + gui_macvim.m | 209 ++++++++++++++++++++++++++++++++++++++++++++++ 7 files changed, 296 insertions(+), 4 deletions(-) diff --git a/MMAppController.m b/MMAppController.m index 25b07ef075..48a54eb056 100644 --- a/MMAppController.m +++ b/MMAppController.m @@ -433,6 +433,43 @@ - (IBAction)selectPreviousWindow:(id)sender return vc; } +- (NSArray *)serverList +{ + NSMutableArray *array = [NSMutableArray array]; + + unsigned i, count = [vimControllers count]; + for (i = 0; i < count; ++i) { + MMVimController *controller = [vimControllers objectAtIndex:i]; + id proxy = [controller backendProxy]; + NSConnection *connection = [proxy connectionForProxy]; + if (!connection) + continue; + + // Set low timeouts since we don't want this call to potentially lock + // up MacVim for a while. + NSTimeInterval req = [connection requestTimeout]; + NSTimeInterval rep = [connection replyTimeout]; + [connection setRequestTimeout:0]; + [connection setReplyTimeout:.1]; + + @try { + NSString *eval = [proxy evaluateExpression:@"v:servername"]; + if (eval) { + [array addObject:eval]; + } + } + @catch (NSException *e) { + NSLog(@"WARNING: Got exception while listing servers: \"%@\"", e); + } + @finally { + [connection setRequestTimeout:req]; + [connection setReplyTimeout:rep]; + } + } + + return array; +} + @end // MMAppController diff --git a/MMBackend.h b/MMBackend.h index 68cbb6f521..7cee92b12b 100644 --- a/MMBackend.h +++ b/MMBackend.h @@ -54,6 +54,7 @@ - (void)setSpecialColor:(int)color; - (void)setDefaultColorsBackground:(int)bg foreground:(int)fg; +- (NSString *)macVimConnectionName; - (BOOL)checkin; - (BOOL)openVimWindow; - (void)clearAll; @@ -103,6 +104,7 @@ - (void)startBlink; - (void)stopBlink; - (void)adjustLinespace:(int)linespace; +- (void)activate; - (int)lookupColorWithKey:(NSString *)key; - (BOOL)hasSpecialKeyWithValue:(NSString *)value; diff --git a/MMBackend.m b/MMBackend.m index 08f7285181..6425344864 100644 --- a/MMBackend.m +++ b/MMBackend.m @@ -135,14 +135,19 @@ - (void)setDefaultColorsBackground:(int)bg foreground:(int)fg [self queueMessage:SetDefaultColorsMsgID data:data]; } +- (NSString *)macVimConnectionName +{ + // NOTE! If the name of the connection changes here it must also be + // updated in MMAppController.m. + return [NSString stringWithFormat:@"%@-connection", + [[NSBundle mainBundle] bundleIdentifier]]; +} + - (BOOL)checkin { NSBundle *mainBundle = [NSBundle mainBundle]; - // NOTE! If the name of the connection changes here it must also be - // updated in MMAppController.m. - NSString *name = [NSString stringWithFormat:@"%@-connection", - [mainBundle bundleIdentifier]]; + NSString *name = [self macVimConnectionName]; connection = [NSConnection connectionWithRegisteredName:name host:nil]; if (!connection) { #if 0 @@ -365,6 +370,12 @@ - (BOOL)waitForInput:(int)milliseconds - (void)exit { +#ifdef MAC_CLIENTSERVER + // The default connection is used for the client/server code. + [[NSConnection defaultConnection] setRootObject:nil]; + [[NSConnection defaultConnection] invalidate]; +#endif + // By invalidating the NSConnection the MMWindowController immediately // finds out that the connection is down and as a result // [MMWindowController connectionDidDie:] is invoked. @@ -843,6 +854,11 @@ - (void)adjustLinespace:(int)linespace [self queueMessage:AdjustLinespaceMsgID data:data]; } +- (void)activate +{ + [self queueMessage:ActivateMsgID data:nil]; +} + - (int)lookupColorWithKey:(NSString *)key { if (!(key && [key length] > 0)) @@ -1003,6 +1019,19 @@ - (BOOL)starRegisterToPasteboard:(byref NSPasteboard *)pboard return NO; } +- (NSString *)evaluateExpression:(in bycopy NSString *)expr +{ + NSString *eval = nil; + char_u *res = eval_client_expr_to_string((char_u*)[expr UTF8String]); + + if (res != NULL) { + eval = [NSString stringWithUTF8String:(char*)res]; + vim_free(res); + } + + return eval; +} + @end // MMBackend @@ -1363,6 +1392,12 @@ - (void)handleMessage:(int)msgid data:(NSData *)data const void *bytes = [data bytes]; int shape = *((int*)bytes); bytes += sizeof(int); update_mouseshape(shape); + } else if (ServerAddInputMsgID == msgid) { + const void *bytes = [data bytes]; + /*int len = *((int*)bytes);*/ bytes += sizeof(int); + char_u *cmd = (char_u*)bytes; + + server_to_input_buf(cmd); } else { NSLog(@"WARNING: Unknown message received (msgid=%d)", msgid); } diff --git a/MMVimController.m b/MMVimController.m index febdce2a42..39f968b92e 100644 --- a/MMVimController.m +++ b/MMVimController.m @@ -749,6 +749,9 @@ - (void)handleMessage:(int)msgid data:(NSData *)data int linespace = *((int*)bytes); bytes += sizeof(int); [windowController adjustLinespace:linespace]; + } else if (ActivateMsgID == msgid) { + [NSApp activateIgnoringOtherApps:YES]; + [[windowController window] makeKeyAndOrderFront:self]; } else { NSLog(@"WARNING: Unknown message received (msgid=%d)", msgid); } diff --git a/MacVim.h b/MacVim.h index 74d24d079e..7d3f0a528e 100644 --- a/MacVim.h +++ b/MacVim.h @@ -35,6 +35,7 @@ - (BOOL)checkForModifiedBuffers; - (oneway void)setDialogReturn:(in bycopy id)obj; - (BOOL)starRegisterToPasteboard:(byref NSPasteboard *)pboard; +- (NSString *)evaluateExpression:(in bycopy NSString *)expr; @end @@ -62,6 +63,7 @@ @protocol MMAppProtocol - (byref id )connectBackend: (byref in id )backend pid:(int)pid; +- (NSArray *)serverList; @end @@ -119,6 +121,8 @@ enum { MouseMovedMsgID, SetMouseShapeMsgID, AdjustLinespaceMsgID, + ActivateMsgID, + ServerAddInputMsgID, }; diff --git a/MacVim.m b/MacVim.m index f8772c3f65..69e810b365 100644 --- a/MacVim.m +++ b/MacVim.m @@ -57,6 +57,8 @@ "MouseMovedMsgID", "SetMouseShapeMsgID", "AdjustLinespaceMsgID", + "ActivateMsgID", + "ServerAddInputMsgID", }; diff --git a/gui_macvim.m b/gui_macvim.m index 66365f487f..3c4084fd9f 100644 --- a/gui_macvim.m +++ b/gui_macvim.m @@ -1247,6 +1247,7 @@ void gui_mch_set_foreground(void) { + [[MMBackend sharedInstance] activate]; } #endif @@ -1326,3 +1327,211 @@ return [actionDict objectForKey:action] != nil; } + + + +// -- Client/Server --------------------------------------------------------- + +#ifdef MAC_CLIENTSERVER + +// +// NOTE: Client/Server stuff only works with the GUI. Theoretically it would +// be possible to make this code work with terminal Vim, but it would require +// that a run-loop is set up and checked, etc. +// + +static unsigned MMServerMax = 1000; +static NSTimeInterval MMEvaluateExpressionTimeout = 3; +static NSTimeInterval MMServerListTimeout = 3; + + + static NSString * +shortToLongName(NSString *shortName) +{ + NSString *bundleIdentifier = [[NSBundle mainBundle] bundleIdentifier]; + + return [NSString stringWithFormat:@"%@.%@", bundleIdentifier, shortName]; +} + + + static NSString * +longToShortName(NSString *longName) +{ + NSString *bundleIdentifier = [[NSBundle mainBundle] bundleIdentifier]; + NSRange range = [longName rangeOfString:bundleIdentifier]; + + return NSNotFound != range.location + ? [longName substringFromIndex:1+NSMaxRange(range)] + : longName; +} + + +/* + * Register connection with 'name'. The actual connection is named something + * like 'org.vim.MacVim.VIM3', whereas the server is called 'VIM3'. + */ + void +serverSetName(char_u *name) +{ + NSString *baseName = + shortToLongName([NSString stringWithUTF8String:(char*)name]); + NSString *longName = baseName; + NSConnection *connection = [NSConnection defaultConnection]; + unsigned i; + + for (i = 1; i < MMServerMax; ++i) { + //NSLog(@"Client-Server: Try to register connection '%@'", longName); + if ([connection registerName:longName]) { + NSString *shortName = longToShortName(longName); + + //NSLog(@"Client-Server: Did register server '%@'", shortName); + serverName = vim_strsave((char_u*)[shortName UTF8String]); +#ifdef FEAT_EVAL + set_vim_var_string(VV_SEND_SERVER, serverName, -1); +#endif +#ifdef FEAT_TITLE + need_maketitle = TRUE; +#endif + + // Don't wait for requests (time-out means that the message is + // dropped). + [connection setRequestTimeout:0]; + //[connection setReplyTimeout:MMReplyTimeout]; + [connection setRootObject:[MMBackend sharedInstance]]; + break; + } + + longName = [NSString stringWithFormat:@"%@%d", baseName, i]; + } +} + + +/* + * Send to an instance of Vim. + * Returns 0 for OK, negative for an error. + */ + int +serverSendToVim(char_u *name, char_u *cmd, char_u **result, + int *server, int asExpr, int silent) +{ + //NSLog(@"serverSendToVim(name=%s, cmd=%s, asExpr=%d, silent=%d)", + // name, cmd, asExpr, silent); + + NSString *longName = + shortToLongName([NSString stringWithUTF8String:(char*)name]); + NSConnection *connection = [NSConnection + connectionWithRegisteredName:longName host:nil]; + + if (!connection) { + if (!silent) + EMSG2(_(e_noserver), name); + return -1; + } + + [connection setRequestTimeout:0]; + + id proxy = [connection rootProxy]; + [proxy setProtocolForProxy:@protocol(MMBackendProtocol)]; + + // Expressions need to wait for a reply; otherwise just send off the input + // asynchronously. + if (asExpr) { + [connection setReplyTimeout:MMEvaluateExpressionTimeout]; + @try { + NSString *expr = [NSString stringWithUTF8String:(char*)cmd]; + NSString *eval = [proxy evaluateExpression:expr]; + if (result) { + *result = (eval ? vim_strsave((char_u*)[eval UTF8String]) + : vim_strsave((char_u*)_(e_invexprmsg))); + } + } + @catch (NSException *e) { + NSLog(@"WARNING: Caught exception during expression evaluation " + "\"%@\"", e); + return -1; + } + } else { + int len = 1 + STRLEN(cmd); + NSMutableData *data = [NSMutableData data]; + + [data appendBytes:&len length:sizeof(int)]; + [data appendBytes:cmd length:len]; + + [proxy processInput:ServerAddInputMsgID data:data]; + } + + return 0; +} + + +/* + * Ask MacVim for the names of all Vim servers. + */ + char_u * +serverGetVimNames(void) +{ + char_u *names = NULL; + NSString *name = [[MMBackend sharedInstance] macVimConnectionName]; + NSConnection *connection = [NSConnection connectionWithRegisteredName:name + host:nil]; + if (connection) { + NSArray *serverNames = nil; + id proxy = [connection rootProxy]; + + [proxy setProtocolForProxy:@protocol(MMAppProtocol)]; + [connection setRequestTimeout:0]; + [connection setReplyTimeout:MMServerListTimeout]; + + @try { + serverNames = [proxy serverList]; + } + @catch (NSException *e) { + NSLog(@"Exception caught when listing servers: \"%@\"", e); + } + + if (serverNames) { + NSString *string = [serverNames componentsJoinedByString:@"\n"]; + names = vim_strsave((char_u*)[string UTF8String]); + } + } + + return names; +} + + +/* + * Check for replies from 'serverid'. + * Return TRUE and a non-malloc'ed string if there is. Else return FALSE. + */ + int +serverPeekReply(char_u *serverid, char_u **str) +{ + return FALSE; +} + + +/* + * Wait for replies from server 'name'. + * Return 0 and the malloc'ed string when a reply is available. + * Return -1 on error. + */ + int +serverReadReply(char_u *name, char_u **str) +{ + //NSLog(@"serverReadReply(name=%s)", name); + return -1; +} + + +/* + * Send a reply string (notification) to client with id "name". + * Return -1 if the window is invalid. + */ + int +serverSendReply(char_u *name, char_u *reply) +{ + //NSLog(@"serverSendReply(name=%s, reply=%s)", name, reply); + return -1; +} + +#endif // MAC_CLIENTSERVER From 43104e3e15d594e16e108e8540a73416a0a2da8a Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sun, 2 Sep 2007 13:09:10 +0000 Subject: [PATCH 0198/1156] Visual bg color changed in script instead of in code. git-svn-id: http://macvim.googlecode.com/svn/trunk@226 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMBackend.m | 16 ---------------- gvimrc | 7 ++++++- 2 files changed, 6 insertions(+), 17 deletions(-) diff --git a/MMBackend.m b/MMBackend.m index 6425344864..582fe51c0c 100644 --- a/MMBackend.m +++ b/MMBackend.m @@ -1539,23 +1539,7 @@ - (void)blinkTimerFired:(NSTimer *)timer - (void)focusChange:(BOOL)on { - // This is a bit of an ugly way to change the selection color. - // TODO: Is there a nicer way to do this? - // TODO: Store selection color and restore it when focus is regained. - char *cmd = on - ? "hi Visual guibg=MacSelectedTextBackgroundColor" - : "hi Visual guibg=MacSecondarySelectedControlColor"; - - do_cmdline_cmd((char_u*)cmd); gui_focus_change(on); - - // TODO: Is all this necessary just to get the highlights to update? - redraw_all_later(CLEAR); - update_screen(NOT_VALID); - setcursor(); - out_flush(); - gui_update_cursor(FALSE, FALSE); - gui_mch_flush(); } - (void)processInputBegin diff --git a/gvimrc b/gvimrc index 513a41f0b3..b7fe90f5b4 100644 --- a/gvimrc +++ b/gvimrc @@ -1,7 +1,7 @@ " System gvimrc file for MacVim " " Maintainer: Björn Winckler -" Last Change: Wed Aug 29 2007 +" Last Change: Sun Sep 02 2007 " " This is a work in progress. If you feel so inclined, please help me improve " this file. @@ -25,6 +25,11 @@ endif set keymodel=startsel +" Change selection color on focus change +au FocusLost * hi Visual guibg=MacSecondarySelectedControlColor +au FocusGained * hi Visual guibg=MacSelectedTextBackgroundColor + + " " Extra menus " From a70e77dd165f569274ab26cc1059711bef535af7 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sun, 2 Sep 2007 16:10:33 +0000 Subject: [PATCH 0199/1156] Fixed rounding problem when looking up system colors. git-svn-id: http://macvim.googlecode.com/svn/trunk@227 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMBackend.m | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/MMBackend.m b/MMBackend.m index 582fe51c0c..646b44a862 100644 --- a/MMBackend.m +++ b/MMBackend.m @@ -895,8 +895,9 @@ - (int)lookupColorWithKey:(NSString *)key float r, g, b, a; col = [col colorUsingColorSpaceName:NSCalibratedRGBColorSpace]; [col getRed:&r green:&g blue:&b alpha:&a]; - return ((int)(r*255) << 16) + ((int)(g*255) << 8) - + (int)(b*255); + return (((int)(r*255+.5f) & 0xff) << 16) + + (((int)(g*255+.5f) & 0xff) << 8) + + ((int)(b*255+.5f) & 0xff); } } } From a434926ed8be9af40e2a377f27a69dd933e89a92 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sun, 2 Sep 2007 17:57:07 +0000 Subject: [PATCH 0200/1156] Removed some warning logs git-svn-id: http://macvim.googlecode.com/svn/trunk@228 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMBackend.m | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/MMBackend.m b/MMBackend.m index 646b44a862..4175603a3b 100644 --- a/MMBackend.m +++ b/MMBackend.m @@ -935,7 +935,7 @@ - (oneway void)processInput:(int)msgid data:(in NSData *)data [inputQueue addObject:data]; #else // Just drop the input - NSLog(@"WARNING: Dropping input in %s", _cmd); + //NSLog(@"WARNING: Dropping input in %s", _cmd); #endif } else { [self processInputBegin]; @@ -958,7 +958,7 @@ - (oneway void)processInputAndData:(in NSArray *)messages [inputQueue addObjectsFromArray:messages]; #else // Just drop the input - NSLog(@"WARNING: Dropping input in %s", _cmd); + //NSLog(@"WARNING: Dropping input in %s", _cmd); #endif } else { [self processInputBegin]; From fe6c1afd1beb7816481d1528ea45a92f66fa4455 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sun, 2 Sep 2007 18:00:44 +0000 Subject: [PATCH 0201/1156] git-svn-id: http://macvim.googlecode.com/svn/trunk@229 96c4425d-ca35-0410-94e5-3396d5c13a8f --- README | 1 + TODO | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/README b/README index d2598b7bfc..17334b8c9e 100644 --- a/README +++ b/README @@ -185,3 +185,4 @@ Features (!supp indicates that a feature is not supported): - Encodings: !supp (enc, tenc always set to utf-8) - Autosave window position - Smart cascading of new windows +- Partial client/server support diff --git a/TODO b/TODO index 13eaea5fc5..3a9b4fae50 100644 --- a/TODO +++ b/TODO @@ -1,8 +1,6 @@ Active: - Listen to NSSystemColorsDidChangeNotification and update highlighting -- System colors don't come out the same as in other apps (as measure with - Digital Color Meter) - Add support for 'mousehide' (needs to check p_mh) - Build Vim (make) from Xcode project - Cmd-W in about box sends vimMenuAction: instead of performClose: @@ -56,6 +54,8 @@ Active: Pending: +- System colors don't come out the same as in other apps (as measure with + Digital Color Meter) - Select-mode for - Insertion point blinking - Hollow insertion point drawing does not always work From ab94408077c7910f3eef8f0f7f9315a402a7cb31 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sun, 9 Sep 2007 17:20:03 +0000 Subject: [PATCH 0202/1156] First revision with full client/server support git-svn-id: http://macvim.googlecode.com/svn/trunk@230 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMAppController.m | 10 +- MMBackend.h | 19 +- MMBackend.m | 462 ++++++++++++++++++++++++++++++++++++++++++++-- MMVimController.h | 3 + MMVimController.m | 19 ++ MacVim.h | 37 +++- MacVim.m | 1 + gui_macvim.m | 207 +++++++-------------- 8 files changed, 598 insertions(+), 160 deletions(-) diff --git a/MMAppController.m b/MMAppController.m index 48a54eb056..906c5d4158 100644 --- a/MMAppController.m +++ b/MMAppController.m @@ -405,8 +405,9 @@ - (IBAction)selectPreviousWindow:(id)sender } } -- (byref id )connectBackend: - (byref in id )backend pid:(int)pid +- (byref id ) + connectBackend:(byref in id )backend + pid:(int)pid { //NSLog(@"Frontend got connection request from backend...adding new " // "MMVimController"); @@ -440,6 +441,7 @@ - (NSArray *)serverList unsigned i, count = [vimControllers count]; for (i = 0; i < count; ++i) { MMVimController *controller = [vimControllers objectAtIndex:i]; +#if 0 id proxy = [controller backendProxy]; NSConnection *connection = [proxy connectionForProxy]; if (!connection) @@ -465,6 +467,10 @@ - (NSArray *)serverList [connection setRequestTimeout:req]; [connection setReplyTimeout:rep]; } +#else + if ([controller serverName]) + [array addObject:[controller serverName]]; +#endif } return array; diff --git a/MMBackend.h b/MMBackend.h index 7cee92b12b..cca74e368e 100644 --- a/MMBackend.h +++ b/MMBackend.h @@ -10,6 +10,7 @@ #import #import "MacVim.h" +#import "vim.h" // If disabled, all input is dropped if input is already being processed. (If @@ -20,7 +21,8 @@ -@interface MMBackend : NSObject { +@interface MMBackend : NSObject { NSMutableArray *queue; NSMutableData *drawData; NSConnection *connection; @@ -45,6 +47,10 @@ #if MM_USE_INPUT_QUEUE NSMutableArray *inputQueue; #endif + NSMutableDictionary *connectionNameDict; + NSMutableDictionary *clientProxyDict; + NSMutableDictionary *serverReplyDict; + NSString *alternateServerName; } + (MMBackend *)sharedInstance; @@ -53,8 +59,8 @@ - (void)setForegroundColor:(int)color; - (void)setSpecialColor:(int)color; - (void)setDefaultColorsBackground:(int)bg foreground:(int)fg; +- (NSConnection *)connection; -- (NSString *)macVimConnectionName; - (BOOL)checkin; - (BOOL)openVimWindow; - (void)clearAll; @@ -109,4 +115,13 @@ - (int)lookupColorWithKey:(NSString *)key; - (BOOL)hasSpecialKeyWithValue:(NSString *)value; +- (void)registerServerWithName:(NSString *)name; +- (BOOL)sendToServer:(NSString *)name string:(NSString *)string + reply:(char_u **)reply port:(int *)port expression:(BOOL)expr + silent:(BOOL)silent; +- (NSArray *)serverList; +- (NSString *)peekForReplyOnPort:(int)port; +- (NSString *)waitForReplyOnPort:(int)port; +- (BOOL)sendReply:(NSString *)reply toPort:(int)port; + @end diff --git a/MMBackend.m b/MMBackend.m index 4175603a3b..a19b2699d4 100644 --- a/MMBackend.m +++ b/MMBackend.m @@ -9,7 +9,6 @@ */ #import "MMBackend.h" -#import "vim.h" @@ -19,6 +18,9 @@ // file). (The unit is seconds.) static float MMFlushTimeoutInterval = 0.1f; +static unsigned MMServerMax = 1000; +//static NSTimeInterval MMEvaluateExpressionTimeout = 3; + // TODO: Move to separate file. static int eventModifierFlagsToVimModMask(int modifierFlags); @@ -34,6 +36,13 @@ }; + +@interface NSString (MMServerNameCompare) +- (NSComparisonResult)serverNameCompare:(NSString *)string; +@end + + + @interface MMBackend (Private) - (void)handleMessage:(int)msgid data:(NSData *)data; + (NSDictionary *)specialKeys; @@ -44,6 +53,12 @@ - (void)blinkTimerFired:(NSTimer *)timer; - (void)focusChange:(BOOL)on; - (void)processInputBegin; - (void)processInputEnd; +- (NSString *)connectionNameFromServerName:(NSString *)name; +- (NSConnection *)connectionForServerName:(NSString *)name; +- (NSConnection *)connectionForServerPort:(int)port; +- (void)serverConnectionDidDie:(NSNotification *)notification; +- (void)addClient:(NSDistantObject *)client; +- (NSString *)alternateServerNameForName:(NSString *)name; @end @@ -64,6 +79,9 @@ - (id)init inputQueue = [[NSMutableArray alloc] init]; #endif drawData = [[NSMutableData alloc] initWithCapacity:1024]; + connectionNameDict = [[NSMutableDictionary alloc] init]; + clientProxyDict = [[NSMutableDictionary alloc] init]; + serverReplyDict = [[NSMutableDictionary alloc] init]; NSString *path = [[NSBundle mainBundle] pathForResource:@"Colors" ofType:@"plist"]; @@ -97,6 +115,10 @@ - (void)dealloc #if MM_USE_INPUT_QUEUE [inputQueue release]; inputQueue = nil; #endif + [alternateServerName release]; alternateServerName = nil; + [serverReplyDict release]; serverReplyDict = nil; + [clientProxyDict release]; clientProxyDict = nil; + [connectionNameDict release]; connectionNameDict = nil; [queue release]; queue = nil; [drawData release]; drawData = nil; [frontendProxy release]; frontendProxy = nil; @@ -135,21 +157,26 @@ - (void)setDefaultColorsBackground:(int)bg foreground:(int)fg [self queueMessage:SetDefaultColorsMsgID data:data]; } -- (NSString *)macVimConnectionName +- (NSConnection *)connection { - // NOTE! If the name of the connection changes here it must also be - // updated in MMAppController.m. - return [NSString stringWithFormat:@"%@-connection", - [[NSBundle mainBundle] bundleIdentifier]]; + if (!connection) { + // NOTE! If the name of the connection changes here it must also be + // updated in MMAppController.m. + NSString *name = [NSString stringWithFormat:@"%@-connection", + [[NSBundle mainBundle] bundleIdentifier]]; + + connection = [NSConnection connectionWithRegisteredName:name host:nil]; + [connection retain]; + } + + // NOTE: 'connection' may be nil here. + return connection; } - (BOOL)checkin { - NSBundle *mainBundle = [NSBundle mainBundle]; - - NSString *name = [self macVimConnectionName]; - connection = [NSConnection connectionWithRegisteredName:name host:nil]; - if (!connection) { + if (![self connection]) { + NSBundle *mainBundle = [NSBundle mainBundle]; #if 0 NSString *path = [mainBundle bundlePath]; if (![[NSWorkspace sharedWorkspace] launchApplication:path]) { @@ -190,8 +217,8 @@ - (BOOL)checkin runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:1]]; - connection = [NSConnection connectionWithRegisteredName:name - host:nil]; + // NOTE: This call will set 'connection' as a side-effect. + [self connection]; } if (!connection) { @@ -210,14 +237,14 @@ - (BOOL)checkin int pid = [[NSProcessInfo processInfo] processIdentifier]; @try { - frontendProxy = [(NSDistantObject*)[proxy connectBackend:self - pid:pid] retain]; + frontendProxy = [proxy connectBackend:self pid:pid]; } @catch (NSException *e) { NSLog(@"Exception caught when trying to connect backend: \"%@\"", e); } if (frontendProxy) { + [frontendProxy retain]; [frontendProxy setProtocolForProxy:@protocol(MMAppProtocol)]; } @@ -859,6 +886,12 @@ - (void)activate [self queueMessage:ActivateMsgID data:nil]; } +- (void)setServerName:(NSString *)name +{ + NSData *data = [name dataUsingEncoding:NSUTF8StringEncoding]; + [self queueMessage:SetServerNameMsgID data:data]; +} + - (int)lookupColorWithKey:(NSString *)key { if (!(key && [key length] > 0)) @@ -1020,6 +1053,7 @@ - (BOOL)starRegisterToPasteboard:(byref NSPasteboard *)pboard return NO; } +#if 0 - (NSString *)evaluateExpression:(in bycopy NSString *)expr { NSString *eval = nil; @@ -1032,6 +1066,230 @@ - (NSString *)evaluateExpression:(in bycopy NSString *)expr return eval; } +#endif + +- (oneway void)addReply:(in bycopy NSString *)reply + server:(in byref id )server +{ + //NSLog(@"addReply:%@ server:%@", reply, (id)server); + + // Replies might come at any time and in any order so we keep them in an + // array inside a dictionary with the send port used as key. + + NSConnection *conn = [(NSDistantObject*)server connectionForProxy]; + // HACK! Assume connection uses mach ports. + int port = [(NSMachPort*)[conn sendPort] machPort]; + NSNumber *key = [NSNumber numberWithInt:port]; + + NSMutableArray *replies = [serverReplyDict objectForKey:key]; + if (!replies) { + replies = [NSMutableArray array]; + [serverReplyDict setObject:replies forKey:key]; + } + + [replies addObject:reply]; +} + +- (void)addInput:(in bycopy NSString *)input + client:(in byref id )client +{ + //NSLog(@"addInput:%@ client:%@", input, (id)client); + + server_to_input_buf((char_u*)[input UTF8String]); + + [self addClient:(id)client]; + + inputReceived = YES; +} + +- (NSString *)evaluateExpression:(in bycopy NSString *)expr + client:(in byref id )client +{ + //NSLog(@"evaluateExpression:%@ client:%@", expr, (id)client); + + NSString *eval = nil; + char_u *res = eval_client_expr_to_string((char_u*)[expr UTF8String]); + + if (res != NULL) { + eval = [NSString stringWithUTF8String:(char*)res]; + vim_free(res); + } + + [self addClient:(id)client]; + + return eval; +} + +- (void)registerServerWithName:(NSString *)name +{ + NSString *svrName = name; + NSConnection *svrConn = [NSConnection defaultConnection]; + unsigned i; + + for (i = 0; i < MMServerMax; ++i) { + NSString *connName = [self connectionNameFromServerName:svrName]; + + if ([svrConn registerName:connName]) { + //NSLog(@"Registered server with name: %@", svrName); + + // Don't wait for requests (time-out means that the message is + // dropped). + [svrConn setRequestTimeout:0]; + //[svrConn setReplyTimeout:MMReplyTimeout]; + [svrConn setRootObject:self]; + + // NOTE: 'serverName' is a global variable + serverName = vim_strsave((char_u*)[svrName UTF8String]); +#ifdef FEAT_EVAL + set_vim_var_string(VV_SEND_SERVER, serverName, -1); +#endif +#ifdef FEAT_TITLE + need_maketitle = TRUE; +#endif + [self queueMessage:SetServerNameMsgID data: + [svrName dataUsingEncoding:NSUTF8StringEncoding]]; + break; + } + + svrName = [NSString stringWithFormat:@"%@%d", name, i+1]; + } +} + +- (BOOL)sendToServer:(NSString *)name string:(NSString *)string + reply:(char_u **)reply port:(int *)port expression:(BOOL)expr + silent:(BOOL)silent +{ + // NOTE: If 'name' equals 'serverName' then the request is local (client + // and server are the same). This case is not handled separately, so a + // connection will be set up anyway (this simplifies the code). + + NSConnection *conn = [self connectionForServerName:name]; + if (!conn) { + if (!silent) + EMSG2(_(e_noserver), [name UTF8String]); + return NO; + } + + if (port) { + // HACK! Assume connection uses mach ports. + *port = [(NSMachPort*)[conn sendPort] machPort]; + } + + id proxy = [conn rootProxy]; + [proxy setProtocolForProxy:@protocol(MMVimServerProtocol)]; + + @try { + if (expr) { + NSString *eval = [proxy evaluateExpression:string client:self]; + if (reply) { + *reply = (eval ? vim_strsave((char_u*)[eval UTF8String]) + : vim_strsave((char_u*)_(e_invexprmsg))); + } + + if (!eval) + return NO; + } else { + [proxy addInput:string client:self]; + } + } + @catch (NSException *e) { + NSLog(@"WARNING: Caught exception in %s: \"%@\"", _cmd, e); + return NO; + } + + return YES; +} + +- (NSArray *)serverList +{ + NSArray *list = nil; + + if ([self connection]) { + id proxy = [connection rootProxy]; + [proxy setProtocolForProxy:@protocol(MMAppProtocol)]; + + @try { + list = [proxy serverList]; + } + @catch (NSException *e) { + NSLog(@"Exception caught when listing servers: \"%@\"", e); + } + } else { + EMSG(_("E???: No connection to MacVim, server listing not possible.")); + } + + return list; +} + +- (NSString *)peekForReplyOnPort:(int)port +{ + //NSLog(@"%s%d", _cmd, port); + + NSNumber *key = [NSNumber numberWithInt:port]; + NSMutableArray *replies = [serverReplyDict objectForKey:key]; + if (replies && [replies count]) { + //NSLog(@" %d replies, topmost is: %@", [replies count], + // [replies objectAtIndex:0]); + return [replies objectAtIndex:0]; + } + + //NSLog(@" No replies"); + return nil; +} + +- (NSString *)waitForReplyOnPort:(int)port +{ + //NSLog(@"%s%d", _cmd, port); + + NSConnection *conn = [self connectionForServerPort:port]; + if (!conn) + return nil; + + NSNumber *key = [NSNumber numberWithInt:port]; + NSMutableArray *replies = nil; + NSString *reply = nil; + + // Wait for reply as long as the connection to the server is valid (unless + // user interrupts wait with Ctrl-C). + while (!got_int && [conn isValid] && + !(replies = [serverReplyDict objectForKey:key])) { + [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode + beforeDate:[NSDate distantFuture]]; + } + + if (replies) { + if ([replies count] > 0) { + reply = [[replies objectAtIndex:0] retain]; + //NSLog(@" Got reply: %@", reply); + [replies removeObjectAtIndex:0]; + [reply autorelease]; + } + + if ([replies count] == 0) + [serverReplyDict removeObjectForKey:key]; + } + + return reply; +} + +- (BOOL)sendReply:(NSString *)reply toPort:(int)port +{ + id client = [clientProxyDict objectForKey:[NSNumber numberWithInt:port]]; + if (client) { + @try { + //NSLog(@"sendReply:%@ toPort:%d", reply, port); + [client addReply:reply server:self]; + return YES; + } + @catch (NSException *e) { + NSLog(@"WARNING: Exception caught in %s: \"%@\"", _cmd, e); + } + } else { + EMSG2(_("E???: server2client failed; no client with id 0x%x"), port); + } + + return NO; +} @end // MMBackend @@ -1586,11 +1844,185 @@ - (void)processInputEnd inProcessInput = NO; } +- (NSString *)connectionNameFromServerName:(NSString *)name +{ + NSString *bundleIdentifier = [[NSBundle mainBundle] bundleIdentifier]; + + return [[NSString stringWithFormat:@"%@.%@", bundleIdentifier, name] + lowercaseString]; +} + +- (NSConnection *)connectionForServerName:(NSString *)name +{ + // TODO: Try 'name%d' if 'name' fails. + NSString *connName = [self connectionNameFromServerName:name]; + NSConnection *svrConn = [connectionNameDict objectForKey:connName]; + + if (!svrConn) { + svrConn = [NSConnection connectionWithRegisteredName:connName + host:nil]; +#if 0 + if (!svrConn && [name length] > 0) { + unichar lastChar = [name characterAtIndex:[name length]-1]; + if (lastChar < '0' && lastChar > '9') { + // No connection for 'name' exists, and 'name' does not end + // with a digit, so try to find connection with name 'name%d'. + int i; + for (i = 1; i <= 10; ++i) { + NSString *altName = [NSString stringWithFormat:@"%@%d", + connName, i]; + svrConn = [NSConnection + connectionWithRegisteredName:altName host:nil]; + if (svrConn) { + connName = altName; + break; + } + } + } + } +#else + // Try alternate server... + if (!svrConn && alternateServerName) { + //NSLog(@" trying to connect to alternate server: %@", + // alternateServerName); + connName = [self connectionNameFromServerName:alternateServerName]; + svrConn = [NSConnection connectionWithRegisteredName:connName + host:nil]; + } + + // Try looking for alternate servers... + if (!svrConn) { + NSLog(@" looking for alternate servers..."); + NSString *alt = [self alternateServerNameForName:name]; + if (alt != alternateServerName) { + //NSLog(@" found alternate server: %@", string); + [alternateServerName release]; + alternateServerName = [alt copy]; + } + } + + // Try alternate server again... + if (!svrConn && alternateServerName) { + //NSLog(@" trying to connect to alternate server: %@", + // alternateServerName); + connName = [self connectionNameFromServerName:alternateServerName]; + svrConn = [NSConnection connectionWithRegisteredName:connName + host:nil]; + } + +#endif + + if (svrConn) { + [connectionNameDict setObject:svrConn forKey:connName]; + + //NSLog(@"Adding %@ as connection observer for %@", self, svrConn); + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(serverConnectionDidDie:) + name:NSConnectionDidDieNotification object:svrConn]; + } + } + + return svrConn; +} + +- (NSConnection *)connectionForServerPort:(int)port +{ + NSConnection *conn; + NSEnumerator *e = [connectionNameDict objectEnumerator]; + + while ((conn = [e nextObject])) { + // HACK! Assume connection uses mach ports. + if (port == [(NSMachPort*)[conn sendPort] machPort]) + return conn; + } + + return nil; +} + +- (void)serverConnectionDidDie:(NSNotification *)notification +{ + //NSLog(@"%s%@", _cmd, notification); + + NSConnection *svrConn = [notification object]; + + //NSLog(@"Removing %@ as connection observer from %@", self, svrConn); + [[NSNotificationCenter defaultCenter] + removeObserver:self + name:NSConnectionDidDieNotification + object:svrConn]; + + [connectionNameDict removeObjectsForKeys: + [connectionNameDict allKeysForObject:svrConn]]; + + // HACK! Assume connection uses mach ports. + int port = [(NSMachPort*)[svrConn sendPort] machPort]; + NSNumber *key = [NSNumber numberWithInt:port]; + + [clientProxyDict removeObjectForKey:key]; + [serverReplyDict removeObjectForKey:key]; +} + +- (void)addClient:(NSDistantObject *)client +{ + NSConnection *conn = [client connectionForProxy]; + // HACK! Assume connection uses mach ports. + int port = [(NSMachPort*)[conn sendPort] machPort]; + NSNumber *key = [NSNumber numberWithInt:port]; + + if (![clientProxyDict objectForKey:key]) { + [client setProtocolForProxy:@protocol(MMVimClientProtocol)]; + [clientProxyDict setObject:client forKey:key]; + } + + // NOTE: 'clientWindow' is a global variable which is used by + clientWindow = port; +} + +- (NSString *)alternateServerNameForName:(NSString *)name +{ + if (!(name && [name length] > 0)) + return nil; + + // Only look for alternates if 'name' doesn't end in a digit. + unichar lastChar = [name characterAtIndex:[name length]-1]; + if (lastChar >= '0' && lastChar <= '9') + return nil; + + // Look for alternates among all current servers. + NSArray *list = [self serverList]; + if (!(list && [list count] > 0)) + return nil; + + // Filter out servers starting with 'name' and ending with a number. The + // (?i) pattern ensures that the match case insensitive. + NSString *pat = [NSString stringWithFormat:@"(?i)%@[0-9]+\\z", name]; + NSPredicate *pred = [NSPredicate predicateWithFormat: + @"SELF MATCHES %@", pat]; + list = [list filteredArrayUsingPredicate:pred]; + if ([list count] > 0) { + list = [list sortedArrayUsingSelector:@selector(serverNameCompare:)]; + return [list objectAtIndex:0]; + } + + return nil; +} + @end // MMBackend (Private) +@implementation NSString (MMServerNameCompare) +- (NSComparisonResult)serverNameCompare:(NSString *)string +{ + return [self compare:string + options:NSCaseInsensitiveSearch|NSNumericSearch]; +} +@end + + + + static int eventModifierFlagsToVimModMask(int modifierFlags) { int modMask = 0; diff --git a/MMVimController.h b/MMVimController.h index 8c7f863c62..c0ca0a4f32 100644 --- a/MMVimController.h +++ b/MMVimController.h @@ -29,11 +29,14 @@ NSToolbar *toolbar; NSMutableDictionary *toolbarItemDict; int pid; + NSString *serverName; } - (id)initWithBackend:(id)backend pid:(int)processIdentifier; - (id)backendProxy; - (int)pid; +- (void)setServerName:(NSString *)name; +- (NSString *)serverName; - (MMWindowController *)windowController; - (void)cleanup; - (void)dropFiles:(NSArray *)filenames; diff --git a/MMVimController.m b/MMVimController.m index 39f968b92e..e0d7d77bda 100644 --- a/MMVimController.m +++ b/MMVimController.m @@ -143,6 +143,7 @@ - (void)dealloc //NSLog(@"%@ %s", [self className], _cmd); isInitialized = NO; + [serverName release]; serverName = nil; [backendProxy release]; backendProxy = nil; [sendQueue release]; sendQueue = nil; @@ -160,6 +161,19 @@ - (MMWindowController *)windowController return windowController; } +- (void)setServerName:(NSString *)name +{ + if (name != serverName) { + [serverName release]; + serverName = [name copy]; + } +} + +- (NSString *)serverName +{ + return serverName; +} + - (int)pid { return pid; @@ -752,6 +766,11 @@ - (void)handleMessage:(int)msgid data:(NSData *)data } else if (ActivateMsgID == msgid) { [NSApp activateIgnoringOtherApps:YES]; [[windowController window] makeKeyAndOrderFront:self]; + } else if (SetServerNameMsgID == msgid) { + NSString *name = [[NSString alloc] initWithData:data + encoding:NSUTF8StringEncoding]; + [self setServerName:name]; + [name release]; } else { NSLog(@"WARNING: Unknown message received (msgid=%d)", msgid); } diff --git a/MacVim.h b/MacVim.h index 7d3f0a528e..f962878386 100644 --- a/MacVim.h +++ b/MacVim.h @@ -35,7 +35,9 @@ - (BOOL)checkForModifiedBuffers; - (oneway void)setDialogReturn:(in bycopy id)obj; - (BOOL)starRegisterToPasteboard:(byref NSPasteboard *)pboard; +#if 0 - (NSString *)evaluateExpression:(in bycopy NSString *)expr; +#endif @end @@ -61,12 +63,42 @@ // It handles connections between MacVim and Vim. // @protocol MMAppProtocol -- (byref id )connectBackend: - (byref in id )backend pid:(int)pid; +- (byref id ) + connectBackend:(byref in id )backend + pid:(int)pid; - (NSArray *)serverList; @end +@protocol MMVimServerProtocol; + +// +// The Vim client protocol (implemented by MMBackend). +// +// The client needs to keep track of server replies. Take a look at MMBackend +// if you want to implement this protocol in another program. +// +@protocol MMVimClientProtocol +- (oneway void)addReply:(in bycopy NSString *)reply + server:(in byref id )server; +@end + + +// +// The Vim server protocol (implemented by MMBackend). +// +// Note that addInput:client: is not asynchronous, because otherwise Vim might +// quit before the message has been passed (e.g. if --remote was used on the +// command line). +// +@protocol MMVimServerProtocol +- (void)addInput:(in bycopy NSString *)input + client:(in byref id )client; +- (NSString *)evaluateExpression:(in bycopy NSString *)expr + client:(in byref id )client; +@end + + // // The following enum lists all messages that are passed between MacVim and @@ -123,6 +155,7 @@ enum { AdjustLinespaceMsgID, ActivateMsgID, ServerAddInputMsgID, + SetServerNameMsgID, }; diff --git a/MacVim.m b/MacVim.m index 69e810b365..7cf09ea3ce 100644 --- a/MacVim.m +++ b/MacVim.m @@ -59,6 +59,7 @@ "AdjustLinespaceMsgID", "ActivateMsgID", "ServerAddInputMsgID", + "SetServerNameMsgID", }; diff --git a/gui_macvim.m b/gui_macvim.m index 3c4084fd9f..da212fc937 100644 --- a/gui_macvim.m +++ b/gui_macvim.m @@ -1335,74 +1335,25 @@ #ifdef MAC_CLIENTSERVER // -// NOTE: Client/Server stuff only works with the GUI. Theoretically it would -// be possible to make this code work with terminal Vim, but it would require -// that a run-loop is set up and checked, etc. +// NOTE: Client/Server is only fully supported with a GUI. Theoretically it +// would be possible to make the server code work with terminal Vim, but it +// would require that a run-loop is set up and checked. This should not be +// difficult to implement, simply call gui_mch_update() at opportune moments +// and it will take care of the run-loop. Another (bigger) problem with +// supporting servers in terminal mode is that the server listing code talks to +// MacVim (the GUI) to figure out which servers are running. // -static unsigned MMServerMax = 1000; -static NSTimeInterval MMEvaluateExpressionTimeout = 3; -static NSTimeInterval MMServerListTimeout = 3; - - - static NSString * -shortToLongName(NSString *shortName) -{ - NSString *bundleIdentifier = [[NSBundle mainBundle] bundleIdentifier]; - - return [NSString stringWithFormat:@"%@.%@", bundleIdentifier, shortName]; -} - - - static NSString * -longToShortName(NSString *longName) -{ - NSString *bundleIdentifier = [[NSBundle mainBundle] bundleIdentifier]; - NSRange range = [longName rangeOfString:bundleIdentifier]; - - return NSNotFound != range.location - ? [longName substringFromIndex:1+NSMaxRange(range)] - : longName; -} - /* * Register connection with 'name'. The actual connection is named something * like 'org.vim.MacVim.VIM3', whereas the server is called 'VIM3'. */ void -serverSetName(char_u *name) -{ - NSString *baseName = - shortToLongName([NSString stringWithUTF8String:(char*)name]); - NSString *longName = baseName; - NSConnection *connection = [NSConnection defaultConnection]; - unsigned i; - - for (i = 1; i < MMServerMax; ++i) { - //NSLog(@"Client-Server: Try to register connection '%@'", longName); - if ([connection registerName:longName]) { - NSString *shortName = longToShortName(longName); - - //NSLog(@"Client-Server: Did register server '%@'", shortName); - serverName = vim_strsave((char_u*)[shortName UTF8String]); -#ifdef FEAT_EVAL - set_vim_var_string(VV_SEND_SERVER, serverName, -1); -#endif -#ifdef FEAT_TITLE - need_maketitle = TRUE; -#endif - - // Don't wait for requests (time-out means that the message is - // dropped). - [connection setRequestTimeout:0]; - //[connection setReplyTimeout:MMReplyTimeout]; - [connection setRootObject:[MMBackend sharedInstance]]; - break; - } - - longName = [NSString stringWithFormat:@"%@%d", baseName, i]; - } +serverRegisterName(char_u *name) +{ + NSString *svrName = [NSString stringWithUTF8String:(char*)name]; + [[MMBackend sharedInstance] registerServerWithName:svrName]; } @@ -1412,55 +1363,17 @@ */ int serverSendToVim(char_u *name, char_u *cmd, char_u **result, - int *server, int asExpr, int silent) + int *port, int asExpr, int silent) { - //NSLog(@"serverSendToVim(name=%s, cmd=%s, asExpr=%d, silent=%d)", - // name, cmd, asExpr, silent); - - NSString *longName = - shortToLongName([NSString stringWithUTF8String:(char*)name]); - NSConnection *connection = [NSConnection - connectionWithRegisteredName:longName host:nil]; - - if (!connection) { - if (!silent) - EMSG2(_(e_noserver), name); - return -1; - } - - [connection setRequestTimeout:0]; - - id proxy = [connection rootProxy]; - [proxy setProtocolForProxy:@protocol(MMBackendProtocol)]; - - // Expressions need to wait for a reply; otherwise just send off the input - // asynchronously. - if (asExpr) { - [connection setReplyTimeout:MMEvaluateExpressionTimeout]; - @try { - NSString *expr = [NSString stringWithUTF8String:(char*)cmd]; - NSString *eval = [proxy evaluateExpression:expr]; - if (result) { - *result = (eval ? vim_strsave((char_u*)[eval UTF8String]) - : vim_strsave((char_u*)_(e_invexprmsg))); - } - } - @catch (NSException *e) { - NSLog(@"WARNING: Caught exception during expression evaluation " - "\"%@\"", e); - return -1; - } - } else { - int len = 1 + STRLEN(cmd); - NSMutableData *data = [NSMutableData data]; + BOOL ok = [[MMBackend sharedInstance] + sendToServer:[NSString stringWithUTF8String:(char*)name] + string:[NSString stringWithUTF8String:(char*)cmd] + reply:result + port:port + expression:asExpr + silent:silent]; - [data appendBytes:&len length:sizeof(int)]; - [data appendBytes:cmd length:len]; - - [proxy processInput:ServerAddInputMsgID data:data]; - } - - return 0; + return ok ? 0 : -1; } @@ -1471,28 +1384,11 @@ serverGetVimNames(void) { char_u *names = NULL; - NSString *name = [[MMBackend sharedInstance] macVimConnectionName]; - NSConnection *connection = [NSConnection connectionWithRegisteredName:name - host:nil]; - if (connection) { - NSArray *serverNames = nil; - id proxy = [connection rootProxy]; - - [proxy setProtocolForProxy:@protocol(MMAppProtocol)]; - [connection setRequestTimeout:0]; - [connection setReplyTimeout:MMServerListTimeout]; - - @try { - serverNames = [proxy serverList]; - } - @catch (NSException *e) { - NSLog(@"Exception caught when listing servers: \"%@\"", e); - } + NSArray *list = [[MMBackend sharedInstance] serverList]; - if (serverNames) { - NSString *string = [serverNames componentsJoinedByString:@"\n"]; - names = vim_strsave((char_u*)[string UTF8String]); - } + if (list) { + NSString *string = [list componentsJoinedByString:@"\n"]; + names = vim_strsave((char_u*)[string UTF8String]); } return names; @@ -1500,38 +1396,71 @@ /* - * Check for replies from 'serverid'. + * 'str' is a hex int representing the send port of the connection. + */ + int +serverStrToPort(char_u *str) +{ + int port = 0; + + sscanf((char *)str, "0x%x", &port); + if (!port) + EMSG2(_("E573: Invalid server id used: %s"), str); + + return port; +} + + +/* + * Check for replies from server with send port 'port'. * Return TRUE and a non-malloc'ed string if there is. Else return FALSE. */ int -serverPeekReply(char_u *serverid, char_u **str) +serverPeekReply(int port, char_u **str) { - return FALSE; + NSString *reply = [[MMBackend sharedInstance] peekForReplyOnPort:port]; + if (str) + *str = (char_u*)[reply UTF8String]; + + return reply != nil; } /* - * Wait for replies from server 'name'. + * Wait for replies from server with send port 'port'. * Return 0 and the malloc'ed string when a reply is available. * Return -1 on error. */ int -serverReadReply(char_u *name, char_u **str) +serverReadReply(int port, char_u **str) { - //NSLog(@"serverReadReply(name=%s)", name); + NSString *reply = [[MMBackend sharedInstance] waitForReplyOnPort:port]; + if (reply && str) { + *str = vim_strsave((char_u*)[reply UTF8String]); + return 0; + } + return -1; } /* - * Send a reply string (notification) to client with id "name". + * Send a reply string (notification) to client with port given by "serverid". * Return -1 if the window is invalid. */ int -serverSendReply(char_u *name, char_u *reply) -{ - //NSLog(@"serverSendReply(name=%s, reply=%s)", name, reply); - return -1; +serverSendReply(char_u *serverid, char_u *reply) +{ + int retval = -1; + int port = serverStrToPort(serverid); + if (port > 0 && reply) { + BOOL ok = [[MMBackend sharedInstance] + sendReply:[NSString stringWithUTF8String:(char*)reply] + toPort:port]; + retval = ok ? 0 : -1; + } + + return retval; } #endif // MAC_CLIENTSERVER From 6395707f8e68f0c98757d7ccc3dfd4cd9dd555f4 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sun, 9 Sep 2007 17:44:23 +0000 Subject: [PATCH 0203/1156] Shift-movements related to HIG can be user-disabled by adding let macvim_skip_hig_shift_movement = 1 to .vimrc (not .gvimrc!). git-svn-id: http://macvim.googlecode.com/svn/trunk@231 96c4425d-ca35-0410-94e5-3396d5c13a8f --- gvimrc | 58 +++++++++++++++++++++++++++++++++++----------------------- 1 file changed, 35 insertions(+), 23 deletions(-) diff --git a/gvimrc b/gvimrc index b7fe90f5b4..22dc7f9f37 100644 --- a/gvimrc +++ b/gvimrc @@ -1,7 +1,7 @@ " System gvimrc file for MacVim " " Maintainer: Björn Winckler -" Last Change: Sun Sep 02 2007 +" Last Change: Sun Sep 9 2007 " " This is a work in progress. If you feel so inclined, please help me improve " this file. @@ -21,10 +21,6 @@ if !exists("syntax_on") syntax on endif -" Shift + special movement key starts visual mode (, etc.) -set keymodel=startsel - - " Change selection color on focus change au FocusLost * hi Visual guibg=MacSecondarySelectedControlColor au FocusGained * hi Visual guibg=MacSelectedTextBackgroundColor @@ -107,41 +103,57 @@ no no! no no! -nn -vn -ino -nn -vn -ino no no! no no! -nn -vn -ino -nn -vn -ino no ino map { imap { -nn -vn -ino no ino map } imap } -nn -vn -ino +" This is so that the HIG shift movement related settings can be disabled by +" adding the line +" let macvim_skip_hig_shift_movement = 1 +" to the user .vimrc. +" +if !exists("macvim_skip_hig_shift_movement") + " Shift + special movement key (, etc.) and mouse starts insert mode + set selectmode=mouse,key + set keymodel=startsel,stopsel + + " HIG related shift + special movement key mappings + nn + vn + ino + nn + vn + ino + + nn + vn + ino + nn + vn + ino + + nn + vn + ino + + nn + vn + ino +endif " !exists("macvim_skip_hig_shift_movement") + " From 16145f3115b5fbc4873fae729347bc385ddb7b4e Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Thu, 13 Sep 2007 19:27:20 +0000 Subject: [PATCH 0204/1156] General cleanup git-svn-id: http://macvim.googlecode.com/svn/trunk@232 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMAppController.m | 28 ------------------------ MMBackend.m | 56 ++++------------------------------------------- MMTextView.m | 7 +++++- MacVim.h | 4 ---- MacVim.m | 1 - README | 6 ++--- 6 files changed, 13 insertions(+), 89 deletions(-) diff --git a/MMAppController.m b/MMAppController.m index 906c5d4158..4c6c8b4539 100644 --- a/MMAppController.m +++ b/MMAppController.m @@ -441,36 +441,8 @@ - (NSArray *)serverList unsigned i, count = [vimControllers count]; for (i = 0; i < count; ++i) { MMVimController *controller = [vimControllers objectAtIndex:i]; -#if 0 - id proxy = [controller backendProxy]; - NSConnection *connection = [proxy connectionForProxy]; - if (!connection) - continue; - - // Set low timeouts since we don't want this call to potentially lock - // up MacVim for a while. - NSTimeInterval req = [connection requestTimeout]; - NSTimeInterval rep = [connection replyTimeout]; - [connection setRequestTimeout:0]; - [connection setReplyTimeout:.1]; - - @try { - NSString *eval = [proxy evaluateExpression:@"v:servername"]; - if (eval) { - [array addObject:eval]; - } - } - @catch (NSException *e) { - NSLog(@"WARNING: Got exception while listing servers: \"%@\"", e); - } - @finally { - [connection setRequestTimeout:req]; - [connection setReplyTimeout:rep]; - } -#else if ([controller serverName]) [array addObject:[controller serverName]]; -#endif } return array; diff --git a/MMBackend.m b/MMBackend.m index a19b2699d4..3c8741e717 100644 --- a/MMBackend.m +++ b/MMBackend.m @@ -1053,21 +1053,6 @@ - (BOOL)starRegisterToPasteboard:(byref NSPasteboard *)pboard return NO; } -#if 0 -- (NSString *)evaluateExpression:(in bycopy NSString *)expr -{ - NSString *eval = nil; - char_u *res = eval_client_expr_to_string((char_u*)[expr UTF8String]); - - if (res != NULL) { - eval = [NSString stringWithUTF8String:(char*)res]; - vim_free(res); - } - - return eval; -} -#endif - - (oneway void)addReply:(in bycopy NSString *)reply server:(in byref id )server { @@ -1132,6 +1117,8 @@ - (void)registerServerWithName:(NSString *)name if ([svrConn registerName:connName]) { //NSLog(@"Registered server with name: %@", svrName); + // TODO: Set request/reply time-outs to something else? + // // Don't wait for requests (time-out means that the message is // dropped). [svrConn setRequestTimeout:0]; @@ -1651,12 +1638,6 @@ - (void)handleMessage:(int)msgid data:(NSData *)data const void *bytes = [data bytes]; int shape = *((int*)bytes); bytes += sizeof(int); update_mouseshape(shape); - } else if (ServerAddInputMsgID == msgid) { - const void *bytes = [data bytes]; - /*int len = *((int*)bytes);*/ bytes += sizeof(int); - char_u *cmd = (char_u*)bytes; - - server_to_input_buf(cmd); } else { NSLog(@"WARNING: Unknown message received (msgid=%d)", msgid); } @@ -1833,13 +1814,6 @@ - (void)processInputEnd } #endif -#if 0 // This does not work...for now, just don't care if a focus msg was lost. - // HACK! A focus message might get lost, but whenever we get here the GUI - // is in focus. - if (!gui.in_focus) - [self focusChange:TRUE]; -#endif - inputReceived = YES; inProcessInput = NO; } @@ -1861,26 +1835,6 @@ - (NSConnection *)connectionForServerName:(NSString *)name if (!svrConn) { svrConn = [NSConnection connectionWithRegisteredName:connName host:nil]; -#if 0 - if (!svrConn && [name length] > 0) { - unichar lastChar = [name characterAtIndex:[name length]-1]; - if (lastChar < '0' && lastChar > '9') { - // No connection for 'name' exists, and 'name' does not end - // with a digit, so try to find connection with name 'name%d'. - int i; - for (i = 1; i <= 10; ++i) { - NSString *altName = [NSString stringWithFormat:@"%@%d", - connName, i]; - svrConn = [NSConnection - connectionWithRegisteredName:altName host:nil]; - if (svrConn) { - connName = altName; - break; - } - } - } - } -#else // Try alternate server... if (!svrConn && alternateServerName) { //NSLog(@" trying to connect to alternate server: %@", @@ -1892,7 +1846,7 @@ - (NSConnection *)connectionForServerName:(NSString *)name // Try looking for alternate servers... if (!svrConn) { - NSLog(@" looking for alternate servers..."); + //NSLog(@" looking for alternate servers..."); NSString *alt = [self alternateServerNameForName:name]; if (alt != alternateServerName) { //NSLog(@" found alternate server: %@", string); @@ -1910,8 +1864,6 @@ - (NSConnection *)connectionForServerName:(NSString *)name host:nil]; } -#endif - if (svrConn) { [connectionNameDict setObject:svrConn forKey:connName]; @@ -1994,7 +1946,7 @@ - (NSString *)alternateServerNameForName:(NSString *)name return nil; // Filter out servers starting with 'name' and ending with a number. The - // (?i) pattern ensures that the match case insensitive. + // (?i) pattern ensures that the match is case insensitive. NSString *pat = [NSString stringWithFormat:@"(?i)%@[0-9]+\\z", name]; NSPredicate *pred = [NSPredicate predicateWithFormat: @"SELF MATCHES %@", pat]; diff --git a/MMTextView.m b/MMTextView.m index 27afcd2b13..4e9c984799 100644 --- a/MMTextView.m +++ b/MMTextView.m @@ -245,7 +245,12 @@ - (void)doCommandBySelector:(SEL)selector #if 0 // Confused note to self: Why did I implement this in the first place? Will -// something break if I don't? Input methods that use arrow keys do not work +// something break if I don't? +// +// Answer: Cmd-letter key strokes are consumed by the menu (regardless if they +// are bound to a menu item or not) and never passed on to Vim. +// +// Input methods that use arrow keys do not work // properly with this implementation, so it is disabled for now. - (BOOL)performKeyEquivalent:(NSEvent *)event { diff --git a/MacVim.h b/MacVim.h index f962878386..08fb9ee1f8 100644 --- a/MacVim.h +++ b/MacVim.h @@ -35,9 +35,6 @@ - (BOOL)checkForModifiedBuffers; - (oneway void)setDialogReturn:(in bycopy id)obj; - (BOOL)starRegisterToPasteboard:(byref NSPasteboard *)pboard; -#if 0 -- (NSString *)evaluateExpression:(in bycopy NSString *)expr; -#endif @end @@ -154,7 +151,6 @@ enum { SetMouseShapeMsgID, AdjustLinespaceMsgID, ActivateMsgID, - ServerAddInputMsgID, SetServerNameMsgID, }; diff --git a/MacVim.m b/MacVim.m index 7cf09ea3ce..4c2d7f4b45 100644 --- a/MacVim.m +++ b/MacVim.m @@ -58,7 +58,6 @@ "SetMouseShapeMsgID", "AdjustLinespaceMsgID", "ActivateMsgID", - "ServerAddInputMsgID", "SetServerNameMsgID", }; diff --git a/README b/README index 17334b8c9e..386ba7cb2a 100644 --- a/README +++ b/README @@ -159,8 +159,8 @@ Features (!supp indicates that a feature is not supported): (but not 'tooltip' which is always on), each window has its own toolbar, custom toolbar items - Cocoa input protocols: input managers, character palette input etc. - supported, marked text !supp, cocoa key bindings (DefaultKeyBinding.dict) - are disabled + supported, marked text partially supported, cocoa key bindings + (DefaultKeyBinding.dict) are disabled - Mouse: resize (vim) windows, selection, different mouse cursors, autoscrolling whilst selecting (horizontal autoscroll !supp) - Drag and Drop: drag files onto dock icon to open in tabs, drag text and files @@ -185,4 +185,4 @@ Features (!supp indicates that a feature is not supported): - Encodings: !supp (enc, tenc always set to utf-8) - Autosave window position - Smart cascading of new windows -- Partial client/server support +- Client/server support (only gui window can become server) From 4257796fb263aac3365a97e3f5e68a26a7da3833 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sun, 16 Sep 2007 19:15:47 +0000 Subject: [PATCH 0205/1156] First version of macvim help file git-svn-id: http://macvim.googlecode.com/svn/trunk@233 96c4425d-ca35-0410-94e5-3396d5c13a8f --- doc/gui_macvim.txt | 198 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 198 insertions(+) create mode 100644 doc/gui_macvim.txt diff --git a/doc/gui_macvim.txt b/doc/gui_macvim.txt new file mode 100644 index 0000000000..e9453f8761 --- /dev/null +++ b/doc/gui_macvim.txt @@ -0,0 +1,198 @@ +*gui_macvim.txt* For Vim version 7.1. Last change: 2007 Sep 13 + + + VIM REFERENCE MANUAL by Bram Moolenaar + + +The MacVim Graphical User Interface *macvim* *gui-macvim* + +1. MacVim differences |macvim-differences| +2. Starting MacVim |gui-macvim-start| +3. Special colors |macvim-colors| +4. Menus |macvim-menus| +5. System services |macvim-services| +6. Known bugs/missing features |macvim-todo| + +Other relevant documentation: +|gui.txt| For generic items of the GUI. +|os_mac.txt| For Mac specific items. + +{Vi does not have a GUI} + +============================================================================== +1. MacVim differences *macvim-differences* + +One of the goals of MacVim is to make Vim behave like a proper Mac OS X +application. For this reason MacVim behaves slightly different from other GUI +ports. Most of the modifications are provided in the system gvimrc file; you +can quickly open this file and look at it yourself by typing: > + :tabe $VIM/gvimrc +Note that this file will be overwritten each time you update MacVim, so it is +better (where possible) to keep your own modifications inside "~/.gvimrc". + + *macvim-windows* +There is some confusion regarding the term "window" in MacVim since it means +one thing to Vim and another to MacVim. A "window" in Vim is what opens up +when you type ":sp", whereas a "window" in MacVim is the GUI window which +contains the text view, scrollbars, toolbar and tabline. To avoid confusion, +the former is referred to as a Vim-window, whereas the latter is simply called +a window. + + *macvim-shift-movement* +Text editors on Mac OS X lets the user hold down shift+movement key to extend +the selection. Also, pressing a printable key whilst selecting replaces the +current selection with that character. MacVim tries to emulate this behaviour +by providing several key bindings and by setting 'keymodel' and 'selectmode' +to non-default values. To disable this behaviour, add the following line to +your "~/.vimrc" (not .gvimrc) file: > + if has("gui_macvim") + let macvim_skip_hig_shift_movement = 1 + endif +< + *macvim-encoding* +It is not possible to modify 'termencoding' in MacVim; this option is forcibly +set to "utf-8". + + *macvim-drag-n-drop* +Dragging files and dropping them on a window opens those files in tabs in that +window. This happens even when Vim is in command-line mode. Holding down +modifier keys whilst dragging is not supported. + + *macvim-default-menu* +The default menu in MacVim has been changed to conform better with the Apple +Human Interface Guidelines (HIG). + +Note: The menus are a work in progress. If you know something about the HIG +and want to contribute to MacVim you could do so by making the menus better. + +============================================================================== +2. Starting MacVim *gui-macvim-start* + +MacVim can be started from Terminal or by double clicking its icon in the +Finder. If you use the Dock then you might want to drag the MacVim icon to +the Dock so that you have easy access to it. MacVim automatically registers +itself as an editor of several standard file formats. This enables you to +double-click a file to open it with MacVim (if it is not associated with +another program), or to right-click a file to bring up the "Open with" menu. +You can also drag and drop files onto the Dock icon to open them in tabs in a +new window, or you can drop them in an already open window to open the files +in tabs in that specific window. Finally, you can use Mac OS X System +Services to open files in MacVim, see |macvim-services|. + +There are essentially two ways to start MacVim from Terminal: either call the +Vim binary with the -g switch > + MacVim.app/Contents/MacOS/Vim -g file ... +or use the "open" command (which is of limited use since it cannot be used to +pass parameters to Vim) > + open -a MacVim file ... + +In order to save you from having to type the entire path every time you start +MacVim, add the following alias to "~/.profile": > + alias gvim='/Applications/MacVim.app/Contents/MacOS/Vim -g' +(This assumes that you have put MacVim.app in /Applications.) + +Once in terminal Vim it is possible to start MacVim by using the following +command: + :gui [++opt] [+cmd] [-f|-b] [files...] +Note: Forking ("-b") currently does not work. + +============================================================================== +3. Special colors *macvim-colors* + +The colors in MacVim are defined in two dictionaries inside the "Resources" +folder of the application bundle (MacVim.app/Contents/Resources). It is +possible to add more colors by modifying these files. Color names are case +insensitive when accessed from Vim, but in the dictionary they must be +lowercase. + + *SystemColors.plist* +There are only a few system colors that can be accessed from Vim. These +colors are defined in the dictionary "SystemColors.plist". This dictionary +stores (key, value) pairs where the key is the name of the color and the +value is an NSColor selector name. + +The most useful system colors are: > + MacSelectedTextBackgroundColor + MacSecondarySelectedColor +The former is the "Highlight Color" which can be changed in the "Appearance" +section of the System Preferences. The latter is the selection color used +when an application is not in focus. + + *Colors.plist* +Apart from the system colors, it is also possible to use the colors listed in +the dictionary "Colors.plist". The key in this dictionary is the name of the +color and the value is an RGB value on the for #rrggbb stored as an integer. + +============================================================================== +4. Menus *macvim-menus* + +MacVim has a special way of binding keys to menu items that differs from other +Vim GUI ports. A menu binding is called a "key equivalent" in Mac OS X +terminology. The ":menukeyequiv" command is used to set the key equivalent of +a menu item. This command takes two parameters, the first names the menu item +to bind to, the second gives the key combination. For example: > + :menukeyequiv File.New\ Tab +This sets the key equivalent of the "New Tab" menu item under the "File" menu +to Cmd+t. + +Note 1: A key equivalent should always contain the Cmd key modifier flag! +Note 2: Key equivalents take precedence over normal mappings made with ":map". + +It is typical for menu items in Cocoa applications to bind to Objective-C +selectors. To support this, MacVim introduces the ":action" command. This +command takes the name of an action message as its only parameter. (An action +message is an Objective-C message with "void" return type and a single +parameter of type "id".) For example, the "New Window" menu item on the +"File" menu is created in the following manner: > + :an 10.290 File.New\ Window :action newVimWindow: + +Note 1: A menu item which is bound to ":action" will automatically be bound to +that action in all modes (as if ":an" was used). It is not possible to bind +to ":action" in one mode only. +Note 2: The action is "nil-targeted", which means it is passed down the first +responder chain. + + *Actions.plist* +Some action messages would not be suitable to call from within Vim, so there +is a dictionary called "Actions.plist" (in the Resources folder of the +application bundle) which contains all actions that may be called. The key in +this dictionary is the name of the action message (case sensitive), the value +is not used. + +============================================================================== +5. System services *macvim-services* + +MacVim supports a few system services. These can be accessed from the MacVim +submenu in the Services menu. For services to work, MacVim.app should be +located in the /Applications folder. (You might have to logout and then login +again before Mac OS X detects the MacVim services.) + +These are the currently supported services: +* New Tab Containing Selection: Opens a new tab in the topmost window and + pastes the currently selected text in that tab. A new window will be + opened if necessary. +* Open Selected File in Tab (Window): If the selected text represents a file + name, then the corresponding file is opened in a new tab in the topmost + window (in a new window). + +============================================================================== +6. Known bugs/missing features *macvim-todo* + +Here are some of the bigger bugs in MacVim. Of course there are others, but +these are ones that are know and/or which were judged major. + +- Composing characters are not supported, they will mess up the display +- Only "utf-8" is supported for 'enc' +- Sometimes multibyte characters look "too wide", i.e. they overlap the + following character. It might help to change 'ambiwidth'. +- Printing +- No find/replace dialog + +If you find new bugs then add a new issue at http://code.google.com/p/macvim/ +or post your findings to the vim_mac mailing list. If you are missing feature +X in MacVim then voice your opinion on the vim_mac mailing list; it might be +simple to implement, but unless somebody ask for a particular feature then +there is little incentive to add it. + + + vim:tw=78:sw=4:ts=8:ft=help:norl: From 0d23ed571f1755b2c9376a9ba4bd09dfc6eddad1 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Mon, 17 Sep 2007 15:05:34 +0000 Subject: [PATCH 0206/1156] - Mapping to Cmd-letter now works - Cmd-enter no longer inserts Ctrl-C git-svn-id: http://macvim.googlecode.com/svn/trunk@234 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMTextView.m | 56 ++++++++++++++++++++++++++++++++++------------------ 1 file changed, 37 insertions(+), 19 deletions(-) diff --git a/MMTextView.m b/MMTextView.m index 4e9c984799..a9afde9e21 100644 --- a/MMTextView.m +++ b/MMTextView.m @@ -23,6 +23,8 @@ // The number of pixels in which the drag timer interval changes static float MMDragAreaSize = 73.0f; +static char MMKeypadEnter[2] = { 'K', 'A' }; +static NSString *MMKeypadEnterString = @"KA"; @@ -233,8 +235,8 @@ - (void)doCommandBySelector:(SEL)selector if (0x3 == chars[0]) { // HACK! AppKit turns enter (not return) into Ctrl-C, so we need to // handle it separately (else Ctrl-C doesn't work). - static char keypadEnter[2] = { 'K', 'A' }; - len = 2; chars = keypadEnter; + len = sizeof(MMKeypadEnter)/sizeof(MMKeypadEnter[0]); + chars = MMKeypadEnter; } [self sendKeyDown:chars length:len modifiers:[event modifierFlags]]; @@ -243,22 +245,22 @@ - (void)doCommandBySelector:(SEL)selector } } -#if 0 -// Confused note to self: Why did I implement this in the first place? Will -// something break if I don't? -// -// Answer: Cmd-letter key strokes are consumed by the menu (regardless if they -// are bound to a menu item or not) and never passed on to Vim. -// -// Input methods that use arrow keys do not work -// properly with this implementation, so it is disabled for now. - (BOOL)performKeyEquivalent:(NSEvent *)event { - NSLog(@"%s %@", _cmd, event); + //NSLog(@"%s %@", _cmd, event); // Called for Cmd+key keystrokes, function keys, arrow keys, page // up/down, home, end. - - if ([event type] != NSKeyDown) + // + // NOTE: This message cannot be ignored since Cmd+letter keys never are + // passed to keyDown:. It seems as if the main menu consumes Cmd-key + // strokes, unless the key is a function key. + + // NOTE: If the event that triggered this method represents a function key + // down then we do nothing, otherwise the input method never gets the key + // stroke (some input methods use e.g. arrow keys). The function key down + // event will still reach Vim though (via keyDown:). + int flags = [event modifierFlags]; + if ([event type] != NSKeyDown || flags & NSFunctionKeyMask) return NO; // HACK! Let the main menu try to handle any key down event, before @@ -277,20 +279,36 @@ - (BOOL)performKeyEquivalent:(NSEvent *)event //NSLog(@"%s%@", _cmd, event); - NSString *string = [event charactersIgnoringModifiers]; - int flags = [event modifierFlags]; - int len = [string lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; + NSString *chars = [event characters]; + NSString *unmodchars = [event charactersIgnoringModifiers]; + int len = [unmodchars lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; NSMutableData *data = [NSMutableData data]; + if (len <= 0) + return NO; + + // If 'chars' and 'unmodchars' differs when shift flag is present, then we + // can clear the shift flag as it is already included in 'unmodchars'. + // Failing to clear the shift flag means turns into (on + // an English keyboard). + if (flags & NSShiftKeyMask && ![chars isEqual:unmodchars]) + flags &= ~NSShiftKeyMask; + + if (0x3 == [unmodchars characterAtIndex:0]) { + // HACK! AppKit turns enter (not return) into Ctrl-C, so we need to + // handle it separately (else Cmd-enter turns into Ctrl-C). + unmodchars = MMKeypadEnterString; + len = [unmodchars lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; + } + [data appendBytes:&flags length:sizeof(int)]; [data appendBytes:&len length:sizeof(int)]; - [data appendBytes:[string UTF8String] length:len]; + [data appendBytes:[unmodchars UTF8String] length:len]; [[self vimController] sendMessage:CmdKeyMsgID data:data wait:NO]; return YES; } -#endif - (BOOL)hasMarkedText { From 888ac758de4721c83ec7de75390aaafdedd1dbc5 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Mon, 17 Sep 2007 19:05:38 +0000 Subject: [PATCH 0207/1156] Implemented resending of last failed send (MM_RESEND_LAST_FAILURE) git-svn-id: http://macvim.googlecode.com/svn/trunk@235 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMVimController.h | 9 ++++ MMVimController.m | 117 ++++++++++++++++++++++++---------------------- 2 files changed, 71 insertions(+), 55 deletions(-) diff --git a/MMVimController.h b/MMVimController.h index c0ca0a4f32..2179b7511c 100644 --- a/MMVimController.h +++ b/MMVimController.h @@ -12,6 +12,10 @@ #import "MacVim.h" +// If sendMessage:: fails, store the message and resend after a delay. +#define MM_RESEND_LAST_FAILURE 1 + + @class MMWindowController; @@ -30,6 +34,11 @@ NSMutableDictionary *toolbarItemDict; int pid; NSString *serverName; +#ifdef MM_RESEND_LAST_FAILURE + NSTimer *resendTimer; + int resendMsgid; + NSData *resendData; +#endif } - (id)initWithBackend:(id)backend pid:(int)processIdentifier; diff --git a/MMVimController.m b/MMVimController.m index e0d7d77bda..b28a3266fd 100644 --- a/MMVimController.m +++ b/MMVimController.m @@ -15,21 +15,23 @@ #import "MMTextStorage.h" -#define MM_NO_REQUEST_TIMEOUT 1 - // This is taken from gui.h #define DRAW_CURSOR 0x20 static NSString *MMDefaultToolbarImageName = @"Attention"; static int MMAlertTextFieldHeight = 22; -#if MM_NO_REQUEST_TIMEOUT // NOTE: By default a message sent to the backend will be dropped if it cannot // be delivered instantly; otherwise there is a possibility that MacVim will // 'beachball' while waiting to deliver DO messages to an unresponsive Vim // process. This means that you cannot rely on any message sent with // sendMessage:: to actually reach Vim. static NSTimeInterval MMBackendProxyRequestTimeout = 0; + +#if MM_RESEND_LAST_FAILURE +// If a message send fails, the message will be resent after this many seconds +// have passed. (No queue is kept, only the very last message is resent.) +static NSTimeInterval MMResendInterval = 0.5; #endif @@ -64,6 +66,9 @@ - (void)addToolbarItemWithTag:(int)tag label:(NSString *)label tip:(NSString *)tip icon:(NSString *)icon atIndex:(int)idx; - (void)connectionDidDie:(NSNotification *)notification; +#if MM_RESEND_LAST_FAILURE +- (void)resendTimerFired:(NSTimer *)timer; +#endif @end @@ -113,11 +118,9 @@ - (id)initWithBackend:(id)backend pid:(int)processIdentifier NSConnection *connection = [backendProxy connectionForProxy]; -#if MM_NO_REQUEST_TIMEOUT // TODO: Check that this will not set the timeout for the root proxy // (in MMAppController). [connection setRequestTimeout:MMBackendProxyRequestTimeout]; -#endif [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(connectionDidDie:) @@ -143,6 +146,10 @@ - (void)dealloc //NSLog(@"%@ %s", [self className], _cmd); isInitialized = NO; +#if MM_RESEND_LAST_FAILURE + [resendData release]; resendData = nil; +#endif + [serverName release]; serverName = nil; [backendProxy release]; backendProxy = nil; [sendQueue release]; sendQueue = nil; @@ -230,43 +237,43 @@ - (void)sendMessage:(int)msgid data:(NSData *)data wait:(BOOL)wait return; } -#if MM_NO_REQUEST_TIMEOUT +#if MM_RESEND_LAST_FAILURE + if (resendTimer) { + //NSLog(@"cancelling scheduled resend of %s", + // MessageStrings[resendMsgid]); + + [resendTimer invalidate]; + [resendTimer release]; + resendTimer = nil; + } + + if (resendData) { + [resendData release]; + resendData = nil; + } +#endif + @try { [backendProxy processInput:msgid data:data]; } @catch (NSException *e) { //NSLog(@"%@ %s Exception caught during DO call: %@", // [self className], _cmd, e); - } -#else - if (wait) { - @try { - [backendProxy processInput:msgid data:data]; - } - @catch (NSException *e) { - NSLog(@"%@ %s Exception caught during DO call: %@", - [self className], _cmd, e); - } - } else { - // Do not wait for the message to be sent, i.e. drop the message if it - // can't be delivered immediately. - NSConnection *connection = [backendProxy connectionForProxy]; - if (connection) { - NSTimeInterval req = [connection requestTimeout]; - [connection setRequestTimeout:0]; - @try { - [backendProxy processInput:msgid data:data]; - } - @catch (NSException *e) { - // Connection timed out, just ignore this. - //NSLog(@"WARNING! Connection timed out in %s", _cmd); - } - @finally { - [connection setRequestTimeout:req]; - } - } - } +#if MM_RESEND_LAST_FAILURE + //NSLog(@"%s failed, scheduling message %s for resend", _cmd, + // MessageStrings[msgid]); + + resendMsgid = msgid; + resendData = [data retain]; + resendTimer = [NSTimer + scheduledTimerWithTimeInterval:MMResendInterval + target:self + selector:@selector(resendTimerFired:) + userInfo:nil + repeats:NO]; + [resendTimer retain]; #endif + } } - (id)backendProxy @@ -418,7 +425,6 @@ - (oneway void)processCommandQueue:(in NSArray *)queue inProcessCommandQueue = NO; if ([sendQueue count] > 0) { -#if MM_NO_REQUEST_TIMEOUT @try { [backendProxy processInputAndData:sendQueue]; } @@ -426,25 +432,6 @@ - (oneway void)processCommandQueue:(in NSArray *)queue // Connection timed out, just ignore this. //NSLog(@"WARNING! Connection timed out in %s", _cmd); } -#else - // Do not wait for the message to be sent, i.e. drop the message if it - // can't be delivered immediately. - NSConnection *connection = [backendProxy connectionForProxy]; - if (connection) { - NSTimeInterval req = [connection requestTimeout]; - [connection setRequestTimeout:0]; - @try { - [backendProxy processInputAndData:sendQueue]; - } - @catch (NSException *e) { - // Connection timed out, just ignore this. - //NSLog(@"WARNING! Connection timed out in %s", _cmd); - } - @finally { - [connection setRequestTimeout:req]; - } - } -#endif [sendQueue removeAllObjects]; } @@ -1204,6 +1191,26 @@ - (NSString *)description return [NSString stringWithFormat:@"%@ : isInitialized=%d inProcessCommandQueue=%d mainMenuItems=%@ popupMenuItems=%@ toolbar=%@", [self className], isInitialized, inProcessCommandQueue, mainMenuItems, popupMenuItems, toolbar]; } +#if MM_RESEND_LAST_FAILURE +- (void)resendTimerFired:(NSTimer *)timer +{ + int msgid = resendMsgid; + NSData *data = nil; + + [resendTimer release]; + resendTimer = nil; + + if (!isInitialized) + return; + + if (resendData) + data = [resendData copy]; + + //NSLog(@"Resending message: %s", MessageStrings[msgid]); + [self sendMessage:msgid data:data wait:NO]; +} +#endif + @end // MMVimController (Private) From f07f3b0ed62054976101f8bc0d4dd9f5452fc0f6 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Mon, 17 Sep 2007 19:42:21 +0000 Subject: [PATCH 0208/1156] Disabled selection color change on focus events git-svn-id: http://macvim.googlecode.com/svn/trunk@236 96c4425d-ca35-0410-94e5-3396d5c13a8f --- gvimrc | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/gvimrc b/gvimrc index 22dc7f9f37..043f44b50f 100644 --- a/gvimrc +++ b/gvimrc @@ -1,7 +1,7 @@ " System gvimrc file for MacVim " " Maintainer: Björn Winckler -" Last Change: Sun Sep 9 2007 +" Last Change: Mon Sep 17 2007 " " This is a work in progress. If you feel so inclined, please help me improve " this file. @@ -21,9 +21,10 @@ if !exists("syntax_on") syntax on endif -" Change selection color on focus change -au FocusLost * hi Visual guibg=MacSecondarySelectedControlColor -au FocusGained * hi Visual guibg=MacSelectedTextBackgroundColor +" Change selection color on focus change (disabled until I can figure out how +" to restore the last value for Visual on FocusGained) +"au FocusLost * hi Visual guibg=MacSecondarySelectedControlColor +"au FocusGained * hi Visual guibg=MacSelectedTextBackgroundColor " From 8c2b5058d06f6585506f0106992bedef12a1199c Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Mon, 17 Sep 2007 19:42:45 +0000 Subject: [PATCH 0209/1156] Added "hints" section git-svn-id: http://macvim.googlecode.com/svn/trunk@237 96c4425d-ca35-0410-94e5-3396d5c13a8f --- doc/gui_macvim.txt | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/doc/gui_macvim.txt b/doc/gui_macvim.txt index e9453f8761..96e989c7bc 100644 --- a/doc/gui_macvim.txt +++ b/doc/gui_macvim.txt @@ -12,6 +12,7 @@ The MacVim Graphical User Interface *macvim* *gui-macvim* 4. Menus |macvim-menus| 5. System services |macvim-services| 6. Known bugs/missing features |macvim-todo| +7. Hints |macvim-hints| Other relevant documentation: |gui.txt| For generic items of the GUI. @@ -194,5 +195,30 @@ X in MacVim then voice your opinion on the vim_mac mailing list; it might be simple to implement, but unless somebody ask for a particular feature then there is little incentive to add it. +============================================================================== +7. Hints *macvim-hints* + +In this section some general (not necessarily MacVim specific) hints are +given. + +Scenario: You try opening a bunch of files in tabs but not all files get +opened in their own tab. +Solution: To get around this, set 'tabpagemax' to something big in your +.gvimrc file (e.g. ":set tabpagemax=100"). + +Scenario: You want to open a file in a tab in an already opened window, but +typing "gvim filename" in Terminal opens it up in a separate window. +Solution: Use the |--remote-tab| switch. If you have several windows open you +might have to specify which window you want the file to open in by using the +|--servername| switch. The title of a window usually ends in something like +"VIM" or "VIM3" --- this is the server name of that window. So to open a file +named "foobar.txt" in a window which ends in "VIM3" you would type: > + gvim --servername VIM3 --remote-tab foobar.txt +For more information, consult the |client-server| manual page. + +Scenario: You can't find the information on MacVim you thought should be in +this manual page. +Solution: Post your question on the vim_mac mailing list and wait for an +answer. vim:tw=78:sw=4:ts=8:ft=help:norl: From fde03ae31e7b24e7dc6785a6b352535ba982af08 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Mon, 17 Sep 2007 19:43:57 +0000 Subject: [PATCH 0210/1156] Removed 'wait' parameter from [MMVimController sendMessage:] git-svn-id: http://macvim.googlecode.com/svn/trunk@238 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMAppController.m | 2 +- MMTextView.m | 23 +++++++++++------------ MMVimController.h | 4 ++-- MMVimController.m | 10 +++++----- MMWindowController.m | 23 +++++++++++------------ 5 files changed, 30 insertions(+), 32 deletions(-) diff --git a/MMAppController.m b/MMAppController.m index 4c6c8b4539..0a74902a06 100644 --- a/MMAppController.m +++ b/MMAppController.m @@ -467,7 +467,7 @@ - (void)openSelection:(NSPasteboard *)pboard userData:(NSString *)userData MMVimController *vc = [self topmostVimController]; if (vc) { // Open a new tab first, since dropString: does not do this. - [vc sendMessage:AddNewTabMsgID data:nil wait:NO]; + [vc sendMessage:AddNewTabMsgID data:nil]; [vc dropString:[pboard stringForType:NSStringPboardType]]; } else { // NOTE: There is no window to paste the selection into, so save the diff --git a/MMTextView.m b/MMTextView.m index a9afde9e21..6c2ff70113 100644 --- a/MMTextView.m +++ b/MMTextView.m @@ -202,8 +202,7 @@ - (void)insertText:(id)string string = [string string]; [[self vimController] sendMessage:InsertTextMsgID - data:[string dataUsingEncoding:NSUTF8StringEncoding] - wait:NO]; + data:[string dataUsingEncoding:NSUTF8StringEncoding]]; } @@ -305,7 +304,7 @@ - (BOOL)performKeyEquivalent:(NSEvent *)event [data appendBytes:&len length:sizeof(int)]; [data appendBytes:[unmodchars UTF8String] length:len]; - [[self vimController] sendMessage:CmdKeyMsgID data:data wait:NO]; + [[self vimController] sendMessage:CmdKeyMsgID data:data]; return YES; } @@ -443,7 +442,7 @@ - (void)scrollWheel:(NSEvent *)event [data appendBytes:&flags length:sizeof(int)]; [data appendBytes:&dy length:sizeof(float)]; - [[self vimController] sendMessage:ScrollWheelMsgID data:data wait:NO]; + [[self vimController] sendMessage:ScrollWheelMsgID data:data]; } - (void)mouseDown:(NSEvent *)event @@ -474,7 +473,7 @@ - (void)mouseDown:(NSEvent *)event [data appendBytes:&flags length:sizeof(int)]; [data appendBytes:&count length:sizeof(int)]; - [[self vimController] sendMessage:MouseDownMsgID data:data wait:NO]; + [[self vimController] sendMessage:MouseDownMsgID data:data]; } - (void)rightMouseDown:(NSEvent *)event @@ -501,7 +500,7 @@ - (void)mouseUp:(NSEvent *)event [data appendBytes:&col length:sizeof(int)]; [data appendBytes:&flags length:sizeof(int)]; - [[self vimController] sendMessage:MouseUpMsgID data:data wait:NO]; + [[self vimController] sendMessage:MouseUpMsgID data:data]; isDragging = NO; } @@ -532,7 +531,7 @@ - (void)mouseDragged:(NSEvent *)event [data appendBytes:&col length:sizeof(int)]; [data appendBytes:&flags length:sizeof(int)]; - [[self vimController] sendMessage:MouseDraggedMsgID data:data wait:NO]; + [[self vimController] sendMessage:MouseDraggedMsgID data:data]; } dragPoint = pt; @@ -575,7 +574,7 @@ - (void)mouseMoved:(NSEvent *)event [data appendBytes:&row length:sizeof(int)]; [data appendBytes:&col length:sizeof(int)]; - [[self vimController] sendMessage:MouseMovedMsgID data:data wait:NO]; + [[self vimController] sendMessage:MouseMovedMsgID data:data]; } } @@ -603,7 +602,7 @@ - (void)mouseExited:(NSEvent *)event int shape = 0; NSMutableData *data = [NSMutableData data]; [data appendBytes:&shape length:sizeof(int)]; - [[self vimController] sendMessage:SetMouseShapeMsgID data:data wait:NO]; + [[self vimController] sendMessage:SetMouseShapeMsgID data:data]; } } @@ -726,7 +725,7 @@ - (void)changeFont:(id)sender [data appendBytes:&len length:sizeof(unsigned)]; [data appendBytes:[name UTF8String] length:len]; - [[self vimController] sendMessage:SetFontMsgID data:data wait:NO]; + [[self vimController] sendMessage:SetFontMsgID data:data]; } } } @@ -897,7 +896,7 @@ - (void)dragTimerFired:(NSTimer *)timer [data appendBytes:&col length:sizeof(int)]; [data appendBytes:&dragFlags length:sizeof(int)]; - [[self vimController] sendMessage:MouseDraggedMsgID data:data wait:NO]; + [[self vimController] sendMessage:MouseDraggedMsgID data:data]; isAutoscrolling = YES; } @@ -933,7 +932,7 @@ - (void)sendKeyDown:(const char *)chars length:(int)len modifiers:(int)flags [NSCursor setHiddenUntilMouseMoves:YES]; //NSLog(@"%s len=%d chars=0x%x", _cmd, len, chars[0]); - [[self vimController] sendMessage:KeyDownMsgID data:data wait:NO]; + [[self vimController] sendMessage:KeyDownMsgID data:data]; } } diff --git a/MMVimController.h b/MMVimController.h index 2179b7511c..ec6c543e33 100644 --- a/MMVimController.h +++ b/MMVimController.h @@ -12,7 +12,7 @@ #import "MacVim.h" -// If sendMessage:: fails, store the message and resend after a delay. +// If sendMessage: fails, store the message and resend after a delay. #define MM_RESEND_LAST_FAILURE 1 @@ -50,7 +50,7 @@ - (void)cleanup; - (void)dropFiles:(NSArray *)filenames; - (void)dropString:(NSString *)string; -- (void)sendMessage:(int)msgid data:(NSData *)data wait:(BOOL)wait; +- (void)sendMessage:(int)msgid data:(NSData *)data; @end diff --git a/MMVimController.m b/MMVimController.m index b28a3266fd..ea3ca67c07 100644 --- a/MMVimController.m +++ b/MMVimController.m @@ -25,7 +25,7 @@ // be delivered instantly; otherwise there is a possibility that MacVim will // 'beachball' while waiting to deliver DO messages to an unresponsive Vim // process. This means that you cannot rely on any message sent with -// sendMessage:: to actually reach Vim. +// sendMessage: to actually reach Vim. static NSTimeInterval MMBackendProxyRequestTimeout = 0; #if MM_RESEND_LAST_FAILURE @@ -204,7 +204,7 @@ - (void)dropFiles:(NSArray *)filenames } } - [self sendMessage:DropFilesMsgID data:data wait:NO]; + [self sendMessage:DropFilesMsgID data:data]; } - (void)dropString:(NSString *)string @@ -216,11 +216,11 @@ - (void)dropString:(NSString *)string [data appendBytes:&len length:sizeof(int)]; [data appendBytes:[string UTF8String] length:len]; - [self sendMessage:DropStringMsgID data:data wait:NO]; + [self sendMessage:DropStringMsgID data:data]; } } -- (void)sendMessage:(int)msgid data:(NSData *)data wait:(BOOL)wait +- (void)sendMessage:(int)msgid data:(NSData *)data { //NSLog(@"sendMessage:%s (isInitialized=%d inProcessCommandQueue=%d)", // MessageStrings[msgid], isInitialized, inProcessCommandQueue); @@ -1207,7 +1207,7 @@ - (void)resendTimerFired:(NSTimer *)timer data = [resendData copy]; //NSLog(@"Resending message: %s", MessageStrings[msgid]); - [self sendMessage:msgid data:data wait:NO]; + [self sendMessage:msgid data:data]; } #endif diff --git a/MMWindowController.m b/MMWindowController.m index 3f5d923748..a691ff9ac3 100644 --- a/MMWindowController.m +++ b/MMWindowController.m @@ -554,12 +554,12 @@ - (IBAction)addNewTab:(id)sender // NOTE! This can get called a lot if the user holds down the key // equivalent for this action, which causes the ports to fill up. If we // wait for the message to be sent then the app might become unresponsive. - [vimController sendMessage:AddNewTabMsgID data:nil wait:NO]; + [vimController sendMessage:AddNewTabMsgID data:nil]; } - (IBAction)toggleToolbar:(id)sender { - [vimController sendMessage:ToggleToolbarMsgID data:nil wait:NO]; + [vimController sendMessage:ToggleToolbarMsgID data:nil]; } @@ -584,7 +584,7 @@ - (BOOL)tabView:(NSTabView *)theTabView shouldSelectTabViewItem: int idx = [self representedIndexOfTabViewItem:tabViewItem]; if (NSNotFound != idx) { NSData *data = [NSData dataWithBytes:&idx length:sizeof(int)]; - [vimController sendMessage:SelectTabMsgID data:data wait:YES]; + [vimController sendMessage:SelectTabMsgID data:data]; } } @@ -602,7 +602,7 @@ - (BOOL)tabView:(NSTabView *)theTabView shouldCloseTabViewItem: int idx = [self representedIndexOfTabViewItem:tabViewItem]; //NSLog(@"Closing tab with index %d", idx); NSData *data = [NSData dataWithBytes:&idx length:sizeof(int)]; - [vimController sendMessage:CloseTabMsgID data:data wait:YES]; + [vimController sendMessage:CloseTabMsgID data:data]; return NO; } @@ -613,7 +613,7 @@ - (void)tabView:(NSTabView *)theTabView didDragTabViewItem: NSMutableData *data = [NSMutableData data]; [data appendBytes:&idx length:sizeof(int)]; - [vimController sendMessage:DraggedTabMsgID data:data wait:YES]; + [vimController sendMessage:DraggedTabMsgID data:data]; } @@ -623,7 +623,7 @@ - (void)tabView:(NSTabView *)theTabView didDragTabViewItem: - (void)windowDidBecomeMain:(NSNotification *)notification { - [vimController sendMessage:GotFocusMsgID data:nil wait:NO]; + [vimController sendMessage:GotFocusMsgID data:nil]; if (textStorage) [[NSFontManager sharedFontManager] setSelectedFont:[textStorage font] @@ -632,7 +632,7 @@ - (void)windowDidBecomeMain:(NSNotification *)notification - (void)windowDidResignMain:(NSNotification *)notification { - [vimController sendMessage:LostFocusMsgID data:nil wait:NO]; + [vimController sendMessage:LostFocusMsgID data:nil]; if (textView) [textView hideMarkedTextField]; @@ -640,7 +640,7 @@ - (void)windowDidResignMain:(NSNotification *)notification - (BOOL)windowShouldClose:(id)sender { - [vimController sendMessage:VimShouldCloseMsgID data:nil wait:YES]; + [vimController sendMessage:VimShouldCloseMsgID data:nil]; return NO; } @@ -891,7 +891,7 @@ - (IBAction)vimMenuItemAction:(id)sender NSMutableData *data = [NSMutableData data]; [data appendBytes:&tag length:sizeof(int)]; - [vimController sendMessage:ExecuteMenuMsgID data:data wait:NO]; + [vimController sendMessage:ExecuteMenuMsgID data:data]; } - (MMScroller *)scrollbarForIdentifier:(long)ident index:(unsigned *)idx @@ -1078,7 +1078,7 @@ - (void)scroll:(id)sender [data appendBytes:&hitPart length:sizeof(int)]; [data appendBytes:&value length:sizeof(float)]; - [vimController sendMessage:ScrollbarEventMsgID data:data wait:NO]; + [vimController sendMessage:ScrollbarEventMsgID data:data]; } - (void)placeViews @@ -1105,8 +1105,7 @@ - (void)placeViews // NOTE! This can get called a lot when in live resize, which causes // the connection buffers to fill up. If we wait for the message to be // sent then the app might become unresponsive. - [vimController sendMessage:SetTextDimensionsMsgID data:data - wait:![textView inLiveResize]]; + [vimController sendMessage:SetTextDimensionsMsgID data:data]; } [textView setFrame:textViewRect]; From 97a9ddf8108d2ff84ef13cfb835b383d27a80767 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Tue, 18 Sep 2007 14:08:16 +0000 Subject: [PATCH 0211/1156] - Rephrased some sections - Fixed typos - Added new hint git-svn-id: http://macvim.googlecode.com/svn/trunk@239 96c4425d-ca35-0410-94e5-3396d5c13a8f --- doc/gui_macvim.txt | 56 ++++++++++++++++++++++++++-------------------- 1 file changed, 32 insertions(+), 24 deletions(-) diff --git a/doc/gui_macvim.txt b/doc/gui_macvim.txt index 96e989c7bc..b0827fcb15 100644 --- a/doc/gui_macvim.txt +++ b/doc/gui_macvim.txt @@ -25,11 +25,11 @@ Other relevant documentation: One of the goals of MacVim is to make Vim behave like a proper Mac OS X application. For this reason MacVim behaves slightly different from other GUI -ports. Most of the modifications are provided in the system gvimrc file; you -can quickly open this file and look at it yourself by typing: > +ports of Vim. Most of the modifications are provided in the system gvimrc +file; you can quickly open this file and look at it yourself by typing: > :tabe $VIM/gvimrc Note that this file will be overwritten each time you update MacVim, so it is -better (where possible) to keep your own modifications inside "~/.gvimrc". +better to keep your own modifications inside "~/.gvimrc". *macvim-windows* There is some confusion regarding the term "window" in MacVim since it means @@ -69,20 +69,23 @@ and want to contribute to MacVim you could do so by making the menus better. ============================================================================== 2. Starting MacVim *gui-macvim-start* -MacVim can be started from Terminal or by double clicking its icon in the -Finder. If you use the Dock then you might want to drag the MacVim icon to -the Dock so that you have easy access to it. MacVim automatically registers -itself as an editor of several standard file formats. This enables you to -double-click a file to open it with MacVim (if it is not associated with -another program), or to right-click a file to bring up the "Open with" menu. -You can also drag and drop files onto the Dock icon to open them in tabs in a -new window, or you can drop them in an already open window to open the files -in tabs in that specific window. Finally, you can use Mac OS X System -Services to open files in MacVim, see |macvim-services|. +The easiest way to start MacVim is by double-clicking its icon in the Finder, +but most users will probably prefer to use the Terminal. First some Finder +related ways of starting MacVim are described, then Terminal is discussed. +Note that you can put MacVim anywhere on your hard drive, but in this help +file it is assumed that you have put it inside your /Applications folder. + +MacVim automatically registers itself as an editor of several standard file +formats. This enables you to double-click a file to open it with MacVim (if +it is not associated with another program), or to right-click a file to bring +up the "Open with" menu. You can also drag and drop files onto the Dock icon +to open them in tabs in a new window, or you can drop them in an already open +window to open the files in tabs in that specific window. Finally, you can +use Mac OS X System Services to open files in MacVim, see |macvim-services|. There are essentially two ways to start MacVim from Terminal: either call the Vim binary with the -g switch > - MacVim.app/Contents/MacOS/Vim -g file ... + /Applications/MacVim.app/Contents/MacOS/Vim -g file ... or use the "open" command (which is of limited use since it cannot be used to pass parameters to Vim) > open -a MacVim file ... @@ -90,7 +93,6 @@ pass parameters to Vim) > In order to save you from having to type the entire path every time you start MacVim, add the following alias to "~/.profile": > alias gvim='/Applications/MacVim.app/Contents/MacOS/Vim -g' -(This assumes that you have put MacVim.app in /Applications.) Once in terminal Vim it is possible to start MacVim by using the following command: @@ -109,20 +111,20 @@ lowercase. *SystemColors.plist* There are only a few system colors that can be accessed from Vim. These colors are defined in the dictionary "SystemColors.plist". This dictionary -stores (key, value) pairs where the key is the name of the color and the +stores (key, value) pairs where the key is the name of the color and the value is an NSColor selector name. The most useful system colors are: > MacSelectedTextBackgroundColor MacSecondarySelectedColor The former is the "Highlight Color" which can be changed in the "Appearance" -section of the System Preferences. The latter is the selection color used -when an application is not in focus. +section of the System Preferences. The latter is the selection color used by +a Cocoa application when it is not in focus. *Colors.plist* Apart from the system colors, it is also possible to use the colors listed in the dictionary "Colors.plist". The key in this dictionary is the name of the -color and the value is an RGB value on the for #rrggbb stored as an integer. +color and the value is an RGB value on the form #rrggbb stored as an integer. ============================================================================== 4. Menus *macvim-menus* @@ -145,7 +147,7 @@ command takes the name of an action message as its only parameter. (An action message is an Objective-C message with "void" return type and a single parameter of type "id".) For example, the "New Window" menu item on the "File" menu is created in the following manner: > - :an 10.290 File.New\ Window :action newVimWindow: + :an 10.290 File.New\ Window :action newWindow: Note 1: A menu item which is bound to ":action" will automatically be bound to that action in all modes (as if ":an" was used). It is not possible to bind @@ -172,9 +174,11 @@ These are the currently supported services: * New Tab Containing Selection: Opens a new tab in the topmost window and pastes the currently selected text in that tab. A new window will be opened if necessary. -* Open Selected File in Tab (Window): If the selected text represents a file +* Open Selected File in Tab: If the selected text represents a file name, then the corresponding file is opened in a new tab in the topmost - window (in a new window). + window. +* Open Selected File in Window: Same as the above, but always open in a new + window. ============================================================================== 6. Known bugs/missing features *macvim-todo* @@ -192,7 +196,7 @@ these are ones that are know and/or which were judged major. If you find new bugs then add a new issue at http://code.google.com/p/macvim/ or post your findings to the vim_mac mailing list. If you are missing feature X in MacVim then voice your opinion on the vim_mac mailing list; it might be -simple to implement, but unless somebody ask for a particular feature then +simple to implement, but unless somebody asks for a particular feature then there is little incentive to add it. ============================================================================== @@ -212,10 +216,14 @@ Solution: Use the |--remote-tab| switch. If you have several windows open you might have to specify which window you want the file to open in by using the |--servername| switch. The title of a window usually ends in something like "VIM" or "VIM3" --- this is the server name of that window. So to open a file -named "foobar.txt" in a window which ends in "VIM3" you would type: > +named "foobar.txt" in a window whose title ends in "VIM3" you would type (the +order of the arguments matters): > gvim --servername VIM3 --remote-tab foobar.txt For more information, consult the |client-server| manual page. +Scenario: Selection doesn't work the way you are used to. +Solution: See |macvim-shift-movement|. + Scenario: You can't find the information on MacVim you thought should be in this manual page. Solution: Post your question on the vim_mac mailing list and wait for an From f4f647e20e22a550803dc28fb8d90f2dc6afd4e3 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Tue, 18 Sep 2007 14:09:38 +0000 Subject: [PATCH 0212/1156] Renamed newVimWindow: action to newWindow: git-svn-id: http://macvim.googlecode.com/svn/trunk@240 96c4425d-ca35-0410-94e5-3396d5c13a8f --- Actions.plist | 2 +- English.lproj/MainMenu.nib/classes.nib | 2 +- English.lproj/MainMenu.nib/keyedobjects.nib | Bin 7451 -> 7498 bytes MMAppController.h | 2 +- MMAppController.m | 6 +++--- gvimrc | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Actions.plist b/Actions.plist index 3f8093cd06..54981e1765 100644 --- a/Actions.plist +++ b/Actions.plist @@ -12,7 +12,7 @@ miniaturizeAll: - newVimWindow: + newWindow: orderFrontCharacterPalette: diff --git a/English.lproj/MainMenu.nib/classes.nib b/English.lproj/MainMenu.nib/classes.nib index cc058adef0..72ef18a17f 100644 --- a/English.lproj/MainMenu.nib/classes.nib +++ b/English.lproj/MainMenu.nib/classes.nib @@ -13,7 +13,7 @@ SUPERCLASS = NSObject; }, { - ACTIONS = {newVimWindow = id; }; + ACTIONS = {newWindow = id; selectNextWindow = id; selectPreviousWindow = id; }; CLASS = MMAppController; LANGUAGE = ObjC; SUPERCLASS = NSObject; diff --git a/English.lproj/MainMenu.nib/keyedobjects.nib b/English.lproj/MainMenu.nib/keyedobjects.nib index 8bbeff59128d68b05b12e2e9e074b3bc9f0be343..b61013f5eeff5b7f8c988a3a78b1f89512246a60 100644 GIT binary patch delta 4663 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 10.290 File.New\ Window :action newVimWindow: +an 10.290 File.New\ Window :action newWindow: an 10.295 File.New\ Tab :tabnew an 10.328 File.-SEP0- an 10.330 File.Close\ Window:qa :confirm qa From 605acbb7085e1c95e29d6eeb0136502c5dcab488 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Tue, 18 Sep 2007 14:32:31 +0000 Subject: [PATCH 0213/1156] - Disabled MM_RESEND_LAST_FAILURE as it doesn't seem to work - Call resizeWindowToFit: when live resize ends, in case SetTextDimensions DO message was lost during live resize. git-svn-id: http://macvim.googlecode.com/svn/trunk@241 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMTextView.m | 11 +++++ MMVimController.h | 2 +- MMWindowController.h | 2 + MMWindowController.m | 98 +++++++++++++++++++++++--------------------- 4 files changed, 66 insertions(+), 47 deletions(-) diff --git a/MMTextView.m b/MMTextView.m index 6c2ff70113..f429eaedba 100644 --- a/MMTextView.m +++ b/MMTextView.m @@ -740,6 +740,17 @@ - (void)updateFontPanel // The font panel is updated whenever the font is set. } +- (void)viewDidEndLiveResize +{ + // HACK! If a SetTextDimensionsMsgID message is lost while dragging to + // resize the window, then the text view and window sizes may become out of + // sync. To avoid this problem, resize the window when live resizes ends. + // This sometimes makes the window size 'jump' unpleasantly, but that is + // better than the alternative. + id windowController = [[self window] windowController]; + [windowController resizeWindowToFit:self]; +} + @end // MMTextView diff --git a/MMVimController.h b/MMVimController.h index ec6c543e33..6bf7bb8f9e 100644 --- a/MMVimController.h +++ b/MMVimController.h @@ -13,7 +13,7 @@ // If sendMessage: fails, store the message and resend after a delay. -#define MM_RESEND_LAST_FAILURE 1 +#define MM_RESEND_LAST_FAILURE 0 @class MMWindowController; diff --git a/MMWindowController.h b/MMWindowController.h index 84a46b407d..e172317745 100644 --- a/MMWindowController.h +++ b/MMWindowController.h @@ -62,6 +62,8 @@ - (IBAction)addNewTab:(id)sender; - (IBAction)toggleToolbar:(id)sender; +- (void)resizeWindowToFit:(id)sender; + @end // vim: set ft=objc: diff --git a/MMWindowController.m b/MMWindowController.m index a691ff9ac3..85143b9ef4 100644 --- a/MMWindowController.m +++ b/MMWindowController.m @@ -50,7 +50,6 @@ @interface MMWindowController (Private) - (NSSize)contentSizeForTextStorageSize:(NSSize)textViewSize; - (NSRect)textViewRectForContentSize:(NSSize)contentSize; - (NSSize)textStorageSizeForTextViewSize:(NSSize)textViewSize; -- (void)resizeWindowToFit:(id)sender; - (NSRect)fitWindowToFrame:(NSRect)frame; - (void)updateResizeIncrements; - (NSTabViewItem *)addNewTabViewItem; @@ -720,6 +719,58 @@ - (BOOL)writeSelectionToPasteboard:(NSPasteboard *)pboard return [self askBackendForStarRegister:pboard]; } +- (void)resizeWindowToFit:(id)sender +{ + // NOTE: Be very careful when you call this method! Do not call while + // processing command queue, instead set 'shouldUpdateWindowSize' to YES. + // The only other place it is currently called is when live resize ends. + // This is done to ensure that the text view and window sizes match up + // (they may become out of sync if a SetTextDimensionsMsgID message to the + // backend is dropped). + + if (!setupDone) return; + + NSWindow *win = [self window]; + NSRect frame = [win frame]; + NSRect contentRect = [win contentRectForFrameRect:frame]; + NSSize newSize = [self contentSizeForTextStorageSize:[textStorage size]]; + + // Keep top-left corner of the window fixed when resizing. + contentRect.origin.y -= newSize.height - contentRect.size.height; + contentRect.size = newSize; + + frame = [win frameRectForContentRect:contentRect]; + NSRect maxFrame = [win constrainFrameRect:frame toScreen:[win screen]]; + + // HACK! Assuming the window frame cannot already be placed too high, + // adjust 'maxFrame' so that it at least as high up as the current frame. + // The reason for doing this is that constrainFrameRect:toScreen: does not + // always seem to utilize as much area as possible. + if (NSMaxY(frame) > NSMaxY(maxFrame)) { + maxFrame.size.height = frame.origin.y - maxFrame.origin.y + + frame.size.height; + } + + if (!NSEqualRects(maxFrame, frame)) { + // The new window frame is too big to fit on the screen, so fit the + // text storage to the biggest frame which will fit on the screen. + //NSLog(@"Proposed window frame does not fit on the screen!"); + frame = [self fitWindowToFrame:maxFrame]; + } + + //NSLog(@"%s %@", _cmd, NSStringFromRect(frame)); + + // HACK! If the window does resize, then windowDidResize is called which in + // turn calls placeViews. In case the computed new size of the window is + // no different from the current size, then we need to call placeViews + // manually. + if (NSEqualRects(frame, [win frame])) { + [self placeViews]; + } else { + [win setFrame:frame display:YES]; + } +} + @end // MMWindowController @@ -789,51 +840,6 @@ - (NSSize)textStorageSizeForTextViewSize:(NSSize)textViewSize return size; } -- (void)resizeWindowToFit:(id)sender -{ - if (!setupDone) return; - - NSWindow *win = [self window]; - NSRect frame = [win frame]; - NSRect contentRect = [win contentRectForFrameRect:frame]; - NSSize newSize = [self contentSizeForTextStorageSize:[textStorage size]]; - - // Keep top-left corner of the window fixed when resizing. - contentRect.origin.y -= newSize.height - contentRect.size.height; - contentRect.size = newSize; - - frame = [win frameRectForContentRect:contentRect]; - NSRect maxFrame = [win constrainFrameRect:frame toScreen:[win screen]]; - - // HACK! Assuming the window frame cannot already be placed too high, - // adjust 'maxFrame' so that it at least as high up as the current frame. - // The reason for doing this is that constrainFrameRect:toScreen: does not - // always seem to utilize as much area as possible. - if (NSMaxY(frame) > NSMaxY(maxFrame)) { - maxFrame.size.height = frame.origin.y - maxFrame.origin.y - + frame.size.height; - } - - if (!NSEqualRects(maxFrame, frame)) { - // The new window frame is too big to fit on the screen, so fit the - // text storage to the biggest frame which will fit on the screen. - //NSLog(@"Proposed window frame does not fit on the screen!"); - frame = [self fitWindowToFrame:maxFrame]; - } - - //NSLog(@"%s %@", _cmd, NSStringFromRect(frame)); - - // HACK! If the window does resize, then windowDidResize is called which in - // turn calls placeViews. In case the computed new size of the window is - // no different from the current size, then we need to call placeViews - // manually. - if (NSEqualRects(frame, [win frame])) { - [self placeViews]; - } else { - [win setFrame:frame display:YES]; - } -} - - (NSRect)fitWindowToFrame:(NSRect)frame { if (!setupDone) return frame; From 87794f1886dd60e84f02058e10b77c7ef4d6063b Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Tue, 18 Sep 2007 15:22:06 +0000 Subject: [PATCH 0214/1156] Renamed gui_macvim.txt to gui_mac.txt git-svn-id: http://macvim.googlecode.com/svn/trunk@242 96c4425d-ca35-0410-94e5-3396d5c13a8f --- doc/gui_mac.txt | 232 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 232 insertions(+) create mode 100644 doc/gui_mac.txt diff --git a/doc/gui_mac.txt b/doc/gui_mac.txt new file mode 100644 index 0000000000..b0827fcb15 --- /dev/null +++ b/doc/gui_mac.txt @@ -0,0 +1,232 @@ +*gui_macvim.txt* For Vim version 7.1. Last change: 2007 Sep 13 + + + VIM REFERENCE MANUAL by Bram Moolenaar + + +The MacVim Graphical User Interface *macvim* *gui-macvim* + +1. MacVim differences |macvim-differences| +2. Starting MacVim |gui-macvim-start| +3. Special colors |macvim-colors| +4. Menus |macvim-menus| +5. System services |macvim-services| +6. Known bugs/missing features |macvim-todo| +7. Hints |macvim-hints| + +Other relevant documentation: +|gui.txt| For generic items of the GUI. +|os_mac.txt| For Mac specific items. + +{Vi does not have a GUI} + +============================================================================== +1. MacVim differences *macvim-differences* + +One of the goals of MacVim is to make Vim behave like a proper Mac OS X +application. For this reason MacVim behaves slightly different from other GUI +ports of Vim. Most of the modifications are provided in the system gvimrc +file; you can quickly open this file and look at it yourself by typing: > + :tabe $VIM/gvimrc +Note that this file will be overwritten each time you update MacVim, so it is +better to keep your own modifications inside "~/.gvimrc". + + *macvim-windows* +There is some confusion regarding the term "window" in MacVim since it means +one thing to Vim and another to MacVim. A "window" in Vim is what opens up +when you type ":sp", whereas a "window" in MacVim is the GUI window which +contains the text view, scrollbars, toolbar and tabline. To avoid confusion, +the former is referred to as a Vim-window, whereas the latter is simply called +a window. + + *macvim-shift-movement* +Text editors on Mac OS X lets the user hold down shift+movement key to extend +the selection. Also, pressing a printable key whilst selecting replaces the +current selection with that character. MacVim tries to emulate this behaviour +by providing several key bindings and by setting 'keymodel' and 'selectmode' +to non-default values. To disable this behaviour, add the following line to +your "~/.vimrc" (not .gvimrc) file: > + if has("gui_macvim") + let macvim_skip_hig_shift_movement = 1 + endif +< + *macvim-encoding* +It is not possible to modify 'termencoding' in MacVim; this option is forcibly +set to "utf-8". + + *macvim-drag-n-drop* +Dragging files and dropping them on a window opens those files in tabs in that +window. This happens even when Vim is in command-line mode. Holding down +modifier keys whilst dragging is not supported. + + *macvim-default-menu* +The default menu in MacVim has been changed to conform better with the Apple +Human Interface Guidelines (HIG). + +Note: The menus are a work in progress. If you know something about the HIG +and want to contribute to MacVim you could do so by making the menus better. + +============================================================================== +2. Starting MacVim *gui-macvim-start* + +The easiest way to start MacVim is by double-clicking its icon in the Finder, +but most users will probably prefer to use the Terminal. First some Finder +related ways of starting MacVim are described, then Terminal is discussed. +Note that you can put MacVim anywhere on your hard drive, but in this help +file it is assumed that you have put it inside your /Applications folder. + +MacVim automatically registers itself as an editor of several standard file +formats. This enables you to double-click a file to open it with MacVim (if +it is not associated with another program), or to right-click a file to bring +up the "Open with" menu. You can also drag and drop files onto the Dock icon +to open them in tabs in a new window, or you can drop them in an already open +window to open the files in tabs in that specific window. Finally, you can +use Mac OS X System Services to open files in MacVim, see |macvim-services|. + +There are essentially two ways to start MacVim from Terminal: either call the +Vim binary with the -g switch > + /Applications/MacVim.app/Contents/MacOS/Vim -g file ... +or use the "open" command (which is of limited use since it cannot be used to +pass parameters to Vim) > + open -a MacVim file ... + +In order to save you from having to type the entire path every time you start +MacVim, add the following alias to "~/.profile": > + alias gvim='/Applications/MacVim.app/Contents/MacOS/Vim -g' + +Once in terminal Vim it is possible to start MacVim by using the following +command: + :gui [++opt] [+cmd] [-f|-b] [files...] +Note: Forking ("-b") currently does not work. + +============================================================================== +3. Special colors *macvim-colors* + +The colors in MacVim are defined in two dictionaries inside the "Resources" +folder of the application bundle (MacVim.app/Contents/Resources). It is +possible to add more colors by modifying these files. Color names are case +insensitive when accessed from Vim, but in the dictionary they must be +lowercase. + + *SystemColors.plist* +There are only a few system colors that can be accessed from Vim. These +colors are defined in the dictionary "SystemColors.plist". This dictionary +stores (key, value) pairs where the key is the name of the color and the +value is an NSColor selector name. + +The most useful system colors are: > + MacSelectedTextBackgroundColor + MacSecondarySelectedColor +The former is the "Highlight Color" which can be changed in the "Appearance" +section of the System Preferences. The latter is the selection color used by +a Cocoa application when it is not in focus. + + *Colors.plist* +Apart from the system colors, it is also possible to use the colors listed in +the dictionary "Colors.plist". The key in this dictionary is the name of the +color and the value is an RGB value on the form #rrggbb stored as an integer. + +============================================================================== +4. Menus *macvim-menus* + +MacVim has a special way of binding keys to menu items that differs from other +Vim GUI ports. A menu binding is called a "key equivalent" in Mac OS X +terminology. The ":menukeyequiv" command is used to set the key equivalent of +a menu item. This command takes two parameters, the first names the menu item +to bind to, the second gives the key combination. For example: > + :menukeyequiv File.New\ Tab +This sets the key equivalent of the "New Tab" menu item under the "File" menu +to Cmd+t. + +Note 1: A key equivalent should always contain the Cmd key modifier flag! +Note 2: Key equivalents take precedence over normal mappings made with ":map". + +It is typical for menu items in Cocoa applications to bind to Objective-C +selectors. To support this, MacVim introduces the ":action" command. This +command takes the name of an action message as its only parameter. (An action +message is an Objective-C message with "void" return type and a single +parameter of type "id".) For example, the "New Window" menu item on the +"File" menu is created in the following manner: > + :an 10.290 File.New\ Window :action newWindow: + +Note 1: A menu item which is bound to ":action" will automatically be bound to +that action in all modes (as if ":an" was used). It is not possible to bind +to ":action" in one mode only. +Note 2: The action is "nil-targeted", which means it is passed down the first +responder chain. + + *Actions.plist* +Some action messages would not be suitable to call from within Vim, so there +is a dictionary called "Actions.plist" (in the Resources folder of the +application bundle) which contains all actions that may be called. The key in +this dictionary is the name of the action message (case sensitive), the value +is not used. + +============================================================================== +5. System services *macvim-services* + +MacVim supports a few system services. These can be accessed from the MacVim +submenu in the Services menu. For services to work, MacVim.app should be +located in the /Applications folder. (You might have to logout and then login +again before Mac OS X detects the MacVim services.) + +These are the currently supported services: +* New Tab Containing Selection: Opens a new tab in the topmost window and + pastes the currently selected text in that tab. A new window will be + opened if necessary. +* Open Selected File in Tab: If the selected text represents a file + name, then the corresponding file is opened in a new tab in the topmost + window. +* Open Selected File in Window: Same as the above, but always open in a new + window. + +============================================================================== +6. Known bugs/missing features *macvim-todo* + +Here are some of the bigger bugs in MacVim. Of course there are others, but +these are ones that are know and/or which were judged major. + +- Composing characters are not supported, they will mess up the display +- Only "utf-8" is supported for 'enc' +- Sometimes multibyte characters look "too wide", i.e. they overlap the + following character. It might help to change 'ambiwidth'. +- Printing +- No find/replace dialog + +If you find new bugs then add a new issue at http://code.google.com/p/macvim/ +or post your findings to the vim_mac mailing list. If you are missing feature +X in MacVim then voice your opinion on the vim_mac mailing list; it might be +simple to implement, but unless somebody asks for a particular feature then +there is little incentive to add it. + +============================================================================== +7. Hints *macvim-hints* + +In this section some general (not necessarily MacVim specific) hints are +given. + +Scenario: You try opening a bunch of files in tabs but not all files get +opened in their own tab. +Solution: To get around this, set 'tabpagemax' to something big in your +.gvimrc file (e.g. ":set tabpagemax=100"). + +Scenario: You want to open a file in a tab in an already opened window, but +typing "gvim filename" in Terminal opens it up in a separate window. +Solution: Use the |--remote-tab| switch. If you have several windows open you +might have to specify which window you want the file to open in by using the +|--servername| switch. The title of a window usually ends in something like +"VIM" or "VIM3" --- this is the server name of that window. So to open a file +named "foobar.txt" in a window whose title ends in "VIM3" you would type (the +order of the arguments matters): > + gvim --servername VIM3 --remote-tab foobar.txt +For more information, consult the |client-server| manual page. + +Scenario: Selection doesn't work the way you are used to. +Solution: See |macvim-shift-movement|. + +Scenario: You can't find the information on MacVim you thought should be in +this manual page. +Solution: Post your question on the vim_mac mailing list and wait for an +answer. + + vim:tw=78:sw=4:ts=8:ft=help:norl: From b7361b8b66a7ea01a814e7904b6d657a0af5533b Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Tue, 18 Sep 2007 15:22:48 +0000 Subject: [PATCH 0215/1156] Renamed gui_macvim.txt to gui_mac.txt git-svn-id: http://macvim.googlecode.com/svn/trunk@243 96c4425d-ca35-0410-94e5-3396d5c13a8f --- doc/gui_macvim.txt | 232 --------------------------------------------- 1 file changed, 232 deletions(-) delete mode 100644 doc/gui_macvim.txt diff --git a/doc/gui_macvim.txt b/doc/gui_macvim.txt deleted file mode 100644 index b0827fcb15..0000000000 --- a/doc/gui_macvim.txt +++ /dev/null @@ -1,232 +0,0 @@ -*gui_macvim.txt* For Vim version 7.1. Last change: 2007 Sep 13 - - - VIM REFERENCE MANUAL by Bram Moolenaar - - -The MacVim Graphical User Interface *macvim* *gui-macvim* - -1. MacVim differences |macvim-differences| -2. Starting MacVim |gui-macvim-start| -3. Special colors |macvim-colors| -4. Menus |macvim-menus| -5. System services |macvim-services| -6. Known bugs/missing features |macvim-todo| -7. Hints |macvim-hints| - -Other relevant documentation: -|gui.txt| For generic items of the GUI. -|os_mac.txt| For Mac specific items. - -{Vi does not have a GUI} - -============================================================================== -1. MacVim differences *macvim-differences* - -One of the goals of MacVim is to make Vim behave like a proper Mac OS X -application. For this reason MacVim behaves slightly different from other GUI -ports of Vim. Most of the modifications are provided in the system gvimrc -file; you can quickly open this file and look at it yourself by typing: > - :tabe $VIM/gvimrc -Note that this file will be overwritten each time you update MacVim, so it is -better to keep your own modifications inside "~/.gvimrc". - - *macvim-windows* -There is some confusion regarding the term "window" in MacVim since it means -one thing to Vim and another to MacVim. A "window" in Vim is what opens up -when you type ":sp", whereas a "window" in MacVim is the GUI window which -contains the text view, scrollbars, toolbar and tabline. To avoid confusion, -the former is referred to as a Vim-window, whereas the latter is simply called -a window. - - *macvim-shift-movement* -Text editors on Mac OS X lets the user hold down shift+movement key to extend -the selection. Also, pressing a printable key whilst selecting replaces the -current selection with that character. MacVim tries to emulate this behaviour -by providing several key bindings and by setting 'keymodel' and 'selectmode' -to non-default values. To disable this behaviour, add the following line to -your "~/.vimrc" (not .gvimrc) file: > - if has("gui_macvim") - let macvim_skip_hig_shift_movement = 1 - endif -< - *macvim-encoding* -It is not possible to modify 'termencoding' in MacVim; this option is forcibly -set to "utf-8". - - *macvim-drag-n-drop* -Dragging files and dropping them on a window opens those files in tabs in that -window. This happens even when Vim is in command-line mode. Holding down -modifier keys whilst dragging is not supported. - - *macvim-default-menu* -The default menu in MacVim has been changed to conform better with the Apple -Human Interface Guidelines (HIG). - -Note: The menus are a work in progress. If you know something about the HIG -and want to contribute to MacVim you could do so by making the menus better. - -============================================================================== -2. Starting MacVim *gui-macvim-start* - -The easiest way to start MacVim is by double-clicking its icon in the Finder, -but most users will probably prefer to use the Terminal. First some Finder -related ways of starting MacVim are described, then Terminal is discussed. -Note that you can put MacVim anywhere on your hard drive, but in this help -file it is assumed that you have put it inside your /Applications folder. - -MacVim automatically registers itself as an editor of several standard file -formats. This enables you to double-click a file to open it with MacVim (if -it is not associated with another program), or to right-click a file to bring -up the "Open with" menu. You can also drag and drop files onto the Dock icon -to open them in tabs in a new window, or you can drop them in an already open -window to open the files in tabs in that specific window. Finally, you can -use Mac OS X System Services to open files in MacVim, see |macvim-services|. - -There are essentially two ways to start MacVim from Terminal: either call the -Vim binary with the -g switch > - /Applications/MacVim.app/Contents/MacOS/Vim -g file ... -or use the "open" command (which is of limited use since it cannot be used to -pass parameters to Vim) > - open -a MacVim file ... - -In order to save you from having to type the entire path every time you start -MacVim, add the following alias to "~/.profile": > - alias gvim='/Applications/MacVim.app/Contents/MacOS/Vim -g' - -Once in terminal Vim it is possible to start MacVim by using the following -command: - :gui [++opt] [+cmd] [-f|-b] [files...] -Note: Forking ("-b") currently does not work. - -============================================================================== -3. Special colors *macvim-colors* - -The colors in MacVim are defined in two dictionaries inside the "Resources" -folder of the application bundle (MacVim.app/Contents/Resources). It is -possible to add more colors by modifying these files. Color names are case -insensitive when accessed from Vim, but in the dictionary they must be -lowercase. - - *SystemColors.plist* -There are only a few system colors that can be accessed from Vim. These -colors are defined in the dictionary "SystemColors.plist". This dictionary -stores (key, value) pairs where the key is the name of the color and the -value is an NSColor selector name. - -The most useful system colors are: > - MacSelectedTextBackgroundColor - MacSecondarySelectedColor -The former is the "Highlight Color" which can be changed in the "Appearance" -section of the System Preferences. The latter is the selection color used by -a Cocoa application when it is not in focus. - - *Colors.plist* -Apart from the system colors, it is also possible to use the colors listed in -the dictionary "Colors.plist". The key in this dictionary is the name of the -color and the value is an RGB value on the form #rrggbb stored as an integer. - -============================================================================== -4. Menus *macvim-menus* - -MacVim has a special way of binding keys to menu items that differs from other -Vim GUI ports. A menu binding is called a "key equivalent" in Mac OS X -terminology. The ":menukeyequiv" command is used to set the key equivalent of -a menu item. This command takes two parameters, the first names the menu item -to bind to, the second gives the key combination. For example: > - :menukeyequiv File.New\ Tab -This sets the key equivalent of the "New Tab" menu item under the "File" menu -to Cmd+t. - -Note 1: A key equivalent should always contain the Cmd key modifier flag! -Note 2: Key equivalents take precedence over normal mappings made with ":map". - -It is typical for menu items in Cocoa applications to bind to Objective-C -selectors. To support this, MacVim introduces the ":action" command. This -command takes the name of an action message as its only parameter. (An action -message is an Objective-C message with "void" return type and a single -parameter of type "id".) For example, the "New Window" menu item on the -"File" menu is created in the following manner: > - :an 10.290 File.New\ Window :action newWindow: - -Note 1: A menu item which is bound to ":action" will automatically be bound to -that action in all modes (as if ":an" was used). It is not possible to bind -to ":action" in one mode only. -Note 2: The action is "nil-targeted", which means it is passed down the first -responder chain. - - *Actions.plist* -Some action messages would not be suitable to call from within Vim, so there -is a dictionary called "Actions.plist" (in the Resources folder of the -application bundle) which contains all actions that may be called. The key in -this dictionary is the name of the action message (case sensitive), the value -is not used. - -============================================================================== -5. System services *macvim-services* - -MacVim supports a few system services. These can be accessed from the MacVim -submenu in the Services menu. For services to work, MacVim.app should be -located in the /Applications folder. (You might have to logout and then login -again before Mac OS X detects the MacVim services.) - -These are the currently supported services: -* New Tab Containing Selection: Opens a new tab in the topmost window and - pastes the currently selected text in that tab. A new window will be - opened if necessary. -* Open Selected File in Tab: If the selected text represents a file - name, then the corresponding file is opened in a new tab in the topmost - window. -* Open Selected File in Window: Same as the above, but always open in a new - window. - -============================================================================== -6. Known bugs/missing features *macvim-todo* - -Here are some of the bigger bugs in MacVim. Of course there are others, but -these are ones that are know and/or which were judged major. - -- Composing characters are not supported, they will mess up the display -- Only "utf-8" is supported for 'enc' -- Sometimes multibyte characters look "too wide", i.e. they overlap the - following character. It might help to change 'ambiwidth'. -- Printing -- No find/replace dialog - -If you find new bugs then add a new issue at http://code.google.com/p/macvim/ -or post your findings to the vim_mac mailing list. If you are missing feature -X in MacVim then voice your opinion on the vim_mac mailing list; it might be -simple to implement, but unless somebody asks for a particular feature then -there is little incentive to add it. - -============================================================================== -7. Hints *macvim-hints* - -In this section some general (not necessarily MacVim specific) hints are -given. - -Scenario: You try opening a bunch of files in tabs but not all files get -opened in their own tab. -Solution: To get around this, set 'tabpagemax' to something big in your -.gvimrc file (e.g. ":set tabpagemax=100"). - -Scenario: You want to open a file in a tab in an already opened window, but -typing "gvim filename" in Terminal opens it up in a separate window. -Solution: Use the |--remote-tab| switch. If you have several windows open you -might have to specify which window you want the file to open in by using the -|--servername| switch. The title of a window usually ends in something like -"VIM" or "VIM3" --- this is the server name of that window. So to open a file -named "foobar.txt" in a window whose title ends in "VIM3" you would type (the -order of the arguments matters): > - gvim --servername VIM3 --remote-tab foobar.txt -For more information, consult the |client-server| manual page. - -Scenario: Selection doesn't work the way you are used to. -Solution: See |macvim-shift-movement|. - -Scenario: You can't find the information on MacVim you thought should be in -this manual page. -Solution: Post your question on the vim_mac mailing list and wait for an -answer. - - vim:tw=78:sw=4:ts=8:ft=help:norl: From 7d904cdc768bccbd944f25fa6d0f39ca57ad913f Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Tue, 18 Sep 2007 15:45:43 +0000 Subject: [PATCH 0216/1156] Changed date git-svn-id: http://macvim.googlecode.com/svn/trunk@244 96c4425d-ca35-0410-94e5-3396d5c13a8f --- doc/gui_mac.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/gui_mac.txt b/doc/gui_mac.txt index b0827fcb15..22a21b4a83 100644 --- a/doc/gui_mac.txt +++ b/doc/gui_mac.txt @@ -1,4 +1,4 @@ -*gui_macvim.txt* For Vim version 7.1. Last change: 2007 Sep 13 +*gui_mac.txt* For Vim version 7.1. Last change: 2007 Sep 18 VIM REFERENCE MANUAL by Bram Moolenaar From ac51e598fe65e87f75e3ef309f4821708f76abeb Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Tue, 18 Sep 2007 18:34:11 +0000 Subject: [PATCH 0217/1156] Menu section changed git-svn-id: http://macvim.googlecode.com/svn/trunk@245 96c4425d-ca35-0410-94e5-3396d5c13a8f --- doc/gui_mac.txt | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/doc/gui_mac.txt b/doc/gui_mac.txt index 22a21b4a83..2511b1bafe 100644 --- a/doc/gui_mac.txt +++ b/doc/gui_mac.txt @@ -129,18 +129,23 @@ color and the value is an RGB value on the form #rrggbb stored as an integer. ============================================================================== 4. Menus *macvim-menus* + *:menukeyequiv* MacVim has a special way of binding keys to menu items that differs from other Vim GUI ports. A menu binding is called a "key equivalent" in Mac OS X -terminology. The ":menukeyequiv" command is used to set the key equivalent of -a menu item. This command takes two parameters, the first names the menu item -to bind to, the second gives the key combination. For example: > +terminology, this is displayed on the right side of a menu item. The +":menukeyequiv" command is used to set the key equivalent of a menu item. +This command takes two parameters, the first names the menu item to bind to, +the second gives the key combination. For example: > :menukeyequiv File.New\ Tab This sets the key equivalent of the "New Tab" menu item under the "File" menu to Cmd+t. -Note 1: A key equivalent should always contain the Cmd key modifier flag! -Note 2: Key equivalents take precedence over normal mappings made with ":map". +Note that key equivalents: + * should always contain the Cmd modifier flag () + * take precedence over normal mappings made with ":map" + * can only be modified during startup (e.g. in .gvimrc) + *:action* It is typical for menu items in Cocoa applications to bind to Objective-C selectors. To support this, MacVim introduces the ":action" command. This command takes the name of an action message as its only parameter. (An action From e7e145401dcade6f9241e8a04480654e4ea3bc3d Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Tue, 18 Sep 2007 19:39:51 +0000 Subject: [PATCH 0218/1156] git-svn-id: http://macvim.googlecode.com/svn/trunk@247 96c4425d-ca35-0410-94e5-3396d5c13a8f --- README | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README b/README index 386ba7cb2a..cba6e0a88e 100644 --- a/README +++ b/README @@ -129,8 +129,14 @@ Keyboard stuff: returns 1, charactersIgnoringModifiers returns . - (2) handles: Ctrl+key, enter, backspace, escape. same note on translation of Ctrl+key as above holds true. + come Ctrl+key combos are by default mapped to several commands, so Ctrl+keys + must be intercepted in keyDown: - (3) handles: Cmd+key, arrow keys, function keys, help key + Cmd+letter keys never reach the app if this method isn't overridden (but + Cmd+function keys do) + Cmd+function key must not be intercepted here or input methods won't work - and are two different characters (the former is 0xa0) +- Cocoa translates to Ctrl-C so this must be taken care of Bugs: From 4257bd5325c19835452cf4f13332092f02895283 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Tue, 18 Sep 2007 19:55:32 +0000 Subject: [PATCH 0219/1156] Added section on dialogs git-svn-id: http://macvim.googlecode.com/svn/trunk@248 96c4425d-ca35-0410-94e5-3396d5c13a8f --- doc/gui_mac.txt | 31 +++++++++++++++++++++++++------ 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/doc/gui_mac.txt b/doc/gui_mac.txt index 2511b1bafe..8ab5e15889 100644 --- a/doc/gui_mac.txt +++ b/doc/gui_mac.txt @@ -10,9 +10,10 @@ The MacVim Graphical User Interface *macvim* *gui-macvim* 2. Starting MacVim |gui-macvim-start| 3. Special colors |macvim-colors| 4. Menus |macvim-menus| -5. System services |macvim-services| -6. Known bugs/missing features |macvim-todo| -7. Hints |macvim-hints| +5. Dialogs |macvim-dialogs| +6. System services |macvim-services| +7. Known bugs/missing features |macvim-todo| +8. Hints |macvim-hints| Other relevant documentation: |gui.txt| For generic items of the GUI. @@ -168,7 +169,25 @@ this dictionary is the name of the action message (case sensitive), the value is not used. ============================================================================== -5. System services *macvim-services* +5. Dialogs *macvim-dialogs* + +Dialogs can be controlled with the keyboard in two ways. By default each +button in a dialog is bound to a key. The button that is highlighted by blue +is bound to Enter, and any button with the title "Cancel" is bound to Escape. +Other buttons are usually bound to the first letter in the title of the +button. There is no visual feedback to indicate which letter a button is +bound to, so sometimes some experimentation might be required in order to +figure out which key to press. + +The second way of controlling dialogs with the keyboard is to enable "Full +keyboard access" in the "Keyboard & Mouse" pane of the System Preferences (you +can also toggle this on or off by pressing Ctrl-F7). Once keyboard access is +enabled it is possible to move between buttons with Tab and pressing Space to +select the current button. The current button is indicated with a blue +outline. + +============================================================================== +6. System services *macvim-services* MacVim supports a few system services. These can be accessed from the MacVim submenu in the Services menu. For services to work, MacVim.app should be @@ -186,7 +205,7 @@ These are the currently supported services: window. ============================================================================== -6. Known bugs/missing features *macvim-todo* +7. Known bugs/missing features *macvim-todo* Here are some of the bigger bugs in MacVim. Of course there are others, but these are ones that are know and/or which were judged major. @@ -205,7 +224,7 @@ simple to implement, but unless somebody asks for a particular feature then there is little incentive to add it. ============================================================================== -7. Hints *macvim-hints* +8. Hints *macvim-hints* In this section some general (not necessarily MacVim specific) hints are given. From f14a3c0548a82ca189b3b1cc2dd18e75bfc23374 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Fri, 21 Sep 2007 12:00:58 +0000 Subject: [PATCH 0220/1156] - HIG shift movement disabled by default - Next/previous tab uses same binding as Safari git-svn-id: http://macvim.googlecode.com/svn/trunk@250 96c4425d-ca35-0410-94e5-3396d5c13a8f --- gvimrc | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/gvimrc b/gvimrc index 47f5399d93..63fbc3b2c3 100644 --- a/gvimrc +++ b/gvimrc @@ -121,12 +121,12 @@ map } imap } -" This is so that the HIG shift movement related settings can be disabled by +" This is so that the HIG shift movement related settings can be enabled by " adding the line -" let macvim_skip_hig_shift_movement = 1 -" to the user .vimrc. +" let macvim_hig_shift_movement = 1 +" to the user .vimrc (not .gvimrc!). " -if !exists("macvim_skip_hig_shift_movement") +if exists("macvim_hig_shift_movement") " Shift + special movement key (, etc.) and mouse starts insert mode set selectmode=mouse,key set keymodel=startsel,stopsel @@ -192,8 +192,8 @@ menukeyequiv Tools.Older\ List menukeyequiv Tools.Newer\ List menukeyequiv Window.Minimize -menukeyequiv Window.Previous\ Tab -menukeyequiv Window.Next\ Tab +menukeyequiv Window.Previous\ Tab +menukeyequiv Window.Next\ Tab " Restore the previous value of 'cpoptions'. From e3a3b4f6094b153445833bd54071654c6f61cc3c Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Fri, 21 Sep 2007 12:02:17 +0000 Subject: [PATCH 0221/1156] - Added more hints - Rewrote info on HIG movement git-svn-id: http://macvim.googlecode.com/svn/trunk@251 96c4425d-ca35-0410-94e5-3396d5c13a8f --- doc/gui_mac.txt | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/doc/gui_mac.txt b/doc/gui_mac.txt index 8ab5e15889..7f6128e07b 100644 --- a/doc/gui_mac.txt +++ b/doc/gui_mac.txt @@ -43,12 +43,13 @@ a window. *macvim-shift-movement* Text editors on Mac OS X lets the user hold down shift+movement key to extend the selection. Also, pressing a printable key whilst selecting replaces the -current selection with that character. MacVim tries to emulate this behaviour -by providing several key bindings and by setting 'keymodel' and 'selectmode' -to non-default values. To disable this behaviour, add the following line to -your "~/.vimrc" (not .gvimrc) file: > +current selection with that character. MacVim can emulate this kind of +behaviour (by providing key bindings and by setting 'keymodel' and +'selectmode' to non-default values) although it is not enabled by default. To +make MacVim behave more like TextEdit and less like Vim, add the following +lines to your "~/.vimrc" (not .gvimrc) file: > if has("gui_macvim") - let macvim_skip_hig_shift_movement = 1 + let macvim_hig_shift_movement = 1 endif < *macvim-encoding* @@ -245,9 +246,23 @@ order of the arguments matters): > gvim --servername VIM3 --remote-tab foobar.txt For more information, consult the |client-server| manual page. -Scenario: Selection doesn't work the way you are used to. +Scenario: You like to be able to select text by holding down shift and +pressing the arrow keys and find the Vim way of selecting text strange. Solution: See |macvim-shift-movement|. +Scenario: You dislike the default font (Monaco) and/or want a font with bold +and italic variants. +Solution: The font "Courier New" is a fixed width font that ships with Mac OS +X which has both bold and italic variants; however, it is not particularly +well suited for programming. A better alternative is to use the font +"Bitstream Vera Sans Mono" which can be downloaded for free, and it also has +both oblique and bold variants. After having downloaded and installed the +Bitstream Vera font, you can make it the default font by adding the following +line to "~/.gvimrc": > + set guifont=Bitstream\ Vera\ Sans\ Mono:h13 +The suffix ":h13" specifies the point size of the font should be "13" (see +'guifont' for more information on how to set the font). + Scenario: You can't find the information on MacVim you thought should be in this manual page. Solution: Post your question on the vim_mac mailing list and wait for an From f7108075fb8f94d60b94be28e98eb34be1731eb8 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Fri, 21 Sep 2007 12:13:27 +0000 Subject: [PATCH 0222/1156] git-svn-id: http://macvim.googlecode.com/svn/trunk@252 96c4425d-ca35-0410-94e5-3396d5c13a8f --- TODO | 1 + 1 file changed, 1 insertion(+) diff --git a/TODO b/TODO index 3a9b4fae50..3aa50561ec 100644 --- a/TODO +++ b/TODO @@ -1,5 +1,6 @@ Active: +- transparent text view - Listen to NSSystemColorsDidChangeNotification and update highlighting - Add support for 'mousehide' (needs to check p_mh) - Build Vim (make) from Xcode project From a68bae47a617fffc3835ba7da8bf5bdabca7bc83 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Fri, 21 Sep 2007 12:47:55 +0000 Subject: [PATCH 0223/1156] Added info on resetting and changing key equivalents git-svn-id: http://macvim.googlecode.com/svn/trunk@253 96c4425d-ca35-0410-94e5-3396d5c13a8f --- doc/gui_mac.txt | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/doc/gui_mac.txt b/doc/gui_mac.txt index 7f6128e07b..61fca74bb2 100644 --- a/doc/gui_mac.txt +++ b/doc/gui_mac.txt @@ -147,6 +147,19 @@ Note that key equivalents: * take precedence over normal mappings made with ":map" * can only be modified during startup (e.g. in .gvimrc) +It is possible to reset a key equivalent by calling :menukeyequiv with a menu +name but no key. This is so that the default key equivalents can be reset in +"~/.gvimrc". For example, if you would like to free up (which is the +key equivalent of "File.Save") then add the following line to "~/.gvimrc": > + menukeyequiv File.Save +Now you can use :map to bind to whatever you like. + +It is not necessary to reset a key equivalent if all you want to do is to +change the key equivalent of a menu item. For example, say you want to use + as the key equivalent for "Next Tab", then add the following line +to "~/.gvimrc": > + menukeyequiv Window.Next\ Tab +< *:action* It is typical for menu items in Cocoa applications to bind to Objective-C selectors. To support this, MacVim introduces the ":action" command. This From 41583ad1dc691a35ab0883bd55f97e28e2141673 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Fri, 21 Sep 2007 18:32:22 +0000 Subject: [PATCH 0224/1156] Drag and drop in command line mode works as it should git-svn-id: http://macvim.googlecode.com/svn/trunk@254 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMBackend.m | 98 +++++++++++++++++++++++++++-------------------------- 1 file changed, 50 insertions(+), 48 deletions(-) diff --git a/MMBackend.m b/MMBackend.m index 3c8741e717..e01b2acc54 100644 --- a/MMBackend.m +++ b/MMBackend.m @@ -1543,63 +1543,65 @@ - (void)handleMessage:(int)msgid data:(NSData *)data } else if (DropFilesMsgID == msgid) { #ifdef FEAT_DND const void *bytes = [data bytes]; + const void *end = [data bytes] + [data length]; int n = *((int*)bytes); bytes += sizeof(int); -#if 0 - int row = *((int*)bytes); bytes += sizeof(int); - int col = *((int*)bytes); bytes += sizeof(int); + if (State & CMDLINE) { + // HACK! If Vim is in command line mode then the files names + // should be added to the command line, instead of opening the + // files in tabs. This is taken care of by gui_handle_drop(). + char_u **fnames = (char_u **)alloc(n * sizeof(char_u *)); + if (fnames) { + int i = 0; + while (bytes < end && i < n) { + int len = *((int*)bytes); bytes += sizeof(int); + fnames[i++] = vim_strnsave((char_u*)bytes, len); + bytes += len; + } - char_u **fnames = (char_u **)alloc(n * sizeof(char_u *)); - if (fnames) { - const void *end = [data bytes] + [data length]; - int i = 0; - while (bytes < end && i < n) { + // NOTE! This function will free 'fnames'. + // HACK! It is assumed that the 'x' and 'y' arguments are + // unused when in command line mode. + gui_handle_drop(0, 0, 0, fnames, i < n ? i : n); + } + } else { + // HACK! I'm not sure how to get Vim to open a list of files in + // tabs, so instead I create a ':tab drop' command with all the + // files to open and execute it. + NSMutableString *cmd = (n > 1) + ? [NSMutableString stringWithString:@":tab drop"] + : [NSMutableString stringWithString:@":drop"]; + + int i; + for (i = 0; i < n && bytes < end; ++i) { int len = *((int*)bytes); bytes += sizeof(int); - fnames[i++] = vim_strnsave((char_u*)bytes, len); + NSMutableString *file = + [NSMutableString stringWithUTF8String:bytes]; + [file replaceOccurrencesOfString:@" " + withString:@"\\ " + options:0 + range:NSMakeRange(0,[file length])]; bytes += len; - } - - // NOTE! This function will free 'fnames'. - gui_handle_drop(col, row, 0, fnames, i < n ? i : n); - } -#else - // HACK! I'm not sure how to get Vim to open a list of files in tabs, - // so instead I create a ':tab drop' command with all the files to open - // and execute it. - NSMutableString *cmd = (n > 1) - ? [NSMutableString stringWithString:@":tab drop"] - : [NSMutableString stringWithString:@":drop"]; - const void *end = [data bytes] + [data length]; - int i; - for (i = 0; i < n && bytes < end; ++i) { - int len = *((int*)bytes); bytes += sizeof(int); - NSMutableString *file = - [NSMutableString stringWithUTF8String:bytes]; - [file replaceOccurrencesOfString:@" " - withString:@"\\ " - options:0 - range:NSMakeRange(0, [file length])]; - bytes += len; - - [cmd appendString:@" "]; - [cmd appendString:file]; - } + [cmd appendString:@" "]; + [cmd appendString:file]; + } - // By going to the last tabpage we ensure that the new tabs will appear - // last (if this call is left out, the taborder becomes messy). - goto_tabpage(9999); + // By going to the last tabpage we ensure that the new tabs will + // appear last (if this call is left out, the taborder becomes + // messy). + goto_tabpage(9999); - do_cmdline_cmd((char_u*)[cmd UTF8String]); + do_cmdline_cmd((char_u*)[cmd UTF8String]); - // Force screen redraw (does it have to be this complicated?). - // (This code was taken from the end of gui_handle_drop().) - update_screen(NOT_VALID); - setcursor(); - out_flush(); - gui_update_cursor(FALSE, FALSE); - gui_mch_flush(); -#endif + // Force screen redraw (does it have to be this complicated?). + // (This code was taken from the end of gui_handle_drop().) + update_screen(NOT_VALID); + setcursor(); + out_flush(); + gui_update_cursor(FALSE, FALSE); + gui_mch_flush(); + } #endif // FEAT_DND } else if (DropStringMsgID == msgid) { #ifdef FEAT_DND From b43f3e9a2b25bbb4d064d2c367e65026e18d63fa Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Fri, 21 Sep 2007 18:33:02 +0000 Subject: [PATCH 0225/1156] - Updated drag-n-drop section - Added another todo git-svn-id: http://macvim.googlecode.com/svn/trunk@255 96c4425d-ca35-0410-94e5-3396d5c13a8f --- doc/gui_mac.txt | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/doc/gui_mac.txt b/doc/gui_mac.txt index 61fca74bb2..ddac904561 100644 --- a/doc/gui_mac.txt +++ b/doc/gui_mac.txt @@ -58,12 +58,14 @@ set to "utf-8". *macvim-drag-n-drop* Dragging files and dropping them on a window opens those files in tabs in that -window. This happens even when Vim is in command-line mode. Holding down -modifier keys whilst dragging is not supported. +window, unless Vim is in command-line mode. In command-line mode the names of +the files are added to the command line. Holding down modifier keys whilst +dragging is not supported. *macvim-default-menu* The default menu in MacVim has been changed to conform better with the Apple -Human Interface Guidelines (HIG). +Human Interface Guidelines (HIG). At the moment this breaks the localized +menus, so only English menus are supported. Note: The menus are a work in progress. If you know something about the HIG and want to contribute to MacVim you could do so by making the menus better. @@ -224,6 +226,9 @@ These are the currently supported services: Here are some of the bigger bugs in MacVim. Of course there are others, but these are ones that are know and/or which were judged major. +- Localized menus are not supported. Choosing anything but "English" in the + "International" pane of "System Prefences" may break the menus (and + toolbar). - Composing characters are not supported, they will mess up the display - Only "utf-8" is supported for 'enc' - Sometimes multibyte characters look "too wide", i.e. they overlap the From 140e41866a8133fb892e8130629e6d525991100b Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Fri, 21 Sep 2007 18:41:50 +0000 Subject: [PATCH 0226/1156] git-svn-id: http://macvim.googlecode.com/svn/trunk@256 96c4425d-ca35-0410-94e5-3396d5c13a8f --- TODO | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/TODO b/TODO index 3aa50561ec..d2f331d80c 100644 --- a/TODO +++ b/TODO @@ -19,12 +19,11 @@ Active: - standardize NSString usage (initialization & how it is passed in messages) - autosave window rows&columns? - set gfn=* ? -- improve drag and drop support (drop in command line mode not working, - modifier keys are ignored) +- improve drag and drop support (modifier keys are ignored) - grey out menus which can't be used: Tab Next/Prev/Close, Undo/Redo, etc. - find/replace toolbar item (FIND_REPLACE_DIALOG) - drag-to-resize, delay if mouse button held down -- ability to modify key equivalents at any time +- ability to modify key equivalents at any time (?) - validate menu actions for when no windows are open (e.g. selectNextWindow:) - need E??? numbers for vim errors - tab-completion for :action command? @@ -55,6 +54,7 @@ Active: Pending: +- improve drag and drop support (drop in command line mode not working) - System colors don't come out the same as in other apps (as measure with Digital Color Meter) - Select-mode for From 5341d45b06c421d88bcbdca7ff62d9bca918194d Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sat, 22 Sep 2007 14:24:37 +0000 Subject: [PATCH 0227/1156] - Added sendMessageNow:data:timeout: method to MMVimController - At end of live resize, send resize message with above method and if that fails fit window to text storage git-svn-id: http://macvim.googlecode.com/svn/trunk@257 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMTextView.m | 7 +- MMVimController.h | 2 + MMVimController.m | 27 ++++++++ MMWindowController.h | 3 +- MMWindowController.m | 152 +++++++++++++++++++++++++++---------------- 5 files changed, 128 insertions(+), 63 deletions(-) diff --git a/MMTextView.m b/MMTextView.m index f429eaedba..dc92394a6e 100644 --- a/MMTextView.m +++ b/MMTextView.m @@ -742,13 +742,8 @@ - (void)updateFontPanel - (void)viewDidEndLiveResize { - // HACK! If a SetTextDimensionsMsgID message is lost while dragging to - // resize the window, then the text view and window sizes may become out of - // sync. To avoid this problem, resize the window when live resizes ends. - // This sometimes makes the window size 'jump' unpleasantly, but that is - // better than the alternative. id windowController = [[self window] windowController]; - [windowController resizeWindowToFit:self]; + [windowController liveResizeDidEnd]; } @end // MMTextView diff --git a/MMVimController.h b/MMVimController.h index 6bf7bb8f9e..fd1b37d458 100644 --- a/MMVimController.h +++ b/MMVimController.h @@ -51,6 +51,8 @@ - (void)dropFiles:(NSArray *)filenames; - (void)dropString:(NSString *)string; - (void)sendMessage:(int)msgid data:(NSData *)data; +- (BOOL)sendMessageNow:(int)msgid data:(NSData *)data + timeout:(NSTimeInterval)timeout; @end diff --git a/MMVimController.m b/MMVimController.m index ea3ca67c07..1c6977a06b 100644 --- a/MMVimController.m +++ b/MMVimController.m @@ -276,6 +276,33 @@ - (void)sendMessage:(int)msgid data:(NSData *)data } } +- (BOOL)sendMessageNow:(int)msgid data:(NSData *)data + timeout:(NSTimeInterval)timeout +{ + if (!isInitialized || inProcessCommandQueue) + return NO; + + if (timeout < 0) timeout = 0; + + BOOL sendOk = YES; + NSConnection *conn = [backendProxy connectionForProxy]; + NSTimeInterval oldTimeout = [conn requestTimeout]; + + [conn setRequestTimeout:timeout]; + + @try { + [backendProxy processInput:msgid data:data]; + } + @catch (NSException *e) { + sendOk = NO; + } + @finally { + [conn setRequestTimeout:oldTimeout]; + } + + return sendOk; +} + - (id)backendProxy { return backendProxy; diff --git a/MMWindowController.h b/MMWindowController.h index e172317745..b472f8438d 100644 --- a/MMWindowController.h +++ b/MMWindowController.h @@ -58,12 +58,11 @@ - (void)showToolbar:(BOOL)on size:(int)size mode:(int)mode; - (void)setMouseShape:(int)shape; - (void)adjustLinespace:(int)linespace; +- (void)liveResizeDidEnd; - (IBAction)addNewTab:(id)sender; - (IBAction)toggleToolbar:(id)sender; -- (void)resizeWindowToFit:(id)sender; - @end // vim: set ft=objc: diff --git a/MMWindowController.m b/MMWindowController.m index 85143b9ef4..d91e023bd3 100644 --- a/MMWindowController.m +++ b/MMWindowController.m @@ -50,6 +50,7 @@ @interface MMWindowController (Private) - (NSSize)contentSizeForTextStorageSize:(NSSize)textViewSize; - (NSRect)textViewRectForContentSize:(NSSize)contentSize; - (NSSize)textStorageSizeForTextViewSize:(NSSize)textViewSize; +- (void)resizeWindowToFit:(id)sender; - (NSRect)fitWindowToFrame:(NSRect)frame; - (void)updateResizeIncrements; - (NSTabViewItem *)addNewTabViewItem; @@ -548,6 +549,50 @@ - (void)adjustLinespace:(int)linespace } } +- (void)liveResizeDidEnd +{ + // TODO: Don't duplicate code from placeViews. + + if (!setupDone) return; + + // NOTE! It is assumed that the window has been resized so that it will + // exactly fit the text storage (possibly after resizing it). If this is + // not the case the display might be messed up. + BOOL resizeFailed = NO; + NSWindow *win = [self window]; + NSRect contentRect = [win contentRectForFrameRect:[win frame]]; + NSRect textViewRect = [self textViewRectForContentSize:contentRect.size]; + NSSize tsSize = [self textStorageSizeForTextViewSize:textViewRect.size]; + + int dim[2], rows, cols; + [textStorage getMaxRows:&rows columns:&cols]; + [textStorage fitToSize:tsSize rows:&dim[0] columns:&dim[1]]; + + if (dim[0] != rows || dim[1] != cols) { + NSData *data = [NSData dataWithBytes:dim length:2*sizeof(int)]; + + // NOTE: Since we're at the end of a live resize we want to make sure + // that the SetTextDimensionsMsgID message reaches Vim, else Vim and + // MacVim will have inconsistent states (i.e. the text view will be too + // large or too small for the window size). Thus, add a timeout (this + // may have to be tweaked) and take note if the message was sent or + // not. + resizeFailed = ![vimController sendMessageNow:SetTextDimensionsMsgID + data:data + timeout:.5]; + } + + [textView setFrame:textViewRect]; + + [self placeScrollbars]; + + if (resizeFailed) { + // Force the window size to match the text view size otherwise Vim and + // MacVim will have inconsistent states. + [self resizeWindowToFit:self]; + } +} + - (IBAction)addNewTab:(id)sender { // NOTE! This can get called a lot if the user holds down the key @@ -719,58 +764,6 @@ - (BOOL)writeSelectionToPasteboard:(NSPasteboard *)pboard return [self askBackendForStarRegister:pboard]; } -- (void)resizeWindowToFit:(id)sender -{ - // NOTE: Be very careful when you call this method! Do not call while - // processing command queue, instead set 'shouldUpdateWindowSize' to YES. - // The only other place it is currently called is when live resize ends. - // This is done to ensure that the text view and window sizes match up - // (they may become out of sync if a SetTextDimensionsMsgID message to the - // backend is dropped). - - if (!setupDone) return; - - NSWindow *win = [self window]; - NSRect frame = [win frame]; - NSRect contentRect = [win contentRectForFrameRect:frame]; - NSSize newSize = [self contentSizeForTextStorageSize:[textStorage size]]; - - // Keep top-left corner of the window fixed when resizing. - contentRect.origin.y -= newSize.height - contentRect.size.height; - contentRect.size = newSize; - - frame = [win frameRectForContentRect:contentRect]; - NSRect maxFrame = [win constrainFrameRect:frame toScreen:[win screen]]; - - // HACK! Assuming the window frame cannot already be placed too high, - // adjust 'maxFrame' so that it at least as high up as the current frame. - // The reason for doing this is that constrainFrameRect:toScreen: does not - // always seem to utilize as much area as possible. - if (NSMaxY(frame) > NSMaxY(maxFrame)) { - maxFrame.size.height = frame.origin.y - maxFrame.origin.y - + frame.size.height; - } - - if (!NSEqualRects(maxFrame, frame)) { - // The new window frame is too big to fit on the screen, so fit the - // text storage to the biggest frame which will fit on the screen. - //NSLog(@"Proposed window frame does not fit on the screen!"); - frame = [self fitWindowToFrame:maxFrame]; - } - - //NSLog(@"%s %@", _cmd, NSStringFromRect(frame)); - - // HACK! If the window does resize, then windowDidResize is called which in - // turn calls placeViews. In case the computed new size of the window is - // no different from the current size, then we need to call placeViews - // manually. - if (NSEqualRects(frame, [win frame])) { - [self placeViews]; - } else { - [win setFrame:frame display:YES]; - } -} - @end // MMWindowController @@ -840,6 +833,58 @@ - (NSSize)textStorageSizeForTextViewSize:(NSSize)textViewSize return size; } +- (void)resizeWindowToFit:(id)sender +{ + // NOTE: Be very careful when you call this method! Do not call while + // processing command queue, instead set 'shouldUpdateWindowSize' to YES. + // The only other place it is currently called is when live resize ends. + // This is done to ensure that the text view and window sizes match up + // (they may become out of sync if a SetTextDimensionsMsgID message to the + // backend is dropped). + + if (!setupDone) return; + + NSWindow *win = [self window]; + NSRect frame = [win frame]; + NSRect contentRect = [win contentRectForFrameRect:frame]; + NSSize newSize = [self contentSizeForTextStorageSize:[textStorage size]]; + + // Keep top-left corner of the window fixed when resizing. + contentRect.origin.y -= newSize.height - contentRect.size.height; + contentRect.size = newSize; + + frame = [win frameRectForContentRect:contentRect]; + NSRect maxFrame = [win constrainFrameRect:frame toScreen:[win screen]]; + + // HACK! Assuming the window frame cannot already be placed too high, + // adjust 'maxFrame' so that it at least as high up as the current frame. + // The reason for doing this is that constrainFrameRect:toScreen: does not + // always seem to utilize as much area as possible. + if (NSMaxY(frame) > NSMaxY(maxFrame)) { + maxFrame.size.height = frame.origin.y - maxFrame.origin.y + + frame.size.height; + } + + if (!NSEqualRects(maxFrame, frame)) { + // The new window frame is too big to fit on the screen, so fit the + // text storage to the biggest frame which will fit on the screen. + //NSLog(@"Proposed window frame does not fit on the screen!"); + frame = [self fitWindowToFrame:maxFrame]; + } + + //NSLog(@"%s %@", _cmd, NSStringFromRect(frame)); + + // HACK! If the window does resize, then windowDidResize is called which in + // turn calls placeViews. In case the computed new size of the window is + // no different from the current size, then we need to call placeViews + // manually. + if (NSEqualRects(frame, [win frame])) { + [self placeViews]; + } else { + [win setFrame:frame display:YES]; + } +} + - (NSRect)fitWindowToFrame:(NSRect)frame { if (!setupDone) return frame; @@ -1108,9 +1153,6 @@ - (void)placeViews // dim[0], dim[1]); NSData *data = [NSData dataWithBytes:dim length:2*sizeof(int)]; - // NOTE! This can get called a lot when in live resize, which causes - // the connection buffers to fill up. If we wait for the message to be - // sent then the app might become unresponsive. [vimController sendMessage:SetTextDimensionsMsgID data:data]; } From c95f5d59cb07fd96b4a79733ec9ce37929243476 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sat, 22 Sep 2007 14:54:24 +0000 Subject: [PATCH 0228/1156] Double-click, triple-click, etc. were not properly handled by MouseDownMsgID git-svn-id: http://macvim.googlecode.com/svn/trunk@258 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMBackend.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MMBackend.m b/MMBackend.m index e01b2acc54..3878fd2bc8 100644 --- a/MMBackend.m +++ b/MMBackend.m @@ -1381,7 +1381,7 @@ - (void)handleMessage:(int)msgid data:(NSData *)data button = eventButtonNumberToVimMouseButton(button); flags = eventModifierFlagsToVimMouseModMask(flags); - gui_send_mouse_event(button, col, row, 0 != count, flags); + gui_send_mouse_event(button, col, row, count>1, flags); } else if (MouseUpMsgID == msgid) { if (!data) return; const void *bytes = [data bytes]; From c234e0b8dd76957158fd920b0c3a0b55c64aa031 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sat, 22 Sep 2007 15:29:49 +0000 Subject: [PATCH 0229/1156] set gfn=* shows the font panel git-svn-id: http://macvim.googlecode.com/svn/trunk@259 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMBackend.m | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/MMBackend.m b/MMBackend.m index 3878fd2bc8..07b6356d9b 100644 --- a/MMBackend.m +++ b/MMBackend.m @@ -764,6 +764,13 @@ - (BOOL)setFontWithName:(char *)name if (name) { fontName = [[[NSString alloc] initWithCString:name encoding:NSUTF8StringEncoding] autorelease]; + + if ([fontName isEqual:@"*"]) { + // :set gfn=* shows the font panel. + do_cmdline_cmd((char_u*)":action orderFrontFontPanel:"); + return YES; + } + NSArray *components = [fontName componentsSeparatedByString:@":"]; if ([components count] == 2) { NSString *sizeString = [components lastObject]; @@ -808,8 +815,8 @@ - (BOOL)setFontWithName:(char *)name } } - NSLog(@"WARNING: Cannot set font with name '%@' of size %.2f", - fontName, size); + //NSLog(@"WARNING: Cannot set font with name '%@' of size %.2f", + // fontName, size); return NO; } From a74e1fe57dd4b8300c3565133aaad397b7ec50ea Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sat, 22 Sep 2007 19:05:41 +0000 Subject: [PATCH 0230/1156] Can now map to Tab with modifiers git-svn-id: http://macvim.googlecode.com/svn/trunk@260 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMBackend.m | 38 ++++++++++++++++++++++++++++++++------ MMTextView.m | 24 ++++++++++++++---------- SpecialKeys.plist | 2 -- 3 files changed, 46 insertions(+), 18 deletions(-) diff --git a/MMBackend.m b/MMBackend.m index 07b6356d9b..9459fda341 100644 --- a/MMBackend.m +++ b/MMBackend.m @@ -1670,8 +1670,8 @@ - (void)handleKeyDown:(NSString *)key modifiers:(int)mods { char_u special[3]; char_u modChars[3]; - char_u *chars = 0; - int length = 0; + char_u *chars = (char_u*)[key UTF8String]; + int length = [key lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; // Special keys (arrow keys, function keys, etc.) are stored in a plist so // that new keys can easily be added. @@ -1692,9 +1692,34 @@ - (void)handleKeyDown:(NSString *)key modifiers:(int)mods chars = special; length = 3; - } else if ([key length] > 0) { - chars = (char_u*)[key UTF8String]; - length = [key lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; + } else if (1 == length && TAB == chars[0]) { + // Tab is a trouble child: + // - is added to the input buffer as is + // - is translated to, {CSI,'k','B'} (i.e. 'Back-tab') + // - should be 0x80|TAB but this is not valid utf-8 so it needs + // to be converted to utf-8 + // - is translated to with ALT modifier + // - is reserved by Mac OS X + // - is reserved by Mac OS X + chars = special; + special[0] = TAB; + length = 1; + + if (mods & MOD_MASK_SHIFT) { + mods &= ~MOD_MASK_SHIFT; + special[0] = CSI; + special[1] = K_SECOND(K_S_TAB); + special[2] = K_THIRD(K_S_TAB); + length = 3; + } else if (mods & MOD_MASK_ALT) { + int mtab = 0x80 | TAB; + // Convert to utf-8 + special[0] = (mtab >> 6) + 0xc0; + special[1] = mtab & 0xbf; + length = 2; + mods &= ~MOD_MASK_ALT; + } + } else if (length > 0) { unichar c = [key characterAtIndex:0]; //NSLog(@"non-special: %@ (hex=%x, mods=%d)", key, @@ -1710,7 +1735,8 @@ - (void)handleKeyDown:(NSString *)key modifiers:(int)mods // cleared since they are already added to the key by the AppKit. // Unfortunately, the only way to deal with when to clear the modifiers // or not seems to be to have hard-wired rules like this. - if ( !((' ' == c) || (0xa0 == c) || (mods & MOD_MASK_CMD)) ) { + if ( !((' ' == c) || (0xa0 == c) || (mods & MOD_MASK_CMD) + || 0x9 == c) ) { mods &= ~MOD_MASK_SHIFT; mods &= ~MOD_MASK_CTRL; //NSLog(@"clear shift ctrl"); diff --git a/MMTextView.m b/MMTextView.m index dc92394a6e..57cfc91294 100644 --- a/MMTextView.m +++ b/MMTextView.m @@ -180,16 +180,19 @@ - (void)insertText:(id)string NSEvent *event = [NSApp currentEvent]; - // HACK! In order to be able to bind to etc. we have to watch - // for when space was pressed. + // HACK! In order to be able to bind to , , etc. we have + // to watch for them here. if ([event type] == NSKeyDown && [[event charactersIgnoringModifiers] length] > 0 - && [[event charactersIgnoringModifiers] characterAtIndex:0] == ' ' && [event modifierFlags] - & (NSShiftKeyMask|NSControlKeyMask|NSAlternateKeyMask)) - { - [self dispatchKeyEvent:event]; - return; + & (NSShiftKeyMask|NSControlKeyMask|NSAlternateKeyMask)) { + unichar c = [[event charactersIgnoringModifiers] characterAtIndex:0]; + + // translates to 0x19 + if (' ' == c || 0x19 == c) { + [self dispatchKeyEvent:event]; + return; + } } // TODO: Support 'mousehide' (check p_mh) @@ -835,6 +838,7 @@ - (void)dispatchKeyEvent:(NSEvent *)event unichar imc = [unmodchars characterAtIndex:0]; int len = 0; const char *bytes = 0; + int mods = [event modifierFlags]; //NSLog(@"%s chars[0]=0x%x unmodchars[0]=0x%x (chars=%@ unmodchars=%@)", // _cmd, c, imc, chars, unmodchars); @@ -856,14 +860,14 @@ - (void)dispatchKeyEvent:(NSEvent *)event } else if (c == 0x19 && imc == 0x19) { // HACK! AppKit turns back tab into Ctrl-Y, so we need to handle it // separately (else Ctrl-Y doesn't work). - static char back_tab[2] = { 'k', 'B' }; - len = 2; bytes = back_tab; + static char tab = 0x9; + len = 1; bytes = &tab; mods |= NSShiftKeyMask; } else { len = [chars lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; bytes = [chars UTF8String]; } - [self sendKeyDown:bytes length:len modifiers:[event modifierFlags]]; + [self sendKeyDown:bytes length:len modifiers:mods]; } - (MMVimController *)vimController diff --git a/SpecialKeys.plist b/SpecialKeys.plist index 180302d040..be1f7784c4 100644 --- a/SpecialKeys.plist +++ b/SpecialKeys.plist @@ -4,8 +4,6 @@ KA KA - kB - kB  kb  From 658181de23f3a0649d50490597cb356b1c94b34e Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sat, 22 Sep 2007 19:50:48 +0000 Subject: [PATCH 0231/1156] - Created runtime folder - Move doc folder into runtime folder - Added MacVim colorscheme git-svn-id: http://macvim.googlecode.com/svn/trunk@261 96c4425d-ca35-0410-94e5-3396d5c13a8f --- runtime/colors/macvim.vim | 83 +++++++++++ runtime/doc/gui_mac.txt | 289 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 372 insertions(+) create mode 100644 runtime/colors/macvim.vim create mode 100644 runtime/doc/gui_mac.txt diff --git a/runtime/colors/macvim.vim b/runtime/colors/macvim.vim new file mode 100644 index 0000000000..bbc860b65d --- /dev/null +++ b/runtime/colors/macvim.vim @@ -0,0 +1,83 @@ +" MacVim colorscheme +" +" Maintainer: Björn Winckler +" Last Change: 2007 Sep 22 +" + + +" Tell vim that this is a light color scheme: +set background=light +highlight clear + +" Reset String -> Constant links etc if they were reset +if exists("syntax_on") + syntax reset +endif + +let colors_name = "macvim" + +" `:he highlight-groups` +hi ErrorMsg guibg=Firebrick2 guifg=White +hi IncSearch gui=reverse +hi ModeMsg gui=bold +hi NonText gui=bold guifg=Blue +hi StatusLine gui=NONE guifg=white guibg=Black +hi StatusLineNC gui=NONE guifg=Gray95 guibg=SlateGray +hi VertSplit gui=NONE guifg=SlateGray guibg=Gray +hi DiffText gui=bold guibg=firebrick2 +hi PmenuThumb gui=reverse +hi PmenuSbar guibg=Grey +hi TabLineSel gui=bold +hi TabLineFill gui=reverse +hi Cursor guibg=fg guifg=bg +hi CursorIM guibg=fg guifg=bg +hi lCursor guibg=fg guifg=bg + + +hi Directory guifg=#1600FF +hi LineNr guifg=#888888 guibg=#E6E6E6 +hi MoreMsg gui=bold guifg=SeaGreen4 +hi Question gui=bold guifg=chartreuse4 +hi Search guibg=cadetblue1 guifg=NONE +hi SpellBad guisp=firebrick2 gui=undercurl +hi SpellCap guisp=blue gui=undercurl +hi SpellRare guisp=Magenta gui=undercurl +hi SpellLocal guisp=DarkCyan gui=undercurl +hi Pmenu guibg=Cornsilk +hi PmenuSel guifg=White guibg=goldenrod2 +hi SpecialKey guifg=Blue +hi Title gui=bold guifg=DeepSkyBlue3 +hi WarningMsg guifg=firebrick2 +hi WildMenu guibg=SkyBlue guifg=Black +hi Folded guibg=#E6E6E6 guifg=DarkBlue +hi FoldColumn guibg=Grey guifg=DarkBlue +hi SignColumn guibg=Grey guifg=DarkBlue +hi Visual guibg=MacSelectedTextBackgroundColor +hi DiffAdd guibg=LightBlue +hi DiffChange guibg=DarkSlateBlue +hi DiffDelete gui=bold guifg=black guibg=SpringGreen4 +hi TabLine gui=underline guibg=LightGrey +hi CursorColumn guibg=#F1F5FA +hi CursorLine guibg=#F1F5FA "Data browser list view secondary color +hi MatchParen guifg=white guibg=DeepPink4 +hi Normal gui=NONE + + +" Syntax items (`:he group-name` -- more groups are available, these are just +" the top level syntax items for now). + +hi Comment gui=italic guifg=blue2 guibg=NONE +hi Constant gui=NONE guifg=magenta1 guibg=NONE +hi String gui=NONE guifg=SkyBlue4 guibg=NONE +hi Boolean gui=NONE guifg=red3 guibg=NONE +hi Identifier gui=NONE guifg=aquamarine4 guibg=NONE +hi Statement gui=bold guifg=maroon guibg=NONE +hi PreProc gui=NONE guifg=DodgerBlue3 guibg=NONE +hi Type gui=bold guifg=green4 guibg=NONE +hi Special gui=NONE guifg=BlueViolet guibg=NONE +hi Underlined gui=underline guifg=SteelBlue1 +hi Ignore gui=NONE guifg=bg guibg=NONE +hi Error gui=NONE guifg=White guibg=firebrick3 +hi Todo gui=NONE guifg=White guibg=magenta3 + +" vim: sw=2 diff --git a/runtime/doc/gui_mac.txt b/runtime/doc/gui_mac.txt new file mode 100644 index 0000000000..ddac904561 --- /dev/null +++ b/runtime/doc/gui_mac.txt @@ -0,0 +1,289 @@ +*gui_mac.txt* For Vim version 7.1. Last change: 2007 Sep 18 + + + VIM REFERENCE MANUAL by Bram Moolenaar + + +The MacVim Graphical User Interface *macvim* *gui-macvim* + +1. MacVim differences |macvim-differences| +2. Starting MacVim |gui-macvim-start| +3. Special colors |macvim-colors| +4. Menus |macvim-menus| +5. Dialogs |macvim-dialogs| +6. System services |macvim-services| +7. Known bugs/missing features |macvim-todo| +8. Hints |macvim-hints| + +Other relevant documentation: +|gui.txt| For generic items of the GUI. +|os_mac.txt| For Mac specific items. + +{Vi does not have a GUI} + +============================================================================== +1. MacVim differences *macvim-differences* + +One of the goals of MacVim is to make Vim behave like a proper Mac OS X +application. For this reason MacVim behaves slightly different from other GUI +ports of Vim. Most of the modifications are provided in the system gvimrc +file; you can quickly open this file and look at it yourself by typing: > + :tabe $VIM/gvimrc +Note that this file will be overwritten each time you update MacVim, so it is +better to keep your own modifications inside "~/.gvimrc". + + *macvim-windows* +There is some confusion regarding the term "window" in MacVim since it means +one thing to Vim and another to MacVim. A "window" in Vim is what opens up +when you type ":sp", whereas a "window" in MacVim is the GUI window which +contains the text view, scrollbars, toolbar and tabline. To avoid confusion, +the former is referred to as a Vim-window, whereas the latter is simply called +a window. + + *macvim-shift-movement* +Text editors on Mac OS X lets the user hold down shift+movement key to extend +the selection. Also, pressing a printable key whilst selecting replaces the +current selection with that character. MacVim can emulate this kind of +behaviour (by providing key bindings and by setting 'keymodel' and +'selectmode' to non-default values) although it is not enabled by default. To +make MacVim behave more like TextEdit and less like Vim, add the following +lines to your "~/.vimrc" (not .gvimrc) file: > + if has("gui_macvim") + let macvim_hig_shift_movement = 1 + endif +< + *macvim-encoding* +It is not possible to modify 'termencoding' in MacVim; this option is forcibly +set to "utf-8". + + *macvim-drag-n-drop* +Dragging files and dropping them on a window opens those files in tabs in that +window, unless Vim is in command-line mode. In command-line mode the names of +the files are added to the command line. Holding down modifier keys whilst +dragging is not supported. + + *macvim-default-menu* +The default menu in MacVim has been changed to conform better with the Apple +Human Interface Guidelines (HIG). At the moment this breaks the localized +menus, so only English menus are supported. + +Note: The menus are a work in progress. If you know something about the HIG +and want to contribute to MacVim you could do so by making the menus better. + +============================================================================== +2. Starting MacVim *gui-macvim-start* + +The easiest way to start MacVim is by double-clicking its icon in the Finder, +but most users will probably prefer to use the Terminal. First some Finder +related ways of starting MacVim are described, then Terminal is discussed. +Note that you can put MacVim anywhere on your hard drive, but in this help +file it is assumed that you have put it inside your /Applications folder. + +MacVim automatically registers itself as an editor of several standard file +formats. This enables you to double-click a file to open it with MacVim (if +it is not associated with another program), or to right-click a file to bring +up the "Open with" menu. You can also drag and drop files onto the Dock icon +to open them in tabs in a new window, or you can drop them in an already open +window to open the files in tabs in that specific window. Finally, you can +use Mac OS X System Services to open files in MacVim, see |macvim-services|. + +There are essentially two ways to start MacVim from Terminal: either call the +Vim binary with the -g switch > + /Applications/MacVim.app/Contents/MacOS/Vim -g file ... +or use the "open" command (which is of limited use since it cannot be used to +pass parameters to Vim) > + open -a MacVim file ... + +In order to save you from having to type the entire path every time you start +MacVim, add the following alias to "~/.profile": > + alias gvim='/Applications/MacVim.app/Contents/MacOS/Vim -g' + +Once in terminal Vim it is possible to start MacVim by using the following +command: + :gui [++opt] [+cmd] [-f|-b] [files...] +Note: Forking ("-b") currently does not work. + +============================================================================== +3. Special colors *macvim-colors* + +The colors in MacVim are defined in two dictionaries inside the "Resources" +folder of the application bundle (MacVim.app/Contents/Resources). It is +possible to add more colors by modifying these files. Color names are case +insensitive when accessed from Vim, but in the dictionary they must be +lowercase. + + *SystemColors.plist* +There are only a few system colors that can be accessed from Vim. These +colors are defined in the dictionary "SystemColors.plist". This dictionary +stores (key, value) pairs where the key is the name of the color and the +value is an NSColor selector name. + +The most useful system colors are: > + MacSelectedTextBackgroundColor + MacSecondarySelectedColor +The former is the "Highlight Color" which can be changed in the "Appearance" +section of the System Preferences. The latter is the selection color used by +a Cocoa application when it is not in focus. + + *Colors.plist* +Apart from the system colors, it is also possible to use the colors listed in +the dictionary "Colors.plist". The key in this dictionary is the name of the +color and the value is an RGB value on the form #rrggbb stored as an integer. + +============================================================================== +4. Menus *macvim-menus* + + *:menukeyequiv* +MacVim has a special way of binding keys to menu items that differs from other +Vim GUI ports. A menu binding is called a "key equivalent" in Mac OS X +terminology, this is displayed on the right side of a menu item. The +":menukeyequiv" command is used to set the key equivalent of a menu item. +This command takes two parameters, the first names the menu item to bind to, +the second gives the key combination. For example: > + :menukeyequiv File.New\ Tab +This sets the key equivalent of the "New Tab" menu item under the "File" menu +to Cmd+t. + +Note that key equivalents: + * should always contain the Cmd modifier flag () + * take precedence over normal mappings made with ":map" + * can only be modified during startup (e.g. in .gvimrc) + +It is possible to reset a key equivalent by calling :menukeyequiv with a menu +name but no key. This is so that the default key equivalents can be reset in +"~/.gvimrc". For example, if you would like to free up (which is the +key equivalent of "File.Save") then add the following line to "~/.gvimrc": > + menukeyequiv File.Save +Now you can use :map to bind to whatever you like. + +It is not necessary to reset a key equivalent if all you want to do is to +change the key equivalent of a menu item. For example, say you want to use + as the key equivalent for "Next Tab", then add the following line +to "~/.gvimrc": > + menukeyequiv Window.Next\ Tab +< + *:action* +It is typical for menu items in Cocoa applications to bind to Objective-C +selectors. To support this, MacVim introduces the ":action" command. This +command takes the name of an action message as its only parameter. (An action +message is an Objective-C message with "void" return type and a single +parameter of type "id".) For example, the "New Window" menu item on the +"File" menu is created in the following manner: > + :an 10.290 File.New\ Window :action newWindow: + +Note 1: A menu item which is bound to ":action" will automatically be bound to +that action in all modes (as if ":an" was used). It is not possible to bind +to ":action" in one mode only. +Note 2: The action is "nil-targeted", which means it is passed down the first +responder chain. + + *Actions.plist* +Some action messages would not be suitable to call from within Vim, so there +is a dictionary called "Actions.plist" (in the Resources folder of the +application bundle) which contains all actions that may be called. The key in +this dictionary is the name of the action message (case sensitive), the value +is not used. + +============================================================================== +5. Dialogs *macvim-dialogs* + +Dialogs can be controlled with the keyboard in two ways. By default each +button in a dialog is bound to a key. The button that is highlighted by blue +is bound to Enter, and any button with the title "Cancel" is bound to Escape. +Other buttons are usually bound to the first letter in the title of the +button. There is no visual feedback to indicate which letter a button is +bound to, so sometimes some experimentation might be required in order to +figure out which key to press. + +The second way of controlling dialogs with the keyboard is to enable "Full +keyboard access" in the "Keyboard & Mouse" pane of the System Preferences (you +can also toggle this on or off by pressing Ctrl-F7). Once keyboard access is +enabled it is possible to move between buttons with Tab and pressing Space to +select the current button. The current button is indicated with a blue +outline. + +============================================================================== +6. System services *macvim-services* + +MacVim supports a few system services. These can be accessed from the MacVim +submenu in the Services menu. For services to work, MacVim.app should be +located in the /Applications folder. (You might have to logout and then login +again before Mac OS X detects the MacVim services.) + +These are the currently supported services: +* New Tab Containing Selection: Opens a new tab in the topmost window and + pastes the currently selected text in that tab. A new window will be + opened if necessary. +* Open Selected File in Tab: If the selected text represents a file + name, then the corresponding file is opened in a new tab in the topmost + window. +* Open Selected File in Window: Same as the above, but always open in a new + window. + +============================================================================== +7. Known bugs/missing features *macvim-todo* + +Here are some of the bigger bugs in MacVim. Of course there are others, but +these are ones that are know and/or which were judged major. + +- Localized menus are not supported. Choosing anything but "English" in the + "International" pane of "System Prefences" may break the menus (and + toolbar). +- Composing characters are not supported, they will mess up the display +- Only "utf-8" is supported for 'enc' +- Sometimes multibyte characters look "too wide", i.e. they overlap the + following character. It might help to change 'ambiwidth'. +- Printing +- No find/replace dialog + +If you find new bugs then add a new issue at http://code.google.com/p/macvim/ +or post your findings to the vim_mac mailing list. If you are missing feature +X in MacVim then voice your opinion on the vim_mac mailing list; it might be +simple to implement, but unless somebody asks for a particular feature then +there is little incentive to add it. + +============================================================================== +8. Hints *macvim-hints* + +In this section some general (not necessarily MacVim specific) hints are +given. + +Scenario: You try opening a bunch of files in tabs but not all files get +opened in their own tab. +Solution: To get around this, set 'tabpagemax' to something big in your +.gvimrc file (e.g. ":set tabpagemax=100"). + +Scenario: You want to open a file in a tab in an already opened window, but +typing "gvim filename" in Terminal opens it up in a separate window. +Solution: Use the |--remote-tab| switch. If you have several windows open you +might have to specify which window you want the file to open in by using the +|--servername| switch. The title of a window usually ends in something like +"VIM" or "VIM3" --- this is the server name of that window. So to open a file +named "foobar.txt" in a window whose title ends in "VIM3" you would type (the +order of the arguments matters): > + gvim --servername VIM3 --remote-tab foobar.txt +For more information, consult the |client-server| manual page. + +Scenario: You like to be able to select text by holding down shift and +pressing the arrow keys and find the Vim way of selecting text strange. +Solution: See |macvim-shift-movement|. + +Scenario: You dislike the default font (Monaco) and/or want a font with bold +and italic variants. +Solution: The font "Courier New" is a fixed width font that ships with Mac OS +X which has both bold and italic variants; however, it is not particularly +well suited for programming. A better alternative is to use the font +"Bitstream Vera Sans Mono" which can be downloaded for free, and it also has +both oblique and bold variants. After having downloaded and installed the +Bitstream Vera font, you can make it the default font by adding the following +line to "~/.gvimrc": > + set guifont=Bitstream\ Vera\ Sans\ Mono:h13 +The suffix ":h13" specifies the point size of the font should be "13" (see +'guifont' for more information on how to set the font). + +Scenario: You can't find the information on MacVim you thought should be in +this manual page. +Solution: Post your question on the vim_mac mailing list and wait for an +answer. + + vim:tw=78:sw=4:ts=8:ft=help:norl: From 26e1c218227a40298ae8c7caab029cfad044c9c6 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sat, 22 Sep 2007 19:52:23 +0000 Subject: [PATCH 0232/1156] Moved git-svn-id: http://macvim.googlecode.com/svn/trunk@262 96c4425d-ca35-0410-94e5-3396d5c13a8f --- doc/gui_mac.txt | 289 ------------------------------------------------ 1 file changed, 289 deletions(-) delete mode 100644 doc/gui_mac.txt diff --git a/doc/gui_mac.txt b/doc/gui_mac.txt deleted file mode 100644 index ddac904561..0000000000 --- a/doc/gui_mac.txt +++ /dev/null @@ -1,289 +0,0 @@ -*gui_mac.txt* For Vim version 7.1. Last change: 2007 Sep 18 - - - VIM REFERENCE MANUAL by Bram Moolenaar - - -The MacVim Graphical User Interface *macvim* *gui-macvim* - -1. MacVim differences |macvim-differences| -2. Starting MacVim |gui-macvim-start| -3. Special colors |macvim-colors| -4. Menus |macvim-menus| -5. Dialogs |macvim-dialogs| -6. System services |macvim-services| -7. Known bugs/missing features |macvim-todo| -8. Hints |macvim-hints| - -Other relevant documentation: -|gui.txt| For generic items of the GUI. -|os_mac.txt| For Mac specific items. - -{Vi does not have a GUI} - -============================================================================== -1. MacVim differences *macvim-differences* - -One of the goals of MacVim is to make Vim behave like a proper Mac OS X -application. For this reason MacVim behaves slightly different from other GUI -ports of Vim. Most of the modifications are provided in the system gvimrc -file; you can quickly open this file and look at it yourself by typing: > - :tabe $VIM/gvimrc -Note that this file will be overwritten each time you update MacVim, so it is -better to keep your own modifications inside "~/.gvimrc". - - *macvim-windows* -There is some confusion regarding the term "window" in MacVim since it means -one thing to Vim and another to MacVim. A "window" in Vim is what opens up -when you type ":sp", whereas a "window" in MacVim is the GUI window which -contains the text view, scrollbars, toolbar and tabline. To avoid confusion, -the former is referred to as a Vim-window, whereas the latter is simply called -a window. - - *macvim-shift-movement* -Text editors on Mac OS X lets the user hold down shift+movement key to extend -the selection. Also, pressing a printable key whilst selecting replaces the -current selection with that character. MacVim can emulate this kind of -behaviour (by providing key bindings and by setting 'keymodel' and -'selectmode' to non-default values) although it is not enabled by default. To -make MacVim behave more like TextEdit and less like Vim, add the following -lines to your "~/.vimrc" (not .gvimrc) file: > - if has("gui_macvim") - let macvim_hig_shift_movement = 1 - endif -< - *macvim-encoding* -It is not possible to modify 'termencoding' in MacVim; this option is forcibly -set to "utf-8". - - *macvim-drag-n-drop* -Dragging files and dropping them on a window opens those files in tabs in that -window, unless Vim is in command-line mode. In command-line mode the names of -the files are added to the command line. Holding down modifier keys whilst -dragging is not supported. - - *macvim-default-menu* -The default menu in MacVim has been changed to conform better with the Apple -Human Interface Guidelines (HIG). At the moment this breaks the localized -menus, so only English menus are supported. - -Note: The menus are a work in progress. If you know something about the HIG -and want to contribute to MacVim you could do so by making the menus better. - -============================================================================== -2. Starting MacVim *gui-macvim-start* - -The easiest way to start MacVim is by double-clicking its icon in the Finder, -but most users will probably prefer to use the Terminal. First some Finder -related ways of starting MacVim are described, then Terminal is discussed. -Note that you can put MacVim anywhere on your hard drive, but in this help -file it is assumed that you have put it inside your /Applications folder. - -MacVim automatically registers itself as an editor of several standard file -formats. This enables you to double-click a file to open it with MacVim (if -it is not associated with another program), or to right-click a file to bring -up the "Open with" menu. You can also drag and drop files onto the Dock icon -to open them in tabs in a new window, or you can drop them in an already open -window to open the files in tabs in that specific window. Finally, you can -use Mac OS X System Services to open files in MacVim, see |macvim-services|. - -There are essentially two ways to start MacVim from Terminal: either call the -Vim binary with the -g switch > - /Applications/MacVim.app/Contents/MacOS/Vim -g file ... -or use the "open" command (which is of limited use since it cannot be used to -pass parameters to Vim) > - open -a MacVim file ... - -In order to save you from having to type the entire path every time you start -MacVim, add the following alias to "~/.profile": > - alias gvim='/Applications/MacVim.app/Contents/MacOS/Vim -g' - -Once in terminal Vim it is possible to start MacVim by using the following -command: - :gui [++opt] [+cmd] [-f|-b] [files...] -Note: Forking ("-b") currently does not work. - -============================================================================== -3. Special colors *macvim-colors* - -The colors in MacVim are defined in two dictionaries inside the "Resources" -folder of the application bundle (MacVim.app/Contents/Resources). It is -possible to add more colors by modifying these files. Color names are case -insensitive when accessed from Vim, but in the dictionary they must be -lowercase. - - *SystemColors.plist* -There are only a few system colors that can be accessed from Vim. These -colors are defined in the dictionary "SystemColors.plist". This dictionary -stores (key, value) pairs where the key is the name of the color and the -value is an NSColor selector name. - -The most useful system colors are: > - MacSelectedTextBackgroundColor - MacSecondarySelectedColor -The former is the "Highlight Color" which can be changed in the "Appearance" -section of the System Preferences. The latter is the selection color used by -a Cocoa application when it is not in focus. - - *Colors.plist* -Apart from the system colors, it is also possible to use the colors listed in -the dictionary "Colors.plist". The key in this dictionary is the name of the -color and the value is an RGB value on the form #rrggbb stored as an integer. - -============================================================================== -4. Menus *macvim-menus* - - *:menukeyequiv* -MacVim has a special way of binding keys to menu items that differs from other -Vim GUI ports. A menu binding is called a "key equivalent" in Mac OS X -terminology, this is displayed on the right side of a menu item. The -":menukeyequiv" command is used to set the key equivalent of a menu item. -This command takes two parameters, the first names the menu item to bind to, -the second gives the key combination. For example: > - :menukeyequiv File.New\ Tab -This sets the key equivalent of the "New Tab" menu item under the "File" menu -to Cmd+t. - -Note that key equivalents: - * should always contain the Cmd modifier flag () - * take precedence over normal mappings made with ":map" - * can only be modified during startup (e.g. in .gvimrc) - -It is possible to reset a key equivalent by calling :menukeyequiv with a menu -name but no key. This is so that the default key equivalents can be reset in -"~/.gvimrc". For example, if you would like to free up (which is the -key equivalent of "File.Save") then add the following line to "~/.gvimrc": > - menukeyequiv File.Save -Now you can use :map to bind to whatever you like. - -It is not necessary to reset a key equivalent if all you want to do is to -change the key equivalent of a menu item. For example, say you want to use - as the key equivalent for "Next Tab", then add the following line -to "~/.gvimrc": > - menukeyequiv Window.Next\ Tab -< - *:action* -It is typical for menu items in Cocoa applications to bind to Objective-C -selectors. To support this, MacVim introduces the ":action" command. This -command takes the name of an action message as its only parameter. (An action -message is an Objective-C message with "void" return type and a single -parameter of type "id".) For example, the "New Window" menu item on the -"File" menu is created in the following manner: > - :an 10.290 File.New\ Window :action newWindow: - -Note 1: A menu item which is bound to ":action" will automatically be bound to -that action in all modes (as if ":an" was used). It is not possible to bind -to ":action" in one mode only. -Note 2: The action is "nil-targeted", which means it is passed down the first -responder chain. - - *Actions.plist* -Some action messages would not be suitable to call from within Vim, so there -is a dictionary called "Actions.plist" (in the Resources folder of the -application bundle) which contains all actions that may be called. The key in -this dictionary is the name of the action message (case sensitive), the value -is not used. - -============================================================================== -5. Dialogs *macvim-dialogs* - -Dialogs can be controlled with the keyboard in two ways. By default each -button in a dialog is bound to a key. The button that is highlighted by blue -is bound to Enter, and any button with the title "Cancel" is bound to Escape. -Other buttons are usually bound to the first letter in the title of the -button. There is no visual feedback to indicate which letter a button is -bound to, so sometimes some experimentation might be required in order to -figure out which key to press. - -The second way of controlling dialogs with the keyboard is to enable "Full -keyboard access" in the "Keyboard & Mouse" pane of the System Preferences (you -can also toggle this on or off by pressing Ctrl-F7). Once keyboard access is -enabled it is possible to move between buttons with Tab and pressing Space to -select the current button. The current button is indicated with a blue -outline. - -============================================================================== -6. System services *macvim-services* - -MacVim supports a few system services. These can be accessed from the MacVim -submenu in the Services menu. For services to work, MacVim.app should be -located in the /Applications folder. (You might have to logout and then login -again before Mac OS X detects the MacVim services.) - -These are the currently supported services: -* New Tab Containing Selection: Opens a new tab in the topmost window and - pastes the currently selected text in that tab. A new window will be - opened if necessary. -* Open Selected File in Tab: If the selected text represents a file - name, then the corresponding file is opened in a new tab in the topmost - window. -* Open Selected File in Window: Same as the above, but always open in a new - window. - -============================================================================== -7. Known bugs/missing features *macvim-todo* - -Here are some of the bigger bugs in MacVim. Of course there are others, but -these are ones that are know and/or which were judged major. - -- Localized menus are not supported. Choosing anything but "English" in the - "International" pane of "System Prefences" may break the menus (and - toolbar). -- Composing characters are not supported, they will mess up the display -- Only "utf-8" is supported for 'enc' -- Sometimes multibyte characters look "too wide", i.e. they overlap the - following character. It might help to change 'ambiwidth'. -- Printing -- No find/replace dialog - -If you find new bugs then add a new issue at http://code.google.com/p/macvim/ -or post your findings to the vim_mac mailing list. If you are missing feature -X in MacVim then voice your opinion on the vim_mac mailing list; it might be -simple to implement, but unless somebody asks for a particular feature then -there is little incentive to add it. - -============================================================================== -8. Hints *macvim-hints* - -In this section some general (not necessarily MacVim specific) hints are -given. - -Scenario: You try opening a bunch of files in tabs but not all files get -opened in their own tab. -Solution: To get around this, set 'tabpagemax' to something big in your -.gvimrc file (e.g. ":set tabpagemax=100"). - -Scenario: You want to open a file in a tab in an already opened window, but -typing "gvim filename" in Terminal opens it up in a separate window. -Solution: Use the |--remote-tab| switch. If you have several windows open you -might have to specify which window you want the file to open in by using the -|--servername| switch. The title of a window usually ends in something like -"VIM" or "VIM3" --- this is the server name of that window. So to open a file -named "foobar.txt" in a window whose title ends in "VIM3" you would type (the -order of the arguments matters): > - gvim --servername VIM3 --remote-tab foobar.txt -For more information, consult the |client-server| manual page. - -Scenario: You like to be able to select text by holding down shift and -pressing the arrow keys and find the Vim way of selecting text strange. -Solution: See |macvim-shift-movement|. - -Scenario: You dislike the default font (Monaco) and/or want a font with bold -and italic variants. -Solution: The font "Courier New" is a fixed width font that ships with Mac OS -X which has both bold and italic variants; however, it is not particularly -well suited for programming. A better alternative is to use the font -"Bitstream Vera Sans Mono" which can be downloaded for free, and it also has -both oblique and bold variants. After having downloaded and installed the -Bitstream Vera font, you can make it the default font by adding the following -line to "~/.gvimrc": > - set guifont=Bitstream\ Vera\ Sans\ Mono:h13 -The suffix ":h13" specifies the point size of the font should be "13" (see -'guifont' for more information on how to set the font). - -Scenario: You can't find the information on MacVim you thought should be in -this manual page. -Solution: Post your question on the vim_mac mailing list and wait for an -answer. - - vim:tw=78:sw=4:ts=8:ft=help:norl: From 16f1a5d99a8794b9c515fe01e464ac8c70b63169 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sat, 22 Sep 2007 20:06:54 +0000 Subject: [PATCH 0233/1156] git-svn-id: http://macvim.googlecode.com/svn/trunk@264 96c4425d-ca35-0410-94e5-3396d5c13a8f --- README | 2 ++ TODO | 5 ++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/README b/README index cba6e0a88e..bba32775dd 100644 --- a/README +++ b/README @@ -137,6 +137,8 @@ Keyboard stuff: Cmd+function key must not be intercepted here or input methods won't work - and are two different characters (the former is 0xa0) - Cocoa translates to Ctrl-C so this must be taken care of +- with various modifiers is very special, check MMBackend how it is + handled Bugs: diff --git a/TODO b/TODO index d2f331d80c..cf792c2e04 100644 --- a/TODO +++ b/TODO @@ -12,13 +12,11 @@ Active: (seems like a drawing bug in PSMTabBarControl) - file modified outside vim dialog sometimes only appear after pressing a key - let user choose file encoding and format in open/save dialogs -- view menu option to show/hide gui status line - autosave settings ? - encoding -- convert strings from vim to utf-8 - main menu (buffers menu, window menu) - standardize NSString usage (initialization & how it is passed in messages) - autosave window rows&columns? -- set gfn=* ? - improve drag and drop support (modifier keys are ignored) - grey out menus which can't be used: Tab Next/Prev/Close, Undo/Redo, etc. - find/replace toolbar item (FIND_REPLACE_DIALOG) @@ -39,7 +37,6 @@ Active: (this will lead to a crash) - update speed whilst resizing with mouse is excruciatingly slow - window count should be typeset nicely in tab ? -- marked text - track pad scrolling is jerky - sanity check all input in handlePortMessage: etc. - nice looking cursors (both the block and in insert mode) ? @@ -54,6 +51,8 @@ Active: Pending: +- marked text +- set gfn=* - improve drag and drop support (drop in command line mode not working) - System colors don't come out the same as in other apps (as measure with Digital Color Meter) From 1f487d966c4e1bed2da183d7ec09b0015aa5b1cd Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sat, 22 Sep 2007 20:44:53 +0000 Subject: [PATCH 0234/1156] Added "Bitstream Vera Sans Mono" as the default font. git-svn-id: http://macvim.googlecode.com/svn/trunk@265 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMAppController.m | 25 ++++ MMBackend.m | 10 +- MacVim.xcodeproj/project.pbxproj | 16 +++ MacVim.xcodeproj/winckler.mode1 | 34 ++--- MacVim.xcodeproj/winckler.pbxuser | 28 ++-- ttf-bitstream-vera-1.10/COPYRIGHT.TXT | 124 +++++++++++++++++ ttf-bitstream-vera-1.10/README.TXT | 11 ++ ttf-bitstream-vera-1.10/RELEASENOTES.TXT | 162 +++++++++++++++++++++++ ttf-bitstream-vera-1.10/VeraMoBI.ttf | Bin 0 -> 55032 bytes ttf-bitstream-vera-1.10/VeraMoBd.ttf | Bin 0 -> 49052 bytes ttf-bitstream-vera-1.10/VeraMoIt.ttf | Bin 0 -> 54508 bytes ttf-bitstream-vera-1.10/VeraMono.ttf | Bin 0 -> 49224 bytes 12 files changed, 376 insertions(+), 34 deletions(-) create mode 100644 ttf-bitstream-vera-1.10/COPYRIGHT.TXT create mode 100644 ttf-bitstream-vera-1.10/README.TXT create mode 100644 ttf-bitstream-vera-1.10/RELEASENOTES.TXT create mode 100644 ttf-bitstream-vera-1.10/VeraMoBI.ttf create mode 100644 ttf-bitstream-vera-1.10/VeraMoBd.ttf create mode 100644 ttf-bitstream-vera-1.10/VeraMoIt.ttf create mode 100644 ttf-bitstream-vera-1.10/VeraMono.ttf diff --git a/MMAppController.m b/MMAppController.m index cc28797b9d..cec158df21 100644 --- a/MMAppController.m +++ b/MMAppController.m @@ -34,6 +34,7 @@ - (void)openFile:(NSPasteboard *)pboard userData:(NSString *)userData @interface MMAppController (Private) - (MMVimController *)keyVimController; - (MMVimController *)topmostVimController; ++ (void)loadFonts; @end @interface NSMenu (MMExtras) @@ -67,6 +68,8 @@ + (void)initialize NSArray *types = [NSArray arrayWithObject:NSStringPboardType]; [NSApp registerServicesMenuSendTypes:types returnTypes:types]; + + [self loadFonts]; } - (id)init @@ -545,6 +548,28 @@ - (MMVimController *)topmostVimController return nil; } ++ (void)loadFonts +{ + // This loads all fonts from the Resources folder. + // (Code taken from cocoadev.com) + NSString *fontsFolder; + if (fontsFolder = [[NSBundle mainBundle] resourcePath]) { + NSURL *fontsURL; + if (fontsURL = [NSURL fileURLWithPath:fontsFolder]) { + FSRef fsRef; + FSSpec fsSpec; + CFURLGetFSRef((CFURLRef)fontsURL, &fsRef); + + if (FSGetCatalogInfo(&fsRef, kFSCatInfoNone, NULL, NULL, &fsSpec, + NULL) == noErr) { + ATSFontActivateFromFileSpecification(&fsSpec, + kATSFontContextGlobal, kATSFontFormatUnspecified, NULL, + kATSOptionFlagsDefault, NULL); + } + } + } +} + @end diff --git a/MMBackend.m b/MMBackend.m index 9459fda341..40f68a2506 100644 --- a/MMBackend.m +++ b/MMBackend.m @@ -21,6 +21,10 @@ static unsigned MMServerMax = 1000; //static NSTimeInterval MMEvaluateExpressionTimeout = 3; +// NOTE: The Bitstream Vera font is bundled with the application and loaded +// during initialization of MMAppController. +static NSString *MMDefaultFontName = @"Bitstream Vera Sans Mono"; +static float MMDefaultFontSize = 12.0f; // TODO: Move to separate file. static int eventModifierFlagsToVimModMask(int modifierFlags); @@ -757,8 +761,8 @@ - (void)setScrollbarThumbValue:(long)val size:(long)size max:(long)max - (BOOL)setFontWithName:(char *)name { - NSString *fontName; - float size = 0.0f; + NSString *fontName = MMDefaultFontName; + float size = MMDefaultFontSize; BOOL parseFailed = NO; if (name) { @@ -787,8 +791,6 @@ - (BOOL)setFontWithName:(char *)name } else if ([components count] > 2) { parseFailed = YES; } - } else { - fontName = [[NSFont userFixedPitchFontOfSize:0] displayName]; } if (!parseFailed && [fontName length] > 0) { diff --git a/MacVim.xcodeproj/project.pbxproj b/MacVim.xcodeproj/project.pbxproj index 8af061e6f2..a7251aebc0 100644 --- a/MacVim.xcodeproj/project.pbxproj +++ b/MacVim.xcodeproj/project.pbxproj @@ -35,6 +35,10 @@ 1DD704310BA9F9C2008679E9 /* SpecialKeys.plist in Resources */ = {isa = PBXBuildFile; fileRef = 1DD704300BA9F9C2008679E9 /* SpecialKeys.plist */; }; 1DD9F5E50C85D60500E8D5A5 /* SystemColors.plist in Resources */ = {isa = PBXBuildFile; fileRef = 1DD9F5E40C85D60500E8D5A5 /* SystemColors.plist */; }; 1DDBEB6D0C7434150036EEDD /* EmptyWindow.nib in Resources */ = {isa = PBXBuildFile; fileRef = 1DDBEB6B0C7434150036EEDD /* EmptyWindow.nib */; }; + 1DE5F2520CA5B0B8005A40E4 /* VeraMoBd.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 1DE5F24E0CA5B0B8005A40E4 /* VeraMoBd.ttf */; }; + 1DE5F2530CA5B0B8005A40E4 /* VeraMoBI.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 1DE5F24F0CA5B0B8005A40E4 /* VeraMoBI.ttf */; }; + 1DE5F2540CA5B0B8005A40E4 /* VeraMoIt.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 1DE5F2500CA5B0B8005A40E4 /* VeraMoIt.ttf */; }; + 1DE5F2550CA5B0B8005A40E4 /* VeraMono.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 1DE5F2510CA5B0B8005A40E4 /* VeraMono.ttf */; }; 1DE608B40C587FDA0055263D /* runtime in CopyFiles */ = {isa = PBXBuildFile; fileRef = 1DE602470C587FD10055263D /* runtime */; }; 1DE8CC620C5E2AAD003F56E3 /* Actions.plist in Resources */ = {isa = PBXBuildFile; fileRef = 1DE8CC610C5E2AAD003F56E3 /* Actions.plist */; }; 1DED78600C6DE43D0079945F /* vimrc in CopyFiles */ = {isa = PBXBuildFile; fileRef = 1DED785F0C6DE43D0079945F /* vimrc */; }; @@ -158,6 +162,10 @@ 1DD704300BA9F9C2008679E9 /* SpecialKeys.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = SpecialKeys.plist; sourceTree = ""; }; 1DD9F5E40C85D60500E8D5A5 /* SystemColors.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = SystemColors.plist; sourceTree = ""; }; 1DDBEB6C0C7434150036EEDD /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = English.lproj/EmptyWindow.nib; sourceTree = ""; }; + 1DE5F24E0CA5B0B8005A40E4 /* VeraMoBd.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = VeraMoBd.ttf; path = "ttf-bitstream-vera-1.10/VeraMoBd.ttf"; sourceTree = ""; }; + 1DE5F24F0CA5B0B8005A40E4 /* VeraMoBI.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = VeraMoBI.ttf; path = "ttf-bitstream-vera-1.10/VeraMoBI.ttf"; sourceTree = ""; }; + 1DE5F2500CA5B0B8005A40E4 /* VeraMoIt.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = VeraMoIt.ttf; path = "ttf-bitstream-vera-1.10/VeraMoIt.ttf"; sourceTree = ""; }; + 1DE5F2510CA5B0B8005A40E4 /* VeraMono.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = VeraMono.ttf; path = "ttf-bitstream-vera-1.10/VeraMono.ttf"; sourceTree = ""; }; 1DE602470C587FD10055263D /* runtime */ = {isa = PBXFileReference; lastKnownFileType = folder; name = runtime; path = ../../runtime; sourceTree = SOURCE_ROOT; }; 1DE8CC610C5E2AAD003F56E3 /* Actions.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = Actions.plist; sourceTree = ""; }; 1DED785F0C6DE43D0079945F /* vimrc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = vimrc; sourceTree = ""; }; @@ -344,6 +352,10 @@ 29B97317FDCFA39411CA2CEA /* Resources */ = { isa = PBXGroup; children = ( + 1DE5F24E0CA5B0B8005A40E4 /* VeraMoBd.ttf */, + 1DE5F24F0CA5B0B8005A40E4 /* VeraMoBI.ttf */, + 1DE5F2500CA5B0B8005A40E4 /* VeraMoIt.ttf */, + 1DE5F2510CA5B0B8005A40E4 /* VeraMono.ttf */, 1DD9F5E40C85D60500E8D5A5 /* SystemColors.plist */, 1DE8CC610C5E2AAD003F56E3 /* Actions.plist */, 1DD04DEB0C529C5E006CDC2B /* Credits.rtf */, @@ -471,6 +483,10 @@ 1DE8CC620C5E2AAD003F56E3 /* Actions.plist in Resources */, 1DDBEB6D0C7434150036EEDD /* EmptyWindow.nib in Resources */, 1DD9F5E50C85D60500E8D5A5 /* SystemColors.plist in Resources */, + 1DE5F2520CA5B0B8005A40E4 /* VeraMoBd.ttf in Resources */, + 1DE5F2530CA5B0B8005A40E4 /* VeraMoBI.ttf in Resources */, + 1DE5F2540CA5B0B8005A40E4 /* VeraMoIt.ttf in Resources */, + 1DE5F2550CA5B0B8005A40E4 /* VeraMono.ttf in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/MacVim.xcodeproj/winckler.mode1 b/MacVim.xcodeproj/winckler.mode1 index d134bd811e..5c10634098 100644 --- a/MacVim.xcodeproj/winckler.mode1 +++ b/MacVim.xcodeproj/winckler.mode1 @@ -368,9 +368,9 @@ TableOfContents - 1DD9F5E60C85D61F00E8D5A5 + 1D50F01D0CA5B246007DB9E5 1CE0B1FE06471DED0097A5F4 - 1DD9F5E70C85D61F00E8D5A5 + 1D50F01E0CA5B246007DB9E5 1CE0B20306471E060097A5F4 1CE0B20506471E060097A5F4 @@ -504,6 +504,8 @@ 5 WindowOrderList + 1C0AD2B3069F1EA900FABCE6 + 1D16B9EF0BA33E3800A69B33 /Users/winckler/Projects/vim7/src/MacVim/MacVim.xcodeproj WindowString @@ -528,7 +530,7 @@ PBXProjectModuleGUID 1CD0528F0623707200166675 PBXProjectModuleLabel - MMApplication.m + StatusBarVisibility @@ -586,7 +588,7 @@ TableOfContents 1D16B9EF0BA33E3800A69B33 - 1DD66EA90C802F9300EBDAB3 + 1D50F01F0CA5B246007DB9E5 1CD0528F0623707200166675 XCMainBuildResultsModuleGUID @@ -628,8 +630,8 @@ yes sizes - {{0, 0}, {378, 339}} - {{378, 0}, {646, 339}} + {{0, 0}, {376, 339}} + {{376, 0}, {648, 339}} VerticalSplitView @@ -692,14 +694,14 @@ TableOfContents 1CD10A99069EF8BA00B06720 - 1DD66EAA0C802F9300EBDAB3 + 1DDA37E50C9F02BF00CE9A67 1C162984064C10D400B95A72 - 1DD66EAB0C802F9300EBDAB3 - 1DD66EAC0C802F9300EBDAB3 - 1DD66EAD0C802F9300EBDAB3 - 1DD66EAE0C802F9300EBDAB3 - 1DD66EAF0C802F9300EBDAB3 - 1DD66EB00C802F9300EBDAB3 + 1DDA37E60C9F02BF00CE9A67 + 1DDA37E70C9F02BF00CE9A67 + 1DDA37E80C9F02BF00CE9A67 + 1DDA37E90C9F02BF00CE9A67 + 1DDA37EA0C9F02BF00CE9A67 + 1DDA37EB0C9F02BF00CE9A67 ToolbarConfiguration xcode.toolbar.config.debug @@ -863,7 +865,7 @@ TableOfContents 1DE444730BA4445100C4C77A - 1DD66EB10C802F9300EBDAB3 + 1DDA37EC0C9F02BF00CE9A67 1C78EAAC065D492600B07095 WindowString @@ -958,9 +960,9 @@ TableOfContents 1C0AD2B3069F1EA900FABCE6 - 1DD66EDD0C803D7000EBDAB3 + 1D50F0200CA5B246007DB9E5 1CD0528B0623707200166675 - 1DD66EDE0C803D7000EBDAB3 + 1D50F0210CA5B246007DB9E5 ToolbarConfiguration xcode.toolbar.config.run diff --git a/MacVim.xcodeproj/winckler.pbxuser b/MacVim.xcodeproj/winckler.pbxuser index d065e0b1a3..18d6f6becf 100644 --- a/MacVim.xcodeproj/winckler.pbxuser +++ b/MacVim.xcodeproj/winckler.pbxuser @@ -49,17 +49,17 @@ }; 1D1474AE0C5678370038FA2B /* MMTextView.m */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {781, 11504}}"; - sepNavSelRange = "{18031, 7}"; - sepNavVisRect = "{{0, 9245}, {781, 608}}"; + sepNavIntBoundsRect = "{{0, 0}, {795, 15040}}"; + sepNavSelRange = "{31183, 0}"; + sepNavVisRect = "{{0, 343}, {795, 162}}"; sepNavWindowFrame = "{{15, 4}, {820, 737}}"; }; }; 1D1474B40C56796D0038FA2B /* MMVimController.m */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {1637, 19840}}"; - sepNavSelRange = "{42712, 0}"; - sepNavVisRect = "{{0, 13527}, {795, 162}}"; + sepNavIntBoundsRect = "{{0, 0}, {1637, 20752}}"; + sepNavSelRange = "{7708, 0}"; + sepNavVisRect = "{{0, 4063}, {983, 274}}"; sepNavWindowFrame = "{{15, 4}, {820, 737}}"; }; }; @@ -222,7 +222,7 @@ delayBeforeContinue = 0; hitCount = 1; location = AppKit; - modificationTime = 209732042.802391; + modificationTime = 211747499.23789; state = 2; symbolName = "[NSView performKeyEquivalent:]"; }; @@ -235,7 +235,7 @@ delayBeforeContinue = 0; hitCount = 1; location = Foundation; - modificationTime = 209732047.262262; + modificationTime = 211747504.632111; state = 1; symbolName = "-[_NSZombie methodSignatureForSelector:]"; }; @@ -248,7 +248,7 @@ delayBeforeContinue = 0; hitCount = 1; location = Foundation; - modificationTime = 209732047.175895; + modificationTime = 211747504.576004; state = 1; symbolName = "[NSException raise]"; }; @@ -264,7 +264,7 @@ hitCount = 1; lineNumber = 594; location = MacVim; - modificationTime = 209732042.795645; + modificationTime = 211747499.23754; state = 2; }; 1DD66EB70C80301100EBDAB3 /* MMTextView.m:172 */ = { @@ -276,10 +276,10 @@ delayBeforeContinue = 0; fileReference = 1D1474AE0C5678370038FA2B /* MMTextView.m */; functionName = "-performKeyEquivalent:"; - hitCount = 3; + hitCount = 1; lineNumber = 172; location = MacVim; - modificationTime = 209732165.15915; + modificationTime = 211747499.237583; state = 2; }; 1DD66ECC0C803D3600EBDAB3 /* MMApplication.m */ = { @@ -438,8 +438,8 @@ PBXFileDataSource_Warnings_ColumnID, ); }; - PBXPerProjectTemplateStateSaveDate = 210097639; - PBXWorkspaceStateSaveDate = 210097639; + PBXPerProjectTemplateStateSaveDate = 212185620; + PBXWorkspaceStateSaveDate = 212185620; }; sourceControlManager = 1D16B9DD0BA33BB000A69B33 /* Source Control */; userBuildSettings = { diff --git a/ttf-bitstream-vera-1.10/COPYRIGHT.TXT b/ttf-bitstream-vera-1.10/COPYRIGHT.TXT new file mode 100644 index 0000000000..e651be1c4f --- /dev/null +++ b/ttf-bitstream-vera-1.10/COPYRIGHT.TXT @@ -0,0 +1,124 @@ +Bitstream Vera Fonts Copyright + +The fonts have a generous copyright, allowing derivative works (as +long as "Bitstream" or "Vera" are not in the names), and full +redistribution (so long as they are not *sold* by themselves). They +can be be bundled, redistributed and sold with any software. + +The fonts are distributed under the following copyright: + +Copyright +========= + +Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream +Vera is a trademark of Bitstream, Inc. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of the fonts accompanying this license ("Fonts") and associated +documentation files (the "Font Software"), to reproduce and distribute +the Font Software, including without limitation the rights to use, +copy, merge, publish, distribute, and/or sell copies of the Font +Software, and to permit persons to whom the Font Software is furnished +to do so, subject to the following conditions: + +The above copyright and trademark notices and this permission notice +shall be included in all copies of one or more of the Font Software +typefaces. + +The Font Software may be modified, altered, or added to, and in +particular the designs of glyphs or characters in the Fonts may be +modified and additional glyphs or characters may be added to the +Fonts, only if the fonts are renamed to names not containing either +the words "Bitstream" or the word "Vera". + +This License becomes null and void to the extent applicable to Fonts +or Font Software that has been modified and is distributed under the +"Bitstream Vera" names. + +The Font Software may be sold as part of a larger software package but +no copy of one or more of the Font Software typefaces may be sold by +itself. + +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL +BITSTREAM OR THE GNOME FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, +OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT +SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. + +Except as contained in this notice, the names of Gnome, the Gnome +Foundation, and Bitstream Inc., shall not be used in advertising or +otherwise to promote the sale, use or other dealings in this Font +Software without prior written authorization from the Gnome Foundation +or Bitstream Inc., respectively. For further information, contact: +fonts at gnome dot org. + +Copyright FAQ +============= + + 1. I don't understand the resale restriction... What gives? + + Bitstream is giving away these fonts, but wishes to ensure its + competitors can't just drop the fonts as is into a font sale system + and sell them as is. It seems fair that if Bitstream can't make money + from the Bitstream Vera fonts, their competitors should not be able to + do so either. You can sell the fonts as part of any software package, + however. + + 2. I want to package these fonts separately for distribution and + sale as part of a larger software package or system. Can I do so? + + Yes. A RPM or Debian package is a "larger software package" to begin + with, and you aren't selling them independently by themselves. + See 1. above. + + 3. Are derivative works allowed? + Yes! + + 4. Can I change or add to the font(s)? + Yes, but you must change the name(s) of the font(s). + + 5. Under what terms are derivative works allowed? + + You must change the name(s) of the fonts. This is to ensure the + quality of the fonts, both to protect Bitstream and Gnome. We want to + ensure that if an application has opened a font specifically of these + names, it gets what it expects (though of course, using fontconfig, + substitutions could still could have occurred during font + opening). You must include the Bitstream copyright. Additional + copyrights can be added, as per copyright law. Happy Font Hacking! + + 6. If I have improvements for Bitstream Vera, is it possible they might get + adopted in future versions? + + Yes. The contract between the Gnome Foundation and Bitstream has + provisions for working with Bitstream to ensure quality additions to + the Bitstream Vera font family. Please contact us if you have such + additions. Note, that in general, we will want such additions for the + entire family, not just a single font, and that you'll have to keep + both Gnome and Jim Lyles, Vera's designer, happy! To make sense to add + glyphs to the font, they must be stylistically in keeping with Vera's + design. Vera cannot become a "ransom note" font. Jim Lyles will be + providing a document describing the design elements used in Vera, as a + guide and aid for people interested in contributing to Vera. + + 7. I want to sell a software package that uses these fonts: Can I do so? + + Sure. Bundle the fonts with your software and sell your software + with the fonts. That is the intent of the copyright. + + 8. If applications have built the names "Bitstream Vera" into them, + can I override this somehow to use fonts of my choosing? + + This depends on exact details of the software. Most open source + systems and software (e.g., Gnome, KDE, etc.) are now converting to + use fontconfig (see www.fontconfig.org) to handle font configuration, + selection and substitution; it has provisions for overriding font + names and subsituting alternatives. An example is provided by the + supplied local.conf file, which chooses the family Bitstream Vera for + "sans", "serif" and "monospace". Other software (e.g., the XFree86 + core server) has other mechanisms for font substitution. + diff --git a/ttf-bitstream-vera-1.10/README.TXT b/ttf-bitstream-vera-1.10/README.TXT new file mode 100644 index 0000000000..0f71795a7c --- /dev/null +++ b/ttf-bitstream-vera-1.10/README.TXT @@ -0,0 +1,11 @@ +Contained herin is the Bitstream Vera font family. + +The Copyright information is found in the COPYRIGHT.TXT file (along +with being incoporated into the fonts themselves). + +The releases notes are found in the file "RELEASENOTES.TXT". + +We hope you enjoy Vera! + + Bitstream, Inc. + The Gnome Project diff --git a/ttf-bitstream-vera-1.10/RELEASENOTES.TXT b/ttf-bitstream-vera-1.10/RELEASENOTES.TXT new file mode 100644 index 0000000000..270bc0d409 --- /dev/null +++ b/ttf-bitstream-vera-1.10/RELEASENOTES.TXT @@ -0,0 +1,162 @@ +Bitstream Vera Fonts - April 16, 2003 +===================================== + +The version number of these fonts is 1.10 to distinguish them from the +beta test fonts. + +Note that the Vera copyright is incorporated in the fonts themselves. +The License field in the fonts contains the copyright license as it +appears below. The TrueType copyright field is not large enough to +contain the full license, so the license is incorporated (as you might +think if you thought about it) into the license field, which +unfortunately can be obscure to find. (In pfaedit, see: Element->Font +Info->TTFNames->License). + +Our apologies for it taking longer to complete the fonts than planned. +Beta testers requested a tighter line spacing (less leading) and Jim +Lyles redesigned Vera's accents to bring its line spacing to more +typical of other fonts. This took additional time and effort. Our +thanks to Jim for this effort above and beyond the call of duty. + +There are four monospace and sans faces (normal, oblique, bold, bold +oblique) and two serif faces (normal and bold). Fontconfig/Xft2 (see +www.fontconfig.org) can artificially oblique the serif faces for you: +this loses hinting and distorts the faces slightly, but is visibly +different than normal and bold, and reasonably pleasing. + +On systems with fontconfig 2.0 or 2.1 installed, making your sans, +serif and monospace fonts default to these fonts is very easy. Just +drop the file local.conf into your /etc/fonts directory. This will +make the Bitstream fonts your default fonts for all applications using +fontconfig (if sans, serif, or monospace names are used, as they often +are as default values in many desktops). The XML in local.conf may +need modification to enable subpixel decimation, if appropriate, +however, the commented out phrase does so for XFree86 4.3, in the case +that the server does not have sufficient information to identify the +use of a flat panel. Fontconfig 2.2 adds Vera to the list of font +families and will, by default use it as the default sans, serif and +monospace fonts. + +During the testing of the final Vera fonts, we learned that screen +fonts in general are only typically hinted to work correctly at +integer pixel sizes. Vera is coded internally for integer sizes only. +We need to investigate further to see if there are commonly used fonts +that are hinted to be rounded but are not rounded to integer sizes due +to oversights in their coding. + +Most fonts work best at 8 pixels and below if anti-aliased only, as +the amount of work required to hint well at smaller and smaller sizes +becomes astronomical. GASP tables are typically used to control +whether hinting is used or not, but Freetype/Xft does not currently +support GASP tables (which are present in Vera). + +To mitigate this problem, both for Vera and other fonts, there will be +(very shortly) a new fontconfig 2.2 release that will, by default not +apply hints if the size is below 8 pixels. if you should have a font +that in fact has been hinted more agressively, you can use fontconfig +to note this exception. We believe this should improve many hinted +fonts in addition to Vera, though implemeting GASP support is likely +the right long term solution. + +Font rendering in Gnome or KDE is the combination of algorithms in +Xft2 and Freetype, along with hinting in the fonts themselves. It is +vital to have sufficient information to disentangle problems that you +may observe. + +Note that having your font rendering system set up correctly is vital +to proper judgement of problems of the fonts: + + * Freetype may or may not be configured to in ways that may + implement execution of possibly patented (in some parts of the world) + TrueType hinting algorithms, particularly at small sizes. Best + results are obtained while using these algorithms. + + * The freetype autohinter (used when the possibly patented + algorithms are not used) continues to improve with each release. If + you are using the autohinter, please ensure you are using an up to + date version of freetype before reporting problems. + + * Please identify what version of freetype you are using in any + bug reports, and how your freetype is configured. + + * Make sure you are not using the freetype version included in + XFree86 4.3, as it has bugs that significantly degrade most fonts, + including Vera. if you build XFree86 4.3 from source yourself, you may + have installed this broken version without intending it (as I + did). Vera was verified with the recently released Freetype 2.1.4. On + many systems, 'ldd" can be used to see which freetype shared library + is actually being used. + + * Xft/X Render does not (yet) implement gamma correction. This + causes significant problems rendering white text on a black background + (causing partial pixels to be insufficiently shaded) if the gamma of + your monitor has not been compensated for, and minor problems with + black text on a while background. The program "xgamma" can be used to + set a gamma correction value in the X server's color pallette. Most + monitors have a gamma near 2. + + * Note that the Vera family uses minimal delta hinting. Your + results on other systems when not used anti-aliased may not be + entirely satisfying. We are primarily interested in reports of + problems on open source systems implementing Xft2/fontconfig/freetype + (which implements antialiasing and hinting adjustements, and + sophisticated subpixel decimation on flatpanels). Also, the + algorithms used by Xft2 adjust the hints to integer widths and the + results are crisper on open source systems than on Windows or + MacIntosh. + + * Your fontconfig may (probably does) predate the release of + fontconfig 2.2, and you may see artifacts not present when the font is + used at very small sizes with hinting enabled. "vc-list -V" can be + used to see what version you have installed. + +We believe and hope that these fonts will resolve the problems +reported during beta test. The largest change is the reduction of +leading (interline spacing), which had annoyed a number of people, and +reduced Vera's utility for some applcations. The Vera monospace font +should also now make '0' and 'O' and '1' and 'l' more clearly +distinguishable. + +The version of these fonts is version 1.10. Fontconfig should be +choosing the new version of the fonts if both the released fonts and +beta test fonts are installed (though please discard them: they have +names of form tt20[1-12]gn.ttf). Note that older versions of +fontconfig sometimes did not rebuild their cache correctly when new +fonts are installed: please upgrade to fontconfig 2.2. "fc-cache -f" +can be used to force rebuilding fontconfig's cache files. + +If you note problems, please send them to fonts at gnome dot org, with +exactly which face and size and unicode point you observe the problem +at. The xfd utility from XFree86 CVS may be useful for this (e.g. "xfd +-fa sans"). A possibly more useful program to examine fonts at a +variety of sizes is the "waterfall" program found in Keith Packard's +CVS. + + $ cvs -d :pserver:anoncvs@keithp.com:/local/src/CVS login + Logging in to :pserver:anoncvs@keithp.com:2401/local/src/CVS + CVS password: + $ cvs -d :pserver:anoncvs@keithp.com:/local/src/CVS co waterfall + $ cd waterfall + $ xmkmf -a + $ make + # make install + # make install.man + +Again, please make sure you are running an up-to-date freetype, and +that you are only examining integer sizes. + +Reporting Problems +================== + +Please send problem reports to fonts at gnome org, with the following +information: + + 1. Version of Freetype, Xft2 and fontconfig + 2. Whether TT hinting is being used, or the autohinter + 3. Application being used + 4. Character/Unicode code point that has problems (if applicable) + 5. Version of which operating system + 6. Please include a screenshot, when possible. + +Please check the fonts list archives before reporting problems to cut +down on duplication. diff --git a/ttf-bitstream-vera-1.10/VeraMoBI.ttf b/ttf-bitstream-vera-1.10/VeraMoBI.ttf new file mode 100644 index 0000000000000000000000000000000000000000..8624542ed208db88b2d1e99bcce1e1acc7e6c28b GIT binary patch literal 55032 zcmcG%34B!5-8X*DJ@?+(GixS$GLvMo?<;{oCLtjSSxG_&Ad-*-637Bc01;8CBDILP zv}oN*eJG{Y$5I~`sus1P*1GWch~=SZEfuxCMYO!s$6|8%f6u)$S-`f>=lMTxhMBo@ z@44svw)5N0?_3BagxK&Q64KO~o%iG|Uv4Ahh4*l_y?K6pTlbIR))Dez0e%;C4|c8J z|I(lK5%NS0A*`c&)0k)fyl*=RiOV5`7Oh^tX7H0me>qA>!dGa&YfabadZNRN{Pqd_ zHm@1jvih!{cJ>jHcrzh;e%04Ac+IQ%`SZ~K03o3@eZ5^hC+~^`=hu9?e9f<&rsK3 z?|o0!X96}eA+d?;heyZKQhxL|LZ1Ckw0~&*NbmaNKmWn^(G)PT+i{PZh7e8>{x=(M z?U<5q{L+pEVkWJDV@7@XZ7$92-MZxJv_J`&3S{dKJ-4&-`zU| zBBaDG;4R`)(OHkDYjkwDyT1$Ld3uJsHxBj=jdhK2cvklh^p1K`c#rB0p4Q>jW1G81 zdgD`7NFdK6!#x|jd)01w`oXFGRU5~8RT%gPlQ(2|`iHs)Hui8xHusP94R0I+FoXSp zf%ph2??*X;8%KdCM<>HG*sEf_ej}JT+Lz&(8Y6>`nLRw>8SRBgpmje$4WNJ7&>Tl} z3z}iT0O{0$Hunt=UI{B_!|IJALl_Vg!Hqq`p3&h9&*;WgYkRxL_!*7H0|UdGIYQmT zLp}YRV574+L)(B%*Q()7y($ixNUI=B3c}Fv7#INtalklVRM0dT(5`t#`?`SEs@?$I z07(Ckho73lba)7oG2$5<9#JKP!!!eN&)Amry{o%0P*xDEnb!xqw(t=KhkN>0_j6(E z8W@B4;Q-xs_4KINt90grukRWG)Efu7MpX2BdPn=$V4{KK(6j6Na5SPyX;(Ko8Rd5b zAsY2uHj*ZFJsQ!v2EMt2z&$}Yrg{T-Ljzkp{WC-zG#KgS3RvYBKN$6Zl$(zkYJUr4f>WQD6uJIgr4lcjoiRWq|K0q{Zr#>)iR`p^&@qRag51eSl;lzFIqv?szX6> zL0$I_tk!5(Q{`FE)Y#@}ZCcQ_q`aldQ`_okZfR<-t*ol_#Fw|?cYKCtNo`wA)8aM{ zTC|imwk`EEE%1~#F7?#aHdbbMsydoms#;q;O)Z|Q-S*$ zo7z0}wGFjx=(Md#y*1EPZ58fY;AyC8nO}pR%PVT@YulD)cox*QHS#_epwn_sb9qZ! z?fk{{2+s z)llA2m%$-yYOASg@u*F*044hHRJHS)TWiYe>pc~^%Eeo1j_Mmz6zO&ek0K3 z{j@c;fFJ=-mejUZWq8V4YFjx+7PK@0T+UD2!Esy+dZKA*At|Jrq~bddzGn`}$I&XZ@Q@0$ z86%^3kC0x{MFvR*&eoD4w9mp(IT^sqLs};L8dZPw;+|gIvk9L)XnAEn9@4J1=tBEe z^gM(+Jfs1z4dKm49!AeSIBEhc1L%JP*@!z@@E*XsOC7;Oa?yJ(V7_vMVE@71gMDXC z_RV|#-=l_w82{V!;BBvjcsfn`ReEshaN2i)61|{)7mnBA+%Q?K(&!&?hmXPE&A4*} z_wpV`@yRLdQGa>BeSWPs!0k2aNJAKrbB%L)wR*L8a>Q=j!C_c~7X12{$}7%2E-mZT z-bMo>45QaEwC=}M{$7I?9G`An=kgcCVoZgCkHsP5(#G3$tL+BSQtLg~18=R-hRZ}Z zM&y#iAxt6hWWi(~@v1!Yd$|m8Y2k2nIaQBq7UA8aEu@h zSB}7Y=XB@>WE;_MkS3dP#P1$f`|_x>h4XtRM#284<~_$vo#Ypw>USpKD64VKf{#1f2GKP6ss`ho8?oK2J4Wr$Ng#E!VX{-cQN1Hut!^@%gUN zdLw$_zoxL__i`<}1~izG@-=A3G3pDP<97sgDaTNQgtynIdpV8xm4A%W6vs6TrX-DH z>H$3eT?l55b2&YxFb&dwRGkx?=X?Z?!E`S3*)XNmIki11&4)lYu3v(5_Mnw^hU2P9 zr8WyR&CKb--`tAy;z*;=bjoj5<*Y}gaQrt|*Ld8i@i<7`;2m7A2fc-O_!HCTrDkjD zG2(Pv!{v(4X^w#gFP8*P=it2Cgsc72unUgaORiD5&9UOG*W;yGGCupc#o-j@+GdKr zLAZlwuCxpqSGfJ+Hl15LP4>B6bSu=^%G&iS$tcXN53PUUZ+?3CZaX*|Wp znUv(1{UZ!!${p9Wn*XO^6P$HHyTLsPZSHYjghR;hm~M}?nc5A1sS8rWN7rnvCS6k+ zHrV6;3$1netewJ2^RKxaYxZ&V47sZzRVuZbNF!;(Q7gRQ1vpv)53@zRR*Q2U_;xM0 z(hiTj5@#!MCLS&L6@EQlotaB;+(v59Zn4^z)<+B4@xGU$E$^HA@{Q`RI<#*@UtIH5 zkq&i?D)h#CZNhlG?*^Q$$2T97x8rxr$C<_W&5x^bt|BmABktlj@b(ROw*??=!}+OE zXF|n$*2d$IHQ-kZ`mYJVT#mkL)&4mAeEbD!zm4i${JsSNNXv2DjJsMeYAt$LjJx`(wN5>&(U8-GbD6_3)eDcQ_}Cg8oc`^B{YcRY$18*#?}` z`qg^%04k0Nhg+k@V*IW|OHK!lA@74<<6PnNte`wG^mjC`#C0@B2&^Z z9g|>hGr99k(h(ei_r>|fDOInI(hAB}fma+Z?F_%4%N3XW`M_XG;xxJE^bWSwsKEKt zsB(4@_^fe6>(8T7VG0Z0*AkTzQ~c04z#-(6;3EcUHpP8DCWko)50_>xWkEhnQH9Sx zE@ONoE(QD-AA!#iE@PZa{915+YGVZXxLCb6*ekzpru1_upqP4|R@-iYQ+YOxZx zj~e{kL*hQW<`Z(?PxDeVUxRz)T9nPB0WDGuMln1(}&H zecacct=>D`FXes{_t-U=(lP`593N*5#^hPDF+ek$WaG72ePzL)(CqhAb}UOBX^m zW`x8@@5(MfF-$I!cIqG(#RT#q`Bdm(SFs1ENNcD_j)?RBQ*7n<^ zZz=3sFNoW3TqBgn(M!$GN61zT+ZBy8Fp=|55)zVglZ9RPHZT}_l z+AZbMwbg7(IlE?ao^;JRwmFY&QrJd?ja_7;7ukryHaOUN9~%y50}5NW)*`L7uznls zzftU4)b55+(na5UM zZIxC=u&b?X1x~C0Pt0ujvS+2`3R|{xg|zHhw(Lf6X@^f*x`HkBiyc0;L}Be{+P;k~ zM%Rn;SQ~z|C9~ERr_|cRTAXarUe?^hnp#-{t~BJadbF$0V|C$dAx3EGxfJ^w0H4{uRvc7t7YMdH6B! zSvJ?lO3_ygs;va}wSs<0G=B_}zhdJQiwXE@!yps$)*UAvwdD!(Jdc z<}o{d*$bGhj#+VJ-OECXnWdPSZOp`CC6mACA~PEDB;!S9z;#0&)9X4U{Whkg86Mjq!B^XJ$iJw= z^XsMF%#6!^dTct+A<}%vvc+@w(xv7OF-lr`NQyqheELJ8FX8mxyLdV?qprEbbLhUR z%0RDGos~G(+JOP^kDtb9Rh1~u5lEl1SL~Da6NYM`NWWRUm&o^0y;LlSB>U*`v$@1} z{Os|wIZnIR?(^EceIgkjWl`fFDSLGxU!5P3Q=vUuP{VTrv?U`3vcjLG*9iuh8AOA` zMA0BHMi|ArKu5$9K`>CABuscfduf$Q3OR~?rcQgmk>ZH$f zwyC#0tYm3C^)fHsEWt@{rN(0AOXzyz4Xa=E(kSI4>D`G9%Kfw#Sbf4CVV|fFajZ-d z6mp542(qZR9e?Ba8^G#9=^J@D6j<>W`{WYgFZA%Pkj~#kxO4)QP8Xyjz$%V3`tzeq zB*q|xIjs>EK_`aV<6>i?qaq{1+@UU~!)~*NSj;AaUKikQtj8Gc!B~JA7?mE)J6?(b z1D`oGf#o~#FQ4V>aENz;Q+*fbI}`90zIc7%>yE46y!!pCzbN`k4c=G(e&w5Ze^Ge8 z2Jfrc2IUk~=XdBPi0;i8X* zxqOK!`qH>qmou!?8yk{svqqUb8F3+c9VN0DW{Wa;Gs0uDQ&J_9=t~qcOi?*1&0YYH z!oVPvO<^T=exRauH1F*3qqbMh<^A>*oI;x%%8H5#3zC>qmP1``;Fgq>>~y=s@LgC? zR9u{|!w(%!GB>Cv>V%zhT2__pEv#uRh}>PW_=&FkrH?PEeDHxwujlN}uD+{2uXN8M z|Dz8pfBU`QQjVEcRu;^odDLxKR+(1v^<6Ym$jYGd+zOE{OWA+j&p*?D_L&$RaWOeV zQht?n@LPvJw-O1~k%%wBj+;mriGo$lC++^ssPL4y2y>*vkWv=sC^MML*u1!`GG9bw zZhTa@m86T&xng{%C|kvNQeZoN^z3_QZRdV}j+21Df&RI-zQhR|Kc!NnB*$4$l%EH* z&B`xDN9xyqqObqrmYbh@ z?&e#5LFdkDYAl((s736!h2x>mFU}t%5(Tx=yS0|;spOz#3*>ugosB%VuM zIqXkSQX;}BgZOiW@rJ4{1gHv4O+b6m7UjHHEITmAV*D1FREOw{vV|~a46z*_KdR|7 z+c@qN1iQ--mXIVA+E8Fv{OSLhRdTwenKDXchw|%*A1SByC~qEklrH=sjTaVBFKQAu zDCb$b+IO5kgvf!ujnJg%{OH+$w&cA#9Wcg1a=zOUirzP^K_Q5oci|A z`~yE#o_bjM{lqiM2Y{Sx5lX~1$c3FO^rzS?CL)>*I#CeyOtPDeG^E0zHyfEjwnKLd z#44H$7TIAt4o&tR-kASjHKz(cbCjRJ?;I*gI-fnkE+zYX#gaYW?i1UTr|80Z<%vg? zC+jJ`>uKGiv|fDiUmx3jSUE^L4)1>KUw1!6JCuV@0jdi4^1H=@n57AR8!^xtNyp4E zMUvhqoB8PDrAN6*QV%#kLcJKyTj;e5AJE5?md})CdPqE|w4CDy=jdbT^KIp{a2CG0 zL<;=jFujr>OGJW;FBLFSD^pQ|;)4}B`T}|eHK$Au#8ovp6z1k}I=e_Yf8tR(to%jU zPH*5eyg;90`-BgmZCy_bL=<4oxUg`=fUg|YSfvXaXHDEDe4xC~<>e}v+%EtNBia5? zLFSfGhPEyswE|oM?fx^i7r16Qt4$is00u1I!?baM@;E@a6Qh$$6=J?><0Acr0s*qh z0m#;dhqM9@+=hsVwS6%D$otZ}e;dTO%b*W7gYU3runXt?Zf3A9OblO`S&>+kBa={l ztXWTzq4F`Y&)VJsCTA`{=^cM7$NwwDX^51vS+B{tFhB9NBsgn6czvP$wI={Zku$VQA%~G@6tZUXUHVl(tx=vWf)`{!%>kR9R z!=^oC58Wl~V!Om$`dx-y#yzHcgnQUM;vM20(jD?0x_k6@=t7&dRrHs-}B;0;nTvJ z+JgMr>hTQ&YrF5ISKTnOuCMod%6|ISca_>7+wSjVy(B;nHM@M$U-4J!fllZixjBa7Qqa9H;V*3XH^}~l{`!! z7uySX@pF!#*8fb^`qF2b3>W)~ib;UnQ0=Ozq&m7v=+7Uo%cY_DSJS)Jcenieru@O* z_P%&tnVmvKWqkartQNZJ`!$Q^%%-N4v?F`}rfiJ|{HGz!oq#`uH25>zq(Si1$JHe? zM4Rg^b%q98MRb*r>cPwsQ<>Sq;@onQF+w&v<5D@~9Ci-3s>qH)%(^mGTfF>7xBic-i&r#5FRRc@Vfg)*S5YoRMhuk#~WY%^2fK_to%axWc5ea7IhvQ zxbNZZ0&)VwixAz3-MZg1)4p11?N=!8TFuqMO) zQfgrq95ZGy>GTG@QD-pd34AnB5(S+ki3Nn2bPFZQN(?3=oN&pkI-dq8a@dFW&IAz4 zK6AYEY+jHVT$|{pxz&0YVd*t+hI*Y|)e*(FlZi?U-S|CP`1t&^~aF4{#o#QnOef(DQOSw?Awx( z#OdF8=>zdjWKK-*4rlpeovguaXo$Ado9k>1K1foE6TY;WZ~=--QKKU65_4T25S`z0 z!BG{7=JZj`iO~hY4QQ1j?%=S5i2($i^ufIM?@4M&QJ7c*f8HC)t20q9n z-ybIF1ST*Ygrq9nGKGL*sA0lbD|ucMiNa{Vv0&Lg~}$YH()!C zgNxiNRw<-0mHUY~PsOFirNyN)u89La9;On_qJ;%S)dsRImSUQz)GBfY-Dj|u8P_de zfBW$A!QINizI8PD-6u~!zIX6i<;3Uz@yRQHSYF+`{i@chw$b-H*4(qHz3(3Sbky#l zr>XeL55D_GM9fdNzNegf^@*Q+PK#?-T(hES>2;jv#g|Sa`u#$U2nzhsy0``-ttWM2 zLxj->^$}5(qKl3&1C z=HA4zU~8R$~}&olFHqrRmLecy#7+z~^~8k2wjD>#Nr#xI^!y7zv2M=bkc zNAIui>R9(1K#Y7PVfA7%c%y^mNS*Q_;3A7UNft$2fq>-&u~wEP0nQsGW|8U;_nx_M z<^?qxJv%-_2Bs_rcUbs~DzvdidAv;ZHpFD*ZskdM90GYnIjxQ@AE3^ z^tEtjYUM_wp6U!#<{>v?`=e)$pLs!bh|Z3`VLLb7QU&KTbS-p`mu{ww+{3!}Id$-$ zpT%BP?&eb7K?cPwJUc<+{5GgSN+gB}FOU$?qO*;k&EuRo{sx>-gAhs!skmkQBNp}b z2cnlfq{1E-Ia8m9D?hDDV;) zZE+){k0CnU>8}%+BumjTv2h+L%F9&taR(9llogn4MsJ)!7L75YbB;?Swo+GE1rcH* zy>TW3at;DDxQN9X2@f#R$>MEC;V68}12C8YKJDN7@|AP8H`RztwbauY!36-!;9r`8 zrQYJAqB4O;tuySO6%GPjrsZ8alrLi)9V^!9?_5~5^v$ut)xYig(JQMq_Uo^Y=D8Sp z=Y5@f8dvD9pI-uj44=$ZoUKHPyMxkrVNSD7LGbgnyGE5FJ z6S*mjG@0$q8L3SC9bzJSDYP-=qFV3N4U7)(K(8Ar&dv0bzJIz-?+2mPe^c> zO@hT}cO=;Cg4JMmI1&mXNSo2n<|v_U#@2YFL64~{o9xbb(Gd|M>7zsRZU;$7v>m@N z>7l7w>x}B21u)PAc2aD)^adP+$K$M&u6QEO5*H$@piJ}95=`*qRdM!t)!d9~Vr1^= zd+F}>mmj!$?QmP=%Uia#FH`F1AKy7~MtEt_8omfQpz`4VPv93ttcxW#0CbUU*xw$699n~^>7#My{7!eNy? zJfwmR=5jjeYv$0pL&mm_UlI@Tqbm>bTzX-ay?EAA9}hx=Nhu6tS@^9y&qP z-gW={S}tE-fp5DZUnUZXjBUD_w3Kwz9vNvingj!}N16*rySaq6N0_+#Y>6=I9X2zG zj8gdmG&D;R@Fu1+Vrl&2aR!wIx;TA+1%U{QdOaeaPa#m1VuDvNKhwGXzVw3fZQGS! z(m6DSMn*;Z`f9FLE}l}J5?>!L>*!cZeb?W7BQ<{c)smMt-18q*S2cr7$fApK08JHgagUWV<>&QEVc_J#&)@tm>^+1DN77c(u^XBaP$ns1u9V!s7XZ_$TV{u z=!HY1Swegs8DB{~Y=8d54urV56ED^aTU9^u2z<#c+%jbYnhSu&K$<~GyIv>Rbx48Z zfZFwXT>(HL?fMd-6&hWgm^wJ}2Aygg1CVf!_nQC-fry6Ic>S@_2=~c$ki)g7^dy#}e9oanr>z*_W6QZ<9!L zk~P{PCv$rT2a(eyAe_o^EvFd-i%&7lKm;TiU+3xPD0F^^$>Hvsd+N5 zA+6vHb3%GlhbD?957P}pG+B9HIk{cAW4i)iCtejwE~X3jPGI9Rh2KfUr&J6U`jaHP z(PR|uCX*3~sdfro-mWvipc}PS1xYZO^hPeg$N_L8u1!I}nl}lo#vx66b4Z-jn9sK4 zD<__#sRiTT&Znu*iEpa`b-pr=WWbxC;#tVfcEI2wE&g=9-DEaNvLNd0X0xfl3@ZkW zCbm2D?Zy&ERVb$$l|s!X5(?82h@Arw8?-_YkV$Fbd4FzI0Sb3%bgG~1DsTMxnz0R0 z-&O7@5ca(4ZJ9s+sSU%wZKNHYD+g{9&Qo#R_{gKh#j^@Qqf6%qkvdcwZT43n5(a0{ z4c3;p*TapW#%H}jz?Vd@T9+UgFO+m^$GSyY8!A(ntb@Xreq+&Z`3ZLk}WD-67h z4r&uZnN19nY?4iO>1?_%y-n{jxQxj>wa8M@a1NWLcdZ~RxBz>3_7w&^;S<`GOH*l| z^1;Ms%BfS?pCElUu|e2#FWii{sxx6B+dnLbH9EGPTpM1(z~JI!>}W!*>AVDC$sk0isY&^;_#Xs;c05bqG@l~ z5`Q}OoY4ZIfE9{`A^FyPTaG=)k>kv9<%H(AbHZ{wIo_Q3oP?aj9A9WK66bb#QdiHT z#q%hI7px{hLxX8i*3-ObPEVpcJuD^`N8P@#Ojk_o_{pBd4Hq9c@!_hr#;+eZ`A0T> z%{A3k$=k0QeYNhIP1RKyH?@wws(5})@4N4|d&bZGM(Mt1_q`Lq$_8#d18(Vwo2>KC z(Y!~4Tk{?b26w34;I`WA4yP32vbzoL0@~&zZHAK2P?zdA8l48oVKESQ7-txFuT-UY zVOmm@t0GN#Ye)Em;07JTpg#z`l)$_~YTKT>?(Ey9+)4MJ{jb{Djeq*Z{z2uW_`b4m z=g#E~Up@V^kv~){Uo?Tz9B@SWMCC{*$t2hLqg|m+UwbHtXg8t=G%GaTWueY^x5EN*tQs_7EmD55GK5~E31>bC+f01fkO)^77D~hNk z5hC375KDB75EW_qGBo{cG7AH=K#@NL%^S$kn z#>IyDmUg)!vMR+Dmh2#jHlrcY8fLSyX$eLyHj{1{^3y z3coRMlwtzX@bFVo4JpPHQ;DI(SYoO*)Ea9|OASknOHF--K4YJ0i(!j#i^-8<1aVeq zsW?z2;KGHv;siA#rzXB*1CdlRz4*d)bUvkPURqvK`PA^H?;h5T-L(@=>A9hguA9?! zeBF+F7gP!NHt)UuJsO^xs(d)FY(qy|E6Xo`ddJ7gxq?EPyJ+#oo_Wh-Ks7w2M$$um zbYz=9j&N^Yr+V_T&@Pq`olKa7xRU2tC^A_Wjw3Z3@PDrKez<>HcgWhdyzY>Vf7tnl zgMT<+y=ZXpW$`0`zDkut|%mi=0 z0+dl?)IT@GZnas>)MT;SY*y7nlMK@=y@g>Z*4XZ@3ZW%fSB?m=0D1|x=ydjoXeb2R z3opQf)AAPF;e>h!T9_$0hA+Uimg*AlESXCeC@6qKHR(>FrlRsNO@5W?u4)_D9`Pzo z{zXD_S^d9nJ9XA1B(ulHv51r%+Oq80>)2Q0El>QSY+>UoPp9>8|MPXwJrfwo$mbZoo zo(FS*Aj+iUUW*3JG>0Xa%$VlF@xvf^kB7q{SmC!v2(c_pNJC}iEMXR#CFxh77Ki3@ zZ^O%|caJhaZRgDJHe@AVId4{er69ul`mpfw#2m5aVmh;pe*s@(1F$IrHYT#sUpD2B z0(7{d0NrE&hI*YI7*6@E1$y|U2DyY0ljfHaEVPSoOD7XGQ(ox|;%e$_IyPPoD@C+{ zPcd70|JTZT<(I;0#*6^W zdYMPB5*#KTyK?tPhF^rW9ikU?1|EDI4a_`vM4A$s?g&i>PxIaohTKVg&(iy8#l+50 z<!W+t+c%5cd76ha~> zpz=W;Kh0*#CbmiMUKmeM#xJn`brj+OyRVTg%Dws}T5%Ev>kUn`H zGvlT6^hq88(M$zV5SKBc#2`JvGwjwU$r3o#LN>3UIes>WhI$Ldw-L*nI&uUp>8N;) zb;_&JG8@%4NN{Qe6uj{pIi&880h&BS)!O2v7tphamtRegQ70hS^Y$ysNqM#MZOR`* zMzW!wH;P-~`=?QYS|@^PLo24Bj>>wg$!HA`Y!-Z*tvtjI_qr`6*+^EnY5Y~O zD}2jsRqmB0qbVgk%!~>}i#y62?_^Qd6lQg%Yfc;#HvaLfI`=}(1TuM8+0y7e%@^T{ zds2O?J_y1kGZ3?#WM}>ffsXs4Y_15zfHid3-?+Crcy^rjp`waU+ z_qq3lh1dieqN!_y1LOcbU^ozZzK`= zi^?|bi=o9^mG>j&|Lf2_Kc~gi_aYJ;tGil`ZOY#8+VYcs2oW58gJmtxJUTeBeOp7r z&%Sr!!(7>9E-5XUbul^l-n*0626(U=l4?Re^a=k$Xn10M8phgmhv2j9-*&1RE zaXJK-9Vcv7d=%JSve`o9QWq(Wsd6p1R$D9~HiO-4W!5mOI|S)d%?0H22j$PINr!JF zdcbHx+%@v6pOeAr499?HUR82?h$ld9U!GPCg7pBm6&l6MW=23l$M6qY7moaB*`8G8 z6wRi-&1DBx-u2VD#Z~{Yarln6Y1D6e*DHU1rEjxvOmkP|TRb+&Pn4MO$jLM2>$>K9-Z69Mr!}bbK7xREy z#Q}Z|z>ieHM-&kRpL049Rc6y2I4x!TT*JS#{!zI^hiS^HN9qgbe!KCJcdxx}!4H=E zyxy-)(7E)s)O6*->{(yEa^v*{1>j``_jmp-FK4iC24f4%F~n|_!AP*PDrUK*+N$xA zfstS*czG7lHFtQ_#i?)Nr8axGnw`!??O5gI6*K7@cuC_q7xPt)!efHs3(SK+SSxH9 z-q%_?^5bQ9ZlgXVbKZ}u_z`$HZx(pD{%*Eg`3TIUp`4k*j=!Bf(AoXok?oYO+kO}7 zzXVbb`rIUL!*d3c$Yy^+bSH`FaYS&2I=T}|&0uJ9QjC+i9nr)C)U8^c^(;p_m}w1g z_8jMI03+amoGOF`kwZ`ggdMXUvmLV^a~yLXa~+F07JDr2nCDoMiL6i;3KDtkWI#-1 zofk2mmT-mW2Ie|Dz4EQ0uN0-Dx$RH4yghCSnJ_R$Z@FpUKUW+S+3KY|x2F`RrG0j0 zH`RBo9{l2!%uTKKSZjChyg9TlB+9&a)h1LGQ^K<=7a$Q%@)Q4D$toLV(Q1?_-iXoR z@mh^Wxqz5#I@UvNJt5Tw+AG;@A$$!1cHC%%|K`#`0n083_!+KAC!Gnb+?_+6O3<%V z{a%&%0aF`DJG)fx9eZa2-g{t11l1{shbw@T@2?413Y}L6@4)FT_JT%ps16G$tiwh- z(v^dcDW@J&K2N81TiW5zzexYMe75*#{ps=T?1s~g@7#U5m~+{obchGU8=%qB$$$8- zLLy0K)^u|^@_B;QoE{y8Rakt7g$wQotJ$2Mh9Ai(LQ*PkR1g_MQq$xJ%m`Zr5IrAf=vdabKtGSV38k5k2Tr@@-;$>6h|%Z9p0bd(zxZQ=(jj-l>?24-r0Xh&0@ zn)5DrGXT3r?fV;}HT~F>Tk$DkiQ*iticuvv&MRL&}& zuX<`pQQeQ0Y}*|cRdj#ngTH92UGUo4zMY{7)b}MdJliv@{MRp54?nE@`IFcfYRJso zc-@ZH#cw~pi$)Ht85>%|D?aByqBt(VZ~Try_|J(H;gQI~sM&M(?3~!et;tnucHIyQuNh?zpj)xL9lnl* z-0d$kT9LQ6K>SR4D@F8dCo2w=`rLJ%ZL}MpPZ5%2o*A3d}l8IUS}P*Sbiu6bhA((Sh`FA)OB1gaG9U>YJ~e z59O}&d*#)kP6ywBVIZ=>rVmAgZF6CL;^>(yIKfk@R;vn_WWUCH)x?17>Vz@y zwb)Qq#e|a3DHSu**l3m)mm#NU7Qpxk8{$lXD`aF*6X0X3%N|fVpn>qdcW(Bahi_2c z%>1Nhb;JSXM7q!j|Dl5V(to@sYfi!Gbvs$x>DOsH*Rn`tOAgiU-tDiPiX5k+H6zNc z3|4K$!-{a-L_rsqP+I|u@>c&>>58$mnm0IR0!ryr49Ie z3RyL(R^v85_M13~6TCEALg1AHZf60p%C;UywcMlEJ9T_7jahQZSg_SGC$|$Xz$$Py z2BdVHr%Hkd@R=KA9%oX}4yb7#0DrkL@EdNm-D1Tm&42OK zXz9mamY&Pw6q_PcP|W#vfM|h3mD3@?xMW7k3iFuzrk;;b~lAJg*QbsMK(n>MK{GX#Wuw?d78XU@l6R$ ziA}zyq^9Jil&RYAW<#@aW!TE_l@Ti=S4ORjUKz78c4gd3&r0vg_>~DO6Ic3HCap|f znX)5phi8X(XZ+2HH~Vf*x;eRi1)X$(u;*w>-OfDD*Qu?T;JLB>ssWSrw$FDN^$GDg zCGK5c?A99+Gec&bVaN=+%Z-=Qt5Fb@98<=tWg|CUC#lbKh3&fImWf?r=fQyK zLj4`Q<}L7=`A#ga-)<-kWu?~Tp;h6;>X5DGa5c`>65d$JQj0_bUc976HCo{>Ygw^) z>w&J;Ee9rK+CWVw&MW_>{Po0n;nBfO$`^00-9qg}w1VFGm)|PCRM!6m*5#DaF5U_L zI1!mX;%|tH64S1+KS8!#j(SQQUNQ{Pgo1oOE@9&D+R=5mm-;~)E-%?Uv96W zt68sydSXOW!-rW-%q?6NoZ8N)u3Mn|HK?iraZF(Tag95TZR#Za=1L&GL=mKTU~@w8 zv>26c-3qTEllr{X`&Zokh!(rt@%r!&5v2Zj*|CY8vhm=mu2a9%HKGHCYO_827wBsNIh{;5CmjduCHRNX)h=eh9y=K28w_#lTn^3 ztDK?VL=~=!G+JCvA6y9-p{bM!6w>AKIxPl$oHJcj-L$xmwI?ICdq;VHRE^W;&06s9 zW5aj8KD@7u2k~sr+kg8~XkOW)1$N)MbK59_zMc(g(8p)>ebDo-Lu%|;nJCo3=ITXQ zS=nmPTg*a;3ExI5D)S3Wc9f$MJ1Y%YZs^q^=Y+ZvgWbT(rjDNpBrY*?d6f+`^<^?K zsghNM?c51*s8-j3T>$}qDhtjyR`}seXu=RC?#@W8*N^e87!QD4HmS2oWZ&S2T; zsfUhDjEkL*b@s=iyo9Pdeii_OWb&N9R0TRNR&Nk=#@M*n0;4H5PNbooF4{@LOI>w# z5#g&3LY`uZ3Wg*7)g5Qo-CJYKkXAl%Q9ktx2h$)A^LmoVcRHTlVoRX zU^xoA7!m67%6f4@Ufp9Wt{$r0zVOCP%4dJ=JJy}weq_ba*10=6t{tJaKdyL2oU0TT zEtr#8>xNH5vV{x2r`@#7;rH2ri9PrQ6%E)B1WOYTj zL~DeL;*G+-2v>pRGKI1p5=MJXJ(e(cWJGwVi*E+znQKZy1iL-brdI60jp2!_3#CWT z=FQaJff*2#cvTM|p#vb0*qQP|dFm(V;DDT$had3@CWrv^i>ayp&H&6OTfesy}{oGVrj2WNPDXl0%to~H9K^jhfY-C`&3KjCk> zEZH+<%&Z|=K#UvIkgZ_KoK;z9uNB6OuY1X$j~&`Qgoex3Fa&33)eI1KS`dGLEZP#- zOtUuSs!a1(G&K>>mvx6sS{Cd|VyUy}auWGXafUc!oGH#6XOUK*^g<(-=BiJnNsG4b zp$Ru3C@X5+5PdC8IH{cSW<1in{X2TPQ#d)%7F7^2yX>~_2%Ep&cVJon?wg})fc~S9 zmt&xpOb+@JWSqc47GhYeZ9$WY+>S_$^rA8zWlOLe|9mYCsSUo8X;3lLsTg9(VoDq) zeKyqJT$W3Qbf6(%;Qt9oV6xc_f|(gbgB&45iV;$ztY5*sc&r|Y$0klHdv?*NX1YV{ z{CXe4vb)%jsyh&gWCABMIpnXHv0ew4_Ma`-_5KeR?9@nPa>Xu8t+LBX5>i>JIGfED z>#zqwXJVpWG==HirZm*rWU^9PDwMKX0sm=M7 zxN^1fCnpN8f#Lz7aN>2g?CX6(5$ODWY}=3!xMXV2Gzp zpr_Gb1W);zf*xg@SRpg&L@Me@uOz5N5AY-OsAB&gE$6BH2ImlHVI%}xGg&<&aXl4# z*Bx?k_J^uca(S%gH>Zl&0bC<26_zp)R51vA%@BMC*I!o>s9SmW5hOmJz(S!yGrvpC zV&}w(iPvb4@_^7HgeWgjJX(fcI)KO=G$U42HIxH;L~J@Nm*GE3K_Z`6Ey&#CGsJ>R zX1=&$F&S*cB=xY>A*Nm%*M?ZzCD>{z*{q@si#wS2T3oKKeDlC1U=pub^5j!r&$p-r z5`Z?9I>-l1QRkbYb6f@y(JUbTQV30_JSH!Ln#6*ski7n1uKyx)bC$rLPbBAbHc2p_v4b7HRGPap5g6keJ*DRzD|(Ru14 zVIOX|NqJm+261){`I&!pyjMu@SP_k4M+u9HvmzwT$P+bdedp$RzPWpDj7?2{mWtm?+}gJ^D#^3$TPs`j`c#9yvU$(* zgWJMp%{q}Y*Hu6F`Jo3+{Naux?YrOp@h$eyCG{~?$!})Ovd_tfl+!Pj7~!NGgVjjB z_kZ2g-haM>AN$OOlOM`4U-4om>^udnBUD;H>F?LVh4hScEc0TEqctNVU5o!^x77+a zOHFr3`VeazT(0!oDoPoQ_?9G-CE1}%lEbQVvolCsOgQSGkkaB# z1hwZTC;3v6qH>}@?kttwe78M3>M3%A(ppTYkv!;MUP0=~m_IB)VD*s;Dyf5XN9qC_ zebhRWN#Z9Y$XnNRL??T$-+px)r>m}F(H7s`Z|--oR9U}rY@To4?wev#(_i^&@1DhX zyt)57PFq`3WOdrxIYqY8+#{VM34_)Xp4qO&3!Wd_d*b)%nsx_0hJ9G+sHRExhhmFF z2sMesAr3@1229ZeWn$6T*2PzX$9b`giXgNE4do@o$td1Z_a+spn=8ZIVSI^8+)}rv zY1sz1sbNii);(H68@*deye=C5qn$qVD`u924N3kiI?2zUkEi9VzHRxJaJ}=*^48)(_wQs9UiA6 z&Ku`+Itt>PW@at*7$VqQ&mz0U=CQMQw>esNy1j8$>3|PZdhX-jzGXYd(_I<^VFb16(%@GxNvD2nuQi6^fZYU~h zXe=yhpjGRXlcCDShn17UcN5coylL!Uw(>DlzFTfCYT&IJl&>$|z_;~CyA#(IZajE! zj>XliOS4z}-_`3cHR0$-LO6>~Sjd+zqpsx7OxHA9m zUO6%2O767YZl88#r(81a%70F~vQfvM8xw@!y}*^dpblTrO~w=S_@55cL5&Sy@d}OI;T0jFE= z%KX23<;09De4OAtw+F89{8pbzokf9h@PE0fi_!sa|b3Gik$tyuj zue=h(RJ#HQChrMis$BtpCa(k`;IWEE>kdBhGziovMx{>hN)Uo8uLL2`u5cOz?@=Lu zg?;MM9B~V(V@zb3KU;`_Tw^biPL6?_E%BoQy*LLI4<)kMU^MGYs;`eKBfZ|NgG+cu z+qa>u?%~NPGdFIinY-W?%;1Wpu!RylHzi$p;_XX#lF1Y4v>v;UwtevRufaqVV`1Ug@YlMT#$T<2PJ;x0^comQAw>gE$$i*GM398uig{`RwdVxjU?O15sIUdl>UzQV33 z3{_NNHQ`g$or2>t^w&wWpn}jE<%GZyr-NCIpU$J-}RE;9r{R{Lucv0$}8193Z zb#{l{q~nj=(YdL^*rQi>jF(1K*vt!E`Vd<*68~<^<;7kZBMEi7LhV+ReDbO+E&+k$ zNj4sw1@9MYyffClg9+S#>4xJAGN?WfkM8k8R0H>@*r6sn-Y+cOG_U`LXfJI}R~{>) zr}M{M1%LLxn)#|PpOViP-XR@QzD!NMWzQivEPTrkZ9M%lHJ|nHHN?J4bHxN;>BMt$ zZ}m48&&n%_b7GZ{5q+$0R+$)@Jtr$~PI~AZSNNQ&iu9V|S>X>-!-c?n64 z?%Am&^OEA}!pzE>$`)Tecd);E@$g7y`sXjT{Cri`!iVbGufEsOGuV9XNPf zqKcz3I+BuSM;2L=B9l8(68z!9v5(@tm1U_lRrAZQt#8{qKfSl?-XpQGA9>>|%c^?K zl{KSvEAGonT~+qrulQ3LD4~1U+lU>)i0w&-9BwAaYpX?Ya3!(U6mVOnW+VI=N{aJ~ zZmg-jDX*}oxFG-L+L~__=&9yz?0ofvVi^gqMH%PE%S9>Ec}*28)-b@T*$ld#^k!VT2%=# zRKLL%h@cnset4-5a3jJ#K~@eQp_$Js?;hFz)5Ek1g^H_X-QWJk8Xb?`ev&2wx)^BW z9da0~zU=SSQ-dxl5+KNtQIVMY$!E{cBD%|SDICAsY*>vi;aj3%g@z$jZv|ZjM8{}x|kMAa%HbElEsEujj>*1ZW^A?cKqmj zd`I|OT*NqPsywMUsvkJZ6HN+qiz;raAZjuf*g+7ObHQhnP316oxHhAXTun(MQY%m+ zwE|KQ%(8?Hhy&7qJfIuU4@3+^4nz$^55x?_nzYqMt&(0%T^0vYm)Qc(Tox5;jvP<$ z2KJrn#4WoY=#=Z{%vLVFSMe=>?(B70%ld}ps*JR!f3mD)#fa+^wn3#*-SJmmGKmTL zp4JlHdRyglzmEvN80TrKtQeN7GuO=7`K-_8uU_5z^+V$7DWM2Ak`4BNTq$Ovt#2h>+PxQv-M#Sf*$Hpgms^jE* z&zv~fk^PGDkxlvQIglMGO{g|CEWyrvBsp>ZEzS!#vzJ*O$U4WksK}WR3b!4YCu_U1 zG2g=ya5Xt0G{NrU`<;0hf*H?)6-^T)!BE}syJgF+TE2Yw@2=nWJA7TWY}xNt`TZp& zvr=|!Z>&x#4sUw2EUF|mZa*d6kKn(ltEsN}X?ORdIKbaeq{d~-mcOUn$~)P1{d>!o zEmKzQPf1Bn9qw3GzStZxEBC;T+1bJu!iLAHYpWmaUG>O9-p#^CR`ouL6NnIl^oxLp zizlZ0eIXV?EgOvM?Zflv2627ZaNbblyrHCpI#*?!g?L<^S#h2Wm0m~lAfuRc(2nC5 z#?RRPs+_TbQV4B=N{*we#yOl$aOc@f%RNay*za#75o<13p3}8%?W)4gwBogSKl#mX zep1~38+@ENWDGSlrjG`mN0^cYU#r;T&8l(hfNHAFvtO@o6XZE;q z_FZjSf-)EQ!!q&2%%hl)IW(*|AHg?EVEE*Mfmfk$vS;bPe}7%w#(Ud#KY*P_AAUG- zgg$u*ibtsvDt0LI=`VK>if7!NQ~g3lGM~f~+O+awPI|Svm?u!R?CKTO#ZY)`Gc8vZ zyv)ms;b-lWQ28(Cg7Z4k<+ovnEK23^z!mJ3U=lADe~&--4Jw5jwd4HZq9|WBVF06= zn7d-rNhH!{)GAn+s6NgNPgGN%qJ}4^>G>WUMBYCBT+n6ba?dLJKg<2IocraMUjn_x zOJ9mNNoLsWdH#5d%ZTa^vq)+ja)_}8+bBU|GoHgF=nWDQa~7BSJQHnF!rkO9ClUx8 z%p6qbhw1V|;Z%frS#ohgA*vr5g}cZ1-u1BZ@?-SVi9voy%MU45c8cb1d*aXUeWo0{ z;qlMj!&>TEUzK7Q`EXJ1g$7a+Qpq=7NwLc**2;2Wt{SgR=K(vw5E zwsSbuP@a3c{3#{HVS(&da0hj=E*TB*ga}4AI~rzfyT4%kg5I!dapU-d{RigWx9d%# zF(f3Sz7V_oM*g*A-)?r=QCG0#`$cqB>0CTI_3DYo;urpZ?R|N86jk>2y;arw-kqe= zNjiJe*|*M~4m1hb1B69HWRp!?5LrUN1q23xun8z2B7=+q!yw}@h>i>5h&T$$FvzGQ ziwruBiV>CJ$4FB7-g~P%35(y%^LxJM`-_I#RjKN#x^?T;Ip?1Hp7(hFO1D0_a(zYL zoiolA-;vRK<-ld<$F0~NphrJog8aVP6P83j5!E={t_@I9agvk2pVbJknJJmx~SEdB^Mf%;Esh8 zIZb(G^_9iN<2nlKbNmgJMa3i6XD*+xX7}FKTbBfiR^HmW@A=gu9}}8q-rhWV%=G*2 zcxVV)PNuo{O#18(d;T%*o;xRf`MXz7Pli0gC=R1G3HM+jX@M|sO4fo~(pU>|gn(Zo zxFz9|29G7kCBglZef|dYk`!+VC?+?`lfIQFu?3?8Qc3dW^YUgo?mQiL!?Y121! zKznst8?)B=U38zji*=}0r`8H)M7Q&Eqrtn+t&k5PCM(EcB%JGTvxZtcUKR?%86nZbaHpY2K5SFwGb1fVgu%GtJYu-cpBPg` zCSh6={zp%oE7A`61*nd}OlbrGi3T6wGbH0N!J zn3cgWm$|k%Y_NMB3cl;*@QOu1dL;Zpt?pMoc#?A=O<0HC6J~UWr)M=K*ESjp9;_~H zwA>*NRU12o$K=@iRNp^C*wKDDDM1?@V>F$1Ml=i=I4~z$2HBuMR(F0W^;1=2{GJNN zyC~vKz~IgsuC^pZTf!epGbTrh1n)HqELN_Rbc;A{ENce_r1^_xkHt^I2!E^4fwut-=p{`VCV zW~}k22kr%G=X?2ix%!LW9ip0Bzn%GzeDP@W9L&Mt8O@U$!6eF<`qBasYUn@BYTX)X zwO~Zo!w^TSXEZPVgIw*M1f*4wtF!>G0cGz(fiOk3iw8R9&^P6BVPku?P$H%-KhY82 z{*U8}asCZBe+ka7A>ap7(KX^~q6G>_%2z|rL&BjEPM(MJ2K=-9pH$LGh11z&mgzyKE|sJ>yh2n;gg4R?0}l=0 z%AbGE1}IQ^d1zkd&}Z!ni%01dibcqbzXE>QqylO4*4%1WqBUcD(ZK1kanW*{d~U1M zc&y{Q`F#Z8HIp$hK7QEnBw=d%BJsgvs8g-HOj-<1;Z)Xg$&ZuRCrporY1XEB6C`~> zWFbTlBNE^(hMR0Z0@AkgIjTHIVUe9ZP56#jU&OzpM8I7H;H20F#YjcprBf!^CDHoV zljB+%%d>hLF!LQfE*$(+sovs0%(-JW$X=?A?ZUjJ4fF~kX_ZKieNrMia8R$zA%ub`|rOvsL33H8^bJLA9-8)zP zaM;|)hoUR86ClphRLL|mgGjNqtn_T17-kf0&d6k)%^I6*)nzN{i78<|>f<9sWyAs) zOZ)jFaL-_D7@{p?Z7+7Qg%$dI$_RwHVidKE)=-5UXqcMQBuLufM;%!Y4!mdHnLjTE z8AM%m$=V?aO{@Ao{;XF1(*w<=8MoXY)^S*PA*rKDS|JC97ZyA)`H3w_$cd1WmeOl? zOw3)QUxcW*xReA|Idy9H0b@>^$D`EQ-w zu}yd(p`%H>{27hhvF@z=)ebN?4?VE5;g$n(@lN!j5zwbCs=e@lR|k^aHsbt+W`T(; zinYKVCGj*$f^fBFgt;@K!qW9o=~6tenDuk~GLtDbidaJ1+~)rF@?exWrtN;H)gSrzC0{8Hym$KepU3%1KA%#%f0;Hh7%lOYEb{ zM^*=JPxn;ij_Kc6=QIKg6k+k@u^~>RDk0Hn@t0>sr{oq^s#K8?PD@suDl4l$ZxDo+ zq9X<$m*TD9{gTO8?hQSk$G}zG0`BgXc((k1w_Z`S3H!bdQOH3s{ke~#KT=`^ksukq zGN0d9zJ+cPwusMVZ^_w`yCv_a;b_EB=h4WcjTVKnB&RILpHr@8(5oVJdPOxcRuIKg zVWBDn8U+;=L%c&U@NYoK^zp#i|`AVps zV&Y>R%@{Q9(N=pR`=rd-VC}#NgEmmp$fqjaY(5$mF7K6p7`MLsP_sD0)yF$$J!qa{ z-9Ma?eOY&x(;E6%UfwHn-p!p-Cch$2%k#b7A`Xj*K7Se-e?;dO;x3Ha+?df^5@;kM z6=|I59RhAzx!uyQ2{hqy`DJ-%4WRjee`6D!wE!KF%GD=??G? z#kwM_x>%ZE(ODuer+FT3MW(V8k&3Jy=dGvzJIYC@5llG;`w~naMW=v)vdF`NCk9i! z+jiUNyDZB&*JS?0F0RRFS}Omm5U7=Y8^^3{8fAK*FQc23FZQ6D{2o-B7{4Q?qGyg0 ze&@hsf%1p3ZZg6d9WJawk`g!#w1h!`;Vxk562MIWGZy5jc&I_intd^tqNE$47IND& zXDMd@!z2ZA0{yF)>Ouc?2{}rVq*rJ(sJ~XxiSkpBqQmLknEze~#vvE-uGHc}B1lMy zNo{Rc=DiOh?Fy&22YF~)`}^WTu#RLf%OV$+#X9wVNVJSV6g&VBH3n(DdL8FSV6^>aik{fP=*Za`;A@7@pN)MP)i#UxW7_H(z(S}sQGYb3;uq6! zPlaL)7bq@42fP-_5K@|-I@mM%PJ1K>l+KKHy|<jXb=?f4}PN zm#(PU3-*87QS{;=SJcprVJlbKe6_F8v+}xaWu^=nW?TrT> zLJYza;_Wfsd$S7ejR#D@aId{MHwQpefECirrs5v17N}u{S_l$b;|9C!jT-_OoW2MS zU~t?3+z{G#J-A`)0%{1GIi|X`?poLb+v8{+Q?o=EaTV;LNTn+*r+@#ttP2X^FJjyL zctbjWf>!@TwF)hvCJljJkPLvn5in*U-cgPD3{h0)103NOA5~}!RbU%tAV%KDz@`|Q zKe#rI$U}in!06^d`CGYdHBNisO2R3zp#8A4=cj47+5oab8h{LHEK^Nxz@-xmAYm{A zFeVz=g+vX>R%x;ssX3Yy7gN9z+{eb;B^s4eLyH{BLK=`MANV>`p5+>uEx-9yrrZ)K zCAFP8)ka$v(xt%_Tyrq4IkfwlMwK3yF(WU8s25E}Fdk^LLB}Qj+%+k#=<#}#1?JS2 zMs=LYq!nM&i*#vp$7h+e?^jZi+_F%f#V#3If#!ipCpGf?4;ol>&4Dt87g8vG)nM(` zu#8C>y$Il>4wJ@+=#ogCUJYm=8`_{TC|*yDM#0J#WGrMuPW}QZCLdydFn9>POrf`^ z=aR`M7Ez!S(N0UN<+tSn)LSKgB=4eSwemYGzeK165i)Tcmk~n9XcR05N64(@D38#d zt5F^d{}DoY@I7dG;5JmX&_FEWU_AV4$fIPp0U~9=irL2SQMO^0Fw-zYiJJ_w455gu z3Pn;O9@Hopj8Rcq6|*S2rjF6~Fpml|sq4PG0t&cakPT3{Ck;2v|B1|P&IhGFhcwRD z@y3-8EB!V9vtQVqFTd!gnLhdWfSI>WOU&=ne~9mOMwj^FU)It4Uik1($YUtJKYHQ@ z`T1!hhJr#7&y{f~w!y|UkOG)lF9${#vi#*7WS>>;FK3QU$zjH-37h@-8L4`Tv8B^d zU?dS^on(};&@sx{5M>-+p&6B(dV73S)qp;jCx=tDp}?5uwq}S85l$&9uOTaG0Jk@k zAq@X!)*`0Pd)SI03lY1!*+60OJHHq*+mq8e zc)>E8wS9VizbIX_!|w2vV9gw7w%UBco{BK9BR}Vs+p3S_ISw3Elm`=UP*p?2j?K%d z|B?Ai%l&1&mo0>CCyxl!N6flo#O#>bzJa>5hiV5skXY9juT1CL^fl=nVGqVrt^n{E z67+j;GC+x$gBZ(U=y|<#EcZ&bum_&@|HUx^c}rX@eF4p>LQj|w$kRiZY1Ia`0S1oR zfcLj6_Y4TrS%hPa5p+k?hyYGR(jyNI1BqZ*@VW8`@o3xGOhSm?>}qR6(TxdE>F^!# z?{@i}0%}H%n&ZJ0aWS>fx$*+}du56DZ!K!LFIdB|ft;)Bbaj36VG$9fhMdjaKpC!? z*Dsj(;6K++WbBQA949%%hiORx%b+7?vX$>Y+NBPYe_*L}s99NJ*8EvjsMJ8nwbJ&v`Ssn=P2G2MxnyT#ptJPF>Rk=mkB_euGRvIQh?I0y2lr%z>`9VbAJ>PC*g_0G&o{Cf!RLAcLY%kuhjdr zKt9Zh+$=R*c~RPpHM@LRc$Ry9o8=^Fq#Bq+oINpM1GBbPQsewgA28cBWLZHMGmnu@ zBTSa((fM>fzAwr~*`%7^ezg4^u|)D*`Si+hDHBqiBf2r4t=)WtcY z#Z*&fPFyM+QOW9Xi^(b3(_$lyp#6$4+tn%Y$(UO>mYVsc z8BB;>Gbc`sS1}zm-XP@FTjb=kD`MG%`nrh|>*^<6X5T&TCUb{hd4~^jKjpPaF|$CY(_K4VuDl*;Iu`eH%o+7Z&XJ>Bx2l) zF$^2@^H~md%m2*{<3=@XlDF#?Aq-fQpD@AxO8RR(ZVYenaRhk^f2=5#-Wng|Cwcej zf1g+R*uCWf2?SDd*i?@O>h*3gLFn9If>670mnt{zQgAzngFzJ?`DS&Q)+&|RF>S2X zlaesA-DZ-)K#ApG@hb{o(IDdS8!!_aoX-fwYT)gI+07hMSLvi1KR@>PLK8PUvYsOu zVW00E!SIZG>N`ojybpNB5%S(lTF+69a{6cT!*t%_9F`%({Nm`9AH}a zNRP7xwF=i{E3V4|Cv@%seDF9wvjIq~|Ey8#xX%B7piza5w8STWcVd^EPD}YpC}|3{ z1e4Thm;eXPX9MPOBZ1P)A%5V88_E5FKJ}i4^t!}G(O8rlVFllvqujJqOkbL~*t0aI zcfPo|(y_Eu*O*e5>uRWv$W>c&Np)@!hQ(RAak(kEuI%#%Poj^XZaam-$M6cfL|a~4 z-laB%u~G;KnA3!L(tBiGD*&=b5zjCfd+zvewj+Zn71ll1(z0VmOY?RblUG;k^VQe4 zM{l1!YumP2Ejy??zlLpUkWW81yJh>1SuNYB+gGb>+Af88uY64tW^dcxGW*xtTIM(8 z*}kJsP$LZ?qY0P=py>9rBMQ z_F%mUG2U=-2I@#==_7d_g9kGI9hcB-z}VBQhQweIb-^Gkj`UMV&99HdVp5IM+FV0v z6XLRg+-kyDuo{?iHQ3+v2p5OyrvmqtDCnRgc_mkq8(tf$3G7OeSCb@c`thX~HeA@x zAV_D=GKn}x70ogDF=T5X9!x4ANR3iCBODA_?P!fswHn=4aKUIJoLZe5X5mR#gbEsi zIZwK#8uMwc+Q-bNPUcB6jde))tV&k{AXd?Y;xPjX9aWA zdt5v!``YM3Y&Wu2x;ESp4DAfxrM2kdNF0sR#_0g-@&!HIN(&Uw{f`ZA9MtSuK_{5$c^v&xqtbBN7TE7>(FNmKXI5 zLOQywh0EY=PxdcjaYse{Rr0Lu+h?&-)X1ZZ@I(+X!$4NBRy<(;Q0q;tK+8CEV92)S zi7-0Y_y}(*Ovk^8H8=5K0jv+BLMu-tXnnp8( z46&EGm=w`Mp-}WmxfsJ2Y8o-ASTEFz6;g!?GlP^N2U*h93-B9l+tqqWe&bn%p%gGe z^f`jN-_7qnDPT32^_o^Q{5y--H2Q(aH@WOBuHPRNMrbpyJs_5A`XR7__jo!LxVYs1dQS! z4aBCg3un;umDD@try26-kw}X{FOA=LTsR@e?cNCd0C;{;N6hFUY8Nshnrsf#hgqBi zIos_H(CSzKOmX&Po^s}ctbxH*G$16L5WxtjTnKB9avCwjVNN@3OeBk17NbNbCf6Ae zRgbY}Hp59^Lr9O{9(vXt3dIIl#Q7SO_b7(>3!|Dm_1@T-nog45IkZrtFwe${ytyyk(c< zt->d;FWFlL-x@ly3jPkz=kV8yy=4%jK*}W994LsOJ$H_7=+Fz7B*MNi?{ER*PmR{5A(bq>;nIY$ltM{&@|SMpOalqK?0v4JPj0$_l~ z;pdzdmPTKfsA~Sw?8S6apW~Uw2ZYjDsZMm~s}eSRORMEqzLlqkvRSeD2RsAjg);+* zvmj8DkeFb#u*`o_Jceut%`DU9;aB{YjDQ=ofC%6{gui;dzQRUzVNs2XyD&z74GPw7qQSb9fJ$BBb!yxC_pJD zufduE)N_3#tU;gd1(-k8J3%lj|N0;2*A8!R` zt3nT9Jj!bW{S_W%pcXZZ%bEkL|F2BS?rtV!(uD5@aC zK^-Wq5PpJGvA;xWVZjrVgi*ON(09ONTEX0;!cT4ZZ3|f|4VPFh$((?j<;r5t0p#>C z=osq+{Og#_!;HAvWaQp-#q|c&kGBCVNR)ahEuvH!&Jxw{K!^SV;7;|t^D#fT2E_t$S+fb-%^BDZxWBH&R_<9NFZI~qtJIg_|$+NSgsS7OS%=pa@8_} zT8Ge2K@S3Z$-pysvnhEc8ZJ1A*$x_A8I_weRZm-28b3YkDY@otx1^1ZSH<6$}zYFc?x%2yHIRo9do2 zd~{QFPHU69Zbik4&2#P_GXB%U4Qs37daoHccIvH?eNB-sB`eao!DgRy+lZ+~-T3-P z*M^5}jE)&poms#%X&kZ!w5VBx_XT7D*@Wn0V2`BxpI>pn*M z@~UG#Szo@X<4gWx2tLl3{ZwwF-{MNKMYT`iNs+lJwhF4aip+;#pg^pvgvZz zozVCgVkp$(C;T5UKsx?+y$Zo8rT-}LnZZ^Bna|v~U72N-K6y0@U4{H-56yN`k8_P@ z&5zemjeij2As1KCp|8)J`T7-iPp+8h?4^`xtlG9eBRB8xABDY53~U%{CJCZ7%hMBj}RI>k6m z;YloHNw%FLH(4|gReakud-J$bTX6*|@#UCzHHOn{I(0}o~*IjoyUwvqK?-BCL z$;s5%rhYZOA>nm4wp@!eab>DY-0B?}uyTX6)wr_IJs}Kiv z2~Slhz$mXDufvQNNpL!wPcR;2!*}kLxGt>iXSU<_ymHrh6C$EXG$>lqMW_%9Wv&e7 zUQn|LH8##or!M)xQPm|G**IA)4{5CGGNjUuK$OL7M+O{?)EaKEx4JYj79iUYMz7Ig z9EAZvmsiT)j+iw3g~yLa8+18gfP{XIfl|;N3Yk2vb5U7> zE-HPr9XH|4;;f1{bWnYo>q@XE73i0`7LN7wO)9W>tloUX(x?TaJpomM$6*Q-Khhc* zooX_dmp;-O0h^TbQ~ZBtHl_4UWKkK;dxCu*fz;*`BL~?V^x?rABuWv5cUSHCf;}dx zW%6J+o>U+FUd={qfOs+g0QXNG4EhHS;#pw$!(5P!bmaP9Kl_ip?C58nVMlMo(KEV^ zR=k_syAVA3AiSFpLfnBcPkwgk&L_Tj5gr8X)~z@iz2~CTB2LAd!;lytNR(JwUQFZ! zeG_c7=m5rls7Ffj(2KLEsu}N_8TQr**joZT4`Tv8gAW8&dLMW<;X~&+v3k@4U9kT^dB@OWClL_Bg+B0==yXh$bO9?AheOc%g7=l#UP&6{$SD%q zCVet+VW=zEi1OO_vuQ>DuLSX!l3d-rZdYwSU53_xp`Np!$q*1*!U0G&lFyqmKp zaFVx&Pmxb>=P+z5-LpzRcwo)l&W$OD)-GAAy5uh^FPy)4@xy2#p%#9UrTl4zy@dB# zP#$NfdC;`*>a|ciym}A?Osk_+FdK#so8@KmV$4+vCKhEQmMmIX;J@hp!cN3_fyGU6 zi0~wf2xG+bFVMg&2Yo_f5~m1DO-s+n%*xKm&GY4hm!P<$w9H@LyHB8RMPYCcR z`i92-0|qt?8a!m^EyHdde%pxKM~)gjX6zkg-1rF-C*3*uuDkEKcglTJ@1Hh(#?0nf zEwkr5@Zdua&z<+k`~?etvFOpoOP01STfSoDs>fEZS^M}C>(+00a^q8*p5FY+EzfNI z)w9oS+rH!1JAbq5`Q5*L;dgs}zxTy`FTMPSS6+SX_5E)gc=L~M9en%HJAZojy~9V| z|KRAKkCDF||M0|LKl=ESzkPc0)af&yp=P zbS_;Zyd#_ve=Qz}?-idDUmCwFAu&;%7@L@$SerP}^WGH!Rt~`#woo-S!h@Yd`_jR5 zG>&~3#~u6H`{W0+UYTb{Ovo{8~ouFV-rFc2;5ru{KUW6lK%~4a_~drDW7ek6~PU= z$gjvR$RhGOS%-`rj{@1Tj66+#O%M-HTFED5Az2H{^arr?tS3vzTd)l;kj-Q#`4Lz9 z7uialC-0JX$Zj%@j3)5#3dOlFc<7_WUrW|IfNA@v}6m^?&Y zCeM(0csh@e`Q#h&E$|{8c)gTQC%FtBqJQI_&yml`NANoRjeJT@k~8FEa+>TRzYqRy zA9;x!#QI+HB6%Cj1>}!pad6*n$cEtB4#wt7o+JR(;PV>)#w$#oQ`X2Df>}ELd7L~U z9mDODPB$n*>5h&^S{W+Ag zShu67QO2T7LFt21gx}|4xf5l0ccDo*<_DBjDCe<#A(of1M3ya*jWQ|tceJvKAT>PE^@tih!gO9^E!N+!x-lvMnV)qORVxF1CP9-~9Cyc?wi1@(t^SFXjbw+@Bf zVd)$Pqr&RQ>esWNeyomNC0MtfZOzwNy?T~?s82MuO~$ox zUu+4j!`q!d1GXM42p%{_x8Uyq_$|)S$=c0`(&KsZKJYHKp}omGlnp4XUbQI4QBI+t zjoAHn?pD@$|6=E0?Grp-=TBJ2by$0M?!*#x=xQtW%;WI)d6c)6Lf*o*wWuH3o)!KK zo3W3zJF5%3hgYx<*P!fp_KaC!f3rI7!f*Fr8N3dE7VNp;nef8esApm42o?6MLIwAV zInrYk?+V4W>3->$fP29F6z^M@x#8`Ld5mM7s1Na=NGPmLSpQ`8Vg2I*)>&Ue-T6JB zkMn-U>fD0gB%t6p8iv2o7QC>&g7<~@SytEJd3oPreTMZhwq)nHh+}cz{2fQT!Qxil z13U-VT*qKX9fLK*`yXZZgtifCnWp6uKZ!8y43T^F2Zk`)3abZN33Dd!n`<$Lt%v^# zc}-wPSm4{V!5i*?J`YFCniC!#7xY&&EMjnc!5_i#J zM4SbbT@E-&@`w+-E(N3z(G10;1X{2R*pG73oAe<8(ieEBO45&1fwis%h>$w?78-yH z=?^siK+;480UtsK9gB&1lLO;9(jqx@)1WorR=)3ozKa5k25C z*Irkkvzb=wq|i6;7Q*5M;z$j91k^~#{B3}3VM0Ceq6Q@s{AXPO_pQ;*Pm|sxBz6*2scP{_Vbu&uT21d76*45!#{J zIohYR`*mfy!}>V=Gx{rr5r$_B=ZvF`ZujC& zBKv0hWk+AfEXVVX<6+vcw6H#5lfqNNUy3kCY<4=Gt0M!ECtcO9_oDKmHbp-dQxel0 z)9HT9{eA3;I8)qn@fKwIa3riu_($TSiJOwjlO9Q0k!(wjO-@fPPOeHGoIED^-sCyS zk0!58-je)$@+-;jB!8HEHn}bNibo5M_e4*&$M3204D*cl-0ykV)9P98`K(uLuVuYt z?=J7Dl#G=2)J2ug7Zex#s&Gc(io)%Mmy2qOW)=Oa z=r2X>#k%5%;@slri$5s7P%^XR@1+AuXO=!wdZBD%+4i!%Wp9>!Q1)rrKg<3F7Hf+? z#-Hjh^jG?u{GL z`VQsu=@x%Q0FE<^Zq!Vnu%NrHfNNI}_iGYkR-;MdG5`W5Rue=f-24Pvz@Pz<=gm)7 z3m9*c~a{B*TI;C*&bbO!B%2yHe$Q^>1qLZQh}rfI=xdtny|U9 qU6zu!##sFSB5}YL;q%Iy<*WJfkL%v+yjymwW`H3G8AU=q-2Vgeno20+KxuvXBLch=7QQh~S3S zDpEv5rIu2pxD>EPt#zvvYpq!2CswO5T1%~Ba(Tbcy)y({`s@Gwyzl3Inas?cd(VB& zbDrlp&vu@3VVp7Mz=zD(>^a$ak8k;^ld*@_ecP?|0u7Z{aCd3wpO>)zm@JW z05=@SsY2Fby4l#$ZwM;NB zo6&!ld4J%Tvm8ro;8!ZESf=z9X^ ztt=<@cY)&&SE^;tq_*~+j^@UuF7L3~bZ=fxPQJIM$2+mPtFx=4zPcsTTiRNi+7;EwDHcX@2K|9sc!A`&T4CI^Gbm-t>W*dJwubKxBE%A6si^O0Y3}T7 zZfo_TeN%l$JqFv@QQg{AUzh1^=%}x!8*7`YI~waVyee1_dwoYIZfL9Ns%~y= zZf!(AwV)cc>}sm_Hng>ZEY-EOZ7uC+P7S)60DXCLZG9_9Ff4H@wMa|{usUybXJ=b& zb2a+&*0t4kx74?GRd*3S4b98zJH5jQqIQFKPFq9Qs_KsV#B>c4NO4D7U3YE02BxkV z{AsS~?yA>tpdK#Vkm+r1tzF(-N0_W??rLi5?gBC`&4G@n2aV&MG{Ejo43vhG>20ak zM%~_Bv%I;pDbqXDM<(@|-PYmltcM_=bu&;64F5Y_(-;93G((30(rF#7YHDlwKCZ-u zhVG75bO?&z#=16dXIrMXv%BW1`r0l!qtkf#^0rkppxU<9x@IC+=V)SR6$VpX)3&l+ z8-p&$8VVN#p|!0Gi~xfOG2)Acnl1zSHE(BAHHKAFAD|l$X>Rq>siBd!wL&sFye(}V znuHKemkiw7)zeqhVf@ocOy`{Q`dT42@Yi?*JVXI!=1@XfHz*g7QX`|QZOr5t^ zcL3||<<%Y9@ayV3n;S8`Kyql;_9h&4Xi{2T3m~0zM-Zb zh{q5#px3&*$J=~~sDlO_^`v$+j?qD<7o;TK1gA(n6S#z#{4gw?SwwV?ABOEjH>p6 zdyN3t8JNeoQoF3WvEGYW3vy`!OAY^f(F(Fw>k5hsO1ge|gHF5YQ@m4Wmsfe`%${0x zc}e9IZ|NLwMdj>yrIV*j_9m9h!SBRO@8zXc(`V1E@}fm$NqN-*@9e4GlJW)KnWg2E zGrd#hS5!`!Gsio-(px&KqO5cZ&Xtx=Dw{jGw0xR(BJL}nUF9t+omE-|pjETATLYj< zr{KP+-dR&BCrt8woe(`Y!sPN-R6I78&18>USupHf*;mg${SF=bLI9e|Fdl~X1G zTeJl2K?$4%q)D^O=S;b5E>56bunRC``V?&(7(faBCTW;y!!O5h2~O4QN)RM~%H^eV zreu0cDof`ON2XTJ2D-#g+(BcU3wokyX?Xx&;t`#rYnMs~TG8DBDo&nKQU-t!lJf7j z)#Pi+>e~8t%(%|rB-fRsrciY)3L}M?sVf6W^|V$@U;UhRi0O&>rI|Wi%U#e1nuh_6 zuPI?tBT$pDO1cuRTUifH*h!inTBD7W%Bp4P>#C|!-?WjNQy8Z>(RCr(fw^sd029k`bucH)z$>D7LD!D+fyAK+}G)>A8bBn}Z* z8?>uLW4*^(+(9@rq6J;=!g(*wv}%&ku0iVz^w0*VUAWeatMqQvT6!TRx~v6Zc4=5p zUxXP+7D24l+Odb{b)7y9I3gJ%Y=+@HQObK!4xVO=T9?e)D0K}JJ?5X4Bzj8pc5Txfmyc(MW^a2oTa4<{x zhvqnqP3K^@Mni%h`wGW*MDdnbY7==Ht^}dFXE1_5p>wi_)R_Q z5*5ViKaV=dM;%*T&Pbw3PhBi^LnB(H(W3>||Mwn(v!MYa>;QdMGV6YPiNn8w=%$p}g$}ASw(|EI40=sCKa)xcELAA(u=&jp)jM9@7xV^$`q78jaKoeEwSuF74;L^cWgxkp7+8oFJZ44>W>{xlFTRNUIaI zy&BD1K{wJbK{|WUNI=&N!tw3H;8xe%=ayW&K0s>WYftn(q*6Q8cEKj@;`*7KDr;$ z7oaV{CcnL0`!y5o%K?it-xM}q>thO_5!Bh}k6_Qj*)n`npVW@-n1nNP@tcmP;oQVP zf91G~#z5_7;awHLv8ev&Ja{7D$W zki_Y7PxKD9)u}-IDc3lA8ThPoM2F|qs4z4Nf_1sZi6MUI93TuyE~v*K&4##7eG<+= zd`Ox}%7T0tq6*DFk}>Luq=0@=4>U(e#)wOFEjT~*K7xFltKA!fO7~qV{Ul{HkAm%j z_x&f`q0=bXH^CknJ4q|iQpb?EtW)EEhdZS0r@+RMwQLXAxK2RPJ>XzGsN4M^Uq`n? z7yF__k)X{SvM51aJq=byx4sv*8#+srrD%xk*HBbPZG-mthobLNw5J>fwY%684tgWH zH>t-;WSMmQ$wMNaUH1ve_tU);-Pa(mT#vFT8qg!vU=%~qA=&0j8n$qLAyr2L=a1& z6l-7RffA#9qM_z1b9PgBE;xxWDvAyCIu~EDBg|uCIMcU3J&e$HD*~lKlTJb)1H+z~LWM_E_ z&OXaicrM$;vjO!Bw9MvjatkkJHR2WMq9bUrmp#WB-^&fGQ)bGW>{)i2y}|mGH zFD;VRNcXVQ@>2c?d(RM#{x-6EKxavIu~$TqT*kg;ucIYnX&AvHqEOkUzks)iy`j7* zjbm#FOJK2GOlITI(#Kvi?lFY&Y~wnmA9thr0L29CsI=bSbxajcJtdxeN<48+{Q8_Y z^7u66$W!9+Y2t96_|;BvC{O&dP8{4Re(_kC@{48Su`qEUOgyTJM;;DQ9yuo-4iWnw zx>?z;iv1_#hxRQ{9=cgPv|ir#V5+ijf!ODlA50Z{Rq;Tc*y9#I+dWPBnJRvE^!)4o z^YZTdOO)Ny#Qh~=*L``)u4UrBJaMloetJ&ab58t36?ePDT`6K`q_|xbx2fV*RqRm3 z_Iii1eXY1-w%quXvPBg)ZeFb1_>{PDy}bE` z6lL>bvDq)*kRmo+Z&x-&iR%=v4#2P?c zlP9i5gRApIPo!9l6RYdQDpjmhMOSBt(itK;R%9t1s#uXF+Htjgt!RrBtu0R}t*U5Q zzF28_O0=w(mp7*<%NL8~etFq4aTR`C^^|D#pHC4@xTmR3G~%nVPBfsWhImo$5Ou1k zRYi>|s@IC8s#pSfxguOyq>3xT#lk$XV1!Fq;1TmZ;&SFvE?338JTX@lRdcLLl|#(2 ziptA8O65**S%pKn%p)osVzw&EXVod?JH@OzQKpKSs+dt4rp(wWO2fqTb7I;#F?Fq& zGC53{vQ|tE6O$rENvN2RC&oL)xUr$iI8}@tV^zk6iZNC(x;R1^y;BsAvMR+9qIkVL z$|^?r<)V?1N>Py*3FJmbio$|OrEsPw$PZTvB1L|<$jgmX^6Eq`F6Tyyoa{)yN6DEi zvLi(nPG!Z55t&Y9giDM#D*63pIWxnqWI9FWQHkMK#_&)j!!9z8@)P(q++b0Lhl=4x z`Fj85a{5d$%r4SqiqzytB{f;3;45XONCs(=BSliUNQ@0v67z)5TcG&H3op)l3q(Rp zxRMYp;_(%)ia0ch%M-ETA|^UaiNP1m4YM2_M6`}ml*z6{IYkuVbh#WEE+S?M z55ReL3U`qRFA`xqUI{xVTzSIj$Wxr>gacO{dBPq#U$L(hq4*U#UxWZmNW8FF?TRg4 zSna}s^CqKBG1-MlAE6N=G}?rbMrf7|idivOgyAUnAC?ufP>youkCNq`LP#Nsh{vbk zfWhMha|wQw*KOLyGyZ@5kNtm$UEC3aA`94nOt0ghlu}xE(0|!{@9!4)Mr3~Hr`KWh z9%K~%CUvLWr0it^Rb0`2n|zEJj&YMxBgrhg_her#bDZou*_RXM^f^;} zPG6JE20BH|z=!HiW9Zjkb{NuOr9J>4SRlYKvp9c1PqmRTR;v)?jVPsVRrOw18gKTn~ zeEHweniH?l$gt?p!duWKwVm9e~i8h3L(NP4UJoe<+u>)i2vp26V4}FUKuzZp4 zPQu$KlERYcUFg%^94Dn`uY76A`_<2UHRBakUGnadSMYv~%QN2Lt|i?4$_${S-o#g` zH@&64^Om}mchmbVp7Iu7IruB}9hBU$z3LnCWLRDU@?6=h!k@v6k?C@HO7bvMQ$l=r zSOjnK#fN4)lI2XntYI-?m^W0g_z1f&<~UA9jD0yGZ=m;O$H1$-gn#ezdHs2RdfxFo zeL5qGLA8-13ky<((_nCidoY01)HJ8Z6X8rvEi4#WRG1&3|DcoZaD!1gGGXeJSH@46 z@X|JZ`LV{vXXZY4;^il{@o7J)7=QN_&%OBeVacKX(L8(H_}P2}k1nS_-WYZNt6$-SgHAcMb2(uJBlGiUJV}YEJdsA8pGRciJc27fa?SVTrcF;hwQ19n zd_r+WMe*p_73yzfSNgXf^Ov5u;rgeazW#WF;Yn)x1h>x~J$m-+ z(Zv;m6@1T9b;)gX;rgeZ;EoDhs3PW{sZ|9cu2$9DE6>_p~NM@(uWNnmOgAm zrj(Tt8yB0GUr;!*$dEfKE-p4@RK~EBI3lrlD!#O zQAu&$SeH4AjdDeCn>XE+Y|7#`L$TvjZ{I*K#G&5_>fogl3522f_*MT`{g8|RP@XFjxUbNzxC~TUrFy|tSY_wp%5Dvp*F@j^oFGC z4d)Tg>SQ>rn8&0ppm(4wBq$19Ngx2=>(npBy#^O%S-d~gfEX$idP~5qwuC~c^7=q9 z+&a*g!wr%<+!c|ODis#Eip0IwuU~)tnfveg=`MrobJhR;U)6D6e8ivm`^Ws*GX%E~ za4UmwjRe=ottKXOE8q_F<_*Ek_qg2Qk}+wdtFS=gg=cpC^q%|A0J_0-MjiL@-_;2p zeZimo>-+o!>PCB{Vz~+u`_;;RI_T$*fqqx1r-cC#i^3xO7Qt2- zgv>3>04sEgU=3(C1ZtPR!i#(VT+7?kf2bSyI@~#eKP~o3??Hz;9tZC^3$XvBZg%(x zY1QBs={@ybw0#DuHWa;}?Gd(0LJw#RW0wtn!$9$8_$>8TfPE`Qx#Ijpd8uZPJbtqT z!QxC3Xx@905F+71G$}T|JJA2G^5!=!fVl?qdmgw&dM$}3`y++fwc2M}9nVs-+~nX^!1CtuC+e~B2DXG_^4Th3Op4cW$QQ?@zVl5L&9Ch!T; z1TjILpiD4KFitQ{Fi)^du+C<)`Ali1m?_UR%{0%n%(hlZRia9+P$~=+#wt^lxyn+9 zsILyASZY{mtTWY_>n!)P`}zIS{o;Q4e$)Nt`z`ldf5CpiAC(>zkIIjl9yLE|`Gxg_ za>8)J2;<7nOXtOT`Mh%8aNc;{bl!a4a^70?V~8GS$N6#TxHv8!SB@Kw8;_fgn~z(L zTTieP{DgEuoRD?ECrl^ICoCtd$&2}7evuXqOEfqgq@kUTRPJ!)=fOlvNr@8gn_f^j zeR^TR^lKWHENN(5vSjeUSO5O{tFONP_gB*2^()h)iRaYM)c$klxQmCK8~i7~o^MpI zRoAH3sMqq1n4yTancN0`T3E8*C05JQYNgJ|R+~)*7*cKpV|xe4c=qL;)jS`cQ_)-> zr|)S#Lw$u8@;E+YU>29fi)Gw0#wM-bx!_v~(df`f&3(e>gs%tF0flu$-OPKUdEwr@>W6~| z-WjVxaieJ=hcp$@YNyGYE~E0VT?zV#3P)R z5atMQyjPp}L^O?LYA;X-qt1w@%pJ}yp%PK?8IdvAn_QXoS01jusj5qR8|M6C{=IvC zcEjxZFH_!B2h>kPL)4Go|5W|l>*bd8^iAu!x1~|0X5;zOat*RCR+h{P{qbRJjmNMi zHsoqsk7G?Dc$;D~gQa0k;YhHhkX9P#Bjpz0=bwn17rRZm-8T}R;HH%1m7EUd%kxMZ zm)6%WUE0{llV;yKY4<~N_HDJlKlShT)zAOUvv}6jJEgv@*Kgdqb>qgHrRUYNBSyUS z$C8rspM0zK@m78}P1Sgk#m(Sk5ol=uu2G6h5|VJqG>eko~Eg1!+= zNzH|Z%L$(;Ea-BAjZ#zX)mPWnuDM!$X2r@c|M2>kU2WIgtbX!$^_KhUFP~puKYtz) zb88zLuU%i?xOQ#YLp@La`OiV-V*EfK(ZRg*X%asqX zepMrW)eEQBRGLp0W6zEV^N)N}{o~X-dC`^i^;d%B;XEWO z^UagQPv~CtcC}eutFDcg`hy%tkf_^TISqW!qD^TPlUErOZjl*+J4`}SyNEUeVPen@ z!xqbFfcQAUCYX5l8sfHuZJNKNh# z-t%Q20s8hmDf~0(@TcF!#-PBXQ)F(09|{=2W^CUDY{CjTp`(EiF=E#_b!nek{SA)+ zCV$5)N{6HiNX82PC@ZvIe4L3J&GGSZDar9>gKUWllUZ0pxT7hel}T~YA!g3vqkSP3 z&O$uVVKV0mOVQ|g5-OgeDa|P12z+{(tfS*O%)miLTwC2V7-~Vm$lKGPnol$0h-+E8&&E*TmRb)(>JZ&nsjVgZn z!Lp5u=1r^`XO0ZTI1TDE@@AzIx~+gM_U8`ENREy`L|~375Z6SQudzATrX^pK5wSM@ znvC4Sv|%=8hzMs9(IFAGa9@Nis}Kf%08=4Pj~F%5Vvab}-oajNe(RQ)j4>|=ggcll zi1`E4g_K|ff=L8Nm^CzyB5=h^KYV#Ew|J#t!Gikw1q&LU>`iT)zW2r7JveQ7;+;4B zLH&m33|8!%vgoqoE$SY1DPPG8{xT@}R;*vYqGSDf_0N@sxqZKV=F{Bl^c(L`Z&Tk< zUs3PO&OTUF#Q(@|<{SCz>Ng)?{1inW)a;&xJ?$R@`GKyK6xpaCcL%|-AjK!a5?ai{ zV!{s?L}L@b7WPmvn~Vl68D&;tERj~n**-n(ab}<|Xbuto;m={xtRh)P`l+9RJ2La2 zxoYM?OVt(gf5WWjPoQrrUj9+eqEQR{nRc35QV!3Na*R19Bja{S78bdXkCsLo3r(H; z8fiV>E*<7iNui6`VlJSx$?6K9)U=gHs3&+czg>NMk=ngbeOrEE@IJBPTn1mEZih^- z#i%zcZ!r^MA}<^7PmW?u7ITxUjyGA>CqyX;VNR<_GO$p)N3qAoo0;7e=cAb%a94E0 zuemE=Y|v8?!Gjc7v!Du>eLj9q@3s{yZ|v=Dzp}bjP2i`$`SyAs+NVxk zx~k_YX{!2Q#iB)XKK;$pJNAS)dk_Bkw?u%uVR4Ev52IL?KRRjyL*y<(HrU!6?Pdh< z(P2ItOEAPn6K(;;tUClb6mSQ`C=hB>BuWA%7f-!sF7)qj`FNf+_uk26+spPm_~0IV zWh5u_Tli|;!*5AWR*z0CQO^$!sOL+jl5W}pnvsV@G#lo3vvzYGZ+Dm^hlMG=ka%V{ zC%S;f00qBVCI#ftX#-C@iTiY9eEeX=V|U!~n7W0Jh1s5{9)oc9$}bH}c!wLg@)vGV zA5gp0PW5Lr`u*s02KuzJ;r<9yyFqT3>MZSs^~{(gSb|xx^H`h4ma%7`RL*D&$?=gF z6nM!q29}6DgPWuYgU?87G%x2E=uSH;j{x?3z&5iKe>ecMc2k|S-XM}#g2L^_Sc?W& zgG(g6U{;(yc|HJ696YAJE%wN-V*~?(L>R#A2Dh#Px8m3wzmIVx#>Cr2OuNao!P(|+ z4{bGd#3O;@l;b0P);M_X$gfbe5O9^$lX})E$L~sz62x|CyO8Y=d%Lj9GKD!#qzj#) z{35<)aoAU<##hnwd;ap=SGv`|s=a&yAF=SUvhhD#x_{s9pJYwup*-&E!K%`k{C3_+ z?9I8{O9o zPgS&p5MMEd7qu}|`}0jm_8JrzA*^R0Q*9Cwe!|U^v8It?!jT}-A%!i= z22R9_(}?Fd5m1jvpaeWlT{S{G>R|&ZO7cIQP-OTsI(^+B?5n(7P3Ir0N7Y>$HR>Lc z$_Eb*tde%`Qw_lFG;mu7+_0n9ZxbLdlk9Q~i#0&JC@FEKFDG9c>}j4Rty139LQdQ_ z5BFh4U@!8o{Fx@;Zv_4pE^)IY@f3>@X+;x8VuhZ^ii2V?q{#75|FIz?wtCE#4N>U5 zkoqINP6G+XK!>)QIbZCrw43ba7%4$Ym&QqycGxVfmwsXVg$1#_B{Y?LdAi6JMLdU( z5);HGzMkJCwu{Z?_2wP?esPECr{=xhq1xVY^Wyl8xJEd*kR$-*8Fj9S{&+*5?FXIxz-4q&N9XQF2QmUL_ zOl5I2<2CgKs$pah7A>Wzk7+^Tq0R6q7W-`ukjUWXoB0-ltYN~5y!cqf$MM~e)92JB z>HrA+tUL~QjQjRkXwOB^4BcAffUJ%`%+L-6YHxLSM4ElBc;U09MQWYvx`4FJC20&6 z(4Jla&sh<7EKe&yD{6m%aI)0^EV0*5^Tj+-?h zg^NsBJQh%djk#ldws^PCkftd`^d86wkmh}kG8^zHlnWM(Oo?QSFkVa~X-8<7Sv{}* zJ4lvmS3miC^_u{-B81>K@@p@U|%-m*G-_%>zEVaz_r0Y63aS9*@`5h zz+4t72AO$;>}j_^mDkx&Kp})HF2Z7v?a@{_+UH7eTkRof8Jg?)`S>;MZGw znwzeco-vm!8T^R%IAR|jJfyt&^55<`B3abtD_dHYK<+78rA%TPYxj@$xTT2jG?o@> zcQ{>2NEnJRQo?XTw#09UYxA{7TQ->6LfQ?j(H+Cm!opdy!#ph66OrKX#EHaVdI)<4 zW72GUFt&$E4JxyX6aN?$MY744X8Ex=^xfo58du-j#pMqgU#-8gcj>Z@IoGc{{D}H5 z^~<*RnpVEMyk&JonY4ZGQ@dXJI6F&yf6~->72_|%a{>Oc?|`sVeTj3bbm#{Z4oq$W&oT zz|d~*u<$yU8Ky*n64#v@nxHUL+Vs$jl^&Wy12`m~SGtO);aLD3Jnc*MtopBiN@?P; z0aN?Bb?xHoflBocNLA3IFjz6Ly&Juu4#%H@1sud7@UbOaf%i>*cM4N@oq&6dSW=2n zB8@@s8fxhh;}P(!1KuWp1!G+E($arA}qFVKcu`x=Gw1-=J(UY&N-}k)5y&`7jT{XT>_H)XyHdU;P|<`Ka{V;23%OxeVbL_yXgN!FZ2g=vMZKf0Cg1hfClA28VbACkgN{g2B>)Yp(mIHSJCkEru_E_ZMz&sFF1e$^#?g;k3b z{>~u$QTXnnwSYAHKmYIG{6<0oB@Q<&WvVl1_k0+irs%y1j9791yjL< z$RZJCZsXN_&12aw%^z4bcvvbU>7rcs7Es&FM){)!M2UQl6jM90bL|Q|4lc(t1KDCC z;)OusBDEPv(IJ=3eOttrgJsfhzx_nIe-P9E>_Cz_a8|sFe)vADrR~95xREmT@^yx8 z={nX0xs*6;0cDK(94GJ(6Pm0(+v2zQL0pGTZS8!-)5Yv=a za9-Bd_-F+OBjx47_1*x=7`|ySP)>+vqxTH0cdy?euH)T`*1KfF_^5Afu{qE)Mv@QL zUSz29mtPvfzy9knWgqoiEcOSqL?l+TuyRyq6kIV<*TDMh%TNVc-$`8hfIt4F`djtc zFZttefZpIE)HftlXn>_^96}VzDA^xp*P$9h%6=I)Q<}`}E0kY{H~7x6W7P5mxnCME zG@xY`RzNq(`XIHAa+n^fhiaj^tO=;ho%ya4vLxXxFUrknj3G``|yawwe zDQuHJ+iYM_2@#<-gOxQ#7#f`kP2QVg8OP?zGav(dUMx{*}hP6XRY5 zzFS!=8|ja;*+pcOSv1+rP3{i+mYA+6=5ggk+6C>^<}H**@Yq<9q42-TBLpfSisY0TkJP~N zJjGMFSoqK!|4%Bn-*eCQxpzz~&dA`ScsR0)#lthzvqfW$?B9R57!OR6*h1hj1}Hgn z`mpFwC0s-|g@!koIzqSbE)fAIOUiRX+Y^0=Lf@kgG>lKnpJCwu84VA=C_OGBc(Qsb z`_B3kC*OKu;dXUbkX+&!Y0fu&`>Jbr0gvRdJZG_L4-ky-BL93X{jTZ@Jd zr>Yn%MUIENa(31A*NvXQo4Z!6Spj}N1}#c-3}XfUXl8X7#dhx49@=H*I}~RqQf178 zb@cGS@;PD|O>rYL*^jj<$e0_sV~viKWzEMz6;>8Lprv`_q`u&e{b&C1;lynDw>75+ zHi&hn%YT3G=^Rk0Mx8HDhZI?{(pTyq79C}aGpD8rb5mT{Ru@FdE}D|Ir0uZZ8ke35 zNw?*>3?6Sf7W(>-6eUh#l}{6OS~}3DG9hzOW|V6oITa9rPK6h9Iie6nQyq&Jtyr;W zaR*QNr~3J#!;9w}xZ;|X8Mic?_@DndwsdC(Pmw0>eEjfTcOQOSeOUeH=P|LguF!o= zPenP;MD%9iqZU?fr};oxiENF2S^mgSC)Ospp~<<$)`bYz!-_~36$U~fP;M+TOXTu7 zfh?$|<4fezR@*#sw)*ar@`{D(yF4jj=T-Obk=`0immcY9+O~FZogsX1@8X6xKs|IU zZ!>Iw<)bx5x6NYO&UP52?UqhiSh+`G79+|$#$r))ERsUmeYA$`cr{1MlfttL)%0#C z3k~R9TJ3`l$0w!B-<2lwKhq%?z=`skb9LhX)Gu3|dq0&P$aJp)8yh^VB1yo!bDlX;Swt3^P+hNmM@mN458pno9L8sa$=Br(_Jgb-ML>QFZzyJ})4@kAeQk_xgQ7uS(I= zCp%ad@+T;$Gnl!@ki`lqe}dIk-I44&69_qi{^G?6lgCg>zLeL(^*NzFt-eyHzGDa< zc#W@BmkdsnY)e%<7*3BBrlRijW&$4k9H=(7Sn=3KT()OZS3E^8rzShWyl)^SKz({S#qmp zdXqG|C$XfUZ&>7&y^7c1HF`~6v)AIaX1lXJ*%8^1*-_cC*>TzN*$Kf)j|sL3&Izsw zVH3h9xMLQ>LxbkTK82t#Uv!Y~)-Fnid<`>hZTliMFK^gq!}9V{zj!mMb@JqP@x`>s zzrzB@7U{LMRrA&i=1Q-vnOC)TFjrpMHF4Hu7iJge5XN%+Fn^p%thDL1jSFK(>xPwQ1*3YBVkNQ7TKN8!Xc<{j|=&kPI zc0LYuXaB(KSw0SZ?^Nf>tI#*uwPJt5#dd8=Xa~Pl?1+O+%hRmeMV8-jM%RbBF3f>r z5*V{ywUT;?YJ8H+eAdo@Y2!6P)3$5ysKK(ox<-8&CjX53hsFFK7g@H2z-)|0l~}BZ z$H5)3>Hf$Tdq>QzQ9I%^ZzKwr}_OZSI|h6}TWg$q)^J1o$>%<9H0 z)UwSGjgyE2K%g8X6=0@l_3r|iJQ4D`oDH)UZ%vI1)3nT?Rbx8~L`G(2$@tXet%C#d z(#MuI$HkJyhje71$29h!e_V)73biK0o6M5Y5}y#CVz$T@YkY#t-CM(ZBAc8X9+KRY z0{?VayxE!%V`SrFJfTHKPk3VCe@uoDo?5J;=R*SPnTLk?IF=VPyvz$nE!~uEPPe36 z({1S?>7kin+2PslOiy}jdR%&ZdP2H)m@hfajcmW>B)G#9q=*NE>i%S{+I{B-XX;P3RKK{S@v52IF57?4CnvA`jXdr=D<~`;Rgovc zQy<>(^PeXraaJ^XZ1JeEiLTT=H|{x{0NS*H8@b9Z%-3>%q!Nm1{_V`kcj!uyd%De}_qY7k^(cG$=`7r{zv1{!{a=GqKt z5L&Lkkd@IL#njzAW%BIV3&<`e+}XVQ0lry!d$6jf>E>&tjotKOyF%hNyqLSFjqZW!;K;wqq^Ck8Kh+BPs_@j-PH5hs?BF#Qa`zIv-$}}yH6?{d`T?)cDFQjke-2B z1YX>Oaa-A4{)q}Ey^InKd?GJ_03It8Ry4AhE#ME5Gsq&Ck&eQug^ci;?NB7-pm1zJ z>3^=tkPQdo|4vHgkWm}G%Ph+l37c0GquFf5c#V{RF-w$Q0{_6h9@KZ;qds!#9rY2u zOWnxlJ^7TpbnxTBqa0VH=~AS62s;Eh8w3COZj8##R{2YSH?t#`CKNo%)gEeR_7GbL zjzU61aLI;jQ%Z={>|jyR-y7F9RxW`P`xdaKb%SDH z{hf>roL8}(GBz?F$qd<)vC%XFxvp3s{C>s;&MNmkDb@}CN}4s$j8&}P%S%5TT>8$3 z(r)x}P(38a!7EEAu4$TDbM3V?Q=7IQzvJDv?&>_=arayA-hQlV`|A(h5azyd?<+gz z!lr$t#z}7*;*de18uG588gi;T##)v1_6LTzuPF(~*0KQ|#I#$&UaVyx~c zyR3Mz+2pzyc3qPFx)^6yN^DfL$!+IJE}2CqxH;rO)`pvh@xt0@Q3<{-884mJJxEAI zgceEZmG{9>doWh=XQ?`iY)jJNo~G$FYp<=I*4(r6>xWvljUT_Q<)N>4ZlAaPmAyB* z!)|!+^=RFpje8=vGeDd57K$ixD0kZnY1M{aslMJ!3F(F3!;>G z91r?uC3wl$`8Z1TQ3}SH7kVYZmjJzjn>g$uQ>Qzm8mAqCLGPeJ3e|i;S2hLoW1i_RyedDeFY0JHb zkP(E1SY%INUgpaYIdYCS$Jdr{f5I>DdOGZA_|eFxqn?gF9&Ui|Q_{Y6Z`XY5ZL!~hn+y*c` zMK_XKFdK%8*?dE=T!wGR9R5)E%7=!lHowYyQQx_uWgd~oOkgf3uq7DK= z{4+9*I+&GOlxB#+ksX>N#~&>*OH-8G6t*R*gWZmq=gBg999%e%VuS1N=vQfnLof}2 zJUvfBjsFh^ZeQ?db;onJ|6urLh(gu#{XZJQ{SapGE&fk1qdfSJU>3-a^Pl}FYCL1G z>qn6rqMAX|W~2P^vVv0erdVT>XG<*TmLOXko~SGfjG`edJt0UrQb-qQmj~sG-6m|eSB+QU&W7L`qfuosaO3M6s4zv zjb=^$(UC5vaEF?)4u+gcRJ1$Ps<^%BO{0>U@)U3A?Ri^9b&QF0nYip^sd3Snp2DnD zPj<8=JAKR$wc%z^K!EU>_EAzwSho*wK6DF_!^!e#W;aO>;3BXtu36~(a4Ks>nDk>K zmaZxi=8Txcw40YNNS-!)ygS8_oOZLcY<^Nn!4DEa$xp$KIDfIpw_ zRywytsMq`$WuOVP*h|wz^8<4?s6oGfC8#65eE{06t*9*=CBwl7()YeDU;R%VZ!g1#CQagne| zO_Q$9&d$xt%DH;-wqqx@O|Pq&KE1A1`653jd-ddrS7&ACAG>ASGkfZ$Pp_$+HXU_W z>~{49*@iu-(eO8>`cq9?%{?(n6Lz~Goe(QGc_Q6g?6!`?7kh}Mc8y}gcF&HO_Zz%`|Ug)uJ6N@ZKGCC@UI$G zuzJ!h*u24=pWZUATRqXS=32Q>Jv%(tI9R6SWTE53p2 zrNg1W`pHk906)kM*MM>{sEG9%J=|s4Zql{`G)1*KY^%dfp&@2wHHL=S-PjcnNL2Sy zs+u-9>$`XK)rG*;&fp>gu!XB#=%9RsTwZ+Ll&flag?f;m9&ms9{PU+jo^y+GMD0({ z*tFx|Y4s4*`0?`7cv8vNaiHlV=f|ObkoLokXFdK&**U{=tp+AX#N~{XL(&>jhc_gJ zG}s&sV_TCZF~Mt|V2ci$P#i5Lq~=ec)Dm{5J9_)| zf=lw?Xm$qvFnxPTJRJRhqVg8)3N~_*$%&w?Qz_gX*ttqx>xDvJlAyFgeJ&SdOUans z7xubJhN9f+-xcMeI_a9Z*N-fl`%;+sPb;r%m|F7slM4>aox7)WR^^|p(Q0o~^)&w< z4$Qbu%uk*&Y~=i<$x|{eyGdGpIzDc6!OUih(z>mF!TRjHHJ9D~P+Z)H@d?F+Q#%cz zj~rOC)t9%r@|FX%0|ql=yLcV(S_Jkox(wK&5~*)xrM-+mD&TNyh--2WPaFYv{>b&y zOE>0W=Ws#(^`+CVE65uuox_Rz!jX9e*Wpq@K@l!(B+q{;W^OuWE;fev?It9MP%{w9 zPz9lFR6Ti0U!m^JJNq)Nm{6S_y|kJj$tRhPAA9W! z5j zo{^Rl9qHRycqfa_%h*|RC$r5Oo|Y++bFjBv_QmH$P07!QpOQRj+C)SCq%ji>uI%U4 z4;|{i`e_$}6VeJ%h6G~`19}AKK?*&ueyOetjC3TnBDl%=6r`pFYt|zol5jOG3H1;u zdb$;YukZ2E_i3l5N=@tjvT)&|E3UZWFW0X93%(XDT=LPaCYE~<6r6-2PlQ$ zG%&TvBo}FsDoF(8S$~9nuo#q){vL@$MZpz0)yuA`DO@_d=&HPjfB*Z3i<%$*0kT~i zpwF}ewRH!k>hzJL_9w(PU3q0=T>O5g>#3jK`=pa6{}9PG1V}S|dTHtO=|R#!Ycg@W zR?lWbDz?O*Y&Kw@yU}5hU7;bcvTl@aA+c#zrV8^^YsgglROi&N>;bj!O?{q#GH1yk z(X%VGMW~1(sBpd5)=7eaSE2NF-GV>-WZBH_yQ{X{yG?oXgAWFe@yE|&8mlv!td6Vgd%rr{=vEu^7JL$qo=wOtnly=${4ZNkPBEwtUn_j z$JQ@O)1smVI*0g45BET|ilqt*rY7bGGN^1ie?r?+qAjJ-c`Zqe^T8x_z|)kD_VuaV zeSL;p_>Q=<{QOt)M#Tm%cDz3^B;0}mJyd8a1u*VY~S>=bbls^VVgT08Kl_2*-8Kh$BzLr3hPHXNoX?ZVpRba2#98QY!L ziuEC8l+=dUlu(0|;=N(r#f7WXo%9*t`X7Bd(tiD`I93ADM> zjqgGS?K6!iilEJvIEKMCrtxPZ=Z@-Vl0Z=~{ zuinFJipQa{I(B>^H|OVnp$@K756u5y8&wpKAGfFTy(OP-r$XyV6Cdipv9aVxmtk7GYua!;dIjzV2Bl~5z$ua>{0@wQ zl6KHC7ip$2&4%mILR!#wg_4rq%&Ev5Gh@=IQ8j}jXXK2XIjLyWqPs@iTzA`Jhi|(4 zMt{*Qm)~^c=eI7}A$50M(Y@r#j@IgH=FoQ&&t2B={u77(Rw8+8Uh@|(M!qLDnNR>^zeGvev8{A zsz_Oy&m04_VX*sR?CvAOZFqVbi+3eQ4u|7=3Wb^=ASnwRla zu>7y>Vb1dyY0_cK9Mp(QOb83lACdXe=;5OetUd9G`uyhy{`&Vv8#X&;O|RcnHluEn zw6peC6YDx}8=K)@uKor^0Y6u#e)!Ahx$*MPx~@^rzSiA?^(s(#omz(dx!jFnyqjLC4CSPfwno}+CJ%vgdnxfiEE=B--C7x{4 z|Me2X8{dpDVyTCt(CBUX7@pP`gQpRAEg^;oJRQy)66NN**u5b?i!hh5nPD@e=$W1w zk<(*Qn11GD- zU;SW@T=x3l=Nl$S($gWfM6Y+={3NMuV3Sz$I&hkl5e%rxR7$;IZ?+`CXA80&7d^bC!6ggF zpH9`RDjSzI-im7Wm>M^>y{4y)dZMR#^{k2cQ*8s%x-B#LxBNs+#n{rE5#fnhgEw^e zF|*!kxZ|fa<>O~e7&bbd))x2yK~K`8+Shbe=P!Vh;)xBnCYzGN`LG94d3dtvfz;60 z2jccbJrKIr+d4co)+vQ6Y*?Bb_96*S{&3Q0UOowWYESkE2=G~LhvO^#Cuw~_m*Su- z7gEHcQG3W~y-?YzTMK8B0ud6fhL*Zf|^^{+C*Aq|Qcf}Qz+x?|?l>O$=GisQ0 zaIiv-iZ2+IJF0Pa@yIRRH*AW|&GjWd9UFV#*Q$RND#@S|Fusp4zF-D7N_v2K9thd% zc)-{i%cCqTOpc1Mghj|m5|CljrW?3I8G=(NJSHsk$Vy9hU6PDUAq>Kv+qbXx*@yN$ z$Cs7Pom+~xH182<|8L&=>#^Uw`!3&qZA;7AwJj~zLN4@uABT}=oa#@GbFzp>jQc~_ zqw#k5Ys|}|WqYW_F*`hNc64~TCAwVpYA89*;1zgg3ebb>qU1`|_Xp;uO7Ih?7zoc- zf@($XMK{3Y<2!u|`&TdL5ubj>qnEGlSJN*mZ*Oc^QBkR;z0tz$$5Hm$iVdy5JFfnt zu4Os8#6bJAGIab+c8m6SkjmgVVMexwYdwFs&w}VR_O_w z2vdyU7gFPR^*Np7LA94hJ633qI;t-J)~|VfdV}C6w6#AiKR>4+r!arywESrW(+a1J zToAJ$c0t^N_{;MzABlq2aFnxpUMmS(%!fp+5H%>6P=+|J_yRLsE2~b^J`p#K2{h1( ztKoT#r=l|_|9k1>3;g3IjN^aFn=m1dKdX+byK?O6F?nm}H0~UpzOiQaW50j7th}sv z^Nblc`)k%F#cf>l%iH;_mE|+1&73!%mqn~yvSe+<8$0eAGx}`i@T!WciYFd<;@A0$ zmlTcsDlKh%$+(IA>gz=BsPkLpL-HH&L&I1G`Jr(M(V-ccRy?CXmc7xT>EZJ5)c9z* zDK)eydP{0YW=7`l@Cc_jK1pk0OpkEJ854}2q%5Z=B0W>{L%-{V>c)=d5 z+b7+zb$3=a3eo1=HR-Oc(gSL3O!QL^#EpKA|1>J{i3bx4)c(>#kU%~zW5mIpr^}8m zqtdhyBMu>{C$WR)KNR{i7E{=2|JX~P=8&R4%|XVq9R9ENt~@@9^6o#+%mLtd-*$8o!Sb~ z!GP2SoxDM4Xj9t|K?yh&XCsYUZf{yAC8r+>50DS{Z@oRjv zK$VoL6eRN@C!1>^AHp(p;V8sajTO3!+|pUCX`o6{D@b8p%*Uy}1(g}jC&AM_7b#_4 zpj^&Ex|VF=(aeJ!Tg}70OC&@?<^`C>*{c9;Mpj;X;-v-PrOS*vzzf=k;-Nu8u8mZ- z8@HJ$NeW(Nr1k)$l5nH6NDjnF3*iaLdE@{AHrTWfAH9~({i37V@!ccROM4!;_O2oA zPyabBU84G}i0-R{#VnQmI@AY(xx;Gr#(N{}@$p`>Js~l{03F$6C(sVB)g56<5}K}fwqcWKP{3RYMx@kb-<4iD!4(IM@u?QpHyvK|AJe;X`9#2u zLS|C5$03IU5t3Z~%%vTQmnI<~A#$m!Q$aqm4-uBo&hF{dOjQSiqWA;~PoSF%TY|+N z5)9o!%TR^bA{fJpC7 zgb*q`R58bp5e}=Yc!=T5I|@k2)y8r|(H1EZ0nT=d)qspKHpCENg53_`9;FamM93z{0_iYB2cw0)=GJzKi!veA z9EWe*w*&hp3S@`d38w6zm$Ra|e&YKV~0meq{VJM)kT6CVP0O2i134PC$p zx8){Sn_P)L)6;kILuwA%I>YyfqiFTClB(9uRcBFC`T=-FXN>7`f$C?1d=9Jvv%+dA z5fQ` z#m0Odhd}^@kZJrcrNEp5fyO;R61YghKt7L3CI~K9vPKA@v}?KNF#GJhwng3cuk-vi zshhf)cK~R}fd?w?d9b6f1qFEn-^@F~03?h+@+S@I$LdFK0-hl(>1>6hlLQI4m{kK= zCnY&PJr)3JNy!tK=?U}wMaqOo_Ec{AgoN0IQIXS2?D6e*{$NkCiFw-HmBmZw*#adI zUQ~K7iNU}#29y&BG6Hx?dtu2+5^@}12l#=c1IY(c4rCq3HjU&riX(c=vL=FL>Vk_< z^TOOn*{a?$7J^7=!GlA_Je8L-uWH8|Z|oTRV7C9!icL#T72R@6;khpT2XyT^pnn&B zA}oEBm-p|*J&^ml@~Ez5rME)z7@S%&a@51IbI;G4cmDjm$3UeS-=-Xt8faWLV}*Fm z@`Ukue?FN?C<#w$fJfkFzY|8yR=<fT+SkCDvS9U3jqhuH8ij935C_LyDETGnqtVy~!w zn2A~t&RIa`!oAR5TfXT@pK^M?Fs{n@D39d)S0G%Jb!ZqW{3@WO5BU z&W3T|bY2zMTN+L$x-0!t-Mjnqv3d_%Unw)Xl5QFI+w4koL~`*iyFVYJw~di6V?%*A z`X-L({Z0!xnPdhm^sET0#lZ2d3(fl|W!})>?ROr6Hz52*kj4VY&|-BT6?LZ4_sZMK zn>cc*`=nLE$~03=RVsi4OSPwjqJSL)s6ff3K~qhvBe}!ROj$Igj~(x z7gVciGt^x@aCNWTSxLWgIPy+xLU_oBhgo5bfR+NATSk;3*({3Aa zcoiZz*^7x2eFO9Bejl48Odv=|9tW`PADoZKg;Q|!C?kyJsS>XGf+*L*YZ_A;cv zsYi3iURf#6X_n|ma%H%8(X4wYg+;n3ztE-S7dj1YAg7IpigDa+9**3A2;=aWaKD%;fH7+aTv`NLio0!9S^^y#6-#hAx(VS$zt;eamAijLr(yvmzL(DCkfT zD9Ebt=AGGf6tnO6*<&a|KM2Rb0y_R8Lig|lh#H6pY_bV9v-=doyR4b4z>J%p_`iIg z4)Aqp+3U5n_4Tzg*KmJfpWa19<>gm>Yi7?{y?Rz{Jx}P^i@xfs9)Epy?V9>owX1nT zQE%<5HHs(m%6B|@_UbjYv)@=$fF$YYGNkm%~^?P(F~Y6{1?CgV&?DG+f0KXDBp&VJ$ykS4_$ zin2@>?LgVYX5xBnH=fb^cH_z z$wg3n4 zx0d||Z=A;#VKI0%`VAXxfha`xn`6D^hycU|k`y$LASoR}HPzKqaM5r_w5+RuaA+ez zM|Ws9&lzofGSokU0S!iqkgZm$&1$zgtWIl`)n#=%JdS8bj3d?&=kPk>eay#wl27(q z{Wibd@AOCcU4FOUd>&6k!2-{9LXfZAQ z$qAKdy|cqXi#RSb45sMBTe_MTJnKu$aX7no!BHGWE7vd_UVh??p|^#!OlTV`)ZacYqq`FpD%PQ^0H<$&1851dD_W7l$a#fjM!2gVW3 z=?jm+4c|AT?LlD<)|4#X5A=BT>e^YWpYLBn$pj_+4eG2lYi3ai_7mv?7=>!JS}p<& zbF<`-!(xoEZG>9mbTj8j8SI@R!70-4uj+2Fkz^5eM^;lk;4ULm`k-_0fjRl(igO32 zb-A@&hg&A)jk?EXTM^~zkQIMdDegZTktp3nBnm~3I4OE$u33TQ0{GrSL`MvXZnn5U zI#Y|cy>-;cW>~+)C=-Bx5pd{+eyg5)^O?h!R?&OUXH&!q=R0s$lf+#GLiR{|glVIl zCho|HDBKkCljxqXvIE^yQIl1)$%P~3E-Fs%R+!O0t7KI6^aq2zdU`Vp9L^PykrhLW zC!_wBG>cNP<^sEildVV4tkV5Wq(TF4X-%^%ya=&9oS$oC4SV)BG&1EZpZ)dM=sa&c z4DLe6f;Pl2B*HQXUB+mLoNB1T8Vyzo_>&`y4y#XLegLAE!mrpNY(&F7!NvqCRTO2) zq@3pTSdPzA&rRcIp2^)))rX{7$y@!xHtEo{OYc9g{-6c~4t_dXtiYQeP0?JikW!0) zJU1*h)i@WsoRJZ7lv$2}a^;S)nqvr$4X-N&9YD2!kfA9Z;k12HHHrGB8GJXS8cDKQF4UN{1n% zkq+q%k&nUvz0@c{dBkiK1du{F5nAC!K{nafU-RYHBBYB7qfh7**nqW1n2uh`LPshS zXH#uehN*GfgC{0??97rJm8dXBv@InzPu0C%BHjS2{g7dWyu&21Q}|4C;8qIZ?ZK73l}Q;)UDsE(_3S>O3S}TuPEbVyfFYWn#G<74L}xFmLtobAo&sInB=Ol&5WHpxtm zO^-FmIR#_#@B3Bl#K|*kGpmNG=gyx|zvIf`tnR**>W4w@dx@u4@a!@bMtPrq$wMzS zyuChm41av#wdd3`>W93LD`$9|)pn$I=H!oS<~%TyX2^{?ye4(GWX0$Fa4)At{F%AqKGhhw?+ynTY z>E?yNIH?5h zoBeND8l0Q5V~|D3jg{_iTL3*BQRlv%0!` z$Q?an8 zdtUJQL!G+aPH!ME+JMzXh!E$10l9)@awKA7!%_fj%hjR(?HBA{?4xGCcoKD-Z%nvp z9Rd?taDsN>+9?!>?EV5x39@J=E7#7jFKLf6H)>+m@HKVFAk;8D!@LL?gyCy&M#Hzz zd69mGFvM>aJ;nZfAN&B>V*W*Uw!2>E~F4 zm=R-AjJKnJ)rC4|#AU_Um?Kb^RPCRgYN|6=#PKjwJE zAqPx8vnSCRApCH5iQsD*u80ZI$adh0#Kb0p;gZG{BxvyzmYEtX65t}i)ZoGPJni(L zrMH(q+5Z<$2Kd&&>Z8b;=Dc+9fw;w!k)d7o%;3}N(f0cWkEX9T50=kg<_clQ59mF& zZo4xr&7KtX?wt9(2dGW{!jIo}%mSA_1S8 z7CuT6Q81&0I4-)8BGjrBU_~{lRgrY3t-lYA)b(|n4bTt{o6{C$bJ^TBk1g8Pq^&!A z4!h7BZfNjAtR^S-1gi8Qi;D{fZt1WazNQgIbMj3>KILJZ^I%4FqKn z4SLYJa@<$o_rTl>jgcwt2Vemh|I32a3P7|;)i7IU*=g$q*EWd6x9($r2sQ8T~# zs+gbX>;v~%hDej;EqRljV{H_(Qc0_1 zg_SZ)cVh41rLr_JTnC58%^$8)oc6gL^70F`^*TFs?$Wii+b!Kgx0c;@dyk&I zdiN>s+pqtCI|kl)*Py{eh7KEk_lSEcMplj*eJ>j`wrbq?2@~&|^ow6ko>Dz^+VmMU zGiTM#zW-MbJowPVa~`RCbndU`JvM*A!pEO@a?w+ZpI)-`nP-2q?78L7zwp}?FTV8h z%2!@}ZPn|m*VMnU_IK;nzqw)KriQmRzx~edxBOx2yW6(!c<+xp-~V9O?mc@y{OIF- z`#<^gz@HAXKY#X@Lx27Ji^E?YIeP5)iIbRK0BJ(jbP{GyJbM^x{F!(ZUW>6rY6{Kuq>r2M2VN$ZkRQj95yDLE;9bZ2TH>%D+**Kv~&XiO<^_CpIGZi?OR0 zuVOjelgm!dJ2~_OSzp-kX~#z~_T>+T_r$~Ngs%{g$*$5ltZc7sm$kon(-Y-MJc~~8 zvhXj~vDetIffB!+Eo0xZ$Ka2Bg1yMzV5{)ZA7_WzT=onk!}E}$o?{Ex2awIqv6t9d z_9I&RH?+6)>?5`p*qvk8SoSolV*A)Q_96S29bo&}C+t)94@gpfW`Dvu_Z!#*_5)kO z4zbVJU)V(U9Xo?HIwrCE*e}>*_DeQ}tpsY5AW z53()n6*dP?=Mh%NPP6af>Ai**OWPXRC15uE2lxIp`-XiE8^o9F2s_G70H@(NYhZ7M zfABhmY#n3pje7!4-}ThF01*XRm8VY$;jk#r7=w z4OUW{NXOWR3;!C&-=at;t56UV!P2qj2fpKTPykd6Jhp?Z49AmDa#42T?`bFxpdh+} z%|JmuB^!^j7-cTXe3UwrYVG%&elxsT`6rHzDAXQZyBuX9NB{tW)!r|S7T3o$-`bhzZb`qD9cc&UAms?eG_F2 z3bjr5LxsMh^LL@p_jI1F!*@J2{2l6ND^UibQ2RlYt|-*cjriR~>^Gy(IM97lq5Gz` z^?RcJQ=e{D=y%k==0)$HzSsLk{cB#RU(L%3^oPdh85C-JE&irH_e8;S*XIZAA=!!N z&IV}TH(tixiqiaf(m2x?EkU8{>AvhJy|sF|3&%8m^qm)l#)IY_)lq;Fu20lW{n?44 zKPP>x=)P}9p*pCqRHz+12dqac3e8h7cWB(HPc%=r;v79En%~q86}o@4L33I>N2-h3 zp)uC?biA%rX+HLJtzKyS&!IllE#48_BR_%C4+Zl=tfR9-`wik!#XBbEEY(l%2Ih#E zAJh+eZq#>u?$A7=`@*0ktPuKO1!ZSD^F{g4RC_I!{#oQE(vQPmh5{F95%I9Q^4?aHFR{f1d_7SqlCH z3JmV`9BB9RpxVEM&EiGysF%S{UIB-CjjaOJUd`43ujvhNuHV5Hu^t?21KY?p3BEv_ zfVjdI_6Km3cR}s9vmNX`_D4i)z7L+a3w&Y^xZH=}bsvMnX`JnV;A+In4uS7{4lZ*z z%yEu^-<$ydImNybyy$Q2@8GTf05AIvT&}EbAqq_2rha7GvJcoTvx!aiK8`g z@EU>zgpOf=Gy(fOQaB?x!rZxy+buK3*G#;B>cnwV>{G{0zpuJ#?6@g4&<4eFnuh!9sBy6rbAn#p1X`%t6xN=wBZ^s}BLIyHy$|Jt);n zpUH`GZ+V>jfV@Ori}fK_0Znq8VU^)WW4Up*@uVqey4y6@RB!s&^u76B^C?S(Ws~J% zM1DkN#Da*wMYVA9>t5$od=W=TP`20#dw(eVl!T{j_7O;|piJbAWTYbCGj{ z^PuzZQMRasQHNY!*ErX9*CqEz_jB&QdJ;VMcosxkqkBcqi~e&=Ld?*ZZ(?&}C&X@w z%Z*ze_oFw%JKy`Fw=upf{tlnT7voFy<@>t%%6-FpRlaGyhkZ}@miu1!HTd51?e`t_ z{oVJYAFDt41eO$_@{8 zc&WqpdHH$M@)qR1o_8pJPX3em&*!hse=Glw`Jd!}ng4D6g#un+FYpy)6%-eg6-+32 zwlJsg?!wm!KQGEC8dkKVXlKz69kV*l==ey-MIB%0xTfQW#qQ#lihozUrTBkJZZ8>8 z@@&a_K`A&YI5k)oTpD~ixGwmI;GW=T!IQ!7gO@v*I#qT0Ri`CbRlZN>nl6qmUAjEf zWmlIAT?@M2-L;yi6zEca(4rooN?5}gG{OY!V1sf==o2_^nye-e2WdRqcu6_jny%q$ zj=0fnplFJrm$DzLIh1L8X%M?8jWE;_1$i15N>=K_nhBj&qp(?@{CwT*{97PMzx2ciYqHhlzG zywk~?ZJRy<%-1#^`dHAO`JS|4qTT`9GFsE^fTc)!1ydy{~+eg2=%`+te|-kCXP z&iQTUx1JdpXN)=UB{No9k&}0-`r0+dPX7#7=ao&GRoQyz9Rp)855f6J|EikS!>|4R zAY)I@VoX%|*K~MZx%9g<#u8H)<1f{>E?@P#2mX4Nu~fQ$$MTx?R%XN>yLc4mw&hLh z>Yw}G-$pQ&wg}CiH`K1W?alnWr5GQd@aYY8HMJj}IPeVmpF;nU4Y**d7gGVxah#_# ztm?SU^2ObMVC^c70>^@R`mf7_jumEO)qy?+7SHMf$3~XR&IFE4EY!3)aBO8!=DmUA5VM=z#RTKB z8S{6TPXvxR%e5p0jwKdqsSF$o=Ig&M4?0#@lx10b07lGptSDNM2q?XooZH>ztIy^)C8J@h{+^pC7V(b(>(@pQD+)Yh%4X1grPG_Uit*0r_chL&X= zHI2=U&C4;5AGD*M9SwD!`j%!8r^fGZS=EZ})S;sRqc=7B>zYA@AxTrIM^Xj`tM$~h zx3~BkYcQXuw#DDMs;;@Cri0+AZ)~b-_Y9#CwHrJYE%hC1Yuf6PGBija%WW;So&Gv) znA%2gsc~6nN1X-(&Cq{Crl+yl-_%)4kgRR&XlUu|05Gc>0~65<8sFOq!OnIdO6X*I zR@G@(w|0Vy?G2fpfjKg1&YYGuPkSB20lgamY5@J4rY0OQENF%a1EkX?THDaF>YK0< z8|pjTnlT|Lf*WgFJnb!+p7zdVE9(3mbVa9eQ&Y=YLdf6JT-!(lYcC>(RsxxtWi4y! zG#qqs)NMSGfm!F z(*~$Jn`+uL^lR(d8<%5|f#lG!tqnM8)1PY!&9HWDF4@gP82`-U3$X%Td{Mweb+ICM;|8h+t;0au6 z@FbC5ND2@Q+?f?vHOuO-o@m@o@PT-@rlnDvj_$0xtpn@EQ`6dtMOL${35%dbze!NuMLUm24uX})7e}b0C@mdO}8Xzmge7Zw!Ni^R=37FVpNR> z+*^(T+XL$uE&i1?%j-N?wIG)!u+;H?FIqv?YEwaRK~>i^)$6pIKE*S&w4~BgQ98A9 z{)F-=p5h8mS$XNa;>lAcdy*zp;5;eQGrzcUdgP_n=?v$$k( zre{i3S^1QT3QuXdr+9YRtl}xSR$MY^*4)X(CDS|;abHPkrDs<0?BYrcT3M>y8W^g0 z3htZgnLVX^(sYbGVPf&D;>rb?o~gx^B{b$#3_8J6Hle(-c+%Wi6UsehbIZ$0E2dzK z$r!ezxMXTMW|=a33Xs4+lS<1LlowB%UYUuTDseH>Q&~P?@|4*V%4cR0gr$|!r<8lN zF4=$*V|b>_qnj(HPnb2!GqJd`qOyF-gxS;=T|LuEN@o*|=9WyJP+44B;+Z%Fs7#nR zi!K5-P+`)n3B|KBJ(DNQo-mEj2~I-Y0_Y5ogKn5MrDRI^gjt!Min1w_is=A!EH0li z3DBY^Xb(!@Dn^=AT2e7(&RkqTzu**L$n+^19zb9M{+pyhrlDT~bZMN*(sB?a0LuL0 ziYb|%3FXBV#F44xr2v=si8~0#xu7Sy7MBFzB_7c=YP(T7(2MR4P;v5<39~RDgrww~ zeKq--a+|-d6)UbixX5)SsVP)li^51@W$MZRQa!C1%U8dq9b$Q6eQBmn*K+;(K=U)8 z@iiq(Y6NN$R!LXFwQK623EN5YLu<5>Gtz}h9!2Y$@G+{E_)!)lgTUXPB z+XBiFOZ`T*5HyUfZH*XsZChgpREnpj6Xvq5@%Dg8#ta%(H)BAv+zfwPU3)7mR^ytw zrghnvtc~m%!3*tN-_o`!fV!q5{T)R?x1qzcoG1mm*MU)&XE$_ov=-&$tX;b{ds)yG z%Z4gslUNIDW$RcQYh=q=1M7f4I)wRI27dG4cjmHu94$i+51WWS9jqOnHde=K*eaHZ ztHrDt{j+g2fi>aJ!^-=|YS+%{a8DiXS%dFd^!(;H9yU+wQG@;!7`YjDc-U;f){Kvb zl>&k$jJle2qF*^aP59Jk<9gU|j5!>TeskR5sKGIVBWB$+;{QD=gfPqhnhwZwB!<}uomqu*IH&NE3oq51@YO4!ydAT-I zGiD@i5r^xw*1G-~{kVf*SdJdl-l6e`xJFXas*Tnjn4txucA$47TIsVKJqRB^+DYz$ zSafJm&|Cx=Ng4I?YyDQCr#^ac1nRBRhNQxe8A)OY!XYe)P3<2eNt0u`w^kdEaBo5X zMvSN9=Rpfy=>%Gov9MRn^+E^ZKy%4`| z#3(razybFu<)K zU1`2=Y6Q}jG&ZdWqQU^hg6m~~YJ>H_;QI(eTHiXimT7PdmN%UubcM$M=R74`2?w43 ztF&MJoU~SuPXC6fIRDKkK~QkyH4v)j6!DvSkb+tWtW2n15&;m{RpFmz%{xfs7nb$9TMuV zQ}<>XQOm!^X@KK81_P2tn0f%u{}zH9=ee041DFQs->$6*;yKMg7!2kzt%d=uPSo~j zG;apoNWTQ>>_IR63gN0trM?Pu%}jKm4_T2q9O)DqO!>8%oYiU+PWl$>nuI%b9tWu# zyo2<5&|gS`M=^L^>b7PUW*ls5NUms269ziGBnd?4;JRCb*2Y2D1?Q||w`tratf+S@ z{&Y)5tDh_mQJA#N0DXgS2d{k7GU!|(`$aaLydz!q$*z&)+$jG8Q0mxyn;s{=bmDH3 z=fPC|Hp&k8Ekxr1KHf-4!t7sRaHHIju5Hrjr(+XbbwRs9o`k;k$QL09>5jqnSYN4r z_)9gA8k$|VwYqc-XxQM0|9@z$n^)}sR=QtJa;)3O`WxhKI-8{=tpBOKwlc0 zeE1UWY$p1bU@X#nQ&^QY#}tf4qn2Vm8hbXb&cZLvN&V=KNw_i>=X5*`*Cqz$E5Tia z1NEPcPh|koN?ae9^+u>@WPLt@Y&OoyG5+)b%o8wnu{IvTPxDXJ#x2qAqWh)>Af15Y zGTc>;S&K2kT--%xbagI%%h0a^cj<5t{Rr9;^ew>{<=XEwv=an6Cv;j(La#E+O+BUo zu1XCGnu)NZo&;4T+9!Y_bU)2HQ@g6ukZ3|&CRheWp;(IM*5M%f&kKx4GC=sx!XMF= z=vbl6Fa=j<A;<0iDqdv_?qAh)dKKT%YXQG&X98mx?NeFyg&xJs0zXo&3BKvYM4gZBB`qVHn#r+fzW8|(=Oy%F7; z)MF*Gk2?J1A(79n`-J5C>0XNNYmis2N7)n&=#gqLilOL`Z1aurUprtVKY*an=L*{Y zfw3s|qAUn`4m2B4ScisY)2aEdZ0*evBSoqdm$YG=wc2rq230f8YXAj}O0A9TcAN)e z7(G8gI1KRW-|--b%fF*Pd5Z0jAU(!v)F@2;Wj5v_%m`9FUJKG!r$D{dM!rN4N}}U{ z^pUS!q}@B%FD1W;Ja%2C^vnQVqj{ENPRfpT0Gc9}gTJ-fUpD*+-F^>b#j>@TR`Fz> zj9P3DJCDyXe0o@yw3(ge+xZK)c7*lf%6sfhd{@a{*3I_g483q)4*QT%?YoDqXPc$< ztVb$mhk@xk@&#Odhjrm^53aPJ=KC=_#dffVQ8_-vUSO|dB$b6SNt?BYU6Tsg7Z~H1 zG>)y8>M_ecwvXS%F0po*DVMkfy?-SQ!&s*61o-py;Uh%9dp23{Y;HT&M z1>be~)HLy$sfilCspyoSaCuXPpuTkRq=xt#j)>4E62VP-;WkY z_lobi#1U0Ic{p5oQWb~8#S?qQp~u6OL#lXufmL}tTpZje4it&UaPnA@cvKbpziUzU ztKz#Bu}>9`sN&&yPUYb^@lb@=tBMEriU(A&XRo;bJ0Z$$RothF?)ng=TNS%hu~QZI zs$vIPcBtYzA!2*g1ZDeI;vSpmnxCq4)rxIfUsSfKV(Z8*>Er7w!5cgVLcOjT}OEN=D5OH{E~6^n4b z=tZ$GRaE1S>M*guDyo2E)dVpgm5; zRdPZ_cCE()WrqRiuVSE2()RMHR`aNK%CtE#Be6 zlPD4sLY2f?kq|24<19*io`|!EIG-FF6Q;z*iI^}EtrRKIdqq@asuHD&NK=FonJOYw z5w40bhj63StqK>=cd5dOVVx6&W3RAdLc1zLg+mFA79pyzsltlB*1f`_3NuDAtHKl^ zjIu8!OEIcK!L3S>ka2^YC4@srae_08!lMMU2;ReMx9;S_{vZBh{}1Q-zdBVsW6v5C zSxB5^dK@RE)Z*HczByH%pDgfZW!`k^aTq-(S=q^ub)KH<*UPHpSY^RUCGMn1HJy}G zlYjNk8h@3QIkT+FbMoUUlLMnpSvnclDylF6{-ev7ZOY^R!1)IgEWpMi%3< z$saMpN8F^8N;1nid-2L}=D2v};+0&t)9Xz2I=u}t>undYy`QOjjiF!ut<8|ZBn~|; zmckM#%*+<}vVoo=DGF1#!kA)G%m%YjF_?=)rJ;h&G06s#Q3z_}2FYx3T)cek>={?& zXy@qREa!6Xm0Un-RQ_yq41AoCqZcIcd?AwEBHx%S?R{%Y)uFuh^LcM6m-<$#-{p0E zJu0x_<>HutJ=L&@_k}8au8bL(K{6O*6EOKDA#`o*mAqW;OxFIy<`WlAV3bSJF#0g* z`d8R#c0oCfF%nssuOQaSs^ZN`q}yH<9U>X!aA#sdd|YfybYw($nA_!a*h52XRb$WpRs52E{?@~f$vUhR|YP6k@uLa+7_mM<#)?rQv^ z@jwG->DOWQrF2zoIN0#_#)FO5SvqHxs+!KF2C-FrT6C#3{D4}sPks6kbs2w*K9BH{ zef$6z!V=Z@oEULYM1Y8Lafz%{R;-*oyJ^g23lk|=ATl>ubLIH3^b|QVUY3=ia-nJ!1Cg{~ zgsYH*N~1F*3Pgv*88x{B8w#aDo`1^>+fnE3E7!j{=GLDyy!NLzUy6_a;@t@wMkf!w zeb(yjnYVWBIKE}V{nNybzV{}+v*W1x-}N7_o;L0MA0Fl2z*y&gRI_F)|hish6{wa*<94)C%^f@=o<{vdiGYN=)#D z8XDO0P@}~V!i3cl>HvL4LvU~>bRU-_XP7H8IZY~XFt_Zw@|Q7V50=j0Qm?_KzSsAt z`k(i!|9R-gyl5BCk>>Moux79NH<7Q6?eW=JgCQ`s#mWQ*KYIm&8XVp2aydsx>G=_^ za0e56wZThfs%o$LH=Zf^dCvVj`_N13>$}toecxCAM7wK`NHgSNkQgT`@nt$ftW36< zjj|-0M5E%gHClLRjmu=S2(!T{xR995E?dpE5QEEc5o+(3_z>TT>5gl3v zdWrv7ope;4%wLlCsFRP;!7=_4#yzk8O4^UOP+&%@6iwsDFLrIL~=k-NLbtnCI|MM72aahr^zem@F|aATi)QM!EQQ zE{8$jWs=3)_l0!VVf0^y1-lP$2$tguhrBTX7?>zx%@W)PCehuO9cO4c={7T9Ff~h= z%pdC=+skv*3&6;6eWIMK$!em{hHcVwWQhwGXEgm42Vnu31r`gEB6&V{h{~6HkDWH` z`Nt~Ey$l+o1^l;Smvjz$)fXYm34T|)KeonImup}tZX3&Thv!1{p&T7=V64kz5iY)w z>$@MZJESy6dGW6Ck-SaPhTtdy5ZrJ__WRZ0z|#!^$Mxzti>?PlG)Tk00w za<|fL=r(qny3O5|ZtDSdfFFn|xV>)9#V>x4uTFe)7O;-dIa+qWcE(4QGmCP$HwE zW8{cf#b8j13|1vpVWIZbR==x8W`2o>hZ+D8jHbyQF5&>r6&QXp`y_|}<=R=z5eR5? zMc3-epBE&h0+d2t$O6v4thp-vGVa)9hx6C)M4)Gfj z=X+Mi`IBo5b>SKC(=2jEM52euW`|ouyVJ}W1UDcD+?sAW3#lc!C94G8L>8NQlQgd- zV9k>Y2h4gu=+akhcc}lN{=Vs*C20#!FMIaW?(aO}+4tBB>$jA@x;l0JtCcVP{6``& z?C_>Ps+Ut!&y6T}@xjh@NA_;0y>-Zt7rcolAAaOr_~6mtz<5Z41pCnLyM>Do0o#By zj0mwRWRVqEWT+q}D>58wMJ|HnF!~iP=9sM(F3C2NQ2}lSvuuOP|E2Cu>xPzeF1(U{ z;V=zyto38)3+{zO3ddS=M8%B0ZvNr^Kb(Fe;mxUUOzGQ}qDXxP@lJ34VRb*ReVJrN z2GuJ8v4^ejje_SZOtRu(9s!5nQzRQb@qQ!R%4Ly$hva8-9Cb#oCrmIo#w}SmzIlw> z;`R~?;7ty=1rFkZ#sl^2V3;)-0+{474-y)zTkoOym0ODU8PUXR4yG;cRTFAd49tm=arRt6W__t`{Ri_?jMo{$}a*&4Vs=C z%EtISW`CmayCd2hA@gm^9R49SiFL!=@T6_b9c^$Y4eR%XA@!v30QcYDfb8UQO?5zT zSy(hZ}zOcT2Zs~j~^W2_4j}9K_Yl^0#fu6 zcw!*Cr6`h+5V%8D6mUQ&FdqhPkd09JfzagI4Jtz;FY=*Y9wv@DdO!M5So+2)mzI3B zT^UBvL(FKh*3`NP%8Rs2kdm8)akZZaZ_w!X6mhb}wuKoIm`L zpGRc6qH&je!NF7-$;p3X0ac(aJk75g$u(C_=dLKYd(E!rwzWR+jJj@R6Cd*a)1SP0 zaMK;?&;I=GpD*xpn-6!^uRnSlf2ZT_*Y`DU>fygm+uisq=g;1E-)}M!j%>Z4{^ji- z9l0VceSCwz?Zn1~O)#HqJTRIS;CQ|-Ho$Hhm<{IF3<19xI1PU5%qIP&+qU=LAYKo4 z^d+vzp$qYj4tr2RNJfK^0munG`#?U9nc8_fwt~DAVf`;(tF2#y`XnYubir0 zP)Dm5Krwhmm^WRE^Q(Q?CI?0K4g=HGsO94FJHWT zMw0|Y`B*CbI;r1Ako_VM$bo`JO6GguM5&J)_%UD!I8sRXA~8?i-%facYa#7kp9^Y{ zGexX5tTA$lMabbs_|kdAuxnS~YMP~RUclvby(dKZ*PqB<@rrszeeF4Z=m8Lo2Vpsi{fKIRztL%B{=+co8MiNP~q_;#>ar#oSDrIZ*+p$6=6@1y!Ipn zu9qF}V;Les)!2Xa3-#hv$LpHm*7z_W0jlf zR)6X1jVY_%s(a*>nmZdS$J)O*Kl~lOd*8x4mn@v#GHOQow23c`9`(egC671Fn_53l z{TpR#uKz}TO+Kx3LZ|pxi?1Mi_|O<%Y@{L7#tgSbvfFIVtf99JkM!O)yl8@NTx^I< z$e}S=*>Zw8Dl8##Tv&S4xDgW|Ruo@C$52*63v{$A>e)+Y>8fU4v~WGwXMTV`Ang@< zWf^W@Fh+-}R+0-fFHl!Qk?;gHlx1=N9nef83nS6)VdN!hnwy*!>Gh2#>Z;Zs_w!Tt zh3D^@bJr1WdbV;)yvbm=|IS_NKW?q8;?l21-!>_0;;styQ}xO24b435z>hyQo4Nen z!%LelJXF)Vv1R<^p54FXqomOR3~>E8X_8`VpXs@K(DM918fn84Tbap!pV?z?tf zIGHdz2Q=FY35nHw1q)l_o2a=1Oo2nDVC5^af!qVLA}l6+xMC3&YJ~d;m%-@g>)mUu@zAwm!};92@NG-F{n*sPiN` zm_0h$Za_xxEcwZ#1$1`-u4Zm3*$b)PA)u64f80T0Cr(!WVBv53?rmGir6eQEdQSZx^#V^mvT|L}T}myBA;#gVcDvoj`i&slbSa%M?FQu1TFCpV?e`Y?g- zTYAfQ9`cXs^DUh}o)nPHia8_p*R=g)&JSKlP3GH=AaW!5{7~chdf!A7!cG(kkVD6T zpdi#jQecJzNcbT02q`f6rQ4Cuw-})2EH%gv>-FD37D_Oylg)+CrC4oNj@%Du#f*y0W-YQAO-Lrl ze!IzUnPabW0R|&iTsA914({zhe5<+MU%Y{J9Rwt>ninJmVyHr@KM08&*yyb3JOYKNXXY^}5tgev_^9Pnn@nV})-FR!Kh#Ent`#aVz*I zkt-DB9$ZnuHd+i8gsbGG7#K3k+VZ7{L}wah2ZInA$>87<;1&)wb|FQDIK`;3YqRuQ zwQmAH{*n6dE3L$@by8Q~gS~sD&yM!JM(YS1vj9egjq=3|)TD}tVF;yV4lBhKB=ev_ z^fYPCEPI^~j{H@W^gid!~}ZDXf=lM#h;vxF3lkWk!0E(i8l zv&B}$#$f93a)ly`Q4-7q5?B=@LNjX!NehvIJWXy30TjRNmtakVkuC*g`sqP3JMckP zTsddNfB0FD^fWVZzSx%*X5>gMBGv}Z2=|!LWN{;<=a3zW!{9bLj1i_7vvV<9?Do15 z>?NB~k>bgp@sMWz7!OrHet}DB$;+KMCSCh#n3B``nTY+0yl$;F_5pA9?|d~(e&_3a z^6|^DiZ(-|I-yg&J}2|Xn*HfDv2{ZY(Jp&*f~GMkRje(P+yV2}p9UlgNBR)!!#P6N zm6X5YU(CHPXU3w&=DE9aW-V%z{wHf#{G{}%U+g~j>af7kTd#H1-@2RcKfMdTd(?*0 z-S>#jW>vjs(fwmKuS1rw<+^_Ocfbi?&z=r})1 z^@r53y4dU(9vdx&B}F@iMa$V*6oom-3DQ$NSoOKeO%x4e1VQXbBkG7Zr(?ggeDL}J zW#i)#e5oVvE#0^8r5pGVdzBmd$$Guw^_Gs~lWx7o`_dx*;LW@s9PsuL;BW~vk7JMc z%E`1?V25N_B3Z`fh!8AcTZk=!M~34#j>m>6AtAOR1A;pthx^T8{*XCVS$4)DZ>U(1 zvyHYQTyci7kmzV<2)D%tIighwK>}Ud5o4%m7<9XJ#`LqNU-M~Kz$Pl8CJQ);;1Ac` z*nZYY>h$>|*PUCDxvKfh`tw*52jBh8yJ|-LM^C)A=^p8o&=vooHt==(m-TH|F8%0< z=RTL__g($LuGU6q$!M&N_26JSYJx=}HYwEVOh`;HnI)senV6VRWU(eB$~=5S*yd13Ry=S8@o$ha{Z zDSYx%5_tj-=4}&@&8Nr}g-k?q48)Sxr_VXD_{pCw+p_M7htyN*uNuzPW-L3``s7cm zw$}CR;WN0U>>1_IJ7dNk-aM^pNP6D)w){!`b5_=cDHBh2l~-qYi}tMhm`CG9JDeSa z?k|A67@5zPAd|Zy$ayI;XoiIuW!OCfH^MbR2H_eaEHW-yhWs0@fSdeLaPt+p!>bOv z&fbOs9tH>Ct4m0{aaIQ2&@R6Ow#hfsskq!Oli6amg@oEoP>pW4OWS@xHXn|M%>f6M zGiYK|Y~3gs$=u?Pu5D5GaC(_1WPZgft|B_$&YM7|+-AA?_ z&ZjaOG_peSrkjx|Ku*DEveM6huQ%B8ld}h(PxsZWCZwle{LKcd?(H#?O}4-%4rHIT z!tj7+GeD7VQpl~rtpU#e_LEO}&+qz<^U3E_)$luMH@uW9Qdr;c-mj$EzWo9ltT=lO zkWU8WCRXn&xEVqd93{A8U>k84ej2!2L~aVLSILB&pKLUPk!Q~$jtEw@ZgNd-7Xa&&cJ!X>TP8gg@SMH^OlCIP7Z2J{b{+sAra^YzPZR~U z3>I#nL@5^CjiEOY1^VA>Bww@;%6+&v7vGyD3`xDVc=5Bo4CT_kuUn4olXnAuZh}P) z!_FTgn?`X8oIr|OjYaY%!)9p{TW%8I4V(x#WXwQm;j>gze1pP6O&jzM3i|tJPDWbR zE3M++i~C%?^m(j0&k)xAkKS&YulD*x3455~b>{lQu}tBpz`ZYG(j2TBwA0QAt!4>L zqgR>(mTf_jg8fj^rDJbWy&0U_gS`v~HOMFVJlH};%O9#tY~q_00$hfx$(a%1wvcqV zL9B0ptt&9li+c+p@P*=_`dzgu{&PO;^LRtpm;cpmkO^)!T^yBR4WW0Ud=`OVV2%+U z7F5gIq!X{borgjNR5SjQUg1A^THUSQ|1|#z82cXIp>|5xKgStU<7K8&rQH4uy94?` z%6S_%qaMq{y#?4UhsLrpqSEW~RZ(WBN6$Q;ncvB_!0D$NzCPKNTsHHhxpL;o(8`5X zKSqJ=3?Yv{-zaC{s0AE$U)u3{cdwydy@%gMKFf4ihVk-x)C{xP=e`=R2RoLOq&USM z%3@;aoAVI-SgexSri9u<-7YE2i3<+JZVxT8nOR(FXpGa$w#S&e!qVoa-jmdou`R4F z2CbQ?aj_26x{S`4G+{_IX2KWC33_i->Lu}n2iHqE4t*Ps#)SU$+;2C?eCQ{GzM=FE zrjybeS&)*OnwwUTevlpH2c?7JpnTAFFyzUogV6_L4#wJ#U<3RS>4-QYAF&+?IU0Q= z=1A-h)2(Fm;g^TP*i-dyyd?S)xGCQJVEWcz)JyvCC#6$sJBCdzUtaaV2Wh4^H}-g@ zpKX5RIV9mtU)UsRQ|G)lTauezUGT!YHYwlkid|n^;lKEN#;m?AN0!um?>lGzG|n96 zn!7MR|5SSV;oY7FqW&0AzY>z_WT|YIZIf$d_U(@5vrMx~{Hbdwy=wO68Wr^@pD=pFZoO z4a>GB#XQe*p5I(OZ^`eQ?zm%7)x1BntluiiE9brY!fy4`ruNPADt7{R&h~=}t09Al zY=ke)KHpL8X7dxPy$@ zy5w!{9pUb<2)n@*7HJ5N4>MTf!JR9JT(Jhg4}H&r7BUXvjxO_>9UCO{I**`~D54y2 zqu`=OQvRt>P;@qkiKC#$(KQtKj?WwxZChdt$cHFk@)Wdy8h7J4V{rx<1)x7G@UQVhj z@r(%DasTL1P-`YcYafHVZtOl7ZBQImMR7Q+NEq7TGuiFdBE`XNrtJpa#dd@mc3MJ1 z!fY0++o3th$kQ-;7_%ZsK1j#Gl=|G%TENiBUJd+;dvJ6wfmpX|KF!2z#WW&fndeBQA88yz(UJ3w1i`mFw}m zP&PZ_TL_;>m=z`4o{eN4{B*^hotPkb;_(|3D@8+#+q1K9k}-6c7?Mf-isI~^_)Iek zpC1v;x;)WcE;IDC$F(bKXHJ$OEZTEFb(SH z0V&mw2EKK#{{}rm8=>GcknSkdc3c$RB(IT$`4TJLnmxR*wRYcoZIZh{{rmrvADEe1 z{Ak&Ohf|}9PBia(wru*0pS9FIoD|!$ySlRa(-mvCsz1EGwyRkE>tEwypUuoZ_(JFW zg&*|n;O-Tz8*1i0ME123yq*qT$FTc-<$*BANL7JAm=mfv?15Enci6F(MT85NoRA26 zQHYCn%~`s_w>fr%@=%AJML9!|HC9{>o*0F^N^C&ak{D>dPtI8QK197BnZBWFK^-h(# z`KtKd=6Js9arM`{yC#8->&=K~XM-knnt@U9}YU_Lq-IsekSJl6PKG-#J?KvLUQ@FMn38?wcx2 z-Kvf!zp)T9alw!XZMWE$qd#PTe+aHjX#_` z(p5Zt|K_{m%Cg0O--p=dZ=mZw=(b_(qOVSSHbO~=Qo zOKMmWOSD8}l8(cchO5~S6iTcBJrWsh5#t+3jvf2kFUDTY)6Mi?77Z|GkYMSndFDx5 zC4BEp&G*j41Hl2`yWfyux%b<-n~w91S}*BJ`o`Jwmb=0?AKmD3XXnqX9JcZ3Mz=F( z_>4JO8;^c?)ScPlo4H6_om{+X(a3vN_N|q+Eb5FJKWfV-eVe5%HLD}X6|Mb4-)4E~ z(y`-b2K66k`_J_s1Rr`S#U&z)}!c$$Wr z^xsE4o^Mxw^3tRI+OHGdN;Pn$y~fDV8^}ktZ40kUFk9`y8kL|qCuG$$UB;8JRi3ul zIq{?kmGlGNt?olfJ%>MPZN=x-v+tD8DE;-G7vCzMS^A0iL_MZ{xn&EV$4y(d?0^5K z-%I1XJ@j+@lf~GRUGdHst3h{~ zwe_j3PWUDN4sqamqel!616A5@IM2c`?#cSYJ>}D9UbwTiD>=4Dz0@Pm)gqhv^6%s! zvVl+h?u)y4QtO)A=FaW@#}~@>Dm|`QIDhV+TG!u2mf=Hau-AaAldP_h_S~YviWDyL zGI+X6*sVCwcHtHo;CwKr@P}?Q?=(U`8Dyu?>@-ajUBfKMGT?Rc1zfani;fV`N3{Q-R zjZ9}Amd-sqCp;&jfEDm*Y#Lt^X(t02Oz1}jGWxpT8OZ3T2U7a9Q9&+9p7!YM?GJry zH%{;DP(Qso=cGS%$$wOAJ$lwL09AqN`M44l9mSOB=qPel;9S`h3Jqln7K_3ZYq;3X zBKc11_K?VknCPhRFnR=#GI*SYN=|2t16G$Z>zcK_HWtsk3|``a#T`(lO%NVdkB(9 zkq#T`yo!_C!$NstWK1CZCF~$OTG(`x!5D;IP>Yc+!{tB`AsGB3CEXwPj_lt0e3#L* zc<$zt-u2J_qQ_hObmLtQoB1(vms2N4mCk+s`_j6v4<21svu9KKVp_A$f@7zFr&cw< zQ`6W4>eVXHcsGJX+d{mI87Q;6lgcwt+A^cmp1wYj+UwtbI*@w~W^$9CeR?1N;*Gw2 zSK;_h7B78$5c6SIkdln~Z0xW9qGsTwtTKS1ngQUTnt^vv&0we11g|DoG_V>OY6dz; zV<9J?lLl76mAs(@J{ZcU@6&1q^&u8i4Md`xXc=mmVd;{ncF=9PU!nTJ5$T7PA6lFM z#3Eb6OkvicBE?!HMp&nzb}$*WgKBdnRSr-$@LSi3+Z3uA+=Z&a9o9$0L&_f0QSpT7 zsO6y5t5pwBItW$|7M-+n+o9on#mj2UlVjBnj(|vOrHOr~#rCfcN-ceqgTDR(xP!1k zuO7%=Y_)*J@FIS((rUAK%@)+CEMBVx^fG%vEyatx2=?a6*iV415;B)f;G9J34_Rbx z!luwc)q~4O9@q{ zJp|sjxy!iAW#1X5KNoCaMzh--<~G3*584L3)&|osQ1rdIK%^~~P|7)An<=I2v_Pk@ z5W6lBJh*OI{@sy94=#NmzG+V9*kK<&cbxy`9p13=8THS_vu5mDyt+~@={+Qt&>Err zFQg01tk4$+HDfZG2%RDdAjS4z)j=yd=u-G?ng3wTVZ6xp_WnicjPHHXD;#}?;kxyH zwCAWurI~uvr{#wcTa92Ref5xivq8zq&JwbOJt5iIS=yu0N`ym6^dy3qA)$)du3*1% zk*6R%OX22>M7u+zM;Nj*c*Lft-5HzGcXK5C3o?cjjL7yRMn^?PIP5kID&Zlxlq}Tg z;|fU2Qg9Q{wAk|9+l$afiv=j4*ADvEc|Zq!;|EmMGdn0|(w0!JHq<$WbFS%z)LcaI5mf|v_F~=bDc{L^R(_ehTXw2f0W!dUm;>YdYl#mxaePqse zwxU>4y0`b>?r_)gnbE$qYu^0m@uTlswLWoj>J?$m%bGiLPxIbu>$}sFsDdTA)OhK% zAs)2?db;%fK~Ia~!YG|SZixR96)sw9f5W5T7c|;G<*WPuK>MtM438tioMBH) zk5CNRA_FAfoxUk!H(0P7bmuzZ-2uuw!Hx8xL*f{bK06Rsk~$4iUduLs@Gy4ZLQuhe zgW~-Wr=UlwXotD}2ybw&Ing=52)*7+oY2{VwGbK?pnK~Kjqb|aWwT>uymW}j&MnJY zLH7GLdvaok?02hA-=~p1%w0b#YC_t7C*?=^Mt3)@_h@7vo;7ak8Si#1u}SZH{hqxURuz1TbUB0W+?81iuPQPb1XbziPP3w|Oa zBB?4NubbIjTD>~LI(vD3>CWPk`zs1+XV}6!7Ej$SY$wJP=38WM)R^%n#*U0gR4j$# zu3y*ocF!`FU>`;b_=<`h7c8H5GNJGKHm-s;4aJiI5BTQTuni?PE;dw&i%q~MUWto~ z^(b~c8esQ^C|=fjy$yE_(2cV(8!g_I;Fh$VJqd8PK&*w*ieCIMR0J4LtZX5@kved@7q( zl)hP9>|Ze6H-Elw{DL3TuJLpE`3KtD9xt1^Pv1Ols2;yy{)F*WRadczd};E^DQ%BG z-Zp2m=c~QicJk}jS-aY)?X^xvHd~_)-pGVv3|h4P!^V}M+z`D5g}9}>6Eyt_8t?<- z60{5tv?zEg6)pOXFpb)IfffOumRhtu7h21x{+2?mg=%gqP{T{dTkYtdk?ll@jv&yg zaW}L~`ll@)+|c3}G}^8~E!Bp?K`lQY)G}U!EeOFc117TZIa6=109UN^}pat1WxmcU$eY!%_x&9k%9zCx~bPKjj`ll@) z47A7&1I-h>XIG$wa>Da8>dXnu^K<$IK9oVI*C4@*J zp3A1)8H;?m*dmQBznBaeP3#KRiv1?J%ObHkh6ikBiw#k$_KcK4m`q``Gx@R}pg>b= z`4oCeG^nrp-6^f=p}(j^t9VFGZUG&J;PsocOLB4)+Uf9x7R@T&9QcC|zF}7ZP6VJ{*jEqqV-sq8^ zU{VrgM86AU^L*0+rOPIFMaM>Mv)k%IQWF#K))qu+wAX@%FnbhBO0v3A0heaWG)s2& zavsHNfdXYf%NyxUC9qQD7$9CJ&4veoM$!(bhzRc19ut?xdxo!{er&>ynckV(#~0QY zKKJ&aom0O%Z&ZEZ*o|u3(I-FalnaihWg2?-DOp2~CwgV1))T`1_Sy@4^3vfW4LlJK z*Cq816HD#tbHBP16xDagzoYG}+~S*RqJ%28Y~V2;xG6Tp8Sb#=GZG#|(Gc>2YoC`SF4HO?zY;njgthDEga)AYi=7 zNz!ecRsf@N0iFOV%rA6lVfZ_#BiD`Ju`g{HZ;MlRR!dQy-hA($tKW!uGbf)LE|0xa zdA4U**0FORcB?sfmit2YRW4tP2lr~P7vkMgzk}B}5l=HsNl8tdICe}yn$6%!&9urq zt}6DS#D}Bsz~e*m!+AAPlTuO(tTvaN6h1aJEmO{!I3@`h4ZATlCn+_2RH{8^d}_ud z@DrvCOuY)Wk~atkQGYKDgzs$dF>fHIxhuH=#KOa1wRGEzT( zVcH(`Y-QETJ!R$d=5A6>98MduYP-0;+ijT?R-eYN2S$JcLo>IbAhHbQ@NLVtv?<-S~tSwi{($^+F9 zJX;_*HoX>^@YLoUgA{7C8n9E|gl+2Db;UphCU^_*zCm4WiQt!Ln|JN){*0HtJDql@ z;{#$tf@qr~{6{WtMm(>e95C6y8yjr>Rk9tGmKYk@j7!Aw)Aw5(Vd=UbQ=mr5<-E;2z7*Xi6P;EH%nO# zyyQo{M7gnG+}WSX>wiy8AX5h62>7qMcxXa3sC0^IVLBW}DzWsZZIRXu8~T^?Cr_Kr zC(dPz&2OKh_WjqiZ4(m4Y@K%3LnG&os~&a!X(1XGt=kpz(Tnoxi|-zM&^t9HylZLN zxXkpqTjxLbL3Gq%k9T9!i1P6{lNXJ@>r9G0-d?((Yx~!G$Uk5k@lLA}M6_{OYqPL> zzZm;Qg~OIjMVV}Rh{a|xM3^lR2kl`8nbUG$!lN1Nv4Tf4_Q&s=9T{e~(JN2PF(TZN z<%-F&h|Fn2l3f{Nh9nQo$@#7N8B&Mzv}GOy0VYM$q)_wNJMiZ`$JO`YLDJuVZjl4! z)8K=6k$9aC)C;|lD>6A;-?%G+76L*^YcWVMmw@IhaSX=zf`p8KlG+(l_^ z-7ANW%PPF{_x1JFGiFTQ{EO=9MGF@${Kck?zrfF;>gr!?TJg-xnX_llob^oOif3lc znmKFc%xC0T%j%{r4pkSrL9ZXju6xI^s&=@4URiWdkIwpzeJvI7xI|0k3{ zF+`I&qSIi?iKRs?MV(#u-Z^S{-iWqwr{4Y9kH)o~{T5oR{1%$YIZbh~58iS2uIQMC z$cUdDf9kD>$G?pT%fF3W(DY2~k?WyvjCkcIo@=l}?m{7UPNdo$c)LZBGt?}&-DSi6 zzJnGMn-h+z77VpBWVqEi+|6>O;c~7ar&qml2}IGt6THU_UJKr?)}J=hw2cgnLmzr5 zhKFk}c`NW@^D<;hBny1=XAiXkc)V?Y;gQvN$AKEhFE6I& zL`31^<*PDzlXwHqa}sUX)A#FXEc!Rw^=O~%j*ryN{j^_?yrWafR5=UYEIqT|?1Rs6 z1UpT!!&rjgX;CSn;w@ANMu~h6z`51a(tj~jo98kn! zO$J-2rO9P*n8I9eAWX=DZOy>gx^f9lwHl8{Q_1SIk^u zcy$EZ?kf|tMO~tu?MB6lhcK|=I7GH1TD6BdWy-e6lxTAICjq({m$=++wp&8 zrJP&9;nB%qci;}?!v{rK3tBBXIs;^P`Csy=^gPS?mK{8G!Id|Z-Zynod!Cwb$J-Skj(U*=Na^;2QbvO{XV5B>M%478u0*A0M=u;VZDHlq ziH+w+Ey7X7QO!){=f?Ta!Ww;G$|;~@%b!s8$zCfROd zA)ywBwzdgkcotW%&T*Jqh_y5L1!da%A*9;=x0K;=&^_vN$JA4N)-hDvB>bNWn7mdV zkNSt@|Frkz@ljQ0|L5Fg_I)ywOp?iDCd&XJJ4wh!CSeO9Km-M3-=c_wsDOY05fK6+ zqJTotDk6;(DWalMYN-l}iU=tpq9WS5)c&X|@={H1e&2KMog`3g-}n9ee*ZCW=1%T< zw);HKd6w@(dPKa;#sS~!-O}&$vkf}EM7)5#F!R32V-gJJK13G|J>ikLZ}I{LV$pV1 z1ds)N{&`xvgAU#Ig<{$XRH$f6I`6I`Z0L52xH}@qC9hr}{O)K(*WKM|X$;)LgQkoX zQ`*i%aWd%hfB#~i^4tz(?`RfZosF7b#2X(+wnZj7WT)3@hndRDHV#0y8EgoyG6(<_ z0%bIau_$oU^coCe2^{<+vL{yOGVh5oI;>X-aj~#z*+E~yNpw~a4B2O60ClqH#Q8q% z|H57dChK#Z)~DbYjB8-FL?sevwYq2kCjeb`1SYm($p?B?6vmo|Yv7q9JRAWfi?U$a z;c3cTSORrL$`S8{qsPwDBPW#EZC>T|IVQSVu(Y2SER89f8im~UnZoAwV~v|&!{zpc zW@zQp$rF(Y+(M^1X@jt(!@XS#^#*BYF+DPZjH4kvadr>&1rpPYqQwI%oo9L|ks0d9 zy--2=;#{D9u+g~a$`*(<)syonDqyktDfN<6y;p>%+Iu4&FHYbiD0&8{^7`R$Zfk3gCt3 zuR7QR;lEuVaC)Y#WL}N%9}#Qp_94|p_ob%h+*iN%UFGb_%}35`tH0AcW<49QaFWWxPgHP>O?Hk%6O2FO0iK>R2A<_0R=J}C;+V$zHJ*Rq_uw_ZfQ>u zOv=gC6U0qo-Q;`P&ah`}#xsiX3_VGVSmk%2AvQ?0g07Z9)qo^okbyX>;`IXP(79QB z?4kAtlv@3^i<9(87yp7g)ODPe9s!$&Z7&=ACnhj%M>G8*UAGV4&bT8rz3_b%|VxCqm+?lXBPQ7TJ62Q)<#~o}gU4 zcb!zbu{}~`h*XP5FIjUqJUl@BNlo=ktLV(x>KFvNFw5 z&&2HBIWchv?HbqPf#fXW8J;lNpjcxH4l2IhqjoM=A{GmhV&N<)~kAFD8{^fKc zVDSitPNtRLr_<$B<<{s5W}_2MZ(K8^tZ`FJTx1WfF*uVV9n$C6)=&w*F-^N17fWRPeJ7#Jkx z7D$CF)>HFC(;S-o&381|*mP0Jg`4`8Ezho8xN9X%evuZ@MrFP7`isih6}xuT(jgyx zPL0Zceg2X1LhUZhrH)qUG7dmLZ-r;Z2wE3e!O^2-k3Aee!WJG8KLU~!4a2Bou_BBv z41-Q-NpasIxvVe@ZrVvoLZcgSCJPPk}@Q9NZOF}S@|Xw5mdw^zG$QY?TiAlQ@JbtKt=luYat4S zrCq0K!9uZ}zMk|8d+w4OQj$`JmyW9!${jj+K$c7n`V0%d&d) zae8xNmf4!eUr=@Vzy^>FB^&eT^1*@igQmbyUt)y6F>#uCSYqYS8JvRE0XLO*tsVHf zg1KYHitF0{o;1AA;~z@xiT=d8p;w*VFnnRwO%t1v1KbU>rYV2H1Tifzq|f#bL{Thm zUzX&jW2inpt9?q&9d-9o+nfdSQ&U$DTc3Bw)v9x5TH4xL@j#+a*`b_|3A>ndx~}6h zaVI25MwOODYIw}yf5b@}mFyT}zZOtw^~qO-E`>@nGMF@@&&x@e7T&`Nvl`>3{0F48 ze2_HeHlQhKG@%FzKG0`|oRcrC`;*^Q*Es8%!HqLU9GaCj`$+xfSEk)L^XhVjly*cK zuw~-%iP!!NQW_vRnD$@=Cc<2_SHvus6ah9d^QK|Z06g|wZxD1w9)GSUqY!jy0C=cg z(t(`d4EVQ03I^_w}lz4QGHdO_E2oeYr1sGJ`j<#lTlH#EixULkk z$5!1|@YC!_JhTmn<%VI(z=3m^n-4>M0=@?-jCrW48V+#}j~sV64bCqf=#Rx2J!#4Z z^u)$&MYr^VaAwK0_B8oV%m4YJSd1qS`0nh1FGLDi6&Y@*^e6c_SdL8fl}Snds4se@ zFWzUajF0z~_$+RdK8ePgRvX-7T?f6Z?XWf+lvW4V*b@z@Nq(4&IJ&=yxU#v64CJdr zEI?Mpie)yFe@_dU7D`=pi;(Z&nFc{6T%fMX-O!Y{Ia`$Wq>k);-CS2DAe;Bi$T+;e z_`0mz897rH#m{e}?%ep-Hs(&3zuBJX2O!5A>)KZ+7e4oRw+Dg`ZW5kaM{Ayb!^PHY zG#8_C5dI5AWN0MaA5PBA$q)+?nJa_OJljQlvu#qZ({qQftr@X? z#tJ>tCUV2$oau1JpwY*Qpiy6j}t8k!j8i z{6%064e+!!3PGffXcY|Y>y-P1Pvmt!-Ygyb39%#sWRA7cNGS!+wKCKb7*M2F^<+Ma zZV@dk!-uFR{bhZB2FQz-0+Tr^>ai6wWIH`|>uC`R+ejlblx;tzC`%ljKctis%0=ae zJ#^bhx~=mko;(sy9@qWJdh)7S>i%S6>93dj6ZOfQU#mi<`sAV_Di$I5MBR+cpp$+~ zq04PoM}Mq6L7}VIqf8p9OzQjz`Q-qlte%wNk?XO-Sr92RIRJoQbQlcgF5J;BEYcE$ z($6s=#9UBqkm!4cSq>Od!HiW95Gk=Z{T%q^-RM#ojFA6oht^1wwi0Eqpjy!Z;#_P5 zMyc``z8Khfw7}l3`OGk%kW}d9VH^k261-`&BP+O1Nc4!T9?^V4n72rtc8$z@LeT3e z&{9@|0=tprb6TXxEeAtEmmCV(QEYN36fAL0x5rqgo3BbH)9o|_z+){r2nA}eV7B=E zE;$7ZxYO304Yy#fkL;AAI<*jRe%Awinls$ge8|UK6)AFkzs6?r-BMk!ef#_GRuzn< zo^OSbL1oJrS{+n=e`E00mTX_H&*NRv)bEp>JCC-mr?c06aZts#la|eHDB64btd{bH zw@J>>2yA(u*a7Cn|q;Ga6DG(Dp z#W7A}rfFb-n7P{I856V0*&JuOr=Yo)xH2iO{;I0J+3@)@>xTmihu9Lt;W2q(-SBYm zDlUO=bqwgH%3+yGLW?rRR8aq`+ioIeC!=EgipNzoW-)(sccTHJsHR5qEcdLK#>^YC z8~YkrFsiyhw9{V{{U9IWKTd;gr!%I9p}+I}T120Xssg2Owxqf4wtJlphhlO$ne11X zQhL|m$*V#o>#n-*S9XWDG~9RZ{JO<`=n%V3S5-dhMxRntHpTDi;c>gF`&Uj*^!9K$ zV`{{XnYWsyncoTtEE3783NnrS@aRNaHT%NsWtJZ zY+=#bORkEKm~qv=UIe|tr59n|Ul0#V_k*8;F_Zd8J_uVkq+f0~c9?Z$h5`(fM$%{$ zueVS*^;%#^2I#L@U{1TAVu67OKQ^|SwzhN1Un+rMaKSE9kh4PsCM&+-dYw+4zuKi( z+rrebWw&_v7`WEr7vj7M|7+#`PW1>;_ zim9Ryn`s*9QR~HFiD5{AbVQ#4F!6U=cG2_dRu}U&%kuCx|Auw`n0Q!ZI2JO{J`%du z1L(*|hIc)nxLN<`An1G=9j{J*bUxRk{U97^>q%`}c4;lY@*s5AjT(IqN8G|;A|2KlW)om7%5(teIagl6@PqrpUJhCY z^CV<4CyLCJS6}^rk1~s?ed(GX#M2kHab5C!B}JN`gC8R}M=0Wib3RJ~rDD*+=>VE5 zRkDJmhN(S_dSRxrlrE#o@O@sfC{}q{+p)I8VzHF=(+5ADkTOBTxsNvY4#OgeQFjvc z%{s`?U$}={nMT7!#Hh@NH1NOAgCQUjyc@VOG+^IvSfyX z9=jwOUk}74ydl2c)0&wR=$V>qjdj_A;Z&X7SIK-P!HZ1l0hL!Jj&q%Yj@Xc) zJa#dtG&#EoHn>YU?lQOYF6327y$i&bOYV}UN-MNHgHC4RinB{fVba(%$R=OleG{Qu zc{(x$wgYBW1$VP`Mo^n%j}u@wqHJVdQ?NR~9g6!;8NGtbw%Q~&3-?K6O^j)+!{Uy2 zIbuYo&uf>V#nTx)HnfZ)p^il|dz>QTdzj87&+(cnzF-9TQkp4}KF?FizGAKr7_RPA zj*${ZQPdYPN?25xh8bvq$pQ8bPS24@xo;IlPs&Cdb4}87lP4p*@qrJ3Fpzd&-+?#$ zhgFb)FTZ3k13zsQTRV{kXlGw|U`-tg_#ADeXq4SHS*I5P(CBvCV0CcWEQsB+l^EQT z-Mrc;0W863Tx%5^UaQkC+T2`hlZj|_L1=c_yqK^b!ra@ft-p+zaA`|Hb2!8qZy;|X za~&%z6fV-Q0c$~#*@!ie_Vg>KJDaDA`R6&g=@JwLwtiH-9+{=M)+Sp-7920SWD#I{ z?3aLDh|aW#B@RQg$)#&1HWOS|gpHP~xH!ff;s`a_4JNFYr5GeK5=A=BzX$B%@B*LnhOKajA%KamE*D3c0XyYvID>+j0ot#PM zoK+^!?OTMvujqF8Pqu%8x8SglEhyp?%-?RgenbZ1&yelA=la2`#Vey$gi&)bMIcIP zn>a-|1{(MOCwr05@eSM);jP8xfd3Asox{a|{~f1AL?n2u%4uJ13oBnEjnenneglT9 zrc*kmCRGB}#|NHGo6&Q2tb4=2&#XY+_l8KBD5M2wE-AOZ=?=V^dnE16j0yeSM~d`s z4)KYDgpxkA2T634ga!@n6N;EZ-oaAH5ej7ub|i)(Js_IHQBYms^VD{lJjyl2d0#QKDqZsc|AuF+Q0zNrQZz{hmiqr1E1{lfn0G$|(BRy}#(fN9hF51hQ{HwzcG zJh5QW_S&ff2TsMFsf$_`Eo^C7xTr<6OdU9A%CrIMt|y+rE};nd0H?Iq44yiDVE^e; z2QK;zPTbKVo)|cFD&Mh?ownnN_R!#|QwOs%_^oz45nV6kBgUX>y`3jERi31I{;NmWbD~G|mmFbtiyqNwN7QHmcBF4- zt<`7&^$5FL^oSndmR%7B-LKKHBY1zI))3F}h^_vSP&d>M4e~?cL7M=IWAZ-IK{3Zg zhI+u*EziExNvXhZ7~N&`h(mi^2I~<;^kAHPE&QA$_&Mpw$cPPsFuUT?!@JSmy=0uO(1_xiA*8s<5O-6)zirJXD>=3M4767LiIdEDc zuNGpIv}#4ljl^UEc%j8)wY%*xc8}d_kBuksG+u}o3J|RRpdlnU6I=;y ze~jPb_xfXf2}y`XR$fL$caCfb75tvF%0_)pYKms&i z2p9uSSX?x3Gn|L<#`&G&t!cs4*245o-&;85nz~v31jKe$@z|>DJV(akj%@(L!=nI-7wvsxM2LvYF-`)i3g+0> zqdkx69B+YP(u-)nAFBZ7O*Av&K>X9&#tqEn-!cRNPsnnh+LhTRhdb10jkRNnIoTO5_T~QB)4C;pDlFpO*Q%3|xNU5NMLtEwHf^0d_t8h^&fTgj zjf@>r85uLSg8e=3(MQp;=K(4RHzMem(j!iz&Sc%7Bg7$^00Au;A)+9&7kk&)tB$0R zSSbbn#Zx^!EM%mmtXHYFZ9?g^Tpm?pK zRZzu_CZmvl_Zm5dVct+^?P!Xy=a0&tn}ym}l^2^;BtzyMNy!&z`B>iaP{eMwne-a~ zUuY(Ht(;6W!@7`ZsH3gU|5r;3UAmw=lARf>O7?{Yho;URT2h~$mTtGNFq!HG7cImy z=qa>%IHz(YpmO9+Sx~7QvWZ5C3tIi3s2uPrfkYwNHf&$M;FE`?ujs<>zsKEKWRhf) zPe2=7AL)zrhhQaEwgRyNLjuAk{CK#NHPB^2R&{W!pKd@qbw=i1iSsOas4(*5tMsH$PYd%g~ATJ*_j8 zFWZmp5b|fv*vtAEeJqUwmQVt@BQg{kSv;Fz2>}R3j!yt_jFWwFG4@zFCdOU@U<2kd zqqpl~R(lz|5Q1(g)LNs?hVk z_EV>)DIc&%D~@N)C7D8vBO5f%&(Jg290)V-IehfwW46)a1b^h$fCJ;B2g;l(dkjaP zHSlXDsz=moh=3^FZO8%3WKY!_=a@u}!8eZRfFsLY{MbSsE)hIp*9~(RqIP%fk~g=T zgbQtieS=bU=4r9Rf8oYRsaXd0wn+x=wjE;bp^SJ{wJ{i-8k#Y=zDi1)pz@*r&)r+RiQdgZ_822fB(L%e@xUl7?yDOE; zcxv`57jC>Pq08!}{$)*_IbD>D2iiaBO6wxL`hb80mnstDEUe6fBnMFkwLUrCM+st) zys>f|199`S<|ZPaJp&pChAA>@>-^p{AMvL(yE2-M^)COKTwj2pO6htei(Zn|Bba3t zdzdXqE{wia&6=7nS(V!H_P~86I`O(*9IU>1penN8c3}mv0D}BH#Qq@03#n+s`LURP z%wDHChr#qMUe|Q<&_Togy7uL_Y6sVTvC^62vA7F*DyNdDYwgLIG?3Uq(&~CYduHy; zC*E<%*-t9(Zd#*s%$&FI)REiI-_Y2Ep!M|8C6gwMe*ONj6BLWvrM%w0@Ge?OX{4Ub zS5;%hq`|1hN|SpvEf<@wQ7spbXGFiUJORzHM_7o5tU)vfb=Vjfk%z`uqYy<{fpLH$ z9f0FNkW_dg&& z;rTEOrgSK8I0O^dyPo@xKtz`}kV7yMBw0YecNRRbJ@ zr!nfd*1Ie!OTU$e*TfBsIf@l5Op^3LI!W0!k4~bK=PBFhgn7#2%66JYC(udr@i+TY zwl84kFpfGwcv##bpM^DlY$S_iutlC~s;hz1L5ZFmH;Tt4W26H=pZThHYFprr#nj1{kSdnN7OMw+5%ar+czg5P^S|(ZwR-JQPx~nmId^)_3%6&? zK|S(OkF)Snivu2L0sf9Vu9Jy3_Bf*1faZz}wsEqJ92acI?dIb`t81z+HjbyUB_jN& z3`0H4Pgo4Z_Z-tPmS&BFn!JLN>b&jryZ9n1J ziBvu{75TS~io1GA!L6&5BQc`wmO1w%wBL|lp4M}zKcR8bn(ytXZ9rHnoO zAnDPRclu~;b)r-~{PSWY7sEMp@8?BwO z=;zKL-;ynzXEf;U!9Bj~@c-;Rct$MFpL=O{H*5TvBdcPi6J~yZ_~^;|Y=h?(gGO%F z*WpN117Ojv@gY`T&3K_n2tX20uVEMi3}35DLg+jK+2JLwHPFxp;PktjujUyF@=IJo zh(_M8WmuD_0h2fW%4;3H#?bAW9hY45F}p_Pm@-g7v2x2KCnAeAY(IFUIyi{2KM}TN zF(n}T6Ek{ex;QK486y4mB-!szbgKu%UM?99Sm3h0I4?u8DhUAB*yq`k;66c`GmOol z`izyaYy93sw=Y(Pn@e1hC&mtL5Et<4;{7yEXHLsv9F{u{VcEf6RgER6c+~9-Uh&^* zxw*Q#^OcEu1O6NUGV`y`*FzTULWI&HQ7#8U?x*ba(IJ6-NiTU{{_#H`BGZCJ4?M8w z#~&|6MgE^>V*h`po$a`Q`LF};dL~&M=^vZwPxI_?`xhrQ#ZM3F7wei#(?u)U6Lx3V z#i_yitZ-Il?~ER)9xVU7fZrmiR&R{npCsyRFUlW`KpcrspODXzlBCY*f&8F(` zpyh+_K0BD6&QtmVWt2XYt*pAgx%SCx!gX6mpZRQ8?h1p`^hmC_mnP645)xLHop^P2 z#)Lj|3ZHx-Qhuyg4{D`C=A6=N!?Q8Z=~me$`Q+1FdcG&(lt>H2W;G%XzHQ7ZhZ0UCez8%WZA&<5Nwf(rTNc<#QjpJ9QHGnk#^B#D_f>YVDWO| zaD>V!Ti@#WrhNLykt5)EJR;D=^)Ta~BT9~8M#^7e-F6%}>o%7etXT;6~x6EQx}EfD!4G^i6Jh)|N@e#w=m>Vpv_nG->3Y^c#B-d_@% z8QGGtb7owwOpVTrUs9&7J^9FrHLaWFi^_#(p273?r`P1=yxHiE3lc_bdhC_E7 z@!8o3%646VjTXi#TgVo(l0YxcrowE{ffz_{JGm5TCG#TvEXe$1wwehs8EP0LK@Frh za}7&+NUdD7G!u((91aAnWC~jXLnUEkUVl2|H)k4@4-aW}JPi5y^Negn9sHQdtZOxh z-_a;xCSIoKk>CY=9=yddV(6F~6BY%3 zf5*bL^2PGPzNI%WW6u#9WScle{s8@15;2k%)}7rHqtGivjEo*KS}3V>@Mk75SByUR zX80}ngQHx&fISf(W-G@p8jk`kqq-AYk)Oj)>HNY$mT*!Z%{=7*_$^z(t6~S1WWi8M zYFc`@2hi$!XJ%#RPm z`>8!oKlAL~=bnFI-|zST;l)25_|r=-zjE-LW5-*`pHIAV^4(MK zoqqp=56^sb_G4(&`=PxhBpFm7p4?74uo`kA1A8v5qNC_kx{%&Z*9(V*GvaT>my*+y zbCOGvcLhTsT_`D(5vmT=r@i@;0Ev&_4qK^?TA=gK!4iKY)=~@U5?uS5@E*U`jcbef zwL-|wubqNxDRfZKA$I(L@*c|8j!F3L-!ZczhK)npg|-g}`S`()SA0DB>@2qDqnkgP zOvw9R%YWj7*B86avlH1d@+1FdTmCnaqH7jv`X8ti#$&5A}h!rv3~r5tb`ZM z8uDxMTe2O4em8J&my->U(!V2X$tJQ2nu;^z8}bO*NxsL^ejwY(@5md--?f`eBh$%! zWCl4x>dEWmO>&I91)rI>$=}Fz?dX(dmQ>&e&TesYqWAnyRT>+j?oSxsh<8_12M zfy^dz$X3!wZYDR8TgY58pUfk-0>A1@vXIG7Uc-`Wur{PZyYCV+k~RSHD6)tLy=G>pzKEJiBf^{ zwQKo3*l!d%2-o}-h20ZvS)8a zsY5x8!rHV9+k@))P$nz*@1LEmh5l6t=LiV9gUE1|%KWjH{JG%~T?ramQ zKdax*6;?;~yzYh7uX|y2X5)5wVfE@>P*<9PeHcI9@8}zfvEt{TozeNhwvZ-U>0az( z^=`!0hQh`cf0NPL7W0C)^#J}}hq4)kwS|qrS*_IIoL2nCx$GRe0$X+u*4J!Kviq~K z#d&=E*uAj7v#;2gr>N(29K{xeTtGR4dmU2?zaJYL*6(aQ*gVB~6n#utKSlcv&!lXg zU`}^@gRS-)J{A}oJ`ZsXDZZ?*Iz$U=U$o%fuur$r`%(6xoJ7B2K0(sp^MUOnn8&d0 z@OjVc>BByZKW{VUHlH8td|b!pEo(zQj&GF;K!Ila^cO84@95>Qizz5zR;MIkWy%&%Sk`@(L_ik zaJl-E0c0QsewElL`c}C^$ z1P5aLX(ed%D)5WD!JqCykKGIUdmp&TdhjPuU~sQZpxwU$)qV*2qhEtZJqmvE7&z49 zWIL#K3weU<0AJflo+P`#wRVFa?IBNdzQ8yE;|lx8@4-?2KwbnlJV5?LULr4pHyi}F zc$K^cF84Zk-J9TWDrY;!xfYsS$!D8x)iypWzLqQ)VM7^sn&s2OsFmD-GR zubVe>(M>b!=h$wlzvYI;8Pn_M%&Whpeugw~{w)N z5no+4$W6| z3A(#yoL#eI}MK;4jcO!-!o;IwwnH7?r*-^e8f_2dC<~o^;;XQzqZBN z=Gk7i2kpxpg5x2_ac7mY$z^rTa_x2f-5qidcHi#a>VD3BCgx#Jz;mPLYwtMk-q^a> z!*TI(x5l;lLcZhigW^}iWn+25dx>`?e(9g+e;}!M(%ng42T}t^0)I(fnfzMviQwqq z^x#dwCBeIcn}XYePX`YKj|ATfeir;L*b%aXe4+GEekc+e78)12J~S`1EOc+^q0o-d zbD>v4$3h>bq@_$rc{{Zt^~2P*v=M3Fr#}(y6TUaRH{8*qvd7as2ljlT=b2uXUM0Qu zXAI3~$#^g0pS>%3ugkP&PRo2Qt2KLk_KBQ?oT8kWIiKfF&V4xdbe<=#0sn5xYtGx4 zPxIf;|Dlhg&*VN&_BmZ37vvR8D7c~E)`E?N{=!J%^ujNT#uOba`dijOJ|q9R{CRE|FZdI+spo| zd{+5_^1I6KFMp)`<$gK+Ug>wN--i`LD~?rs7DS%33zrD@q^AvQwU9& z4%-+RU4P5eQB&v49o9Ifal|yxTYL&TI+Vh^zC&_y2rAD%kgzFoX9J+&$|u?b!~`z| z-IY(Y2aw+vzHV1O(H?-u%9Z|zb_TY@YJhLll~1$>i0w*$MEinmks88Cj8{I<9v}`A z6unnI(H;Qi>XrV8b_TY@Wkx2(E1zf&5cie-i1r2Bk{AnYnpZy29v~hoJdUq?qCG&o zSNbE`7i>#nZ7@Mz`9ynw#9ir+XkV}`@!8>^aOD&20TS2HD zr;|9Ze4;(T6sZC%RLlp0dzLW!mb7y`oop}rfdmX((YpVo?>I`w{#T}L?Pyf|ax;8m L*;UZpvd{ko7U7TT literal 0 HcmV?d00001 diff --git a/ttf-bitstream-vera-1.10/VeraMono.ttf b/ttf-bitstream-vera-1.10/VeraMono.ttf new file mode 100644 index 0000000000000000000000000000000000000000..139f0b4311ad2e0369a347b3be6c46e6c2b730d5 GIT binary patch literal 49224 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 literal 0 HcmV?d00001 From ffbae75345fd70ab2ae1f34962b8674bd24f5a96 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sun, 23 Sep 2007 11:52:06 +0000 Subject: [PATCH 0235/1156] Added copyright notice for inclusion of Bitstream Vera font. git-svn-id: http://macvim.googlecode.com/svn/trunk@266 96c4425d-ca35-0410-94e5-3396d5c13a8f --- Credits.rtf | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Credits.rtf b/Credits.rtf index 5823bbbce5..85c3cd2b60 100644 --- a/Credits.rtf +++ b/Credits.rtf @@ -22,4 +22,6 @@ Thank you to {\field{\*\fldinst{HYPERLINK "http://www.positivespinmedia.com"}}{\ \ Toolbar icons borrowed from the {\field{\*\fldinst{HYPERLINK "http://www.everaldo.com/crystal/"}}{\fldrslt Crystal Project}}.\ \ -Vim icons made by {\field{\*\fldinst{HYPERLINK "http://www.cs.princeton.edu/~mtwebb/vim_icon/vim_icons.html"}}{\fldrslt Matthew Webb}}.} \ No newline at end of file +Vim icons made by {\field{\*\fldinst{HYPERLINK "http://www.cs.princeton.edu/~mtwebb/vim_icon/vim_icons.html"}}{\fldrslt Matthew Webb}}.\ +\ +The Bitstream Vera\'aa font is \'a9 2003 Bitstream, Inc.} \ No newline at end of file From f20ea2760c60ebb2299d01175323790916eb441e Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sun, 23 Sep 2007 11:57:22 +0000 Subject: [PATCH 0236/1156] - New section 0 Important! - macvim colorscheme in differences section - menus section: added list of actions, key equivs _must_ specify D - hints section: list of hints typeset differently, hint on default font, hint on localized menus git-svn-id: http://macvim.googlecode.com/svn/trunk@267 96c4425d-ca35-0410-94e5-3396d5c13a8f --- runtime/doc/gui_mac.txt | 95 +++++++++++++++++++++++++++++++---------- 1 file changed, 73 insertions(+), 22 deletions(-) diff --git a/runtime/doc/gui_mac.txt b/runtime/doc/gui_mac.txt index ddac904561..f5c20e8faa 100644 --- a/runtime/doc/gui_mac.txt +++ b/runtime/doc/gui_mac.txt @@ -1,11 +1,12 @@ *gui_mac.txt* For Vim version 7.1. Last change: 2007 Sep 18 - VIM REFERENCE MANUAL by Bram Moolenaar + VIM REFERENCE MANUAL by Björn Winckler The MacVim Graphical User Interface *macvim* *gui-macvim* +0. Important! |macvim-important| 1. MacVim differences |macvim-differences| 2. Starting MacVim |gui-macvim-start| 3. Special colors |macvim-colors| @@ -21,6 +22,20 @@ Other relevant documentation: {Vi does not have a GUI} +============================================================================== +0. Important! *macvim-important* + +MacVim is still under development...this is not the finished product! If you +have problems with MacVim then make it known either by adding an issue report +on the MacVim project page > + http://code.google.com/p/macvim +or by posting to the vim_mac mailing list > + http://groups.google.com/group/vim_mac + +Remember to keep checking the project page for new snapshots. (If you +downloaded this copy from somewhere else, you might want to go there now to +make sure that you have got the latest version.) + ============================================================================== 1. MacVim differences *macvim-differences* @@ -130,6 +145,13 @@ Apart from the system colors, it is also possible to use the colors listed in the dictionary "Colors.plist". The key in this dictionary is the name of the color and the value is an RGB value on the form #rrggbb stored as an integer. + *macvim-colorscheme* +MacVim ships with a custom colorscheme that can be used as an alternative to +the default Vim colorscheme. You can try it out by typing: > + :colorscheme macvim +If you have any comments regarding this colorscheme (is it better or worse +than the default?) then post them to vim_mac. + ============================================================================== 4. Menus *macvim-menus* @@ -145,7 +167,7 @@ This sets the key equivalent of the "New Tab" menu item under the "File" menu to Cmd+t. Note that key equivalents: - * should always contain the Cmd modifier flag () + * must contain the Cmd modifier flag () * take precedence over normal mappings made with ":map" * can only be modified during startup (e.g. in .gvimrc) @@ -184,6 +206,25 @@ application bundle) which contains all actions that may be called. The key in this dictionary is the name of the action message (case sensitive), the value is not used. +Here is a random assortment of actions from Actions.plist which might be +useful. + +Action Description ~ +newWindow: Open a new (empty) window +orderFrontCharacterPalette: Show the the "Special Characters" dialog +orderFrontFontPanel: Show the Font panel +performZoom: Zoom window (same as clicking the green blob) +selectNextWindow: Select next window (similar to ) +selectPreviousWindow: Select previous window (similar to ) + +As an example, to map to performZoom: you could do something like this: > + :map :action performZoom: +A better way to map to performZoom: would be to set the key equivalent of the +menu item "Window.Zoom" to the above action. This can be done by adding the +following line to "~/.gvimrc": > + menukeyequiv Window.Zoom +(Note that key equivalents must contain the 'D' flag.) + ============================================================================== 5. Dialogs *macvim-dialogs* @@ -248,14 +289,18 @@ there is little incentive to add it. In this section some general (not necessarily MacVim specific) hints are given. -Scenario: You try opening a bunch of files in tabs but not all files get +Scenario: ~ +You try opening a bunch of files in tabs but not all files get opened in their own tab. -Solution: To get around this, set 'tabpagemax' to something big in your +Solution: ~ +To get around this, set 'tabpagemax' to something big in your .gvimrc file (e.g. ":set tabpagemax=100"). -Scenario: You want to open a file in a tab in an already opened window, but +Scenario: ~ +You want to open a file in a tab in an already opened window, but typing "gvim filename" in Terminal opens it up in a separate window. -Solution: Use the |--remote-tab| switch. If you have several windows open you +Solution: ~ +Use the |--remote-tab| switch. If you have several windows open you might have to specify which window you want the file to open in by using the |--servername| switch. The title of a window usually ends in something like "VIM" or "VIM3" --- this is the server name of that window. So to open a file @@ -264,26 +309,32 @@ order of the arguments matters): > gvim --servername VIM3 --remote-tab foobar.txt For more information, consult the |client-server| manual page. -Scenario: You like to be able to select text by holding down shift and +Scenario: ~ +You like to be able to select text by holding down shift and pressing the arrow keys and find the Vim way of selecting text strange. -Solution: See |macvim-shift-movement|. - -Scenario: You dislike the default font (Monaco) and/or want a font with bold -and italic variants. -Solution: The font "Courier New" is a fixed width font that ships with Mac OS -X which has both bold and italic variants; however, it is not particularly -well suited for programming. A better alternative is to use the font -"Bitstream Vera Sans Mono" which can be downloaded for free, and it also has -both oblique and bold variants. After having downloaded and installed the -Bitstream Vera font, you can make it the default font by adding the following -line to "~/.gvimrc": > - set guifont=Bitstream\ Vera\ Sans\ Mono:h13 -The suffix ":h13" specifies the point size of the font should be "13" (see +Solution: ~ +See |macvim-shift-movement|. + +Scenario: ~ +Enabling localized menus breaks the toolbar and the menus as well. +Solution: ~ +This is a know problem, see |macvim-todo|. + +Scenario: ~ +You dislike the default font (Bitstream Vera). +Solution: ~ +The standard fixed width font on other Mac OS X applications is +Monaco. If you prefer this font then add the following line to your +"~/.gvimrc" (note that Monaco does not come in italic and bold variants): > + set guifont=Monaco:h10 +The suffix ":h10" specifies the point size of the font should be "10" (see 'guifont' for more information on how to set the font). -Scenario: You can't find the information on MacVim you thought should be in +Scenario: ~ +You can't find the information on MacVim you thought should be in this manual page. -Solution: Post your question on the vim_mac mailing list and wait for an +Solution: ~ +Post your question on the vim_mac mailing list and wait for an answer. vim:tw=78:sw=4:ts=8:ft=help:norl: From 7c035d86553496ec540808c9254a42b438cb2a19 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sun, 23 Sep 2007 12:14:28 +0000 Subject: [PATCH 0237/1156] Deprecated in favour of DejaVu git-svn-id: http://macvim.googlecode.com/svn/trunk@268 96c4425d-ca35-0410-94e5-3396d5c13a8f --- ttf-bitstream-vera-1.10/COPYRIGHT.TXT | 124 ----------------- ttf-bitstream-vera-1.10/README.TXT | 11 -- ttf-bitstream-vera-1.10/RELEASENOTES.TXT | 162 ----------------------- ttf-bitstream-vera-1.10/VeraMoBI.ttf | Bin 55032 -> 0 bytes ttf-bitstream-vera-1.10/VeraMoBd.ttf | Bin 49052 -> 0 bytes ttf-bitstream-vera-1.10/VeraMoIt.ttf | Bin 54508 -> 0 bytes ttf-bitstream-vera-1.10/VeraMono.ttf | Bin 49224 -> 0 bytes 7 files changed, 297 deletions(-) delete mode 100644 ttf-bitstream-vera-1.10/COPYRIGHT.TXT delete mode 100644 ttf-bitstream-vera-1.10/README.TXT delete mode 100644 ttf-bitstream-vera-1.10/RELEASENOTES.TXT delete mode 100644 ttf-bitstream-vera-1.10/VeraMoBI.ttf delete mode 100644 ttf-bitstream-vera-1.10/VeraMoBd.ttf delete mode 100644 ttf-bitstream-vera-1.10/VeraMoIt.ttf delete mode 100644 ttf-bitstream-vera-1.10/VeraMono.ttf diff --git a/ttf-bitstream-vera-1.10/COPYRIGHT.TXT b/ttf-bitstream-vera-1.10/COPYRIGHT.TXT deleted file mode 100644 index e651be1c4f..0000000000 --- a/ttf-bitstream-vera-1.10/COPYRIGHT.TXT +++ /dev/null @@ -1,124 +0,0 @@ -Bitstream Vera Fonts Copyright - -The fonts have a generous copyright, allowing derivative works (as -long as "Bitstream" or "Vera" are not in the names), and full -redistribution (so long as they are not *sold* by themselves). They -can be be bundled, redistributed and sold with any software. - -The fonts are distributed under the following copyright: - -Copyright -========= - -Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream -Vera is a trademark of Bitstream, Inc. - -Permission is hereby granted, free of charge, to any person obtaining -a copy of the fonts accompanying this license ("Fonts") and associated -documentation files (the "Font Software"), to reproduce and distribute -the Font Software, including without limitation the rights to use, -copy, merge, publish, distribute, and/or sell copies of the Font -Software, and to permit persons to whom the Font Software is furnished -to do so, subject to the following conditions: - -The above copyright and trademark notices and this permission notice -shall be included in all copies of one or more of the Font Software -typefaces. - -The Font Software may be modified, altered, or added to, and in -particular the designs of glyphs or characters in the Fonts may be -modified and additional glyphs or characters may be added to the -Fonts, only if the fonts are renamed to names not containing either -the words "Bitstream" or the word "Vera". - -This License becomes null and void to the extent applicable to Fonts -or Font Software that has been modified and is distributed under the -"Bitstream Vera" names. - -The Font Software may be sold as part of a larger software package but -no copy of one or more of the Font Software typefaces may be sold by -itself. - -THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT -OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL -BITSTREAM OR THE GNOME FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR -OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, -OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR -OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT -SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. - -Except as contained in this notice, the names of Gnome, the Gnome -Foundation, and Bitstream Inc., shall not be used in advertising or -otherwise to promote the sale, use or other dealings in this Font -Software without prior written authorization from the Gnome Foundation -or Bitstream Inc., respectively. For further information, contact: -fonts at gnome dot org. - -Copyright FAQ -============= - - 1. I don't understand the resale restriction... What gives? - - Bitstream is giving away these fonts, but wishes to ensure its - competitors can't just drop the fonts as is into a font sale system - and sell them as is. It seems fair that if Bitstream can't make money - from the Bitstream Vera fonts, their competitors should not be able to - do so either. You can sell the fonts as part of any software package, - however. - - 2. I want to package these fonts separately for distribution and - sale as part of a larger software package or system. Can I do so? - - Yes. A RPM or Debian package is a "larger software package" to begin - with, and you aren't selling them independently by themselves. - See 1. above. - - 3. Are derivative works allowed? - Yes! - - 4. Can I change or add to the font(s)? - Yes, but you must change the name(s) of the font(s). - - 5. Under what terms are derivative works allowed? - - You must change the name(s) of the fonts. This is to ensure the - quality of the fonts, both to protect Bitstream and Gnome. We want to - ensure that if an application has opened a font specifically of these - names, it gets what it expects (though of course, using fontconfig, - substitutions could still could have occurred during font - opening). You must include the Bitstream copyright. Additional - copyrights can be added, as per copyright law. Happy Font Hacking! - - 6. If I have improvements for Bitstream Vera, is it possible they might get - adopted in future versions? - - Yes. The contract between the Gnome Foundation and Bitstream has - provisions for working with Bitstream to ensure quality additions to - the Bitstream Vera font family. Please contact us if you have such - additions. Note, that in general, we will want such additions for the - entire family, not just a single font, and that you'll have to keep - both Gnome and Jim Lyles, Vera's designer, happy! To make sense to add - glyphs to the font, they must be stylistically in keeping with Vera's - design. Vera cannot become a "ransom note" font. Jim Lyles will be - providing a document describing the design elements used in Vera, as a - guide and aid for people interested in contributing to Vera. - - 7. I want to sell a software package that uses these fonts: Can I do so? - - Sure. Bundle the fonts with your software and sell your software - with the fonts. That is the intent of the copyright. - - 8. If applications have built the names "Bitstream Vera" into them, - can I override this somehow to use fonts of my choosing? - - This depends on exact details of the software. Most open source - systems and software (e.g., Gnome, KDE, etc.) are now converting to - use fontconfig (see www.fontconfig.org) to handle font configuration, - selection and substitution; it has provisions for overriding font - names and subsituting alternatives. An example is provided by the - supplied local.conf file, which chooses the family Bitstream Vera for - "sans", "serif" and "monospace". Other software (e.g., the XFree86 - core server) has other mechanisms for font substitution. - diff --git a/ttf-bitstream-vera-1.10/README.TXT b/ttf-bitstream-vera-1.10/README.TXT deleted file mode 100644 index 0f71795a7c..0000000000 --- a/ttf-bitstream-vera-1.10/README.TXT +++ /dev/null @@ -1,11 +0,0 @@ -Contained herin is the Bitstream Vera font family. - -The Copyright information is found in the COPYRIGHT.TXT file (along -with being incoporated into the fonts themselves). - -The releases notes are found in the file "RELEASENOTES.TXT". - -We hope you enjoy Vera! - - Bitstream, Inc. - The Gnome Project diff --git a/ttf-bitstream-vera-1.10/RELEASENOTES.TXT b/ttf-bitstream-vera-1.10/RELEASENOTES.TXT deleted file mode 100644 index 270bc0d409..0000000000 --- a/ttf-bitstream-vera-1.10/RELEASENOTES.TXT +++ /dev/null @@ -1,162 +0,0 @@ -Bitstream Vera Fonts - April 16, 2003 -===================================== - -The version number of these fonts is 1.10 to distinguish them from the -beta test fonts. - -Note that the Vera copyright is incorporated in the fonts themselves. -The License field in the fonts contains the copyright license as it -appears below. The TrueType copyright field is not large enough to -contain the full license, so the license is incorporated (as you might -think if you thought about it) into the license field, which -unfortunately can be obscure to find. (In pfaedit, see: Element->Font -Info->TTFNames->License). - -Our apologies for it taking longer to complete the fonts than planned. -Beta testers requested a tighter line spacing (less leading) and Jim -Lyles redesigned Vera's accents to bring its line spacing to more -typical of other fonts. This took additional time and effort. Our -thanks to Jim for this effort above and beyond the call of duty. - -There are four monospace and sans faces (normal, oblique, bold, bold -oblique) and two serif faces (normal and bold). Fontconfig/Xft2 (see -www.fontconfig.org) can artificially oblique the serif faces for you: -this loses hinting and distorts the faces slightly, but is visibly -different than normal and bold, and reasonably pleasing. - -On systems with fontconfig 2.0 or 2.1 installed, making your sans, -serif and monospace fonts default to these fonts is very easy. Just -drop the file local.conf into your /etc/fonts directory. This will -make the Bitstream fonts your default fonts for all applications using -fontconfig (if sans, serif, or monospace names are used, as they often -are as default values in many desktops). The XML in local.conf may -need modification to enable subpixel decimation, if appropriate, -however, the commented out phrase does so for XFree86 4.3, in the case -that the server does not have sufficient information to identify the -use of a flat panel. Fontconfig 2.2 adds Vera to the list of font -families and will, by default use it as the default sans, serif and -monospace fonts. - -During the testing of the final Vera fonts, we learned that screen -fonts in general are only typically hinted to work correctly at -integer pixel sizes. Vera is coded internally for integer sizes only. -We need to investigate further to see if there are commonly used fonts -that are hinted to be rounded but are not rounded to integer sizes due -to oversights in their coding. - -Most fonts work best at 8 pixels and below if anti-aliased only, as -the amount of work required to hint well at smaller and smaller sizes -becomes astronomical. GASP tables are typically used to control -whether hinting is used or not, but Freetype/Xft does not currently -support GASP tables (which are present in Vera). - -To mitigate this problem, both for Vera and other fonts, there will be -(very shortly) a new fontconfig 2.2 release that will, by default not -apply hints if the size is below 8 pixels. if you should have a font -that in fact has been hinted more agressively, you can use fontconfig -to note this exception. We believe this should improve many hinted -fonts in addition to Vera, though implemeting GASP support is likely -the right long term solution. - -Font rendering in Gnome or KDE is the combination of algorithms in -Xft2 and Freetype, along with hinting in the fonts themselves. It is -vital to have sufficient information to disentangle problems that you -may observe. - -Note that having your font rendering system set up correctly is vital -to proper judgement of problems of the fonts: - - * Freetype may or may not be configured to in ways that may - implement execution of possibly patented (in some parts of the world) - TrueType hinting algorithms, particularly at small sizes. Best - results are obtained while using these algorithms. - - * The freetype autohinter (used when the possibly patented - algorithms are not used) continues to improve with each release. If - you are using the autohinter, please ensure you are using an up to - date version of freetype before reporting problems. - - * Please identify what version of freetype you are using in any - bug reports, and how your freetype is configured. - - * Make sure you are not using the freetype version included in - XFree86 4.3, as it has bugs that significantly degrade most fonts, - including Vera. if you build XFree86 4.3 from source yourself, you may - have installed this broken version without intending it (as I - did). Vera was verified with the recently released Freetype 2.1.4. On - many systems, 'ldd" can be used to see which freetype shared library - is actually being used. - - * Xft/X Render does not (yet) implement gamma correction. This - causes significant problems rendering white text on a black background - (causing partial pixels to be insufficiently shaded) if the gamma of - your monitor has not been compensated for, and minor problems with - black text on a while background. The program "xgamma" can be used to - set a gamma correction value in the X server's color pallette. Most - monitors have a gamma near 2. - - * Note that the Vera family uses minimal delta hinting. Your - results on other systems when not used anti-aliased may not be - entirely satisfying. We are primarily interested in reports of - problems on open source systems implementing Xft2/fontconfig/freetype - (which implements antialiasing and hinting adjustements, and - sophisticated subpixel decimation on flatpanels). Also, the - algorithms used by Xft2 adjust the hints to integer widths and the - results are crisper on open source systems than on Windows or - MacIntosh. - - * Your fontconfig may (probably does) predate the release of - fontconfig 2.2, and you may see artifacts not present when the font is - used at very small sizes with hinting enabled. "vc-list -V" can be - used to see what version you have installed. - -We believe and hope that these fonts will resolve the problems -reported during beta test. The largest change is the reduction of -leading (interline spacing), which had annoyed a number of people, and -reduced Vera's utility for some applcations. The Vera monospace font -should also now make '0' and 'O' and '1' and 'l' more clearly -distinguishable. - -The version of these fonts is version 1.10. Fontconfig should be -choosing the new version of the fonts if both the released fonts and -beta test fonts are installed (though please discard them: they have -names of form tt20[1-12]gn.ttf). Note that older versions of -fontconfig sometimes did not rebuild their cache correctly when new -fonts are installed: please upgrade to fontconfig 2.2. "fc-cache -f" -can be used to force rebuilding fontconfig's cache files. - -If you note problems, please send them to fonts at gnome dot org, with -exactly which face and size and unicode point you observe the problem -at. The xfd utility from XFree86 CVS may be useful for this (e.g. "xfd --fa sans"). A possibly more useful program to examine fonts at a -variety of sizes is the "waterfall" program found in Keith Packard's -CVS. - - $ cvs -d :pserver:anoncvs@keithp.com:/local/src/CVS login - Logging in to :pserver:anoncvs@keithp.com:2401/local/src/CVS - CVS password: - $ cvs -d :pserver:anoncvs@keithp.com:/local/src/CVS co waterfall - $ cd waterfall - $ xmkmf -a - $ make - # make install - # make install.man - -Again, please make sure you are running an up-to-date freetype, and -that you are only examining integer sizes. - -Reporting Problems -================== - -Please send problem reports to fonts at gnome org, with the following -information: - - 1. Version of Freetype, Xft2 and fontconfig - 2. Whether TT hinting is being used, or the autohinter - 3. Application being used - 4. Character/Unicode code point that has problems (if applicable) - 5. Version of which operating system - 6. Please include a screenshot, when possible. - -Please check the fonts list archives before reporting problems to cut -down on duplication. diff --git a/ttf-bitstream-vera-1.10/VeraMoBI.ttf b/ttf-bitstream-vera-1.10/VeraMoBI.ttf deleted file mode 100644 index 8624542ed208db88b2d1e99bcce1e1acc7e6c28b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55032 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 L*;UZpvd{ko7U7TT diff --git a/ttf-bitstream-vera-1.10/VeraMono.ttf b/ttf-bitstream-vera-1.10/VeraMono.ttf deleted file mode 100644 index 139f0b4311ad2e0369a347b3be6c46e6c2b730d5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49224 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 From bda81718791b4e7e62d78ebdffb2eb8d0bcce908 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sun, 23 Sep 2007 12:15:42 +0000 Subject: [PATCH 0238/1156] DejaVu font replaces Bitstream Vera git-svn-id: http://macvim.googlecode.com/svn/trunk@269 96c4425d-ca35-0410-94e5-3396d5c13a8f --- dejavu-ttf-2.20/AUTHORS | 40 + dejavu-ttf-2.20/BUGS | 3 + dejavu-ttf-2.20/DejaVuSansMono-Bold.ttf | Bin 0 -> 288964 bytes .../DejaVuSansMono-BoldOblique.ttf | Bin 0 -> 210444 bytes dejavu-ttf-2.20/DejaVuSansMono-Oblique.ttf | Bin 0 -> 216556 bytes dejavu-ttf-2.20/DejaVuSansMono.ttf | Bin 0 -> 303436 bytes dejavu-ttf-2.20/LICENSE | 98 ++ dejavu-ttf-2.20/NEWS | 934 ++++++++++++++++++ dejavu-ttf-2.20/README | 59 ++ dejavu-ttf-2.20/langcover.txt | 187 ++++ dejavu-ttf-2.20/unicover.txt | 160 +++ 11 files changed, 1481 insertions(+) create mode 100644 dejavu-ttf-2.20/AUTHORS create mode 100644 dejavu-ttf-2.20/BUGS create mode 100644 dejavu-ttf-2.20/DejaVuSansMono-Bold.ttf create mode 100644 dejavu-ttf-2.20/DejaVuSansMono-BoldOblique.ttf create mode 100644 dejavu-ttf-2.20/DejaVuSansMono-Oblique.ttf create mode 100644 dejavu-ttf-2.20/DejaVuSansMono.ttf create mode 100644 dejavu-ttf-2.20/LICENSE create mode 100644 dejavu-ttf-2.20/NEWS create mode 100644 dejavu-ttf-2.20/README create mode 100644 dejavu-ttf-2.20/langcover.txt create mode 100644 dejavu-ttf-2.20/unicover.txt diff --git a/dejavu-ttf-2.20/AUTHORS b/dejavu-ttf-2.20/AUTHORS new file mode 100644 index 0000000000..68e2af2879 --- /dev/null +++ b/dejavu-ttf-2.20/AUTHORS @@ -0,0 +1,40 @@ +Adrian Schroeter +Andrey Valentinovich Panov +Ben Laenen +Besarion Gugushvili +Bhikkhu Pesala +Clayborne Arevalo +Dafydd Harries +Danilo Segan +Davide Viti +David Jez +David Lawrence Ramsey +Denis Jacquerye +Dwayne Bailey +Eugeniy Meshcheryakov +Gee Fung Sit +Heikki Lindroos +James Cloos +James Crippen +John Karp +Keenan Pepper +Lars Naesbye Christensen +Mashrab Kuvatov +Mederic Boquien +Michael Everson +Misu Moldovan +Nguyen Thai Ngoc Duy +Ognyan Kulev +Ondrej Koala Vacha +Peter Cernak +Remy Oudompheng +Roozbeh Pournader +Sander Vesik +Stepan Roh +Tavmjong Bah +Tim May +Valentin Stoykov +Vasek Stodulka +Wesley Transue + +$Id: AUTHORS 1910 2007-06-25 19:10:14Z ben_laenen $ diff --git a/dejavu-ttf-2.20/BUGS b/dejavu-ttf-2.20/BUGS new file mode 100644 index 0000000000..49b36de553 --- /dev/null +++ b/dejavu-ttf-2.20/BUGS @@ -0,0 +1,3 @@ +See http://dejavu.sourceforge.net/wiki/index.php/Bugs + +$Id: BUGS 80 2004-11-13 13:12:02Z src $ diff --git a/dejavu-ttf-2.20/DejaVuSansMono-Bold.ttf b/dejavu-ttf-2.20/DejaVuSansMono-Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..16defbc603fd75767a5ae35cfaa53a47cd4c2b3b GIT binary patch literal 288964 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

=B46a5a^VXP% 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≈wmuU@OmK2|$mlETW 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�OXPPkeAy|HKDZ^-p~2tNJIt_FqT! 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 literal 0 HcmV?d00001 diff --git a/dejavu-ttf-2.20/DejaVuSansMono-Oblique.ttf b/dejavu-ttf-2.20/DejaVuSansMono-Oblique.ttf new file mode 100644 index 0000000000000000000000000000000000000000..8ce54344f2094e1848b50a356a900555e755db82 GIT binary patch literal 216556 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 P|Dmn_ucl63wd#KWo~jX` literal 0 HcmV?d00001 diff --git a/dejavu-ttf-2.20/DejaVuSansMono.ttf b/dejavu-ttf-2.20/DejaVuSansMono.ttf new file mode 100644 index 0000000000000000000000000000000000000000..2346ad45611b2fdea83b98f320f9589b1dbe492c GIT binary patch literal 303436 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 Date: Sun, 23 Sep 2007 13:27:51 +0000 Subject: [PATCH 0239/1156] - Default font is now DejaVu (copyright in About box) - Fall back on Monaco if the default font is not in the app bundle - The default font is activated locally for each process (so that it is only available within MacVim) git-svn-id: http://macvim.googlecode.com/svn/trunk@270 96c4425d-ca35-0410-94e5-3396d5c13a8f --- Credits.rtf | 4 +++- MMAppController.h | 5 +++-- MMAppController.m | 35 ++++++++----------------------- MMBackend.h | 1 + MMBackend.m | 22 ++++++++++++++++--- MacVim.h | 5 +++++ MacVim.m | 34 ++++++++++++++++++++++++++++++ MacVim.xcodeproj/project.pbxproj | 32 ++++++++++++++-------------- MacVim.xcodeproj/winckler.mode1 | 14 ++++++------- MacVim.xcodeproj/winckler.pbxuser | 4 ++-- 10 files changed, 98 insertions(+), 58 deletions(-) diff --git a/Credits.rtf b/Credits.rtf index 85c3cd2b60..822442526d 100644 --- a/Credits.rtf +++ b/Credits.rtf @@ -24,4 +24,6 @@ Toolbar icons borrowed from the {\field{\*\fldinst{HYPERLINK "http://www.everald \ Vim icons made by {\field{\*\fldinst{HYPERLINK "http://www.cs.princeton.edu/~mtwebb/vim_icon/vim_icons.html"}}{\fldrslt Matthew Webb}}.\ \ -The Bitstream Vera\'aa font is \'a9 2003 Bitstream, Inc.} \ No newline at end of file +DejaVu is the default font in MacVim.\ +\ +The Bitstream Vera\'aa font is \'a9 2003 by Bitstream, Inc. The Arev font is \'a9 2006 by Tavmjong Bah. The DejaVu changes to these fonts are in the public domain.} \ No newline at end of file diff --git a/MMAppController.h b/MMAppController.h index bc1bf6b09e..ee08c1ef67 100644 --- a/MMAppController.h +++ b/MMAppController.h @@ -16,8 +16,9 @@ @interface MMAppController : NSObject { - NSMutableArray *vimControllers; - NSString *openSelectionString; + NSMutableArray *vimControllers; + NSString *openSelectionString; + ATSFontContainerRef fontContainerRef; } - (void)removeVimController:(id)controller; diff --git a/MMAppController.m b/MMAppController.m index cec158df21..ddbca89379 100644 --- a/MMAppController.m +++ b/MMAppController.m @@ -34,7 +34,6 @@ - (void)openFile:(NSPasteboard *)pboard userData:(NSString *)userData @interface MMAppController (Private) - (MMVimController *)keyVimController; - (MMVimController *)topmostVimController; -+ (void)loadFonts; @end @interface NSMenu (MMExtras) @@ -68,13 +67,13 @@ + (void)initialize NSArray *types = [NSArray arrayWithObject:NSStringPboardType]; [NSApp registerServicesMenuSendTypes:types returnTypes:types]; - - [self loadFonts]; } - (id)init { if ((self = [super init])) { + fontContainerRef = loadFonts(); + vimControllers = [NSMutableArray new]; // NOTE! If the name of the connection changes here it must also be @@ -289,7 +288,13 @@ - (void)applicationWillTerminate:(NSNotification *)aNotification } } - // NOTE! Is this a correct way of releasing the MMAppController? + if (fontContainerRef) { + ATSFontDeactivate(fontContainerRef, NULL, kATSOptionFlagsDefault); + fontContainerRef = 0; + } + + // TODO: Is this a correct way of releasing the MMAppController? + // (It doesn't seem like dealloc is ever called.) [NSApp setDelegate:nil]; [self autorelease]; } @@ -548,28 +553,6 @@ - (MMVimController *)topmostVimController return nil; } -+ (void)loadFonts -{ - // This loads all fonts from the Resources folder. - // (Code taken from cocoadev.com) - NSString *fontsFolder; - if (fontsFolder = [[NSBundle mainBundle] resourcePath]) { - NSURL *fontsURL; - if (fontsURL = [NSURL fileURLWithPath:fontsFolder]) { - FSRef fsRef; - FSSpec fsSpec; - CFURLGetFSRef((CFURLRef)fontsURL, &fsRef); - - if (FSGetCatalogInfo(&fsRef, kFSCatInfoNone, NULL, NULL, &fsSpec, - NULL) == noErr) { - ATSFontActivateFromFileSpecification(&fsSpec, - kATSFontContextGlobal, kATSFontFormatUnspecified, NULL, - kATSOptionFlagsDefault, NULL); - } - } - } -} - @end diff --git a/MMBackend.h b/MMBackend.h index cca74e368e..f64753188c 100644 --- a/MMBackend.h +++ b/MMBackend.h @@ -51,6 +51,7 @@ NSMutableDictionary *clientProxyDict; NSMutableDictionary *serverReplyDict; NSString *alternateServerName; + ATSFontContainerRef fontContainerRef; } + (MMBackend *)sharedInstance; diff --git a/MMBackend.m b/MMBackend.m index 40f68a2506..52266644bb 100644 --- a/MMBackend.m +++ b/MMBackend.m @@ -21,9 +21,8 @@ static unsigned MMServerMax = 1000; //static NSTimeInterval MMEvaluateExpressionTimeout = 3; -// NOTE: The Bitstream Vera font is bundled with the application and loaded -// during initialization of MMAppController. -static NSString *MMDefaultFontName = @"Bitstream Vera Sans Mono"; +// NOTE: The default font is bundled with the application. +static NSString *MMDefaultFontName = @"DejaVu Sans Mono"; static float MMDefaultFontSize = 12.0f; // TODO: Move to separate file. @@ -78,6 +77,8 @@ + (MMBackend *)sharedInstance - (id)init { if ((self = [super init])) { + fontContainerRef = loadFonts(); + queue = [[NSMutableArray alloc] init]; #if MM_USE_INPUT_QUEUE inputQueue = [[NSMutableArray alloc] init]; @@ -413,6 +414,12 @@ - (void)exit //NSLog(@"%@ %s", [self className], _cmd); [[NSNotificationCenter defaultCenter] removeObserver:self]; [connection invalidate]; + + if (fontContainerRef) { + ATSFontDeactivate(fontContainerRef, NULL, kATSOptionFlagsDefault); + fontContainerRef = 0; + } + } - (void)selectTab:(int)index @@ -800,6 +807,15 @@ - (BOOL)setFontWithName:(char *)name } NSFont *font = [NSFont fontWithName:fontName size:size]; + + if (!font && MMDefaultFontName == fontName) { + // If for some reason the MacVim default font is not in the app + // bundle, then fall back on the system default font. + size = 0; + font = [NSFont userFixedPitchFontOfSize:size]; + fontName = [font displayName]; + } + if (font) { //NSLog(@"Setting font '%@' of size %.2f", fontName, size); int len = [fontName diff --git a/MacVim.h b/MacVim.h index 08fb9ee1f8..685037973c 100644 --- a/MacVim.h +++ b/MacVim.h @@ -208,4 +208,9 @@ extern NSString *MMOpenFilesInTabsKey; +// Loads all fonts in the Resouces folder of the app bundle and returns a font +// container reference (which should be used to deactivate the loaded fonts). +ATSFontContainerRef loadFonts(); + + // vim: set ft=objc: diff --git a/MacVim.m b/MacVim.m index 4c2d7f4b45..13b2ce7ec9 100644 --- a/MacVim.m +++ b/MacVim.m @@ -81,3 +81,37 @@ NSString *MMTranslateCtrlClickKey = @"MMTranslateCtrlClick"; NSString *MMTopLeftPointKey = @"MMTopLeftPoint"; NSString *MMOpenFilesInTabsKey = @"MMOpenFilesInTabs"; + + + + + ATSFontContainerRef +loadFonts() +{ + // This loads all fonts from the Resources folder. The fonts are only + // available to the process which loaded them, so loading has to be done + // once for MacVim and an additional time for each Vim process. The + // returned container ref should be used to deactiave the font. + // + // (Code taken from cocoadev.com) + ATSFontContainerRef fontContainerRef = 0; + NSString *fontsFolder = [[NSBundle mainBundle] resourcePath]; + if (fontsFolder) { + NSURL *fontsURL = [NSURL fileURLWithPath:fontsFolder]; + if (fontsURL) { + FSRef fsRef; + FSSpec fsSpec; + CFURLGetFSRef((CFURLRef)fontsURL, &fsRef); + + if (FSGetCatalogInfo(&fsRef, kFSCatInfoNone, NULL, NULL, &fsSpec, + NULL) == noErr) { + ATSFontActivateFromFileSpecification(&fsSpec, + kATSFontContextLocal, kATSFontFormatUnspecified, NULL, + kATSOptionFlagsDefault, &fontContainerRef); + } + } + } + + return fontContainerRef; +} + diff --git a/MacVim.xcodeproj/project.pbxproj b/MacVim.xcodeproj/project.pbxproj index a7251aebc0..b5527d8b61 100644 --- a/MacVim.xcodeproj/project.pbxproj +++ b/MacVim.xcodeproj/project.pbxproj @@ -15,6 +15,10 @@ 1D1474B00C5678370038FA2B /* MMTextView.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D1474AE0C5678370038FA2B /* MMTextView.m */; }; 1D1474B60C56796D0038FA2B /* MMVimController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D1474B40C56796D0038FA2B /* MMVimController.m */; }; 1D1474BC0C567A910038FA2B /* MMWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D1474BA0C567A910038FA2B /* MMWindowController.m */; }; + 1D3D19110CA690FF0004A0A5 /* DejaVuSansMono-Bold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 1D3D190D0CA690FF0004A0A5 /* DejaVuSansMono-Bold.ttf */; }; + 1D3D19120CA690FF0004A0A5 /* DejaVuSansMono-BoldOblique.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 1D3D190E0CA690FF0004A0A5 /* DejaVuSansMono-BoldOblique.ttf */; }; + 1D3D19130CA690FF0004A0A5 /* DejaVuSansMono-Oblique.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 1D3D190F0CA690FF0004A0A5 /* DejaVuSansMono-Oblique.ttf */; }; + 1D3D19140CA690FF0004A0A5 /* DejaVuSansMono.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 1D3D19100CA690FF0004A0A5 /* DejaVuSansMono.ttf */; }; 1D493D580C5247BF00AB718C /* Vim in CopyFiles */ = {isa = PBXBuildFile; fileRef = 1D493D570C5247BF00AB718C /* Vim */; }; 1D493DBA0C52534300AB718C /* PSMTabBarControl.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 1D493DB90C52533B00AB718C /* PSMTabBarControl.framework */; }; 1D71ACB40BC702AB002F2B60 /* doc-bm-c.icns in Resources */ = {isa = PBXBuildFile; fileRef = 1D71ACA90BC702AB002F2B60 /* doc-bm-c.icns */; }; @@ -35,10 +39,6 @@ 1DD704310BA9F9C2008679E9 /* SpecialKeys.plist in Resources */ = {isa = PBXBuildFile; fileRef = 1DD704300BA9F9C2008679E9 /* SpecialKeys.plist */; }; 1DD9F5E50C85D60500E8D5A5 /* SystemColors.plist in Resources */ = {isa = PBXBuildFile; fileRef = 1DD9F5E40C85D60500E8D5A5 /* SystemColors.plist */; }; 1DDBEB6D0C7434150036EEDD /* EmptyWindow.nib in Resources */ = {isa = PBXBuildFile; fileRef = 1DDBEB6B0C7434150036EEDD /* EmptyWindow.nib */; }; - 1DE5F2520CA5B0B8005A40E4 /* VeraMoBd.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 1DE5F24E0CA5B0B8005A40E4 /* VeraMoBd.ttf */; }; - 1DE5F2530CA5B0B8005A40E4 /* VeraMoBI.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 1DE5F24F0CA5B0B8005A40E4 /* VeraMoBI.ttf */; }; - 1DE5F2540CA5B0B8005A40E4 /* VeraMoIt.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 1DE5F2500CA5B0B8005A40E4 /* VeraMoIt.ttf */; }; - 1DE5F2550CA5B0B8005A40E4 /* VeraMono.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 1DE5F2510CA5B0B8005A40E4 /* VeraMono.ttf */; }; 1DE608B40C587FDA0055263D /* runtime in CopyFiles */ = {isa = PBXBuildFile; fileRef = 1DE602470C587FD10055263D /* runtime */; }; 1DE8CC620C5E2AAD003F56E3 /* Actions.plist in Resources */ = {isa = PBXBuildFile; fileRef = 1DE8CC610C5E2AAD003F56E3 /* Actions.plist */; }; 1DED78600C6DE43D0079945F /* vimrc in CopyFiles */ = {isa = PBXBuildFile; fileRef = 1DED785F0C6DE43D0079945F /* vimrc */; }; @@ -141,6 +141,10 @@ 1D1474B40C56796D0038FA2B /* MMVimController.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = MMVimController.m; sourceTree = ""; }; 1D1474B90C567A910038FA2B /* MMWindowController.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = MMWindowController.h; sourceTree = ""; }; 1D1474BA0C567A910038FA2B /* MMWindowController.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = MMWindowController.m; sourceTree = ""; }; + 1D3D190D0CA690FF0004A0A5 /* DejaVuSansMono-Bold.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "DejaVuSansMono-Bold.ttf"; path = "dejavu-ttf-2.20/DejaVuSansMono-Bold.ttf"; sourceTree = ""; }; + 1D3D190E0CA690FF0004A0A5 /* DejaVuSansMono-BoldOblique.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "DejaVuSansMono-BoldOblique.ttf"; path = "dejavu-ttf-2.20/DejaVuSansMono-BoldOblique.ttf"; sourceTree = ""; }; + 1D3D190F0CA690FF0004A0A5 /* DejaVuSansMono-Oblique.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "DejaVuSansMono-Oblique.ttf"; path = "dejavu-ttf-2.20/DejaVuSansMono-Oblique.ttf"; sourceTree = ""; }; + 1D3D19100CA690FF0004A0A5 /* DejaVuSansMono.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = DejaVuSansMono.ttf; path = "dejavu-ttf-2.20/DejaVuSansMono.ttf"; sourceTree = ""; }; 1D493D570C5247BF00AB718C /* Vim */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.executable"; name = Vim; path = ../Vim; sourceTree = SOURCE_ROOT; }; 1D493DB30C52533B00AB718C /* PSMTabBarControl.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = PSMTabBarControl.xcodeproj; path = PSMTabBarControl/PSMTabBarControl.xcodeproj; sourceTree = ""; }; 1D71ACA90BC702AB002F2B60 /* doc-bm-c.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = "doc-bm-c.icns"; sourceTree = ""; }; @@ -162,10 +166,6 @@ 1DD704300BA9F9C2008679E9 /* SpecialKeys.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = SpecialKeys.plist; sourceTree = ""; }; 1DD9F5E40C85D60500E8D5A5 /* SystemColors.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = SystemColors.plist; sourceTree = ""; }; 1DDBEB6C0C7434150036EEDD /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = English.lproj/EmptyWindow.nib; sourceTree = ""; }; - 1DE5F24E0CA5B0B8005A40E4 /* VeraMoBd.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = VeraMoBd.ttf; path = "ttf-bitstream-vera-1.10/VeraMoBd.ttf"; sourceTree = ""; }; - 1DE5F24F0CA5B0B8005A40E4 /* VeraMoBI.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = VeraMoBI.ttf; path = "ttf-bitstream-vera-1.10/VeraMoBI.ttf"; sourceTree = ""; }; - 1DE5F2500CA5B0B8005A40E4 /* VeraMoIt.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = VeraMoIt.ttf; path = "ttf-bitstream-vera-1.10/VeraMoIt.ttf"; sourceTree = ""; }; - 1DE5F2510CA5B0B8005A40E4 /* VeraMono.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = VeraMono.ttf; path = "ttf-bitstream-vera-1.10/VeraMono.ttf"; sourceTree = ""; }; 1DE602470C587FD10055263D /* runtime */ = {isa = PBXFileReference; lastKnownFileType = folder; name = runtime; path = ../../runtime; sourceTree = SOURCE_ROOT; }; 1DE8CC610C5E2AAD003F56E3 /* Actions.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = Actions.plist; sourceTree = ""; }; 1DED785F0C6DE43D0079945F /* vimrc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = vimrc; sourceTree = ""; }; @@ -352,10 +352,10 @@ 29B97317FDCFA39411CA2CEA /* Resources */ = { isa = PBXGroup; children = ( - 1DE5F24E0CA5B0B8005A40E4 /* VeraMoBd.ttf */, - 1DE5F24F0CA5B0B8005A40E4 /* VeraMoBI.ttf */, - 1DE5F2500CA5B0B8005A40E4 /* VeraMoIt.ttf */, - 1DE5F2510CA5B0B8005A40E4 /* VeraMono.ttf */, + 1D3D190D0CA690FF0004A0A5 /* DejaVuSansMono-Bold.ttf */, + 1D3D190E0CA690FF0004A0A5 /* DejaVuSansMono-BoldOblique.ttf */, + 1D3D190F0CA690FF0004A0A5 /* DejaVuSansMono-Oblique.ttf */, + 1D3D19100CA690FF0004A0A5 /* DejaVuSansMono.ttf */, 1DD9F5E40C85D60500E8D5A5 /* SystemColors.plist */, 1DE8CC610C5E2AAD003F56E3 /* Actions.plist */, 1DD04DEB0C529C5E006CDC2B /* Credits.rtf */, @@ -483,10 +483,10 @@ 1DE8CC620C5E2AAD003F56E3 /* Actions.plist in Resources */, 1DDBEB6D0C7434150036EEDD /* EmptyWindow.nib in Resources */, 1DD9F5E50C85D60500E8D5A5 /* SystemColors.plist in Resources */, - 1DE5F2520CA5B0B8005A40E4 /* VeraMoBd.ttf in Resources */, - 1DE5F2530CA5B0B8005A40E4 /* VeraMoBI.ttf in Resources */, - 1DE5F2540CA5B0B8005A40E4 /* VeraMoIt.ttf in Resources */, - 1DE5F2550CA5B0B8005A40E4 /* VeraMono.ttf in Resources */, + 1D3D19110CA690FF0004A0A5 /* DejaVuSansMono-Bold.ttf in Resources */, + 1D3D19120CA690FF0004A0A5 /* DejaVuSansMono-BoldOblique.ttf in Resources */, + 1D3D19130CA690FF0004A0A5 /* DejaVuSansMono-Oblique.ttf in Resources */, + 1D3D19140CA690FF0004A0A5 /* DejaVuSansMono.ttf in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/MacVim.xcodeproj/winckler.mode1 b/MacVim.xcodeproj/winckler.mode1 index 5c10634098..772b46f982 100644 --- a/MacVim.xcodeproj/winckler.mode1 +++ b/MacVim.xcodeproj/winckler.mode1 @@ -368,9 +368,9 @@ TableOfContents - 1D50F01D0CA5B246007DB9E5 + 1DD15C5B0CA69E1F00C745CE 1CE0B1FE06471DED0097A5F4 - 1D50F01E0CA5B246007DB9E5 + 1DD15C5C0CA69E1F00C745CE 1CE0B20306471E060097A5F4 1CE0B20506471E060097A5F4 @@ -504,8 +504,8 @@ 5 WindowOrderList - 1C0AD2B3069F1EA900FABCE6 1D16B9EF0BA33E3800A69B33 + 1C0AD2B3069F1EA900FABCE6 /Users/winckler/Projects/vim7/src/MacVim/MacVim.xcodeproj WindowString @@ -547,8 +547,6 @@ 194pt - BecomeActive - ContentConfiguration PBXProjectModuleGUID @@ -588,7 +586,7 @@ TableOfContents 1D16B9EF0BA33E3800A69B33 - 1D50F01F0CA5B246007DB9E5 + 1DD15C5D0CA69E1F00C745CE 1CD0528F0623707200166675 XCMainBuildResultsModuleGUID @@ -960,9 +958,9 @@ TableOfContents 1C0AD2B3069F1EA900FABCE6 - 1D50F0200CA5B246007DB9E5 + 1DD15C570CA69E1700C745CE 1CD0528B0623707200166675 - 1D50F0210CA5B246007DB9E5 + 1DD15C580CA69E1700C745CE ToolbarConfiguration xcode.toolbar.config.run diff --git a/MacVim.xcodeproj/winckler.pbxuser b/MacVim.xcodeproj/winckler.pbxuser index 18d6f6becf..994d686a08 100644 --- a/MacVim.xcodeproj/winckler.pbxuser +++ b/MacVim.xcodeproj/winckler.pbxuser @@ -438,8 +438,8 @@ PBXFileDataSource_Warnings_ColumnID, ); }; - PBXPerProjectTemplateStateSaveDate = 212185620; - PBXWorkspaceStateSaveDate = 212185620; + PBXPerProjectTemplateStateSaveDate = 212246019; + PBXWorkspaceStateSaveDate = 212246019; }; sourceControlManager = 1D16B9DD0BA33BB000A69B33 /* Source Control */; userBuildSettings = { From 554873cdce365909eedcb0164e98138c768d3a0a Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sun, 23 Sep 2007 14:27:31 +0000 Subject: [PATCH 0240/1156] set gfn=* does not set p_guifont to "*" (fix mostly in Vim code) git-svn-id: http://macvim.googlecode.com/svn/trunk@271 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMBackend.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MMBackend.m b/MMBackend.m index 52266644bb..4a77f15bb2 100644 --- a/MMBackend.m +++ b/MMBackend.m @@ -779,7 +779,7 @@ - (BOOL)setFontWithName:(char *)name if ([fontName isEqual:@"*"]) { // :set gfn=* shows the font panel. do_cmdline_cmd((char_u*)":action orderFrontFontPanel:"); - return YES; + return NO; } NSArray *components = [fontName componentsSeparatedByString:@":"]; From 07f17f6ad869048f8f343bde90a3ce2e5109aa37 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sun, 23 Sep 2007 14:35:31 +0000 Subject: [PATCH 0241/1156] Use system colors for text git-svn-id: http://macvim.googlecode.com/svn/trunk@272 96c4425d-ca35-0410-94e5-3396d5c13a8f --- runtime/colors/macvim.vim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runtime/colors/macvim.vim b/runtime/colors/macvim.vim index bbc860b65d..7948aaffd8 100644 --- a/runtime/colors/macvim.vim +++ b/runtime/colors/macvim.vim @@ -60,7 +60,7 @@ hi TabLine gui=underline guibg=LightGrey hi CursorColumn guibg=#F1F5FA hi CursorLine guibg=#F1F5FA "Data browser list view secondary color hi MatchParen guifg=white guibg=DeepPink4 -hi Normal gui=NONE +hi Normal gui=NONE guifg=MacTextColor guibg=MacTextBackgroundColor " Syntax items (`:he group-name` -- more groups are available, these are just From 435f2b20d7dd3d60e9548fa6a65560465bd76aa0 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sun, 23 Sep 2007 15:01:08 +0000 Subject: [PATCH 0242/1156] open files now recognizes directories as well git-svn-id: http://macvim.googlecode.com/svn/trunk@273 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMAppController.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MMAppController.m b/MMAppController.m index ddbca89379..32ba89f3fe 100644 --- a/MMAppController.m +++ b/MMAppController.m @@ -137,7 +137,7 @@ - (void)application:(NSApplication *)sender openFiles:(NSArray *)filenames int i, count = [filenames count]; for (i = 0; i < count; ++i) { NSString *name = [filenames objectAtIndex:i]; - if ([NSFileHandle fileHandleForReadingAtPath:name]) { + if ([[NSFileManager defaultManager] fileExistsAtPath:name]) { [files addObject:name]; } else if (!firstMissingFile) { firstMissingFile = name; From b9217d938859f2be10d3c5f0d0c946b6f442f581 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sun, 23 Sep 2007 15:04:44 +0000 Subject: [PATCH 0243/1156] Changed font credits git-svn-id: http://macvim.googlecode.com/svn/trunk@274 96c4425d-ca35-0410-94e5-3396d5c13a8f --- Credits.rtf | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Credits.rtf b/Credits.rtf index 822442526d..e9de262e2f 100644 --- a/Credits.rtf +++ b/Credits.rtf @@ -24,6 +24,4 @@ Toolbar icons borrowed from the {\field{\*\fldinst{HYPERLINK "http://www.everald \ Vim icons made by {\field{\*\fldinst{HYPERLINK "http://www.cs.princeton.edu/~mtwebb/vim_icon/vim_icons.html"}}{\fldrslt Matthew Webb}}.\ \ -DejaVu is the default font in MacVim.\ -\ -The Bitstream Vera\'aa font is \'a9 2003 by Bitstream, Inc. The Arev font is \'a9 2006 by Tavmjong Bah. The DejaVu changes to these fonts are in the public domain.} \ No newline at end of file +The default font in MacVim, DejaVu Sans Mono, is based on the Bitstream Vera\'aa and Arev fonts. Bitstream Vera\'aa is \'a9 2003 by Bitstream, Inc. Arev is \'a9 2006 by Tavmjong Bah. The DejaVu changes to these fonts are in the public domain.} \ No newline at end of file From ea3c2ef74ab938fba5986740216ff6c2be52ddac Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sun, 23 Sep 2007 15:16:30 +0000 Subject: [PATCH 0244/1156] Fixed focus stealing bug git-svn-id: http://macvim.googlecode.com/svn/trunk@275 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMAppController.m | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/MMAppController.m b/MMAppController.m index 32ba89f3fe..496cf53f0f 100644 --- a/MMAppController.m +++ b/MMAppController.m @@ -119,7 +119,9 @@ - (BOOL)applicationShouldOpenUntitledFile:(NSApplication *)sender { // NOTE! This way it possible to start the app with the command-line // argument '-nowindow yes' and no window will be opened by default. - return ![[NSUserDefaults standardUserDefaults] boolForKey:MMNoWindowKey]; + untitledWindowOpening = + ![[NSUserDefaults standardUserDefaults] boolForKey:MMNoWindowKey]; + return untitledWindowOpening; } - (BOOL)applicationOpenUntitledFile:(NSApplication *)sender @@ -436,8 +438,14 @@ - (IBAction)selectPreviousWindow:(id)sender [vimControllers addObject:vc]; // HACK! MacVim does not get activated if it is launched from the - // terminal, so we forcibly activate here. - [NSApp activateIgnoringOtherApps:YES]; + // terminal, so we forcibly activate here unless it is an untitled window + // opening (i.e. MacVim was opened from the Finder). Untitled windows are + // treated differently, else MacVim would steal the focus if another app + // was activated while the untitled window was loading. + if (!untitledWindowOpening) + [NSApp activateIgnoringOtherApps:YES]; + + untitledWindowOpening = NO; return vc; } From d05b2811cf0efa8205bb86b281791c2ba9d6e347 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sun, 23 Sep 2007 16:20:30 +0000 Subject: [PATCH 0245/1156] Focus stealing bug fixed git-svn-id: http://macvim.googlecode.com/svn/trunk@276 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMAppController.h | 1 + 1 file changed, 1 insertion(+) diff --git a/MMAppController.h b/MMAppController.h index ee08c1ef67..15d7e7a2e8 100644 --- a/MMAppController.h +++ b/MMAppController.h @@ -19,6 +19,7 @@ NSMutableArray *vimControllers; NSString *openSelectionString; ATSFontContainerRef fontContainerRef; + BOOL untitledWindowOpening; } - (void)removeVimController:(id)controller; From 665e95bfb0acc1c36f9333ec3d26bc8d3ec1aa6d Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Mon, 24 Sep 2007 12:56:42 +0000 Subject: [PATCH 0246/1156] Updated info on Colors.plist git-svn-id: http://macvim.googlecode.com/svn/trunk@278 96c4425d-ca35-0410-94e5-3396d5c13a8f --- runtime/doc/gui_mac.txt | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/runtime/doc/gui_mac.txt b/runtime/doc/gui_mac.txt index f5c20e8faa..7404177c5a 100644 --- a/runtime/doc/gui_mac.txt +++ b/runtime/doc/gui_mac.txt @@ -141,9 +141,12 @@ section of the System Preferences. The latter is the selection color used by a Cocoa application when it is not in focus. *Colors.plist* -Apart from the system colors, it is also possible to use the colors listed in -the dictionary "Colors.plist". The key in this dictionary is the name of the -color and the value is an RGB value on the form #rrggbb stored as an integer. +Apart from the system colors, it is also possible to use the standard X11 +color names (see http://en.wikipedia.org/wiki/X11_color_names) which usually +come in a file called "rgb.txt". MacVim does not have such a file, instead it +keeps these colors in a dictionary called "Colors.plist". The key in this +dictionary is the name of the color and the value is an RGB value on the form +#rrggbb stored as an integer. *macvim-colorscheme* MacVim ships with a custom colorscheme that can be used as an alternative to From b83b8df6f1311d7852efa8a8c7d2ededeea99dcb Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Mon, 24 Sep 2007 15:37:37 +0000 Subject: [PATCH 0247/1156] lastFlushDate not set on input begin otherwise some error message were never displayed git-svn-id: http://macvim.googlecode.com/svn/trunk@279 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMBackend.m | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/MMBackend.m b/MMBackend.m index 4a77f15bb2..d3782895aa 100644 --- a/MMBackend.m +++ b/MMBackend.m @@ -19,7 +19,6 @@ static float MMFlushTimeoutInterval = 0.1f; static unsigned MMServerMax = 1000; -//static NSTimeInterval MMEvaluateExpressionTimeout = 3; // NOTE: The default font is bundled with the application. static NSString *MMDefaultFontName = @"DejaVu Sans Mono"; @@ -1838,8 +1837,11 @@ - (void)focusChange:(BOOL)on - (void)processInputBegin { inProcessInput = YES; + + // Reset last flush date otherwise timed error message from e.g. + // ':set tenc=latin1' are never displayed. [lastFlushDate release]; - lastFlushDate = [[NSDate date] retain]; + lastFlushDate = nil; } - (void)processInputEnd From d2ea2ef36a0e82c4d979febb73d94b2164884ac8 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Tue, 25 Sep 2007 14:55:44 +0000 Subject: [PATCH 0248/1156] Don't set Visual group in gui_mch_def_colors() git-svn-id: http://macvim.googlecode.com/svn/trunk@280 96c4425d-ca35-0410-94e5-3396d5c13a8f --- gui_macvim.m | 4 ---- 1 file changed, 4 deletions(-) diff --git a/gui_macvim.m b/gui_macvim.m index da212fc937..0c5aa00037 100644 --- a/gui_macvim.m +++ b/gui_macvim.m @@ -469,10 +469,6 @@ [backend lookupColorWithKey:@"MacTextColor"]; gui.def_back_pixel = gui.back_pixel = [backend lookupColorWithKey:@"MacTextBackgroundColor"]; - - // Set the text selection color to match the system preferences. - // TODO: Is there a better way to do this? - do_cmdline_cmd((char_u*)"hi Visual guibg=MacSelectedTextBackgroundColor"); } From 27227a615a1175694d7d25990a4a8b741ba7566f Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Tue, 25 Sep 2007 15:16:40 +0000 Subject: [PATCH 0249/1156] Added hint on Cmd-zooming git-svn-id: http://macvim.googlecode.com/svn/trunk@281 96c4425d-ca35-0410-94e5-3396d5c13a8f --- runtime/doc/gui_mac.txt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/runtime/doc/gui_mac.txt b/runtime/doc/gui_mac.txt index 7404177c5a..003abe7bc6 100644 --- a/runtime/doc/gui_mac.txt +++ b/runtime/doc/gui_mac.txt @@ -333,6 +333,12 @@ Monaco. If you prefer this font then add the following line to your The suffix ":h10" specifies the point size of the font should be "10" (see 'guifont' for more information on how to set the font). +Scenario: ~ +When you click the (green) zoom button you want the window to maximize +horizontally as well as vertically. +Solution: ~ +Hold down Cmd and click the zoom button. + Scenario: ~ You can't find the information on MacVim you thought should be in this manual page. From b16bdb5fac6fb860c02b7b0bea5b98e02d89428c Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Wed, 26 Sep 2007 16:15:26 +0000 Subject: [PATCH 0250/1156] - Inactive status line less obtrusive - Popupmenu blue instead of yellow - Math parenthesis color lighter - Visual color changes on focus change git-svn-id: http://macvim.googlecode.com/svn/trunk@282 96c4425d-ca35-0410-94e5-3396d5c13a8f --- runtime/colors/macvim.vim | 52 +++++++++++++++++++++++---------------- 1 file changed, 31 insertions(+), 21 deletions(-) diff --git a/runtime/colors/macvim.vim b/runtime/colors/macvim.vim index 7948aaffd8..db19e67814 100644 --- a/runtime/colors/macvim.vim +++ b/runtime/colors/macvim.vim @@ -21,10 +21,10 @@ hi ErrorMsg guibg=Firebrick2 guifg=White hi IncSearch gui=reverse hi ModeMsg gui=bold hi NonText gui=bold guifg=Blue -hi StatusLine gui=NONE guifg=white guibg=Black -hi StatusLineNC gui=NONE guifg=Gray95 guibg=SlateGray -hi VertSplit gui=NONE guifg=SlateGray guibg=Gray -hi DiffText gui=bold guibg=firebrick2 +hi StatusLine gui=NONE guifg=White guibg=Black +hi StatusLineNC gui=NONE guifg=Gray70 guibg=Gray90 +hi VertSplit gui=NONE guifg=White guibg=Gray +hi DiffText gui=bold guibg=Firebrick2 hi PmenuThumb gui=reverse hi PmenuSbar guibg=Grey hi TabLineSel gui=bold @@ -37,17 +37,17 @@ hi lCursor guibg=fg guifg=bg hi Directory guifg=#1600FF hi LineNr guifg=#888888 guibg=#E6E6E6 hi MoreMsg gui=bold guifg=SeaGreen4 -hi Question gui=bold guifg=chartreuse4 -hi Search guibg=cadetblue1 guifg=NONE -hi SpellBad guisp=firebrick2 gui=undercurl -hi SpellCap guisp=blue gui=undercurl +hi Question gui=bold guifg=Chartreuse4 +hi Search guibg=CadetBlue1 guifg=NONE +hi SpellBad guisp=Firebrick2 gui=undercurl +hi SpellCap guisp=Blue gui=undercurl hi SpellRare guisp=Magenta gui=undercurl hi SpellLocal guisp=DarkCyan gui=undercurl -hi Pmenu guibg=Cornsilk -hi PmenuSel guifg=White guibg=goldenrod2 +hi Pmenu guibg=LightSteelBlue1 +hi PmenuSel guifg=White guibg=SkyBlue4 hi SpecialKey guifg=Blue hi Title gui=bold guifg=DeepSkyBlue3 -hi WarningMsg guifg=firebrick2 +hi WarningMsg guifg=Firebrick2 hi WildMenu guibg=SkyBlue guifg=Black hi Folded guibg=#E6E6E6 guifg=DarkBlue hi FoldColumn guibg=Grey guifg=DarkBlue @@ -55,29 +55,39 @@ hi SignColumn guibg=Grey guifg=DarkBlue hi Visual guibg=MacSelectedTextBackgroundColor hi DiffAdd guibg=LightBlue hi DiffChange guibg=DarkSlateBlue -hi DiffDelete gui=bold guifg=black guibg=SpringGreen4 +hi DiffDelete gui=bold guifg=Black guibg=SpringGreen4 hi TabLine gui=underline guibg=LightGrey hi CursorColumn guibg=#F1F5FA hi CursorLine guibg=#F1F5FA "Data browser list view secondary color -hi MatchParen guifg=white guibg=DeepPink4 +hi MatchParen guifg=White guibg=MediumPurple1 hi Normal gui=NONE guifg=MacTextColor guibg=MacTextBackgroundColor " Syntax items (`:he group-name` -- more groups are available, these are just " the top level syntax items for now). -hi Comment gui=italic guifg=blue2 guibg=NONE -hi Constant gui=NONE guifg=magenta1 guibg=NONE +hi Comment gui=italic guifg=Blue2 guibg=NONE +hi Constant gui=NONE guifg=Magenta1 guibg=NONE hi String gui=NONE guifg=SkyBlue4 guibg=NONE -hi Boolean gui=NONE guifg=red3 guibg=NONE -hi Identifier gui=NONE guifg=aquamarine4 guibg=NONE -hi Statement gui=bold guifg=maroon guibg=NONE +hi Boolean gui=NONE guifg=Red3 guibg=NONE +hi Identifier gui=NONE guifg=Aquamarine4 guibg=NONE +hi Statement gui=bold guifg=Maroon guibg=NONE hi PreProc gui=NONE guifg=DodgerBlue3 guibg=NONE -hi Type gui=bold guifg=green4 guibg=NONE +hi Type gui=bold guifg=Green4 guibg=NONE hi Special gui=NONE guifg=BlueViolet guibg=NONE hi Underlined gui=underline guifg=SteelBlue1 hi Ignore gui=NONE guifg=bg guibg=NONE -hi Error gui=NONE guifg=White guibg=firebrick3 -hi Todo gui=NONE guifg=White guibg=magenta3 +hi Error gui=NONE guifg=White guibg=Firebrick3 +hi Todo gui=NONE guifg=White guibg=Magenta3 + + +" Change the selection color on focus change (but only if the "macvim" +" colorscheme is active). +if !exists("s:augroups_defined") + au FocusLost * if colors_name == "macvim" | hi Visual guibg=MacSecondarySelectedControlColor | endif + au FocusGained * if colors_name == "macvim" | hi Visual guibg=MacSelectedTextBackgroundColor | endif + + let s:augroups_defined = 1 +endif " vim: sw=2 From ef9e2d1f7537d7fd59c819196011afe4f9828ae3 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Wed, 26 Sep 2007 18:17:07 +0000 Subject: [PATCH 0251/1156] Added to info on MacVim colorscheme git-svn-id: http://macvim.googlecode.com/svn/trunk@283 96c4425d-ca35-0410-94e5-3396d5c13a8f --- runtime/doc/gui_mac.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/runtime/doc/gui_mac.txt b/runtime/doc/gui_mac.txt index 003abe7bc6..b3c82f6f5c 100644 --- a/runtime/doc/gui_mac.txt +++ b/runtime/doc/gui_mac.txt @@ -152,6 +152,10 @@ dictionary is the name of the color and the value is an RGB value on the form MacVim ships with a custom colorscheme that can be used as an alternative to the default Vim colorscheme. You can try it out by typing: > :colorscheme macvim +The colorscheme uses the the system "Highlight Color", which can be changed in +the "Appearance" pane of the System Preferences. It also changes the +highlight color when a window becomes inactive. + If you have any comments regarding this colorscheme (is it better or worse than the default?) then post them to vim_mac. From c0e672072ca4b1565052589f76d863397429343c Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Thu, 27 Sep 2007 17:51:54 +0000 Subject: [PATCH 0252/1156] Renamed SetVimWindowTitleMsgId -> SetWindowTitleMsgId git-svn-id: http://macvim.googlecode.com/svn/trunk@284 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMVimController.m | 2 +- MacVim.h | 4 ++-- MacVim.m | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/MMVimController.m b/MMVimController.m index 1c6977a06b..0abdbe4168 100644 --- a/MMVimController.m +++ b/MMVimController.m @@ -525,7 +525,7 @@ - (void)handleMessage:(int)msgid data:(NSData *)data int cols = *((int*)bytes); bytes += sizeof(int); [windowController setTextDimensionsWithRows:rows columns:cols]; - } else if (SetVimWindowTitleMsgID == msgid) { + } else if (SetWindowTitleMsgID == msgid) { const void *bytes = [data bytes]; int len = *((int*)bytes); bytes += sizeof(int); diff --git a/MacVim.h b/MacVim.h index 685037973c..0838730d55 100644 --- a/MacVim.h +++ b/MacVim.h @@ -12,7 +12,7 @@ // Enable to use experimental 'enc' support. -#define MM_ENABLE_CONV 0 +#define MM_ENABLE_CONV 1 @@ -119,7 +119,7 @@ enum { ShowTabBarMsgID, HideTabBarMsgID, SetTextDimensionsMsgID, - SetVimWindowTitleMsgID, + SetWindowTitleMsgID, ScrollWheelMsgID, MouseDownMsgID, MouseUpMsgID, diff --git a/MacVim.m b/MacVim.m index 13b2ce7ec9..84bf922cef 100644 --- a/MacVim.m +++ b/MacVim.m @@ -26,7 +26,7 @@ "ShowTabBarMsgID", "HideTabBarMsgID", "SetTextDimensionsMsgID", - "SetVimWindowTitleMsgID", + "SetWindowTitleMsgID", "ScrollWheelMsgID", "MouseDownMsgID", "MouseUpMsgID", From b88c64d80df7e12af9c338e2323983cc776ea537 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Thu, 27 Sep 2007 17:52:48 +0000 Subject: [PATCH 0253/1156] Implemented support for 'enc' (disable with MM_ENABLE_CONV = 0) git-svn-id: http://macvim.googlecode.com/svn/trunk@285 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMBackend.h | 2 +- MMBackend.m | 215 ++++++++++++++++++++++++------- gui_macvim.m | 356 ++++++++++++++++++++++++++++++++------------------- 3 files changed, 396 insertions(+), 177 deletions(-) diff --git a/MMBackend.h b/MMBackend.h index f64753188c..cee40ad813 100644 --- a/MMBackend.h +++ b/MMBackend.h @@ -83,7 +83,7 @@ - (BOOL)tabBarVisible; - (void)showTabBar:(BOOL)enable; - (void)setRows:(int)rows columns:(int)cols; -- (void)setVimWindowTitle:(char *)title; +- (void)setWindowTitle:(char *)title; - (char *)browseForFileInDirectory:(char *)dir title:(char *)title saving:(int)saving; - (int)presentDialogWithType:(int)type title:(char *)title message:(char *)msg diff --git a/MMBackend.m b/MMBackend.m index d3782895aa..23be376134 100644 --- a/MMBackend.m +++ b/MMBackend.m @@ -443,9 +443,14 @@ - (void)updateTabBar for (tp = first_tabpage; tp != NULL; tp = tp->tp_next) { // This function puts the label of the tab in the global 'NameBuff'. get_tabline_label(tp, FALSE); - int len = strlen((char*)NameBuff); + char_u *s = NameBuff; + int len = STRLEN(s); if (len <= 0) continue; +#if MM_ENABLE_CONV + s = CONVERT_TO_UTF8(s); +#endif + // Count the number of windows in the tabpage. //win_T *wp = tp->tp_firstwin; //int wincount; @@ -453,7 +458,11 @@ - (void)updateTabBar //[data appendBytes:&wincount length:sizeof(int)]; [data appendBytes:&len length:sizeof(int)]; - [data appendBytes:NameBuff length:len]; + [data appendBytes:s length:len]; + +#if MM_ENABLE_CONV + CONVERT_TO_UTF8_FREE(s); +#endif } [self queueMessage:UpdateTabBarMsgID data:data]; @@ -482,7 +491,7 @@ - (void)setRows:(int)rows columns:(int)cols [self queueMessage:SetTextDimensionsMsgID data:data]; } -- (void)setVimWindowTitle:(char *)title +- (void)setWindowTitle:(char *)title { NSMutableData *data = [NSMutableData data]; int len = strlen(title); @@ -491,7 +500,7 @@ - (void)setVimWindowTitle:(char *)title [data appendBytes:&len length:sizeof(int)]; [data appendBytes:title length:len]; - [self queueMessage:SetVimWindowTitleMsgID data:data]; + [self queueMessage:SetWindowTitleMsgID data:data]; } - (char *)browseForFileInDirectory:(char *)dir title:(char *)title @@ -501,12 +510,8 @@ - (char *)browseForFileInDirectory:(char *)dir title:(char *)title // saving); char_u *s = NULL; - NSString *ds = dir - ? [NSString stringWithCString:dir encoding:NSUTF8StringEncoding] - : nil; - NSString *ts = title - ? [NSString stringWithCString:title encoding:NSUTF8StringEncoding] - : nil; + NSString *ds = dir ? [NSString stringWithUTF8String:dir] : nil; + NSString *ts = title ? [NSString stringWithUTF8String:title] : nil; @try { [frontendProxy showSavePanelForDirectory:ds title:ts saving:saving]; @@ -515,7 +520,14 @@ - (char *)browseForFileInDirectory:(char *)dir title:(char *)title beforeDate:[NSDate distantFuture]]; if (dialogReturn && [dialogReturn isKindOfClass:[NSString class]]) { - s = vim_strsave((char_u*)[dialogReturn UTF8String]); + char_u *ret = (char_u*)[dialogReturn UTF8String]; +#if MM_ENABLE_CONV + ret = CONVERT_FROM_UTF8(ret); +#endif + s = vim_strsave(ret); +#if MM_ENABLE_CONV + CONVERT_FROM_UTF8_FREE(ret); +#endif } [dialogReturn release]; dialogReturn = nil; @@ -591,8 +603,14 @@ - (int)presentDialogWithType:(int)type title:(char *)title message:(char *)msg retval = [[dialogReturn objectAtIndex:0] intValue]; if (txtfield && [dialogReturn count] > 1) { NSString *retString = [dialogReturn objectAtIndex:1]; - vim_strncpy((char_u*)txtfield, (char_u*)[retString UTF8String], - IOSIZE - 1); + char_u *ret = (char_u*)[retString UTF8String]; +#if MM_ENABLE_CONV + ret = CONVERT_FROM_UTF8(ret); +#endif + vim_strncpy((char_u*)txtfield, ret, IOSIZE - 1); +#if MM_ENABLE_CONV + CONVERT_FROM_UTF8_FREE(ret); +#endif } } @@ -772,8 +790,7 @@ - (BOOL)setFontWithName:(char *)name BOOL parseFailed = NO; if (name) { - fontName = [[[NSString alloc] initWithCString:name - encoding:NSUTF8StringEncoding] autorelease]; + fontName = [NSString stringWithUTF8String:name]; if ([fontName isEqual:@"*"]) { // :set gfn=* shows the font panel. @@ -910,12 +927,6 @@ - (void)activate [self queueMessage:ActivateMsgID data:nil]; } -- (void)setServerName:(NSString *)name -{ - NSData *data = [name dataUsingEncoding:NSUTF8StringEncoding]; - [self queueMessage:SetServerNameMsgID data:data]; -} - - (int)lookupColorWithKey:(NSString *)key { if (!(key && [key length] > 0)) @@ -981,11 +992,10 @@ - (oneway void)processInput:(int)msgid data:(in NSData *)data // NOTE: This method might get called whenever the run loop is tended to. // Thus it might get called whilst input is being processed. Normally this // is not a problem, but if it gets called often then it might become - // dangerous. E.g. when a focus messages is received the screen is redrawn - // because the selection color changes and if another focus message is - // received whilst the first one is being processed Vim might crash. To - // deal with this problem at the moment, we simply drop messages that are - // received while other input is being processed. + // dangerous. E.g. say a message causes the screen to be redrawn and then + // another message is received causing another simultaneous screen redraw; + // this is not good. To deal with this problem at the moment, we simply + // drop messages that are received while other input is being processed. if (inProcessInput) { #if MM_USE_INPUT_QUEUE [inputQueue addObject:[NSNumber numberWithInt:msgid]]; @@ -1056,11 +1066,23 @@ - (BOOL)starRegisterToPasteboard:(byref NSPasteboard *)pboard clip_copy_selection(); // Get the text to put on the pasteboard. - long_u len = 0; char_u *str = 0; - int type = clip_convert_selection(&str, &len, &clip_star); + long_u llen = 0; char_u *str = 0; + int type = clip_convert_selection(&str, &llen, &clip_star); if (type < 0) return NO; + // TODO: Avoid overflow. + int len = (int)llen; +#if MM_ENABLE_CONV + if (output_conv.vc_type != CONV_NONE) { + char_u *conv_str = string_convert(&output_conv, str, &len); + if (conv_str) { + vim_free(str); + str = conv_str; + } + } +#endif + NSString *string = [[NSString alloc] initWithBytes:str length:len encoding:NSUTF8StringEncoding]; @@ -1104,7 +1126,17 @@ - (void)addInput:(in bycopy NSString *)input { //NSLog(@"addInput:%@ client:%@", input, (id)client); - server_to_input_buf((char_u*)[input UTF8String]); + char_u *s = (char_u*)[input UTF8String]; + +#if MM_ENABLE_CONV + s = CONVERT_FROM_UTF8(s); +#endif + + server_to_input_buf(s); + +#if MM_ENABLE_CONV + CONVERT_FROM_UTF8_FREE(s); +#endif [self addClient:(id)client]; @@ -1117,10 +1149,27 @@ - (NSString *)evaluateExpression:(in bycopy NSString *)expr //NSLog(@"evaluateExpression:%@ client:%@", expr, (id)client); NSString *eval = nil; - char_u *res = eval_client_expr_to_string((char_u*)[expr UTF8String]); + char_u *s = (char_u*)[expr UTF8String]; + +#if MM_ENABLE_CONV + s = CONVERT_FROM_UTF8(s); +#endif + + char_u *res = eval_client_expr_to_string(s); + +#if MM_ENABLE_CONV + CONVERT_FROM_UTF8_FREE(s); +#endif if (res != NULL) { - eval = [NSString stringWithUTF8String:(char*)res]; + s = res; +#if MM_ENABLE_CONV + s = CONVERT_TO_UTF8(s); +#endif + eval = [NSString stringWithUTF8String:(char*)s]; +#if MM_ENABLE_CONV + CONVERT_TO_UTF8_FREE(s); +#endif vim_free(res); } @@ -1149,8 +1198,15 @@ - (void)registerServerWithName:(NSString *)name //[svrConn setReplyTimeout:MMReplyTimeout]; [svrConn setRootObject:self]; + char_u *s = (char_u*)[svrName UTF8String]; +#if MM_ENABLE_CONV + s = CONVERT_FROM_UTF8(s); +#endif // NOTE: 'serverName' is a global variable - serverName = vim_strsave((char_u*)[svrName UTF8String]); + serverName = vim_strsave(s); +#if MM_ENABLE_CONV + CONVERT_FROM_UTF8_FREE(s); +#endif #ifdef FEAT_EVAL set_vim_var_string(VV_SEND_SERVER, serverName, -1); #endif @@ -1176,8 +1232,16 @@ - (BOOL)sendToServer:(NSString *)name string:(NSString *)string NSConnection *conn = [self connectionForServerName:name]; if (!conn) { - if (!silent) - EMSG2(_(e_noserver), [name UTF8String]); + if (!silent) { + char_u *s = (char_u*)[name UTF8String]; +#if MM_ENABLE_CONV + s = CONVERT_FROM_UTF8(s); +#endif + EMSG2(_(e_noserver), s); +#if MM_ENABLE_CONV + CONVERT_FROM_UTF8_FREE(s); +#endif + } return NO; } @@ -1193,8 +1257,18 @@ - (BOOL)sendToServer:(NSString *)name string:(NSString *)string if (expr) { NSString *eval = [proxy evaluateExpression:string client:self]; if (reply) { - *reply = (eval ? vim_strsave((char_u*)[eval UTF8String]) - : vim_strsave((char_u*)_(e_invexprmsg))); + if (eval) { + char_u *r = (char_u*)[eval UTF8String]; +#if MM_ENABLE_CONV + r = CONVERT_FROM_UTF8(r); +#endif + *reply = vim_strsave(r); +#if MM_ENABLE_CONV + CONVERT_FROM_UTF8_FREE(r); +#endif + } else { + *reply = vim_strsave((char_u*)_(e_invexprmsg)); + } } if (!eval) @@ -1552,8 +1626,17 @@ - (void)handleMessage:(int)msgid data:(NSData *)data NSMutableString *name = [NSMutableString stringWithUTF8String:bytes]; [name appendString:[NSString stringWithFormat:@":h%.2f", pointSize]]; + char_u *s = (char_u*)[name UTF8String]; + +#if MM_ENABLE_CONV + s = CONVERT_FROM_UTF8(s); +#endif - set_option_value((char_u*)"gfn", 0, (char_u*)[name UTF8String], 0); + set_option_value((char_u*)"guifont", 0, s, 0); + +#if MM_ENABLE_CONV + CONVERT_FROM_UTF8_FREE(s); +#endif // Force screen redraw (does it have to be this complicated?). redraw_all_later(CLEAR); @@ -1579,7 +1662,14 @@ - (void)handleMessage:(int)msgid data:(NSData *)data int i = 0; while (bytes < end && i < n) { int len = *((int*)bytes); bytes += sizeof(int); - fnames[i++] = vim_strnsave((char_u*)bytes, len); + char_u *s = (char_u*)bytes; +#if MM_ENABLE_CONV + s = CONVERT_FROM_UTF8(s); +#endif + fnames[i++] = vim_strsave(s); +#if MM_ENABLE_CONV + s = CONVERT_FROM_UTF8_FREE(s); +#endif bytes += len; } @@ -1616,7 +1706,14 @@ - (void)handleMessage:(int)msgid data:(NSData *)data // messy). goto_tabpage(9999); - do_cmdline_cmd((char_u*)[cmd UTF8String]); + char_u *s = (char_u*)[cmd UTF8String]; +#if MM_ENABLE_CONV + s = CONVERT_FROM_UTF8(s); +#endif + do_cmdline_cmd(s); +#if MM_ENABLE_CONV + CONVERT_FROM_UTF8_FREE(s); +#endif // Force screen redraw (does it have to be this complicated?). // (This code was taken from the end of gui_handle_drop().) @@ -1645,7 +1742,16 @@ - (void)handleMessage:(int)msgid data:(NSData *)data } len = [string lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; - dnd_yank_drag_data((char_u*)[string UTF8String], len); + char_u *s = (char_u*)[string UTF8String]; +#if MM_ENABLE_CONV + if (input_conv.vc_type != CONV_NONE) + s = string_convert(&input_conv, s, &len); +#endif + dnd_yank_drag_data(s, len); +#if MM_ENABLE_CONV + if (input_conv.vc_type != CONV_NONE) + vim_free(s); +#endif add_to_input_buf(dropkey, sizeof(dropkey)); #endif // FEAT_DND } else if (GotFocusMsgID == msgid) { @@ -1688,6 +1794,9 @@ - (void)handleKeyDown:(NSString *)key modifiers:(int)mods char_u special[3]; char_u modChars[3]; char_u *chars = (char_u*)[key UTF8String]; +#if MM_ENABLE_CONV + char_u *conv_str = NULL; +#endif int length = [key lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; // Special keys (arrow keys, function keys, etc.) are stored in a plist so @@ -1730,10 +1839,15 @@ - (void)handleKeyDown:(NSString *)key modifiers:(int)mods length = 3; } else if (mods & MOD_MASK_ALT) { int mtab = 0x80 | TAB; - // Convert to utf-8 - special[0] = (mtab >> 6) + 0xc0; - special[1] = mtab & 0xbf; - length = 2; + if (enc_utf8) { + // Convert to utf-8 + special[0] = (mtab >> 6) + 0xc0; + special[1] = mtab & 0xbf; + length = 2; + } else { + special[0] = mtab; + length = 1; + } mods &= ~MOD_MASK_ALT; } } else if (length > 0) { @@ -1766,6 +1880,14 @@ - (void)handleKeyDown:(NSString *)key modifiers:(int)mods //NSLog(@"clear alt"); mods &= ~MOD_MASK_ALT; } + +#if MM_ENABLE_CONV + if (input_conv.vc_type != CONV_NONE) { + conv_str = string_convert(&input_conv, chars, &length); + if (conv_str) + chars = conv_str; + } +#endif } if (chars && length > 0) { @@ -1781,6 +1903,11 @@ - (void)handleKeyDown:(NSString *)key modifiers:(int)mods // TODO: Check for CSI bytes? add_to_input_buf(chars, length); } + +#if MM_ENABLE_CONV + if (conv_str) + vim_free(conv_str); +#endif } - (void)queueMessage:(int)msgid data:(NSData *)data diff --git a/gui_macvim.m b/gui_macvim.m index 0c5aa00037..2c6f9127cc 100644 --- a/gui_macvim.m +++ b/gui_macvim.m @@ -71,11 +71,9 @@ if (![[MMBackend sharedInstance] checkin]) return FAIL; - // HACK! Force the 'termencoding to utf-8. For the moment also force - // 'encoding', although this will change in the future. The user can still - // change 'encoding'; doing so WILL crash the program. + // Force 'termencoding' to utf-8 (changes to 'tenc' are disallowed in + // 'option.c', so that ':set termencoding=...' is impossible). set_option_value((char_u *)"termencoding", 0L, (char_u *)"utf-8", 0); - set_option_value((char_u *)"encoding", 0L, (char_u *)"utf-8", 0); // Set values so that pixels and characters are in one-to-one // correspondence (assuming all characters have the same dimensions). @@ -209,88 +207,28 @@ void gui_mch_draw_string(int row, int col, char_u *s, int len, int flags) { +#if MM_ENABLE_CONV + char_u *conv_str = NULL; + if (output_conv.vc_type != CONV_NONE) { + conv_str = string_convert(&output_conv, s, &len); + if (conv_str) + s = conv_str; + } +#endif + [[MMBackend sharedInstance] replaceString:(char*)s length:len row:row column:col flags:flags]; + +#if MM_ENABLE_CONV + if (conv_str) + vim_free(conv_str); +#endif } int gui_macvim_draw_string(int row, int col, char_u *s, int len, int flags) { -#if 0 - NSString *string = [[NSString alloc] - initWithBytesNoCopy:(void*)s - length:len - encoding:NSUTF8StringEncoding - freeWhenDone:NO]; - int cells = [string length]; - [string release]; - - NSLog(@"gui_macvim_draw_string(row=%d, col=%d, len=%d, cells=%d, flags=%d)", - row, col, len, cells, flags); - - [[MMBackend sharedInstance] replaceString:(char*)s length:len - row:row column:col flags:flags]; - - return cells; -#elif 0 - int c; - int cn; - int cl; - int i; - BOOL wide = NO; - int start = 0; - int endcol = col; - int startcol = col; - MMBackend *backend = [MMBackend sharedInstance]; - - for (i = 0; i < len; i += cl) { - c = utf_ptr2char(s + i); - cl = utf_ptr2len(s + i); - cn = utf_char2cells(c); - comping = utf_iscomposing(c); - - if (!comping) - endcol += cn; - - if (cn > 1 && !wide) { - // Start of wide characters. - wide = YES; - - // Output non-wide characters. - if (start > i) { - NSLog(@"Outputting %d non-wide chars (%d bytes)", - endcol-startcol, start-i); - [backend replaceString:(char*)(s+start) length:start-i - row:row column:startcol flags:flags]; - startcol = endcol; - start = i; - } - } else if (cn <= 1 && !comping && wide) { - // End of wide characters. - wide = NO; - - // Output wide characters. - if (start > i) { - NSLog(@"Outputting %d wide chars (%d bytes)", - endcol-startcol, start-i); - [backend replaceString:(char*)(s+start) length:start-i - row:row column:startcol flags:(flags|0x80)]; - startcol = endcol; - start = i; - } - } - } - - // Output remaining characters. - flags = wide ? flags|0x80 : flags; - NSLog(@"Outputting %d %s chars (%d bytes)", endcol-startcol, wide ? "wide" - : "non-wide", len-start); - [backend replaceString:(char*)(s+start) length:len-start - row:row column:startcol flags:flags]; - - return endcol - col; -#elif 1 // // Output chars until a wide char found. If a wide char is found, output a // zero-width space after it so that a wide char looks like two chars to @@ -311,7 +249,7 @@ char_u *conv_str = NULL; if (output_conv.vc_type != CONV_NONE) { - char_u *conv_str = string_convert(&output_conv, s, &len); + conv_str = string_convert(&output_conv, s, &len); if (conv_str) s = conv_str; } @@ -392,23 +330,6 @@ #endif return endcol - col; -#else - // This will fail abysmally when wide or composing characters are used. - [[MMBackend sharedInstance] - replaceString:(char*)s length:len row:row column:col flags:flags]; - - int i, c, cl, cn, cells = 0; - for (i = 0; i < len; i += cl) { - c = utf_ptr2char(s + i); - cl = utf_ptr2len(s + i); - cn = utf_char2cells(c); - - if (!utf_iscomposing(c)) - cells += cn; - } - - return cells; -#endif } @@ -577,19 +498,17 @@ int len = [string lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; #if MM_ENABLE_CONV - if (input_conv.vc_type != CONV_NONE) { - NSLog(@"Converting from: '%@'", string); - char_u *conv_str = string_convert(&input_conv, str, &len); - if (conv_str) { - NSLog(@" to: '%s'", conv_str); - clip_yank_selection(type, conv_str, len, cbd); - vim_free(conv_str); - return; - } - } + if (input_conv.vc_type != CONV_NONE) + str = string_convert(&input_conv, str, &len); #endif - clip_yank_selection(type, str, len, cbd); + if (str) + clip_yank_selection(type, str, len, cbd); + +#if MM_ENABLE_CONV + if (input_conv.vc_type != CONV_NONE) + vim_free(str); +#endif } } @@ -659,9 +578,18 @@ MenuMenubarType; } + char_u *dname = menu->dname; +#if MM_ENABLE_CONV + dname = CONVERT_TO_UTF8(dname); +#endif + [[MMBackend sharedInstance] - addMenuWithTag:(int)menu parent:parent name:(char*)menu->dname + addMenuWithTag:(int)menu parent:parent name:(char*)dname atIndex:idx]; + +#if MM_ENABLE_CONV + CONVERT_TO_UTF8_FREE(dname); +#endif } @@ -673,20 +601,27 @@ { // NOTE! If 'iconfile' is not set but 'iconidx' is, use the name of the // menu item. (Should correspond to a stock item.) - char *icon = menu->iconfile ? (char*)menu->iconfile : - menu->iconidx >= 0 ? (char*)menu->dname : + char_u *icon = menu->iconfile ? menu->iconfile : + menu->iconidx >= 0 ? menu->dname : NULL; //char *name = menu_is_separator(menu->name) ? NULL : (char*)menu->dname; - char *name = (char*)menu->dname; - char *tip = menu->strings[MENU_INDEX_TIP] - ? (char*)menu->strings[MENU_INDEX_TIP] : (char*)menu->actext; + char_u *name = menu->dname; + char_u *tip = menu->strings[MENU_INDEX_TIP] + ? menu->strings[MENU_INDEX_TIP] : menu->actext; + char_u *map_str = menu->strings[MENU_INDEX_NORMAL]; + +#if MM_ENABLE_CONV + icon = CONVERT_TO_UTF8(icon); + name = CONVERT_TO_UTF8(name); + tip = CONVERT_TO_UTF8(tip); + map_str = CONVERT_TO_UTF8(map_str); +#endif // HACK! Check if menu is mapped to ':action actionName:'; if so, pass the // action along so that MacVim can bind the menu item to this action. This // means that if a menu item maps to an action in normal mode, then all // other modes will also use the same action. NSString *action = nil; - char_u *map_str = menu->strings[MENU_INDEX_NORMAL]; if (map_str) { NSString *mapping = [NSString stringWithCString:(char*)map_str encoding:NSUTF8StringEncoding]; @@ -704,13 +639,20 @@ [[MMBackend sharedInstance] addMenuItemWithTag:(int)menu parent:(int)menu->parent - name:name - tip:tip + name:(char*)name + tip:(char*)tip icon:(char*)icon keyEquivalent:menu->ke_key modifiers:menu->ke_mods action:action atIndex:idx]; + +#if MM_ENABLE_CONV + CONVERT_TO_UTF8_FREE(icon); + CONVERT_TO_UTF8_FREE(name); + CONVERT_TO_UTF8_FREE(tip); + CONVERT_TO_UTF8_FREE(map_str); +#endif } @@ -754,8 +696,18 @@ void gui_mch_show_popupmenu(vimmenu_T *menu) { - [[MMBackend sharedInstance] showPopupMenuWithName:(char*)menu->name + char_u *name = menu->name; +#if MM_ENABLE_CONV + name = CONVERT_TO_UTF8(name); +#endif + + [[MMBackend sharedInstance] showPopupMenuWithName:(char*)name atMouseLocation:YES]; + +#if MM_ENABLE_CONV + CONVERT_TO_UTF8_FREE(name); +#endif + } @@ -765,8 +717,16 @@ void gui_make_popup(char_u *path_name, int mouse_pos) { +#if MM_ENABLE_CONV + path_name = CONVERT_TO_UTF8(path_name); +#endif + [[MMBackend sharedInstance] showPopupMenuWithName:(char*)path_name atMouseLocation:mouse_pos]; + +#if MM_ENABLE_CONV + CONVERT_TO_UTF8_FREE(path_name); +#endif } @@ -861,8 +821,18 @@ // HACK! This gets called whenever the user types :set gfn=fontname, so // for now we set the font here. // TODO! Proper font handling, the way Vim expects it. - return [[MMBackend sharedInstance] - setFontWithName:(char*)font_name]; + +#if MM_ENABLE_CONV + font_name = CONVERT_TO_UTF8(font_name); +#endif + + BOOL ok = [[MMBackend sharedInstance] setFontWithName:(char*)font_name]; + +#if MM_ENABLE_CONV + CONVERT_TO_UTF8_FREE(font_name); +#endif + + return ok; } @@ -1053,13 +1023,22 @@ return; } - NSString *name = [NSString stringWithCString:(char*)eap->arg + char_u *arg = eap->arg; +#if MM_ENABLE_CONV + arg = CONVERT_TO_UTF8(arg); +#endif + + NSString *name = [NSString stringWithCString:(char*)arg encoding:NSUTF8StringEncoding]; if (gui_macvim_is_valid_action(name)) { [[MMBackend sharedInstance] executeActionWithName:name]; } else { EMSG2(_("E???: \"%s\" is not a valid action"), eap->arg); } + +#if MM_ENABLE_CONV + arg = CONVERT_TO_UTF8(arg); +#endif } @@ -1112,10 +1091,20 @@ //NSLog(@"gui_mch_browse(saving=%d, title=%s, dflt=%s, ext=%s, initdir=%s," // " filter=%s", saving, title, dflt, ext, initdir, filter); +#if MM_ENABLE_CONV + title = CONVERT_TO_UTF8(title); + initdir = CONVERT_TO_UTF8(initdir); +#endif + char_u *s = (char_u*)[[MMBackend sharedInstance] browseForFileInDirectory:(char*)initdir title:(char*)title saving:saving]; +#if MM_ENABLE_CONV + CONVERT_TO_UTF8_FREE(title); + CONVERT_TO_UTF8_FREE(initdir); +#endif + return s; } #endif /* FEAT_BROWSE */ @@ -1135,11 +1124,28 @@ // "dfltbutton=%d textfield=%s)", type, title, message, buttons, // dfltbutton, textfield); - return [[MMBackend sharedInstance] presentDialogWithType:type - title:(char*)title - message:(char*)message - buttons:(char*)buttons - textField:(char*)textfield]; +#if MM_ENABLE_CONV + title = CONVERT_TO_UTF8(title); + message = CONVERT_TO_UTF8(message); + buttons = CONVERT_TO_UTF8(buttons); + textfield = CONVERT_TO_UTF8(textfield); +#endif + + int ret = [[MMBackend sharedInstance] + presentDialogWithType:type + title:(char*)title + message:(char*)message + buttons:(char*)buttons + textField:(char*)textfield]; + +#if MM_ENABLE_CONV + CONVERT_TO_UTF8_FREE(title); + CONVERT_TO_UTF8_FREE(message); + CONVERT_TO_UTF8_FREE(buttons); + CONVERT_TO_UTF8_FREE(textfield); +#endif + + return ret; } @@ -1158,8 +1164,18 @@ guicolor_T gui_mch_get_color(char_u *name) { +#if MM_ENABLE_CONV + name = CONVERT_TO_UTF8(name); +#endif + NSString *key = [NSString stringWithUTF8String:(char*)name]; - return [[MMBackend sharedInstance] lookupColorWithKey:key]; + guicolor_T col = [[MMBackend sharedInstance] lookupColorWithKey:key]; + +#if MM_ENABLE_CONV + CONVERT_TO_UTF8_FREE(name); +#endif + + return col; } @@ -1210,11 +1226,21 @@ int gui_mch_haskey(char_u *name) { + BOOL ok = NO; + +#if MM_ENABLE_CONV + name = CONVERT_TO_UTF8(name); +#endif + NSString *value = [NSString stringWithUTF8String:(char*)name]; if (value) - return [[MMBackend sharedInstance] hasSpecialKeyWithValue:value]; + ok = [[MMBackend sharedInstance] hasSpecialKeyWithValue:value]; + +#if MM_ENABLE_CONV + CONVERT_TO_UTF8_FREE(name); +#endif - return NO; + return ok; } @@ -1292,7 +1318,15 @@ { //NSLog(@"gui_mch_settitle(title=%s, icon=%s)", title, icon); - [[MMBackend sharedInstance] setVimWindowTitle:(char*)title]; +#if MM_ENABLE_CONV + title = CONVERT_TO_UTF8(title); +#endif + + [[MMBackend sharedInstance] setWindowTitle:(char*)title]; + +#if MM_ENABLE_CONV + CONVERT_TO_UTF8_FREE(title); +#endif } #endif @@ -1348,8 +1382,16 @@ void serverRegisterName(char_u *name) { +#if MM_ENABLE_CONV + name = CONVERT_TO_UTF8(name); +#endif + NSString *svrName = [NSString stringWithUTF8String:(char*)name]; [[MMBackend sharedInstance] registerServerWithName:svrName]; + +#if MM_ENABLE_CONV + CONVERT_TO_UTF8_FREE(name); +#endif } @@ -1361,6 +1403,11 @@ serverSendToVim(char_u *name, char_u *cmd, char_u **result, int *port, int asExpr, int silent) { +#if MM_ENABLE_CONV + name = CONVERT_TO_UTF8(name); + cmd = CONVERT_TO_UTF8(cmd); +#endif + BOOL ok = [[MMBackend sharedInstance] sendToServer:[NSString stringWithUTF8String:(char*)name] string:[NSString stringWithUTF8String:(char*)cmd] @@ -1369,6 +1416,11 @@ expression:asExpr silent:silent]; +#if MM_ENABLE_CONV + CONVERT_TO_UTF8_FREE(name); + CONVERT_TO_UTF8_FREE(cmd); +#endif + return ok ? 0 : -1; } @@ -1384,7 +1436,14 @@ if (list) { NSString *string = [list componentsJoinedByString:@"\n"]; - names = vim_strsave((char_u*)[string UTF8String]); + char_u *s = (char_u*)[string UTF8String]; +#if MM_ENABLE_CONV + s = CONVERT_FROM_UTF8(s); +#endif + names = vim_strsave(s); +#if MM_ENABLE_CONV + CONVERT_FROM_UTF8_FREE(s); +#endif } return names; @@ -1415,9 +1474,29 @@ serverPeekReply(int port, char_u **str) { NSString *reply = [[MMBackend sharedInstance] peekForReplyOnPort:port]; - if (str) + int len = [reply lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; + + if (str && len > 0) { *str = (char_u*)[reply UTF8String]; +#if MM_ENABLE_CONV + if (input_conv.vc_type != CONV_NONE) { + char_u *s = string_convert(&input_conv, *str, &len); + + if (len > 0) { + // HACK! Since 's' needs to be freed we cannot simply set + // '*str = s' or memory will leak. Instead, create a dummy + // NSData and return its 'bytes' pointer, then autorelease the + // NSData. + NSData *data = [NSData dataWithBytes:s length:len+1]; + *str = (char_u*)[data bytes]; + } + + vim_free(s); + } +#endif + } + return reply != nil; } @@ -1432,7 +1511,14 @@ { NSString *reply = [[MMBackend sharedInstance] waitForReplyOnPort:port]; if (reply && str) { - *str = vim_strsave((char_u*)[reply UTF8String]); + char_u *s = (char_u*)[reply UTF8String]; +#if MM_ENABLE_CONV + s = CONVERT_FROM_UTF8(s); +#endif + *str = vim_strsave(s); +#if MM_ENABLE_CONV + CONVERT_FROM_UTF8_FREE(s); +#endif return 0; } @@ -1450,10 +1536,16 @@ int retval = -1; int port = serverStrToPort(serverid); if (port > 0 && reply) { +#if MM_ENABLE_CONV + reply = CONVERT_TO_UTF8(reply); +#endif BOOL ok = [[MMBackend sharedInstance] sendReply:[NSString stringWithUTF8String:(char*)reply] toPort:port]; retval = ok ? 0 : -1; +#if MM_ENABLE_CONV + CONVERT_TO_UTF8_FREE(reply); +#endif } return retval; From 42cbb40719c5dbe36464bebc27829563fc79185d Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Thu, 27 Sep 2007 17:53:42 +0000 Subject: [PATCH 0254/1156] Got rid of multibyte chars in comment git-svn-id: http://macvim.googlecode.com/svn/trunk@286 96c4425d-ca35-0410-94e5-3396d5c13a8f --- gvimrc | 6 +----- vimrc | 2 +- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/gvimrc b/gvimrc index 63fbc3b2c3..4634e661fa 100644 --- a/gvimrc +++ b/gvimrc @@ -1,6 +1,6 @@ " System gvimrc file for MacVim " -" Maintainer: Björn Winckler +" Maintainer: Bjorn Winckler " Last Change: Mon Sep 17 2007 " " This is a work in progress. If you feel so inclined, please help me improve @@ -21,10 +21,6 @@ if !exists("syntax_on") syntax on endif -" Change selection color on focus change (disabled until I can figure out how -" to restore the last value for Visual on FocusGained) -"au FocusLost * hi Visual guibg=MacSecondarySelectedControlColor -"au FocusGained * hi Visual guibg=MacSelectedTextBackgroundColor " diff --git a/vimrc b/vimrc index 6f6c4c36f0..b4ea93ecaa 100644 --- a/vimrc +++ b/vimrc @@ -1,6 +1,6 @@ " System vimrc file for MacVim " -" Maintainer: Björn Winckler +" Maintainer: Bjorn Winckler " Last Change: Sat Aug 11 14:26:41 CEST 2007 set nocompatible From 516a49f81af68aa5f0e62838cfaec8a3265c172f Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Thu, 27 Sep 2007 17:54:21 +0000 Subject: [PATCH 0255/1156] Got rid of multibyte chars in comment git-svn-id: http://macvim.googlecode.com/svn/trunk@287 96c4425d-ca35-0410-94e5-3396d5c13a8f --- runtime/colors/macvim.vim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runtime/colors/macvim.vim b/runtime/colors/macvim.vim index db19e67814..e2afd1b14e 100644 --- a/runtime/colors/macvim.vim +++ b/runtime/colors/macvim.vim @@ -1,6 +1,6 @@ " MacVim colorscheme " -" Maintainer: Björn Winckler +" Maintainer: Bjorn Winckler " Last Change: 2007 Sep 22 " From 556a49deec8e84081b1d6745708ad6677eba21cb Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Thu, 27 Sep 2007 17:55:28 +0000 Subject: [PATCH 0256/1156] - Expanded info on macvim-encoding - Added section on toolbar - Added encoding hint - Removed 'enc' todo git-svn-id: http://macvim.googlecode.com/svn/trunk@288 96c4425d-ca35-0410-94e5-3396d5c13a8f --- runtime/doc/gui_mac.txt | 58 +++++++++++++++++++++++++++++++---------- 1 file changed, 44 insertions(+), 14 deletions(-) diff --git a/runtime/doc/gui_mac.txt b/runtime/doc/gui_mac.txt index b3c82f6f5c..4ca4449a1b 100644 --- a/runtime/doc/gui_mac.txt +++ b/runtime/doc/gui_mac.txt @@ -1,7 +1,7 @@ *gui_mac.txt* For Vim version 7.1. Last change: 2007 Sep 18 - VIM REFERENCE MANUAL by Björn Winckler + VIM REFERENCE MANUAL by Bjorn Winckler The MacVim Graphical User Interface *macvim* *gui-macvim* @@ -11,10 +11,11 @@ The MacVim Graphical User Interface *macvim* *gui-macvim* 2. Starting MacVim |gui-macvim-start| 3. Special colors |macvim-colors| 4. Menus |macvim-menus| -5. Dialogs |macvim-dialogs| -6. System services |macvim-services| -7. Known bugs/missing features |macvim-todo| -8. Hints |macvim-hints| +5. Toolbar |macvim-toolbar| +6. Dialogs |macvim-dialogs| +7. System services |macvim-services| +8. Known bugs/missing features |macvim-todo| +9. Hints |macvim-hints| Other relevant documentation: |gui.txt| For generic items of the GUI. @@ -55,6 +56,14 @@ contains the text view, scrollbars, toolbar and tabline. To avoid confusion, the former is referred to as a Vim-window, whereas the latter is simply called a window. + *macvim-encoding* +It is not possible to modify 'termencoding' in MacVim; this option is forcibly +set to "utf-8". The most natural value for 'encoding' is "utf-8" as well, but +this is not the default for reasons explained in the help for 'encoding'. If +you want to edit files with non-English characters you should add the +following line to "~/.gvimrc": > + set encoding=utf-8 +< *macvim-shift-movement* Text editors on Mac OS X lets the user hold down shift+movement key to extend the selection. Also, pressing a printable key whilst selecting replaces the @@ -67,10 +76,6 @@ lines to your "~/.vimrc" (not .gvimrc) file: > let macvim_hig_shift_movement = 1 endif < - *macvim-encoding* -It is not possible to modify 'termencoding' in MacVim; this option is forcibly -set to "utf-8". - *macvim-drag-n-drop* Dragging files and dropping them on a window opens those files in tabs in that window, unless Vim is in command-line mode. In command-line mode the names of @@ -233,7 +238,23 @@ following line to "~/.gvimrc": > (Note that key equivalents must contain the 'D' flag.) ============================================================================== -5. Dialogs *macvim-dialogs* +5. Toolbar *macvim-toolbar* + +The toolbar in MacVim works just like in the other GUIs (see |gui-toolbar|), +with the addition of two separator items (see |menu-separator|). You can use +them as follows: > + :an ToolBar.-space1- + :an ToolBar.-flexspace2- +The first example creates an empty space on the toolbar, the second creates an +empty space which will shink or expand so that the items to the right of it +are right-aligned. A space (flexspace) will be created for any toolbar item +whose name begins with "-space" ("-flexspace") and ends with "-" + +Note: Only a subset of the builtin toolbar items presently have icons. If no +icon can be found a warning triangle is displayed instead. + +============================================================================== +6. Dialogs *macvim-dialogs* Dialogs can be controlled with the keyboard in two ways. By default each button in a dialog is bound to a key. The button that is highlighted by blue @@ -251,7 +272,7 @@ select the current button. The current button is indicated with a blue outline. ============================================================================== -6. System services *macvim-services* +7. System services *macvim-services* MacVim supports a few system services. These can be accessed from the MacVim submenu in the Services menu. For services to work, MacVim.app should be @@ -269,7 +290,7 @@ These are the currently supported services: window. ============================================================================== -7. Known bugs/missing features *macvim-todo* +8. Known bugs/missing features *macvim-todo* Here are some of the bigger bugs in MacVim. Of course there are others, but these are ones that are know and/or which were judged major. @@ -278,7 +299,6 @@ these are ones that are know and/or which were judged major. "International" pane of "System Prefences" may break the menus (and toolbar). - Composing characters are not supported, they will mess up the display -- Only "utf-8" is supported for 'enc' - Sometimes multibyte characters look "too wide", i.e. they overlap the following character. It might help to change 'ambiwidth'. - Printing @@ -291,11 +311,21 @@ simple to implement, but unless somebody asks for a particular feature then there is little incentive to add it. ============================================================================== -8. Hints *macvim-hints* +9. Hints *macvim-hints* In this section some general (not necessarily MacVim specific) hints are given. +Scenario: ~ +You open a file which contain non-English characters, and all you see is lots +of upside-down question marks. +Solution: ~ +Set the 'encoding' option to "utf-8". To make Vim remember this setting +between sessions, add the following line to your "~/.gvimrc": > + set encoding=utf-8 +Be aware that changing 'encoding' has certain side-effects which are +documented in the help for 'encoding'. + Scenario: ~ You try opening a bunch of files in tabs but not all files get opened in their own tab. From c4980c3ac4bbf579812fe46daaa548e3389ec1ca Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Fri, 28 Sep 2007 18:22:57 +0000 Subject: [PATCH 0257/1156] - Got rid of warning message - Set lastFlushDate in processInputBegin (else update will speed suffer) git-svn-id: http://macvim.googlecode.com/svn/trunk@289 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMBackend.m | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/MMBackend.m b/MMBackend.m index 23be376134..74f3766249 100644 --- a/MMBackend.m +++ b/MMBackend.m @@ -1668,7 +1668,7 @@ - (void)handleMessage:(int)msgid data:(NSData *)data #endif fnames[i++] = vim_strsave(s); #if MM_ENABLE_CONV - s = CONVERT_FROM_UTF8_FREE(s); + CONVERT_FROM_UTF8_FREE(s); #endif bytes += len; } @@ -1965,10 +1965,9 @@ - (void)processInputBegin { inProcessInput = YES; - // Reset last flush date otherwise timed error message from e.g. - // ':set tenc=latin1' are never displayed. + // Don't flush too soon or update speed will suffer. [lastFlushDate release]; - lastFlushDate = nil; + lastFlushDate = [[NSDate date] retain]; } - (void)processInputEnd From 651c2ad975bec9555ddd2dc3dc64b7f1bcb19fe6 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Fri, 28 Sep 2007 18:25:00 +0000 Subject: [PATCH 0258/1156] Added gui_macvim_force_flush() function (called from ui_delay()) git-svn-id: http://macvim.googlecode.com/svn/trunk@290 96c4425d-ca35-0410-94e5-3396d5c13a8f --- gui_macvim.m | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/gui_macvim.m b/gui_macvim.m index 2c6f9127cc..84bef4726c 100644 --- a/gui_macvim.m +++ b/gui_macvim.m @@ -145,6 +145,15 @@ } +/* Force flush output to MacVim. Do not call this method unless absolutely + * necessary (use gui_mch_flush() instead). */ + void +gui_macvim_force_flush(void) +{ + [[MMBackend sharedInstance] flushQueue:YES]; +} + + /* * GUI input routine called by gui_wait_for_chars(). Waits for a character * from the keyboard. From 58a943a0f74917eed77776572f864fb5bec4ccf6 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Fri, 28 Sep 2007 19:06:28 +0000 Subject: [PATCH 0259/1156] - Renamed gui-macvim-start tag to macvim-start - Added section on the "mvim" script git-svn-id: http://macvim.googlecode.com/svn/trunk@291 96c4425d-ca35-0410-94e5-3396d5c13a8f --- runtime/doc/gui_mac.txt | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/runtime/doc/gui_mac.txt b/runtime/doc/gui_mac.txt index 4ca4449a1b..64efa1eb23 100644 --- a/runtime/doc/gui_mac.txt +++ b/runtime/doc/gui_mac.txt @@ -8,7 +8,7 @@ The MacVim Graphical User Interface *macvim* *gui-macvim* 0. Important! |macvim-important| 1. MacVim differences |macvim-differences| -2. Starting MacVim |gui-macvim-start| +2. Starting MacVim |macvim-start| 3. Special colors |macvim-colors| 4. Menus |macvim-menus| 5. Toolbar |macvim-toolbar| @@ -91,7 +91,7 @@ Note: The menus are a work in progress. If you know something about the HIG and want to contribute to MacVim you could do so by making the menus better. ============================================================================== -2. Starting MacVim *gui-macvim-start* +2. Starting MacVim *macvim-start* The easiest way to start MacVim is by double-clicking its icon in the Finder, but most users will probably prefer to use the Terminal. First some Finder @@ -113,10 +113,21 @@ Vim binary with the -g switch > or use the "open" command (which is of limited use since it cannot be used to pass parameters to Vim) > open -a MacVim file ... - -In order to save you from having to type the entire path every time you start -MacVim, add the following alias to "~/.profile": > +< + *mvim* +To save yourself from having to type the entire path to the Vim binary each +time you start MacVim, you could create an alias such as > alias gvim='/Applications/MacVim.app/Contents/MacOS/Vim -g' +and add that to "~/.profile". A more flexible way to start MacVim is to use +the shell script "mvim" which comes bundled with MacVim. Put this script in a +folder in your path and then simply type "mvim" to start MacVim. This script +will try to find MacVim.app in various typical folders such as > + ~/Applications ~/Applications/vim + /Applications /Applications/vim + /Applications/Utilities /Applications/Utilities/vim +If you would rather put MacVim.app in some other directory then that is also +possible, simply set the environment variable VIM_APP_DIR to whatever folder +you have placed MacVim.app in. Once in terminal Vim it is possible to start MacVim by using the following command: From d3a78b7125f5c5888125f501ed74eca1f0f93df6 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Fri, 28 Sep 2007 19:23:18 +0000 Subject: [PATCH 0260/1156] Added note on differences in the default window title git-svn-id: http://macvim.googlecode.com/svn/trunk@292 96c4425d-ca35-0410-94e5-3396d5c13a8f --- runtime/doc/gui_mac.txt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/runtime/doc/gui_mac.txt b/runtime/doc/gui_mac.txt index 64efa1eb23..c2c062b108 100644 --- a/runtime/doc/gui_mac.txt +++ b/runtime/doc/gui_mac.txt @@ -90,6 +90,12 @@ menus, so only English menus are supported. Note: The menus are a work in progress. If you know something about the HIG and want to contribute to MacVim you could do so by making the menus better. + *macvim-window-title* +The default window title does not include the argument list because it looks +really bad once you start using tabs. For example, dropping two files, then +dropping two more, and switching back to the first tab would cause weird +strings like "((3) of 2)" to appear in the window title. + ============================================================================== 2. Starting MacVim *macvim-start* From 1eece0985297ec354d1e41a989eb2cf8e7c4c973 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Fri, 28 Sep 2007 20:20:44 +0000 Subject: [PATCH 0261/1156] Ctrl-PageUp/PageDown now get passed on to Vim git-svn-id: http://macvim.googlecode.com/svn/trunk@293 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMTextView.m | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/MMTextView.m b/MMTextView.m index 57cfc91294..107c2ac2f6 100644 --- a/MMTextView.m +++ b/MMTextView.m @@ -259,10 +259,12 @@ - (BOOL)performKeyEquivalent:(NSEvent *)event // NOTE: If the event that triggered this method represents a function key // down then we do nothing, otherwise the input method never gets the key - // stroke (some input methods use e.g. arrow keys). The function key down - // event will still reach Vim though (via keyDown:). + // stroke (some input methods use e.g. arrow keys). The function key down + // event will still reach Vim though (via keyDown:). The exceptions to + // this rule are: PageUp/PageDown (keycode 116/121). int flags = [event modifierFlags]; - if ([event type] != NSKeyDown || flags & NSFunctionKeyMask) + if ([event type] != NSKeyDown || flags & NSFunctionKeyMask + && !(116 == [event keyCode] || 121 == [event keyCode])) return NO; // HACK! Let the main menu try to handle any key down event, before From 8feb525cbde1018f155476d522ec6771de6e1b38 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sun, 30 Sep 2007 15:30:01 +0000 Subject: [PATCH 0262/1156] Added list of non-standard options that MacVim supports git-svn-id: http://macvim.googlecode.com/svn/trunk@294 96c4425d-ca35-0410-94e5-3396d5c13a8f --- runtime/doc/gui_mac.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/runtime/doc/gui_mac.txt b/runtime/doc/gui_mac.txt index c2c062b108..3e0f781928 100644 --- a/runtime/doc/gui_mac.txt +++ b/runtime/doc/gui_mac.txt @@ -96,6 +96,10 @@ really bad once you start using tabs. For example, dropping two files, then dropping two more, and switching back to the first tab would cause weird strings like "((3) of 2)" to appear in the window title. + *macvim-options* +These are the non-standard options that MacVim supports: + 'toolbariconsize' 'transparency' + ============================================================================== 2. Starting MacVim *macvim-start* From 1f7875d27c6455c712462e1ba9d4b9ed493eff85 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sun, 30 Sep 2007 15:59:05 +0000 Subject: [PATCH 0263/1156] Inactive status line color changed git-svn-id: http://macvim.googlecode.com/svn/trunk@295 96c4425d-ca35-0410-94e5-3396d5c13a8f --- runtime/colors/macvim.vim | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/runtime/colors/macvim.vim b/runtime/colors/macvim.vim index e2afd1b14e..96cc6576d4 100644 --- a/runtime/colors/macvim.vim +++ b/runtime/colors/macvim.vim @@ -1,7 +1,7 @@ " MacVim colorscheme " " Maintainer: Bjorn Winckler -" Last Change: 2007 Sep 22 +" Last Change: 2007 Sep 30 " @@ -22,7 +22,7 @@ hi IncSearch gui=reverse hi ModeMsg gui=bold hi NonText gui=bold guifg=Blue hi StatusLine gui=NONE guifg=White guibg=Black -hi StatusLineNC gui=NONE guifg=Gray70 guibg=Gray90 +hi StatusLineNC gui=NONE guifg=Gray50 guibg=Gray80 hi VertSplit gui=NONE guifg=White guibg=Gray hi DiffText gui=bold guibg=Firebrick2 hi PmenuThumb gui=reverse From a91326dc57fa4ce30dcfe98e8ff12fa6ea49e418 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sun, 30 Sep 2007 16:17:54 +0000 Subject: [PATCH 0264/1156] - Integrated George Harker's transparency patch - Added 'transparency' option git-svn-id: http://macvim.googlecode.com/svn/trunk@296 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMBackend.h | 10 +++---- MMBackend.m | 38 +++++++++++++++---------- MMTextStorage.m | 68 ++++++++++++++++++++++++++++++-------------- MMTextView.m | 21 ++++++++++++++ MMVimController.m | 41 ++++++++++++++++---------- MMWindowController.m | 22 ++++++++++++-- 6 files changed, 141 insertions(+), 59 deletions(-) diff --git a/MMBackend.h b/MMBackend.h index cee40ad813..a7767aca80 100644 --- a/MMBackend.h +++ b/MMBackend.h @@ -31,11 +31,11 @@ NSDictionary *sysColorDict; BOOL inputReceived; BOOL tabBarVisible; - int backgroundColor; - int foregroundColor; - int specialColor; - int defaultBackgroundColor; - int defaultForegroundColor; + unsigned backgroundColor; + unsigned foregroundColor; + unsigned specialColor; + unsigned defaultBackgroundColor; + unsigned defaultForegroundColor; NSDate *lastFlushDate; id dialogReturn; NSTimer *blinkTimer; diff --git a/MMBackend.m b/MMBackend.m index 74f3766249..7978b1fcba 100644 --- a/MMBackend.m +++ b/MMBackend.m @@ -12,6 +12,13 @@ +// NOTE: Colors in MMBackend are stored as unsigned ints on the form 0xaarrggbb +// whereas colors in Vim are int without the alpha component. +#define MM_COLOR(col) ((unsigned)( ((col)&0xffffff) | 0xff000000 )) +#define MM_COLOR_WITH_TRANSP(col,transp) \ + ((unsigned)( ((col)&0xffffff) | (((unsigned)(255-(transp))&0xff)<<24) )) + + // This constant controls how often the command queue may be flushed. If it is // too small the app might feel unresponsive; if it is too large there might be // long periods without the screen updating (e.g. when sourcing a large session @@ -135,28 +142,28 @@ - (void)dealloc - (void)setBackgroundColor:(int)color { - backgroundColor = color; + backgroundColor = MM_COLOR_WITH_TRANSP(color,p_transp); } - (void)setForegroundColor:(int)color { - foregroundColor = color; + foregroundColor = MM_COLOR(color); } - (void)setSpecialColor:(int)color { - specialColor = color; + specialColor = MM_COLOR(color); } - (void)setDefaultColorsBackground:(int)bg foreground:(int)fg { - defaultBackgroundColor = bg; - defaultForegroundColor = fg; + defaultBackgroundColor = MM_COLOR_WITH_TRANSP(bg,p_transp); + defaultForegroundColor = MM_COLOR(fg); NSMutableData *data = [NSMutableData data]; - [data appendBytes:&bg length:sizeof(int)]; - [data appendBytes:&fg length:sizeof(int)]; + [data appendBytes:&defaultBackgroundColor length:sizeof(unsigned)]; + [data appendBytes:&defaultForegroundColor length:sizeof(unsigned)]; [self queueMessage:SetDefaultColorsMsgID data:data]; } @@ -272,7 +279,7 @@ - (void)clearAll [drawData appendBytes:&type length:sizeof(int)]; - [drawData appendBytes:&defaultBackgroundColor length:sizeof(int)]; + [drawData appendBytes:&defaultBackgroundColor length:sizeof(unsigned)]; } - (void)clearBlockFromRow:(int)row1 column:(int)col1 @@ -282,7 +289,7 @@ - (void)clearBlockFromRow:(int)row1 column:(int)col1 [drawData appendBytes:&type length:sizeof(int)]; - [drawData appendBytes:&defaultBackgroundColor length:sizeof(int)]; + [drawData appendBytes:&defaultBackgroundColor length:sizeof(unsigned)]; [drawData appendBytes:&row1 length:sizeof(int)]; [drawData appendBytes:&col1 length:sizeof(int)]; [drawData appendBytes:&row2 length:sizeof(int)]; @@ -296,7 +303,7 @@ - (void)deleteLinesFromRow:(int)row count:(int)count [drawData appendBytes:&type length:sizeof(int)]; - [drawData appendBytes:&defaultBackgroundColor length:sizeof(int)]; + [drawData appendBytes:&defaultBackgroundColor length:sizeof(unsigned)]; [drawData appendBytes:&row length:sizeof(int)]; [drawData appendBytes:&count length:sizeof(int)]; [drawData appendBytes:&bottom length:sizeof(int)]; @@ -313,9 +320,9 @@ - (void)replaceString:(char*)s length:(int)len row:(int)row column:(int)col [drawData appendBytes:&type length:sizeof(int)]; - [drawData appendBytes:&backgroundColor length:sizeof(int)]; - [drawData appendBytes:&foregroundColor length:sizeof(int)]; - [drawData appendBytes:&specialColor length:sizeof(int)]; + [drawData appendBytes:&backgroundColor length:sizeof(unsigned)]; + [drawData appendBytes:&foregroundColor length:sizeof(unsigned)]; + [drawData appendBytes:&specialColor length:sizeof(unsigned)]; [drawData appendBytes:&row length:sizeof(int)]; [drawData appendBytes:&col length:sizeof(int)]; [drawData appendBytes:&flags length:sizeof(int)]; @@ -330,7 +337,7 @@ - (void)insertLinesFromRow:(int)row count:(int)count [drawData appendBytes:&type length:sizeof(int)]; - [drawData appendBytes:&defaultBackgroundColor length:sizeof(int)]; + [drawData appendBytes:&defaultBackgroundColor length:sizeof(unsigned)]; [drawData appendBytes:&row length:sizeof(int)]; [drawData appendBytes:&count length:sizeof(int)]; [drawData appendBytes:&bottom length:sizeof(int)]; @@ -342,10 +349,11 @@ - (void)drawCursorAtRow:(int)row column:(int)col shape:(int)shape fraction:(int)percent color:(int)color { int type = DrawCursorDrawType; + unsigned uc = MM_COLOR(color); [drawData appendBytes:&type length:sizeof(int)]; - [drawData appendBytes:&color length:sizeof(int)]; + [drawData appendBytes:&uc length:sizeof(unsigned)]; [drawData appendBytes:&row length:sizeof(int)]; [drawData appendBytes:&col length:sizeof(int)]; [drawData appendBytes:&shape length:sizeof(int)]; diff --git a/MMTextStorage.m b/MMTextStorage.m index 89de6b8f0f..1bfb77ed54 100644 --- a/MMTextStorage.m +++ b/MMTextStorage.m @@ -292,14 +292,20 @@ - (void)deleteLinesFromRow:(int)row lineCount:(int)count srcRange.location += maxColumns+1; } + NSRange emptyRange = {0,width}; + NSAttributedString *emptyString = + [emptyRowString attributedSubstringFromRange: emptyRange]; + NSDictionary *attribs = [NSDictionary dictionaryWithObjectsAndKeys: + font, NSFontAttributeName, + color, NSBackgroundColorAttributeName, nil]; + for (i = 0; i < count; ++i) { - NSDictionary *attribs = [NSDictionary dictionaryWithObjectsAndKeys: - font, NSFontAttributeName, - color, NSForegroundColorAttributeName, - color, NSBackgroundColorAttributeName, nil]; + [attribString replaceCharactersInRange:destRange + withAttributedString:emptyString]; [attribString setAttributes:attribs range:destRange]; - [self edited:NSTextStorageEditedAttributes range:destRange - changeInLength:0]; + [self edited:(NSTextStorageEditedAttributes + | NSTextStorageEditedCharacters) range:destRange + changeInLength:0]; destRange.location += maxColumns+1; } } @@ -339,15 +345,21 @@ - (void)insertLinesAtRow:(int)row lineCount:(int)count destRange.location -= maxColumns+1; srcRange.location -= maxColumns+1; } - + + NSRange emptyRange = {0,width}; + NSAttributedString *emptyString = + [emptyRowString attributedSubstringFromRange:emptyRange]; + NSDictionary *attribs = [NSDictionary dictionaryWithObjectsAndKeys: + font, NSFontAttributeName, + color, NSBackgroundColorAttributeName, nil]; + for (i = 0; i < count; ++i) { - NSDictionary *attribs = [NSDictionary dictionaryWithObjectsAndKeys: - font, NSFontAttributeName, - color, NSForegroundColorAttributeName, - color, NSBackgroundColorAttributeName, nil]; + [attribString replaceCharactersInRange:destRange + withAttributedString:emptyString]; [attribString setAttributes:attribs range:destRange]; - [self edited:NSTextStorageEditedAttributes range:destRange - changeInLength:0]; + [self edited:(NSTextStorageEditedAttributes + | NSTextStorageEditedCharacters) range:destRange + changeInLength:0]; destRange.location -= maxColumns+1; } } @@ -368,16 +380,21 @@ - (void)clearBlockFromRow:(int)row1 column:(int)col1 toRow:(int)row2 NSDictionary *attribs = [NSDictionary dictionaryWithObjectsAndKeys: font, NSFontAttributeName, - color, NSForegroundColorAttributeName, color, NSBackgroundColorAttributeName, nil]; NSRange range = { row1*(maxColumns+1) + col1, col2-col1+1 }; - + + NSRange emptyRange = {0,col2-col1+1}; + NSAttributedString *emptyString = + [emptyRowString attributedSubstringFromRange:emptyRange]; int r; for (r=row1; r<=row2; ++r) { + [attribString replaceCharactersInRange:range + withAttributedString:emptyString]; [attribString setAttributes:attribs range:range]; - [self edited:NSTextStorageEditedAttributes range:range - changeInLength:0]; + [self edited:(NSTextStorageEditedAttributes + | NSTextStorageEditedCharacters) range:range + changeInLength:0]; range.location += maxColumns+1; } } @@ -385,14 +402,23 @@ - (void)clearBlockFromRow:(int)row1 column:(int)col1 toRow:(int)row2 - (void)clearAllWithColor:(NSColor *)color { //NSLog(@"%s%@", _cmd, color); + [self lazyResize]; + + [attribString release]; + attribString = [[NSMutableAttributedString alloc] init]; + NSRange fullRange = NSMakeRange(0, [attribString length]); + + int i; + for (i=0; i>16) & 0xff)/255.0f; float g = ((rgb>>8) & 0xff)/255.0f; @@ -1253,6 +1254,16 @@ + (NSColor *)colorWithRgbInt:(int)rgb return [NSColor colorWithCalibratedRed:r green:g blue:b alpha:1.0f]; } ++ (NSColor *)colorWithArgbInt:(unsigned)argb +{ + float a = ((argb>>24) & 0xff)/255.0f; + float r = ((argb>>16) & 0xff)/255.0f; + float g = ((argb>>8) & 0xff)/255.0f; + float b = (argb & 0xff)/255.0f; + + return [NSColor colorWithCalibratedRed:r green:g blue:b alpha:a]; +} + @end // NSColor (MMProtocol) diff --git a/MMWindowController.m b/MMWindowController.m index d91e023bd3..edac1ac21d 100644 --- a/MMWindowController.m +++ b/MMWindowController.m @@ -90,6 +90,12 @@ - (BOOL)askBackendForStarRegister:(NSPasteboard *)pb; } #endif +// Note: This hack allows us to set content shadowing separately from +// the window shadow. This is apparently what webkit and terminal do. +@interface NSWindow (NSWindowPrivate) // new Tiger private method +- (void) _setContentHasShadow:(BOOL)shadow; +@end + @implementation MMWindowController @@ -127,7 +133,8 @@ - (id)initWithVimController:(MMVimController *)controller [textStorage addLayoutManager:lm]; [lm addTextContainer:tc]; - NSView *contentView = [[self window] contentView]; + NSWindow *win = [self window]; + NSView *contentView = [win contentView]; textView = [[MMTextView alloc] initWithFrame:[contentView frame] textContainer:tc]; @@ -185,8 +192,12 @@ - (id)initWithVimController:(MMVimController *)controller [contentView addSubview:tabBarControl]; [contentView addSubview:tablineSeparator]; - [[self window] setDelegate:self]; - [[self window] setInitialFirstResponder:textView]; + [win setDelegate:self]; + [win setInitialFirstResponder:textView]; + + // Make us safe on pre-tiger OSX + if ([win respondsToSelector:@selector(_setContentHasShadow:)]) + [win _setContentHasShadow:NO]; } return self; @@ -444,6 +455,11 @@ - (void)setScrollbarThumbValue:(float)val proportion:(float)prop - (void)setDefaultColorsBackground:(NSColor *)back foreground:(NSColor *)fore { + // NOTE: This is called when the transparency changes so set the opacity + // flag on the window here (should be faster if the window is opaque). + BOOL isOpaque = [back alphaComponent] == 1.0f; + [[self window] setOpaque:isOpaque]; + [textStorage setDefaultColorsBackground:back foreground:fore]; [textView setBackgroundColor:back]; } From 44155c847f48a46feeeaddf4f3acda4d3eaea66f Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sun, 30 Sep 2007 18:27:48 +0000 Subject: [PATCH 0265/1156] - renamed clearAllWithColor to clearAll - clearAll now actually clears all (nothing happened before) git-svn-id: http://macvim.googlecode.com/svn/trunk@297 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMBackend.m | 2 -- MMTextStorage.h | 2 +- MMTextStorage.m | 48 ++++++++++++++++++----------------------------- MMVimController.m | 4 +--- 4 files changed, 20 insertions(+), 36 deletions(-) diff --git a/MMBackend.m b/MMBackend.m index 7978b1fcba..85fe1531bc 100644 --- a/MMBackend.m +++ b/MMBackend.m @@ -278,8 +278,6 @@ - (void)clearAll [drawData setLength:0]; [drawData appendBytes:&type length:sizeof(int)]; - - [drawData appendBytes:&defaultBackgroundColor length:sizeof(unsigned)]; } - (void)clearBlockFromRow:(int)row1 column:(int)col1 diff --git a/MMTextStorage.h b/MMTextStorage.h index 0f0fbdffd1..50f3e6d10b 100644 --- a/MMTextStorage.h +++ b/MMTextStorage.h @@ -54,7 +54,7 @@ color:(NSColor *)color; - (void)clearBlockFromRow:(int)row1 column:(int)col1 toRow:(int)row2 column:(int)col2 color:(NSColor *)color; -- (void)clearAllWithColor:(NSColor *)color; +- (void)clearAll; - (void)setDefaultColorsBackground:(NSColor *)bgColor foreground:(NSColor *)fgColor; - (void)setFont:(NSFont *)newFont; diff --git a/MMTextStorage.m b/MMTextStorage.m index 1bfb77ed54..719b18b2b3 100644 --- a/MMTextStorage.m +++ b/MMTextStorage.m @@ -25,7 +25,7 @@ @interface MMTextStorage (Private) -- (void)lazyResize; +- (void)lazyResize:(BOOL)force; @end @@ -194,8 +194,10 @@ - (void)replaceString:(NSString *)string atRow:(int)row column:(int)col withFlags:(int)flags foregroundColor:(NSColor *)fg backgroundColor:(NSColor *)bg specialColor:(NSColor *)sp { - //NSLog(@"replaceString:atRow:%d column:%d withFlags:%d", row, col, flags); - [self lazyResize]; + //NSLog(@"replaceString:atRow:%d column:%d withFlags:%d " + // "foreground:%@ background:%@ special:%@", + // row, col, flags, fg, bg, sp); + [self lazyResize:NO]; // TODO: support DRAW_TRANSP if (flags & DRAW_TRANSP) @@ -264,8 +266,8 @@ - (void)deleteLinesFromRow:(int)row lineCount:(int)count scrollBottom:(int)bottom left:(int)left right:(int)right color:(NSColor *)color { - //NSLog(@"deleteLinesFromRow:%d lineCount:%d", row, count); - [self lazyResize]; + //NSLog(@"deleteLinesFromRow:%d lineCount:%d color:%@", row, count, color); + [self lazyResize:NO]; if (row < 0 || row+count > maxRows) { //NSLog(@"[%s] WARNING : out of range, row=%d (%d) count=%d", _cmd, row, @@ -318,8 +320,8 @@ - (void)insertLinesAtRow:(int)row lineCount:(int)count scrollBottom:(int)bottom left:(int)left right:(int)right color:(NSColor *)color { - //NSLog(@"insertLinesAtRow:%d lineCount:%d", row, count); - [self lazyResize]; + //NSLog(@"insertLinesAtRow:%d lineCount:%d color:%@", row, count, color); + [self lazyResize:NO]; if (row < 0 || row+count > maxRows) { //NSLog(@"[%s] WARNING : out of range, row=%d (%d) count=%d", _cmd, row, @@ -367,9 +369,9 @@ - (void)insertLinesAtRow:(int)row lineCount:(int)count - (void)clearBlockFromRow:(int)row1 column:(int)col1 toRow:(int)row2 column:(int)col2 color:(NSColor *)color { - //NSLog(@"clearBlockFromRow:%d column:%d toRow:%d column:%d", row1, col1, - // row2, col2); - [self lazyResize]; + //NSLog(@"clearBlockFromRow:%d column:%d toRow:%d column:%d color:%@", + // row1, col1, row2, col2, color); + [self lazyResize:NO]; if (row1 < 0 || row2 >= maxRows || col1 < 0 || col2 > maxColumns) { //NSLog(@"[%s] WARNING : out of range, row1=%d row2=%d (%d) col1=%d " @@ -399,31 +401,17 @@ - (void)clearBlockFromRow:(int)row1 column:(int)col1 toRow:(int)row2 } } -- (void)clearAllWithColor:(NSColor *)color +- (void)clearAll { //NSLog(@"%s%@", _cmd, color); - [self lazyResize]; - - [attribString release]; - attribString = [[NSMutableAttributedString alloc] init]; - NSRange fullRange = NSMakeRange(0, [attribString length]); - - int i; - for (i=0; i Date: Sun, 30 Sep 2007 18:38:20 +0000 Subject: [PATCH 0266/1156] - Added fontSizeUp/fontSizeDown actions - Added font submenu with above actions and font panel - Key equivalents and mapped to font size up/down menu items git-svn-id: http://macvim.googlecode.com/svn/trunk@298 96c4425d-ca35-0410-94e5-3396d5c13a8f --- Actions.plist | 4 ++++ MMAppController.h | 2 ++ MMAppController.m | 26 ++++++++++++++++++++++++++ gvimrc | 7 ++++++- 4 files changed, 38 insertions(+), 1 deletion(-) diff --git a/Actions.plist b/Actions.plist index 54981e1765..6e8d8a3320 100644 --- a/Actions.plist +++ b/Actions.plist @@ -6,6 +6,10 @@ arrangeInFront: + fontSizeDown: + + fontSizeUp: + hide: hideOtherApplications: diff --git a/MMAppController.h b/MMAppController.h index 15d7e7a2e8..5033d7e719 100644 --- a/MMAppController.h +++ b/MMAppController.h @@ -27,5 +27,7 @@ - (IBAction)newWindow:(id)sender; - (IBAction)selectNextWindow:(id)sender; - (IBAction)selectPreviousWindow:(id)sender; +- (IBAction)fontSizeUp:(id)sender; +- (IBAction)fontSizeDown:(id)sender; @end diff --git a/MMAppController.m b/MMAppController.m index 496cf53f0f..26475a0107 100644 --- a/MMAppController.m +++ b/MMAppController.m @@ -40,6 +40,10 @@ @interface NSMenu (MMExtras) - (void)recurseSetAutoenablesItems:(BOOL)on; @end +@interface NSNumber (MMExtras) +- (int)tag; +@end + @implementation MMAppController @@ -415,6 +419,18 @@ - (IBAction)selectPreviousWindow:(id)sender } } +- (IBAction)fontSizeUp:(id)sender +{ + [[NSFontManager sharedFontManager] modifyFont: + [NSNumber numberWithInt:NSSizeUpFontAction]]; +} + +- (IBAction)fontSizeDown:(id)sender +{ + [[NSFontManager sharedFontManager] modifyFont: + [NSNumber numberWithInt:NSSizeDownFontAction]]; +} + - (byref id ) connectBackend:(byref in id )backend pid:(int)pid @@ -582,3 +598,13 @@ - (void)recurseSetAutoenablesItems:(BOOL)on } @end // NSMenu (MMExtras) + + + + +@implementation NSNumber (MMExtras) +- (int)tag +{ + return [self intValue]; +} +@end // NSNumber (MMExtras) diff --git a/gvimrc b/gvimrc index 4634e661fa..9a0bf8b9de 100644 --- a/gvimrc +++ b/gvimrc @@ -44,7 +44,10 @@ an 10.331 File.Close:q :confirm q "an 10.331 File.Close\ Tab :tabclose an 20.460 Edit.-SEP4- -an 20.465 Edit.Show\ Fonts\.\.\. :action orderFrontFontPanel: +an 20.465.10 Edit.Font.Show\ Fonts :action orderFrontFontPanel: +an 20.465.20 Edit.Font.-SEP5- +an 20.465.30 Edit.Font.Bigger :action fontSizeUp: +an 20.465.40 Edit.Font.Smaller :action fontSizeDown: an 20.470 Edit.Special\ Characters\.\.\. :action orderFrontCharacterPalette: @@ -176,6 +179,8 @@ menukeyequiv Edit.Copy menukeyequiv Edit.Paste menukeyequiv Edit.Select\ All menukeyequiv Edit.Special\ Characters\.\.\. +menukeyequiv Edit.Font.Bigger +menukeyequiv Edit.Font.Smaller menukeyequiv Tools.Spelling.To\ Next\ error menukeyequiv Tools.Spelling.Suggest\ Corrections From 4f6eaaef107fc4e8c5e2ff7885259b459cbec834 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sun, 30 Sep 2007 18:39:11 +0000 Subject: [PATCH 0267/1156] Changed "date modified" git-svn-id: http://macvim.googlecode.com/svn/trunk@299 96c4425d-ca35-0410-94e5-3396d5c13a8f --- gvimrc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gvimrc b/gvimrc index 9a0bf8b9de..ab3727262f 100644 --- a/gvimrc +++ b/gvimrc @@ -1,7 +1,7 @@ " System gvimrc file for MacVim " " Maintainer: Bjorn Winckler -" Last Change: Mon Sep 17 2007 +" Last Change: Mon Sep 30 2007 " " This is a work in progress. If you feel so inclined, please help me improve " this file. From 59843e77435f5ac1a78e4075abc07c32f84a04f0 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sun, 30 Sep 2007 18:50:51 +0000 Subject: [PATCH 0268/1156] - 'encoding' defaults to 'utf-8' in $VIM/gvimrc - updated docs to reflect this git-svn-id: http://macvim.googlecode.com/svn/trunk@300 96c4425d-ca35-0410-94e5-3396d5c13a8f --- gvimrc | 3 +++ runtime/doc/gui_mac.txt | 28 ++++++++++++---------------- 2 files changed, 15 insertions(+), 16 deletions(-) diff --git a/gvimrc b/gvimrc index ab3727262f..6a228ac948 100644 --- a/gvimrc +++ b/gvimrc @@ -21,6 +21,9 @@ if !exists("syntax_on") syntax on endif +" TODO: Move to the source code instead. +set enc=utf-8 + " diff --git a/runtime/doc/gui_mac.txt b/runtime/doc/gui_mac.txt index 3e0f781928..4316dbb0cc 100644 --- a/runtime/doc/gui_mac.txt +++ b/runtime/doc/gui_mac.txt @@ -58,12 +58,18 @@ a window. *macvim-encoding* It is not possible to modify 'termencoding' in MacVim; this option is forcibly -set to "utf-8". The most natural value for 'encoding' is "utf-8" as well, but -this is not the default for reasons explained in the help for 'encoding'. If -you want to edit files with non-English characters you should add the -following line to "~/.gvimrc": > - set encoding=utf-8 -< +set to "utf-8". The option 'encoding' also defaults to "utf-8"; currently +this is done in "$VIM/gvimrc" so you can override it by adding the following +line to "~/.gvimrc": > + set enc=latin1 +Note: Having 'encoding' default to "utf-8" has the side-effect that all files +you load will be converted in memory (unless they are already utf-8 encoded). +When you save them back to their original encoding, the contents in memory are +converted once again. This means that if you read and then write a file +immediately the file might still change. This is no problem if you are +editing utf-8 encoded files, but if you edit say a binary file then you should +set 'encoding' to "latin1" since this does no conversion. + *macvim-shift-movement* Text editors on Mac OS X lets the user hold down shift+movement key to extend the selection. Also, pressing a printable key whilst selecting replaces the @@ -337,16 +343,6 @@ there is little incentive to add it. In this section some general (not necessarily MacVim specific) hints are given. -Scenario: ~ -You open a file which contain non-English characters, and all you see is lots -of upside-down question marks. -Solution: ~ -Set the 'encoding' option to "utf-8". To make Vim remember this setting -between sessions, add the following line to your "~/.gvimrc": > - set encoding=utf-8 -Be aware that changing 'encoding' has certain side-effects which are -documented in the help for 'encoding'. - Scenario: ~ You try opening a bunch of files in tabs but not all files get opened in their own tab. From 2d3b5d5a4e038579b6ce7eb8beeeb57ca22a9eb3 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Tue, 2 Oct 2007 17:05:27 +0000 Subject: [PATCH 0269/1156] Included patch by Tim Allen clarifying the macvim-encoding section git-svn-id: http://macvim.googlecode.com/svn/trunk@302 96c4425d-ca35-0410-94e5-3396d5c13a8f --- runtime/doc/gui_mac.txt | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/runtime/doc/gui_mac.txt b/runtime/doc/gui_mac.txt index 4316dbb0cc..7eb6a1a595 100644 --- a/runtime/doc/gui_mac.txt +++ b/runtime/doc/gui_mac.txt @@ -62,13 +62,19 @@ set to "utf-8". The option 'encoding' also defaults to "utf-8"; currently this is done in "$VIM/gvimrc" so you can override it by adding the following line to "~/.gvimrc": > set enc=latin1 -Note: Having 'encoding' default to "utf-8" has the side-effect that all files -you load will be converted in memory (unless they are already utf-8 encoded). -When you save them back to their original encoding, the contents in memory are -converted once again. This means that if you read and then write a file -immediately the file might still change. This is no problem if you are -editing utf-8 encoded files, but if you edit say a binary file then you should -set 'encoding' to "latin1" since this does no conversion. + +Note: UTF-8 can represent all characters defined in Unicode, which includes +all characters in all other standard encodings, so it should be perfectly safe +to edit files in any encoding while 'encoding' is set to "utf-8". Of course, +you may need to set 'fileencodings' to auto-detect the encoding of the files +you edit, or force the detection with |++enc| on the command line. + +However, if you are editing files that use multiple encodings (container +formats like MIME or Unix mbox files) or no standard encoding (binary data, +see also |edit-binary|), you may want to prevent MacVim from re-encoding the +file at all. In this situation, you will need to set both 'encoding' and +'fileencodings' to a simple single-byte encoding such as Latin1 so that when +the file is read into memory, the original bytes are left untouched. *macvim-shift-movement* Text editors on Mac OS X lets the user hold down shift+movement key to extend From a109bb567a753e95a880d4838b2c0f915d635e88 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Mon, 8 Oct 2007 19:22:26 +0000 Subject: [PATCH 0270/1156] - 'enc' no longer set in $VIM/gvimrc (done in code) - Cmd and Opt key mappings can be disabled by setting a variable - updated docs to reflect the above changes - docs updated to say that DejaVu is the default font git-svn-id: http://macvim.googlecode.com/svn/trunk@303 96c4425d-ca35-0410-94e5-3396d5c13a8f --- gvimrc | 62 ++++++++++++++++++++--------------------- runtime/doc/gui_mac.txt | 23 +++++++++++---- 2 files changed, 49 insertions(+), 36 deletions(-) diff --git a/gvimrc b/gvimrc index 6a228ac948..05efb98c5f 100644 --- a/gvimrc +++ b/gvimrc @@ -21,9 +21,6 @@ if !exists("syntax_on") syntax on endif -" TODO: Move to the source code instead. -set enc=utf-8 - " @@ -54,17 +51,17 @@ an 20.465.40 Edit.Font.Smaller :action fontSizeDown: an 20.470 Edit.Special\ Characters\.\.\. :action orderFrontCharacterPalette: -" Window menu +" Window menu (should be next to Help so give it a high priority) aunmenu Window -an 70.300 Window.Minimize :action performMiniaturize: -an 70.310 Window.Zoom :action performZoom: -an 70.320 Window.-SEP1- +an 9900.300 Window.Minimize :action performMiniaturize: +an 9900.310 Window.Zoom :action performZoom: +an 9900.320 Window.-SEP1- " TODO! Grey out if no tabs are visible. -an 70.330 Window.Previous\ Tab :tabprevious -an 70.340 Window.Next\ Tab :tabnext -an 70.350 Window.-SEP2- -an 70.360 Window.Bring\ All\ To\ Front :action arrangeInFront: +an 9900.330 Window.Previous\ Tab :tabprevious +an 9900.340 Window.Next\ Tab :tabnext +an 9900.350 Window.-SEP2- +an 9900.360 Window.Bring\ All\ To\ Front :action arrangeInFront: @@ -98,29 +95,32 @@ aunmenu ToolBar.FindHelp +" This is so that HIG Cmd and Option movement mappings can be disabled by +" adding the line +" let macvim_skip_cmd_opt_movement = 1 +" to the user .vimrc " -" HIG insertion point related mappings -" - -no -no! -no -no! +if !exists("macvim_skip_cmd_opt_movement") + no + no! + no + no! -no -no! -no -no! + no + no! + no + no! -no -ino -map { -imap { + no + ino + map { + imap { -no -ino -map } -imap } + no + ino + map } + imap } +endif " !exists("macvim_skip_cmd_opt_movement") " This is so that the HIG shift movement related settings can be enabled by @@ -155,7 +155,7 @@ if exists("macvim_hig_shift_movement") nn vn ino -endif " !exists("macvim_skip_hig_shift_movement") +endif " exists("macvim_hig_shift_movement") diff --git a/runtime/doc/gui_mac.txt b/runtime/doc/gui_mac.txt index 7eb6a1a595..b27ecee2b4 100644 --- a/runtime/doc/gui_mac.txt +++ b/runtime/doc/gui_mac.txt @@ -58,10 +58,8 @@ a window. *macvim-encoding* It is not possible to modify 'termencoding' in MacVim; this option is forcibly -set to "utf-8". The option 'encoding' also defaults to "utf-8"; currently -this is done in "$VIM/gvimrc" so you can override it by adding the following -line to "~/.gvimrc": > - set enc=latin1 +set to "utf-8". The option 'encoding' also defaults to "utf-8" (as opposed to +"latin1" in the other GUI ports). Note: UTF-8 can represent all characters defined in Unicode, which includes all characters in all other standard encodings, so it should be perfectly safe @@ -76,6 +74,16 @@ file at all. In this situation, you will need to set both 'encoding' and 'fileencodings' to a simple single-byte encoding such as Latin1 so that when the file is read into memory, the original bytes are left untouched. + *macvim-movement* +Some Mac OS X standard key mappings involving Cmd or Option and an arrow key +are set up by default in "$VIM/gvimrc". You can quickly disable all of these +by adding the following lines to your "~/.vimrc" (not .gvimrc) file: > + if has("gui_macvim") + let macvim_skip_cmd_opt_movement = 1 + endif +Note: These are the only key mappings that MacVim make (not counting menu key +equivalents which are not set up with :map). + *macvim-shift-movement* Text editors on Mac OS X lets the user hold down shift+movement key to extend the selection. Also, pressing a printable key whilst selecting replaces the @@ -375,13 +383,18 @@ pressing the arrow keys and find the Vim way of selecting text strange. Solution: ~ See |macvim-shift-movement|. +Scenario: ~ +You do not want MacVim to set up any key mappings. +Solution: ~ +See |macvim-movement|. + Scenario: ~ Enabling localized menus breaks the toolbar and the menus as well. Solution: ~ This is a know problem, see |macvim-todo|. Scenario: ~ -You dislike the default font (Bitstream Vera). +You dislike the default font (DejaVu Sans Mono). Solution: ~ The standard fixed width font on other Mac OS X applications is Monaco. If you prefer this font then add the following line to your From ca451c546e8601790464d492149a6aa3b80087fb Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Tue, 9 Oct 2007 17:49:40 +0000 Subject: [PATCH 0271/1156] Merged Nico's fullscreen patch git-svn-id: http://macvim.googlecode.com/svn/trunk@304 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMBackend.h | 3 + MMBackend.m | 10 + MMFullscreenWindow.h | 32 + MMFullscreenWindow.m | 273 +++++++ MMVimController.m | 4 + MMVimView.h | 87 +++ MMVimView.m | 747 +++++++++++++++++++ MMWindowController.h | 21 +- MMWindowController.m | 790 ++++----------------- MacVim.h | 2 + MacVim.m | 2 + MacVim.xcodeproj/project.pbxproj | 20 + MacVim.xcodeproj/winckler.mode1 | 13 +- MacVim.xcodeproj/winckler.pbxuser | 4 +- PSMTabBarControl/source/PSMMetalTabStyle.m | 12 +- gui_macvim.m | 12 + 16 files changed, 1354 insertions(+), 678 deletions(-) create mode 100644 MMFullscreenWindow.h create mode 100644 MMFullscreenWindow.m create mode 100644 MMVimView.h create mode 100644 MMVimView.m diff --git a/MMBackend.h b/MMBackend.h index a7767aca80..af48b5b676 100644 --- a/MMBackend.h +++ b/MMBackend.h @@ -116,6 +116,9 @@ - (int)lookupColorWithKey:(NSString *)key; - (BOOL)hasSpecialKeyWithValue:(NSString *)value; +- (void)enterFullscreen; +- (void)leaveFullscreen; + - (void)registerServerWithName:(NSString *)name; - (BOOL)sendToServer:(NSString *)name string:(NSString *)string reply:(char_u **)reply port:(int *)port expression:(BOOL)expr diff --git a/MMBackend.m b/MMBackend.m index 85fe1531bc..aa1a1ab9d2 100644 --- a/MMBackend.m +++ b/MMBackend.m @@ -993,6 +993,16 @@ - (BOOL)hasSpecialKeyWithValue:(NSString *)value return NO; } +- (void)enterFullscreen +{ + [self queueMessage:EnterFullscreenMsgID data:nil]; +} + +- (void)leaveFullscreen +{ + [self queueMessage:LeaveFullscreenMsgID data:nil]; +} + - (oneway void)processInput:(int)msgid data:(in NSData *)data { // NOTE: This method might get called whenever the run loop is tended to. diff --git a/MMFullscreenWindow.h b/MMFullscreenWindow.h new file mode 100644 index 0000000000..62c7da7da3 --- /dev/null +++ b/MMFullscreenWindow.h @@ -0,0 +1,32 @@ +/* vi:set ts=8 sts=4 sw=4 ft=objc: + * + * VIM - Vi IMproved by Bram Moolenaar + * MacVim GUI port by Bjorn Winckler + * + * Do ":help uganda" in Vim to read copying and usage conditions. + * Do ":help credits" in Vim to see a list of people who contributed. + * See README.txt for an overview of the Vim source code. + */ + +#import + + + +@class MMVimView; + +@interface MMFullscreenWindow : NSWindow { + NSWindow* target; + MMVimView* view; + NSPoint oldPosition; + NSString *oldTabBarStyle; +} + +- (MMFullscreenWindow*)initWithWindow:(NSWindow*)t andView:(MMVimView*)v; + +- (void) enterFullscreen; +- (void) leaveFullscreen; + +- (BOOL)canBecomeKeyWindow; +- (BOOL)canBecomeMainWindow; + +@end diff --git a/MMFullscreenWindow.m b/MMFullscreenWindow.m new file mode 100644 index 0000000000..1b0bf07a41 --- /dev/null +++ b/MMFullscreenWindow.m @@ -0,0 +1,273 @@ +/* vi:set ts=8 sts=4 sw=4 ft=objc: + * + * VIM - Vi IMproved by Bram Moolenaar + * MacVim GUI port by Bjorn Winckler + * + * Do ":help uganda" in Vim to read copying and usage conditions. + * Do ":help credits" in Vim to see a list of people who contributed. + * See README.txt for an overview of the Vim source code. + */ + +#import "MMFullscreenWindow.h" +#import +#import "MMVimView.h" +#import "MMTextView.h" +#import "MMWindowController.h" +#import + + + +@implementation MMFullscreenWindow + +- (MMFullscreenWindow*)initWithWindow:(NSWindow*)t andView:(MMVimView*)v +{ + NSScreen* screen = [t screen]; + + // XXX: what if screen == nil? + + // you can't change the style of an existing window in cocoa. create a new + // window and move the MMTextView into it. + // (another way would be to make the existing window large enough that the + // title bar is off screen. but that doesn't work with multiple screens). + self = [super initWithContentRect:[screen frame] + styleMask:NSBorderlessWindowMask + backing:NSBackingStoreBuffered + defer:YES + screen:screen]; + + if(self == nil) + return nil; + + [self setHasShadow:NO]; + [self setShowsResizeIndicator:NO]; + [self setBackgroundColor:[NSColor blackColor]]; + [self setReleasedWhenClosed:NO]; + + target = t; [target retain]; + view = v; [view retain]; + + return self; +} + +- (void) dealloc +{ + [target release]; + [view release]; + + [super dealloc]; +} + +- (void) centerView +{ + NSRect outer = [self frame], inner = [view frame]; + //NSLog(@"%s %@%@", _cmd, NSStringFromRect(outer), NSStringFromRect(inner)); + + NSPoint origin = NSMakePoint((outer.size.width - inner.size.width)/2, + (outer.size.height - inner.size.height)/2); + [view setFrameOrigin:origin]; +} + +- (void) enterFullscreen +{ + // hide menu and dock, both appear on demand + SetSystemUIMode(kUIModeAllSuppressed, 0); //requires 10.3 + + // fade to black + Boolean didBlend = NO; + CGDisplayFadeReservationToken token; + if(CGAcquireDisplayFadeReservation(.5, &token) == kCGErrorSuccess) { + CGDisplayFade(token, .25, kCGDisplayBlendNormal, + kCGDisplayBlendSolidColor, .0, .0, .0, true); + didBlend = YES; + } + + // fool delegate + id delegate = [target delegate]; + [target setDelegate:nil]; + + // make target's window controller believe that it's now controlling us + [target retain]; // NSWindowController will release target once in the next + // line + [[target windowController] setWindow: self]; + + + oldTabBarStyle = [[view tabBarControl] styleName]; + [[view tabBarControl] setStyleNamed:@"Unified"]; + + // add text view + oldPosition = [view frame].origin; + + [[self contentView] addSubview:view]; + [self setInitialFirstResponder:[view textView]]; + + [self setTitle: [target title]]; + [self setOpaque:[target isOpaque]]; + + // make us visible and target invisible + [target orderOut:self]; + [self makeKeyAndOrderFront:self]; + + // don't set this sooner, so we don't get an additional focus gained message + [self setDelegate: delegate]; + + // update bottom right corner scrollbar (no resize handle in fu mode) + [[self windowController] placeViews]; + + // the call above moves the text view in the lower left corner, fix that + // XXX: still required? + [self centerView]; + [self display]; + + // fade back in + if(didBlend) { + CGDisplayFade(token, .25, kCGDisplayBlendSolidColor, + kCGDisplayBlendNormal, .0, .0, .0, false); + CGReleaseDisplayFadeReservation(token); + } +} + +- (void) leaveFullscreen +{ + // fade to black + Boolean didBlend = NO; + CGDisplayFadeReservationToken token; + if(CGAcquireDisplayFadeReservation(.5, &token) == kCGErrorSuccess) { + CGDisplayFade(token, .25, kCGDisplayBlendNormal, + kCGDisplayBlendSolidColor, .0, .0, .0, true); + didBlend = YES; + } + + // fix up target controller + [self retain]; // NSWindowController releases us once + [[self windowController] setWindow: target]; + + + [[view tabBarControl] setStyleNamed:oldTabBarStyle]; + + // fix delegate + id delegate = [self delegate]; + [self setDelegate:nil]; + + // move text view back to original window, hide fullscreen window, + // show original window + // do this _after_ resetting delegate and window controller, so the + // window controller doesn't get a focus lost message from the fullscreen + // window. + [[target contentView] addSubview: view]; + [view setFrameOrigin:oldPosition]; + [self close]; + [target makeKeyAndOrderFront:self]; + + // ...but we don't want a focus gained message either, so don't set this + // sooner + [target setDelegate: delegate]; + + + // update bottom right corner scrollbar (resize handle reappears) + // XXX: Doesn't work? + [[self windowController] placeViews]; + [view placeScrollbars]; + + + // fade back in + if(didBlend) { + CGDisplayFade(token, .25, kCGDisplayBlendSolidColor, + kCGDisplayBlendNormal, .0, .0, .0, false); + CGReleaseDisplayFadeReservation(token); + } + + // order menu and dock back in + SetSystemUIMode(kUIModeNormal, 0); +} + +// Title-less windows normally don't receive key presses, override this +- (BOOL)canBecomeKeyWindow +{ + return YES; +} + +// Title-less windows normally can't become main which means that another +// non-fullscreen window will have the "active" titlebar in expose. Bad, fix it. +- (BOOL)canBecomeMainWindow +{ + return YES; +} + + +#pragma mark Proxy/Decorator/whatever stuff + +// the window controller will send us messages that are meant for the original, +// non-fullscreen window. forward those, and interpret the messages that are +// interesting for us + +- (void)setTitle:(NSString*)title +{ + [target setTitle:title]; + [super setTitle:title]; +} + +// HACK: if the T flag in guioptions is changed in fu mode, the toolbar needs +// to be changed when nofu is set. MMWindowController gets the toolbar object, +// so we need to return a toolbar from this method, even if none is visible for +// the fullscreen window. Seems to work, though. +- (NSToolbar*)toolbar +{ + return [target toolbar]; +} + +- (void)setFrame:(NSRect)frame display:(BOOL)display +{ + // HACK: if the target window would resize, we have to call our own + // windowDidResize method so that placeViews in MMWindowController is called + if (!NSEqualRects(frame, [target frame])) + { + [target setFrame:frame display:NO]; + + // XXX: send this directly to MMVimView + if ([[self delegate] respondsToSelector:@selector(windowDidResize:)]) + [[self delegate] windowDidResize:nil]; + + [self centerView]; + [self display]; + } +} + +/*- (NSRect)frame +{ + return [target frame]; // really? needed by MMWindowController placeViews. + // but mucks up display +}*/ + +- (NSRect)contentRectForFrameRect:(NSRect)rect +{ + //return [target contentRectForFrameRect:rect]; + + // EVIL HACK: this is always called with [[self window] frame] as argument + // from MMWindowController. We can't let frame return the frame of target, + // so "fix" this here. + return [target contentRectForFrameRect:[target frame]]; +} + +- (NSRect)frameRectForContentRect:(NSRect)contentRect +{ + return [target frameRectForContentRect:contentRect]; +} + +- (NSRect)constrainFrameRect:(NSRect)frameRect toScreen:(NSScreen*)screen +{ + return [target constrainFrameRect:frameRect toScreen:screen]; +} + +- (void)setContentResizeIncrements:(NSSize)size +{ + [target setContentResizeIncrements:size]; +} + +- (void)setOpaque:(BOOL)isOpaque +{ + // XXX: Do we want transparency even in fullscreen mode? + [super setOpaque:isOpaque]; + [target setOpaque:isOpaque]; +} + +@end diff --git a/MMVimController.m b/MMVimController.m index 50d9356344..43793fa27b 100644 --- a/MMVimController.m +++ b/MMVimController.m @@ -786,6 +786,10 @@ - (void)handleMessage:(int)msgid data:(NSData *)data encoding:NSUTF8StringEncoding]; [self setServerName:name]; [name release]; + } else if (EnterFullscreenMsgID == msgid) { + [windowController enterFullscreen]; + } else if (LeaveFullscreenMsgID == msgid) { + [windowController leaveFullscreen]; } else { NSLog(@"WARNING: Unknown message received (msgid=%d)", msgid); } diff --git a/MMVimView.h b/MMVimView.h new file mode 100644 index 0000000000..be00667192 --- /dev/null +++ b/MMVimView.h @@ -0,0 +1,87 @@ +/* vi:set ts=8 sts=4 sw=4 ft=objc: + * + * VIM - Vi IMproved by Bram Moolenaar + * MacVim GUI port by Bjorn Winckler + * + * Do ":help uganda" in Vim to read copying and usage conditions. + * Do ":help credits" in Vim to see a list of people who contributed. + * See README.txt for an overview of the Vim source code. + */ + +#import + + + +@class PSMTabBarControl; +@class MMTextView; +@class MMTextStorage; +@class MMScroller; +@class MMVimController; + + +@interface MMVimView : NSView { + PSMTabBarControl *tabBarControl; + NSTabView *tabView; + + MMVimController *vimController; + BOOL vimTaskSelectedTab; + MMTextView *textView; + MMTextStorage *textStorage; + NSMutableArray *scrollbars; + + // This is temporary to make the refactoring easier + BOOL shouldUpdateWindowSize; +} + +- (MMVimView *)initWithFrame:(NSRect)frame vimController:(MMVimController *) c; + +- (MMTextView *)textView; +- (MMTextStorage *)textStorage; +- (NSMutableArray *)scrollbars; +- (BOOL)inLiveResize; +- (void)cleanup; + + +- (PSMTabBarControl *)tabBarControl; +- (NSTabView *)tabView; +- (IBAction)addNewTab:(id)sender; +- (void)updateTabsWithData:(NSData *)data; +- (void)selectTabWithIndex:(int)idx; +- (int)representedIndexOfTabViewItem:(NSTabViewItem *)tvi; +- (NSTabViewItem *)addNewTabViewItem; + +- (BOOL)bottomScrollbarVisible; +- (BOOL)leftScrollbarVisible; +- (BOOL)rightScrollbarVisible; +- (void)placeScrollbars; +- (void)createScrollbarWithIdentifier:(long)ident type:(int)type; +- (void)destroyScrollbarWithIdentifier:(long)ident; +- (void)showScrollbarWithIdentifier:(long)ident state:(BOOL)visible; +- (void)setScrollbarThumbValue:(float)val proportion:(float)prop + identifier:(long)ident; +- (MMScroller *)scrollbarForIdentifier:(long)ident index:(unsigned *)idx; + +- (void)setDefaultColorsBackground:(NSColor *)back foreground:(NSColor *)fore; + +- (BOOL)shouldUpdateWindowSize; +- (NSRect)textViewRectForContentSize:(NSSize)contentSize; +- (void)setShouldUpdateWindowSize:(BOOL)b; + + +- (NSSize)contentSizeForTextStorageSize:(NSSize)textViewSize; +- (NSSize)textStorageSizeForTextViewSize:(NSSize)textViewSize; +@end + +// TODO: Move! +@interface MMScroller : NSScroller { + long identifier; + int type; + NSRange range; +} +- (id)initWithIdentifier:(long)ident type:(int)type; +- (long)identifier; +- (int)type; +- (NSRange)range; +- (void)setRange:(NSRange)newRange; +@end + diff --git a/MMVimView.m b/MMVimView.m new file mode 100644 index 0000000000..f5e8f68ba8 --- /dev/null +++ b/MMVimView.m @@ -0,0 +1,747 @@ +/* vi:set ts=8 sts=4 sw=4 ft=objc: + * + * VIM - Vi IMproved by Bram Moolenaar + * MacVim GUI port by Bjorn Winckler + * + * Do ":help uganda" in Vim to read copying and usage conditions. + * Do ":help credits" in Vim to see a list of people who contributed. + * See README.txt for an overview of the Vim source code. + */ + +#import "MMVimView.h" + +#import +#import "MacVim.h" +#import "MMTextView.h" +#import "MMTextStorage.h" +#import "MMTypesetter.h" +#import "MMVimController.h" + +#import "MMWindowController.h" // needed by MMScroller. TODO: remove + +// Scroller type; these must match SBAR_* in gui.h +enum { + MMScrollerTypeLeft = 0, + MMScrollerTypeRight, + MMScrollerTypeBottom +}; + +// TODO: Move! +@interface NSTabView (MMExtras) +- (void)removeAllTabViewItems; +@end + + +@interface MMVimView (Private) +- (BOOL)bottomScrollbarVisible; +- (BOOL)leftScrollbarVisible; +- (BOOL)rightScrollbarVisible; +- (void)placeScrollbars; +@end + + +@implementation MMVimView + +- (MMVimView *)initWithFrame:(NSRect)frame + vimController:(MMVimController *)controller { + if (![super initWithFrame:frame]) + return nil; + + vimController = controller; + scrollbars = [[NSMutableArray alloc] init]; + + // Set up a complete text system. + textStorage = [[MMTextStorage alloc] init]; + NSLayoutManager *lm = [[NSLayoutManager alloc] init]; + NSTextContainer *tc = [[NSTextContainer alloc] initWithContainerSize: + NSMakeSize(1.0e7,1.0e7)]; + + NSString *typesetterString = [[NSUserDefaults standardUserDefaults] + stringForKey:MMTypesetterKey]; + if (![typesetterString isEqual:@"NSTypesetter"]) { + MMTypesetter *typesetter = [[MMTypesetter alloc] init]; + [lm setTypesetter:typesetter]; + [typesetter release]; + } else { + // Only MMTypesetter supports different cell width multipliers. + [[NSUserDefaults standardUserDefaults] + setFloat:1.0 forKey:MMCellWidthMultiplierKey]; + } + + [tc setWidthTracksTextView:NO]; + [tc setHeightTracksTextView:NO]; + [tc setLineFragmentPadding:0]; + + [textStorage addLayoutManager:lm]; + [lm addTextContainer:tc]; + + textView = [[MMTextView alloc] initWithFrame:frame + textContainer:tc]; + + NSUserDefaults *ud = [NSUserDefaults standardUserDefaults]; + int left = [ud integerForKey:MMTextInsetLeftKey]; + int top = [ud integerForKey:MMTextInsetTopKey]; + [textView setTextContainerInset:NSMakeSize(left, top)]; + + [self addSubview:textView]; + + // The text storage retains the layout manager which in turn retains + // the text container. + [tc release]; + [lm release]; + + // Create the tab view (which is never visible, but the tab bar control + // needs it to function). + tabView = [[NSTabView alloc] initWithFrame:NSZeroRect]; + + // Create the tab bar control (which is responsible for actually + // drawing the tabline and tabs). + NSRect tabFrame = frame; + tabFrame.origin.y = NSMaxY(tabFrame) - 22; + tabFrame.size.height = 22; + tabBarControl = [[PSMTabBarControl alloc] initWithFrame:tabFrame]; + + [tabView setDelegate:tabBarControl]; + + [tabBarControl setTabView:tabView]; + [tabBarControl setDelegate:self]; + [tabBarControl setHidden:YES]; + [tabBarControl setAutoresizingMask:NSViewWidthSizable|NSViewMinYMargin]; + [tabBarControl setCellMinWidth:[ud integerForKey:MMTabMinWidthKey]]; + [tabBarControl setCellMaxWidth:[ud integerForKey:MMTabMaxWidthKey]]; + [tabBarControl setCellOptimumWidth: + [ud integerForKey:MMTabOptimumWidthKey]]; + [tabBarControl setShowAddTabButton:YES]; + [[tabBarControl addTabButton] setTarget:self]; + [[tabBarControl addTabButton] setAction:@selector(addNewTab:)]; + [tabBarControl setAllowsDragBetweenWindows:NO]; + + [tabBarControl setPartnerView:[self textView]]; + + [self addSubview:tabBarControl]; + + return self; +} + +- (void)dealloc +{ + [tabBarControl release]; tabBarControl = nil; + [tabView release]; tabView = nil; + [scrollbars release]; scrollbars = nil; + [textView release]; textView = nil; + [textStorage release]; textStorage = nil; + + [super dealloc]; +} + +- (MMTextView *)textView +{ + return textView; +} + +- (MMTextStorage *)textStorage +{ + return textStorage; +} + +- (NSMutableArray *)scrollbars +{ + return scrollbars; +} + +- (BOOL)inLiveResize +{ + return [textView inLiveResize]; +} + +- (PSMTabBarControl *)tabBarControl +{ + return tabBarControl; +} + +- (NSTabView *)tabView +{ + return tabView; +} + + +- (void)cleanup +{ + vimController = nil; + + // NOTE! There is a bug in PSMTabBarControl in that it retains the delegate + // (which is the MMWindowController) so reset the delegate here, otherwise + // the MMWindowController never gets released resulting in a pretty serious + // memory leak. + [tabView setDelegate:nil]; + [tabBarControl setDelegate:nil]; + [tabBarControl setTabView:nil]; + [[self window] setDelegate:nil]; + + // NOTE! There is another bug in PSMTabBarControl where the control is not + // removed as an observer, so remove it here (else lots of evil nasty bugs + // will come and gnaw at your feet while you are sleeping). + [[NSNotificationCenter defaultCenter] removeObserver:tabBarControl]; + + [tabBarControl removeFromSuperviewWithoutNeedingDisplay]; + [textView removeFromSuperviewWithoutNeedingDisplay]; + + unsigned i, count = [scrollbars count]; + for (i = 0; i < count; ++i) { + MMScroller *sb = [scrollbars objectAtIndex:i]; + [sb removeFromSuperviewWithoutNeedingDisplay]; + } + + [tabView removeAllTabViewItems]; +} + +- (IBAction)addNewTab:(id)sender +{ + // NOTE! This can get called a lot if the user holds down the key + // equivalent for this action, which causes the ports to fill up. If we + // wait for the message to be sent then the app might become unresponsive. + [vimController sendMessage:AddNewTabMsgID data:nil]; +} + +- (void)updateTabsWithData:(NSData *)data +{ + const void *p = [data bytes]; + const void *end = p + [data length]; + int tabIdx = 0; + + // HACK! Current tab is first in the message. This way it is not + // necessary to guess which tab should be the selected one (this can be + // problematic for instance when new tabs are created). + int curtabIdx = *((int*)p); p += sizeof(int); + + NSArray *tabViewItems = [[self tabBarControl] representedTabViewItems]; + + while (p < end) { + //int wincount = *((int*)p); p += sizeof(int); + int length = *((int*)p); p += sizeof(int); + + NSString *label = [[NSString alloc] + initWithBytesNoCopy:(void*)p + length:length + encoding:NSUTF8StringEncoding + freeWhenDone:NO]; + p += length; + + // Set the label of the tab; add a new tab when needed. + NSTabViewItem *tvi = [[self tabView] numberOfTabViewItems] <= tabIdx + ? [self addNewTabViewItem] + : [tabViewItems objectAtIndex:tabIdx]; + + [tvi setLabel:label]; + + [label release]; + + ++tabIdx; + } + + // Remove unused tabs from the NSTabView. Note that when a tab is closed + // the NSTabView will automatically select another tab, but we want Vim to + // take care of which tab to select so set the vimTaskSelectedTab flag to + // prevent the tab selection message to be passed on to the VimTask. + vimTaskSelectedTab = YES; + int i, count = [[self tabView] numberOfTabViewItems]; + for (i = count-1; i >= tabIdx; --i) { + id tvi = [tabViewItems objectAtIndex:i]; + //NSLog(@"Removing tab with index %d", i); + [[self tabView] removeTabViewItem:tvi]; + } + vimTaskSelectedTab = NO; + + [self selectTabWithIndex:curtabIdx]; +} + +- (void)selectTabWithIndex:(int)idx +{ + //NSLog(@"%s%d", _cmd, idx); + + NSArray *tabViewItems = [[self tabBarControl] representedTabViewItems]; + if (idx < 0 || idx >= [tabViewItems count]) { + NSLog(@"WARNING: No tab with index %d exists.", idx); + return; + } + + // Do not try to select a tab if already selected. + NSTabViewItem *tvi = [tabViewItems objectAtIndex:idx]; + if (tvi != [[self tabView] selectedTabViewItem]) { + vimTaskSelectedTab = YES; + [[self tabView] selectTabViewItem:tvi]; + vimTaskSelectedTab = NO; + } +} + +- (NSTabViewItem *)addNewTabViewItem +{ + // NOTE! A newly created tab is not by selected by default; the VimTask + // decides which tab should be selected at all times. However, the AppKit + // will automatically select the first tab added to a tab view. + + NSTabViewItem *tvi = [[NSTabViewItem alloc] initWithIdentifier:nil]; + + // NOTE: If this is the first tab it will be automatically selected. + vimTaskSelectedTab = YES; + [[self tabView] addTabViewItem:tvi]; + vimTaskSelectedTab = NO; + + [tvi release]; + + return tvi; +} + +- (int)representedIndexOfTabViewItem:(NSTabViewItem *)tvi +{ + NSArray *tabViewItems = [[self tabBarControl] representedTabViewItems]; + return [tabViewItems indexOfObject:tvi]; +} + +- (BOOL)bottomScrollbarVisible +{ + unsigned i, count = [scrollbars count]; + for (i = 0; i < count; ++i) { + MMScroller *scroller = [scrollbars objectAtIndex:i]; + if ([scroller type] == MMScrollerTypeBottom && ![scroller isHidden]) + return YES; + } + + return NO; +} + +- (BOOL)leftScrollbarVisible +{ + unsigned i, count = [scrollbars count]; + for (i = 0; i < count; ++i) { + MMScroller *scroller = [scrollbars objectAtIndex:i]; + if ([scroller type] == MMScrollerTypeLeft && ![scroller isHidden]) + return YES; + } + + return NO; +} + +- (BOOL)rightScrollbarVisible +{ + unsigned i, count = [scrollbars count]; + for (i = 0; i < count; ++i) { + MMScroller *scroller = [scrollbars objectAtIndex:i]; + if ([scroller type] == MMScrollerTypeRight && ![scroller isHidden]) + return YES; + } + + return NO; +} + +- (void)createScrollbarWithIdentifier:(long)ident type:(int)type +{ + //NSLog(@"Create scroller %d of type %d", ident, type); + + MMScroller *scroller = [[MMScroller alloc] initWithIdentifier:ident + type:type]; + [scroller setTarget:self]; + [scroller setAction:@selector(scroll:)]; + + [self addSubview:scroller]; + [[self scrollbars] addObject:scroller]; + [scroller release]; +} + +- (void)destroyScrollbarWithIdentifier:(long)ident +{ + //NSLog(@"Destroy scroller %d", ident); + + unsigned idx = 0; + MMScroller *scroller = [self scrollbarForIdentifier:ident index:&idx]; + if (scroller) { + [scroller removeFromSuperview]; + [[self scrollbars] removeObjectAtIndex:idx]; + + if (![scroller isHidden]) { + // A visible scroller was removed, so the window must resize to + // fit. + //NSLog(@"Visible scroller %d was destroyed, resizing window.", + // ident); + shouldUpdateWindowSize = YES; + } + } +} + +- (void)showScrollbarWithIdentifier:(long)ident state:(BOOL)visible +{ + MMScroller *scroller = [self scrollbarForIdentifier:ident index:NULL]; + if (!scroller) return; + + BOOL wasVisible = ![scroller isHidden]; + //NSLog(@"%s scroller %d (was %svisible)", visible ? "Show" : "Hide", + // ident, wasVisible ? "" : "in"); + [scroller setHidden:!visible]; + + if (wasVisible != visible) { + // A scroller was hidden or shown, so the window must resize to fit. + //NSLog(@"%s scroller %d and resize.", visible ? "Show" : "Hide", + // ident); + shouldUpdateWindowSize = YES; + } +} + +- (void)setScrollbarThumbValue:(float)val proportion:(float)prop + identifier:(long)ident +{ + MMScroller *scroller = [self scrollbarForIdentifier:ident index:NULL]; + //NSLog(@"Set thumb value %.2f proportion %.2f for scroller %d", + // val, prop, ident); + [scroller setFloatValue:val knobProportion:prop]; +} + + +- (void)scroll:(id)sender +{ + NSMutableData *data = [NSMutableData data]; + long ident = [(MMScroller*)sender identifier]; + int hitPart = [sender hitPart]; + float value = [sender floatValue]; + + [data appendBytes:&ident length:sizeof(long)]; + [data appendBytes:&hitPart length:sizeof(int)]; + [data appendBytes:&value length:sizeof(float)]; + + [vimController sendMessage:ScrollbarEventMsgID data:data]; +} + +- (void)placeScrollbars +{ + NSRect textViewFrame = [textView frame]; + BOOL lsbVisible = [self leftScrollbarVisible]; + + // HACK! Find the lowest left&right vertical scrollbars, as well as the + // rightmost horizontal scrollbar. This hack continues further down. + // + // TODO! Can there be no more than one horizontal scrollbar? If so, the + // code can be simplified. + unsigned lowestLeftSbIdx = (unsigned)-1; + unsigned lowestRightSbIdx = (unsigned)-1; + unsigned rightmostSbIdx = (unsigned)-1; + unsigned rowMaxLeft = 0, rowMaxRight = 0, colMax = 0; + unsigned i, count = [scrollbars count]; + for (i = 0; i < count; ++i) { + MMScroller *scroller = [scrollbars objectAtIndex:i]; + if (![scroller isHidden]) { + NSRange range = [scroller range]; + if ([scroller type] == MMScrollerTypeLeft + && range.location >= rowMaxLeft) { + rowMaxLeft = range.location; + lowestLeftSbIdx = i; + } else if ([scroller type] == MMScrollerTypeRight + && range.location >= rowMaxRight) { + rowMaxRight = range.location; + lowestRightSbIdx = i; + } else if ([scroller type] == MMScrollerTypeBottom + && range.location >= colMax) { + colMax = range.location; + rightmostSbIdx = i; + } + } + } + + // Place the scrollbars. + for (i = 0; i < count; ++i) { + MMScroller *scroller = [scrollbars objectAtIndex:i]; + if ([scroller isHidden]) + continue; + + NSRect rect; + if ([scroller type] == MMScrollerTypeBottom) { + rect = [textStorage rectForColumnsInRange:[scroller range]]; + rect.size.height = [NSScroller scrollerWidth]; + if (lsbVisible) + rect.origin.x += [NSScroller scrollerWidth]; + + // HACK! Make sure the rightmost horizontal scrollbar covers the + // text view all the way to the right, otherwise it looks ugly when + // the user drags the window to resize. + if (i == rightmostSbIdx) { + float w = NSMaxX(textViewFrame) - NSMaxX(rect); + if (w > 0) + rect.size.width += w; + } + + // Make sure scrollbar rect is bounded by the text view frame. + if (rect.origin.x < textViewFrame.origin.x) + rect.origin.x = textViewFrame.origin.x; + else if (rect.origin.x > NSMaxX(textViewFrame)) + rect.origin.x = NSMaxX(textViewFrame); + if (NSMaxX(rect) > NSMaxX(textViewFrame)) + rect.size.width -= NSMaxX(rect) - NSMaxX(textViewFrame); + if (rect.size.width < 0) + rect.size.width = 0; + } else { + rect = [textStorage rectForRowsInRange:[scroller range]]; + // Adjust for the fact that text layout is flipped. + rect.origin.y = NSMaxY(textViewFrame) - rect.origin.y + - rect.size.height; + rect.size.width = [NSScroller scrollerWidth]; + if ([scroller type] == MMScrollerTypeRight) + rect.origin.x = NSMaxX(textViewFrame); + + // HACK! Make sure the lowest vertical scrollbar covers the text + // view all the way to the bottom. This is done because Vim only + // makes the scrollbar cover the (vim-)window it is associated with + // and this means there is always an empty gap in the scrollbar + // region next to the command line. + // TODO! Find a nicer way to do this. + if (i == lowestLeftSbIdx || i == lowestRightSbIdx) { + float h = rect.origin.y + rect.size.height + - textViewFrame.origin.y; + if (rect.size.height < h) { + rect.origin.y = textViewFrame.origin.y; + rect.size.height = h; + } + } + + // Vertical scrollers must not cover the resize box in the + // bottom-right corner of the window. + if ([[self window] showsResizeIndicator] // XXX: make this a flag + && rect.origin.y < [NSScroller scrollerWidth]) { + rect.size.height -= [NSScroller scrollerWidth] - rect.origin.y; + rect.origin.y = [NSScroller scrollerWidth]; + } + + // Make sure scrollbar rect is bounded by the text view frame. + if (rect.origin.y < textViewFrame.origin.y) { + rect.size.height -= textViewFrame.origin.y - rect.origin.y; + rect.origin.y = textViewFrame.origin.y; + } else if (rect.origin.y > NSMaxY(textViewFrame)) + rect.origin.y = NSMaxY(textViewFrame); + if (NSMaxY(rect) > NSMaxY(textViewFrame)) + rect.size.height -= NSMaxY(rect) - NSMaxY(textViewFrame); + if (rect.size.height < 0) + rect.size.height = 0; + } + + //NSLog(@"set scroller #%d frame = %@", i, NSStringFromRect(rect)); + NSRect oldRect = [scroller frame]; + if (!NSEqualRects(oldRect, rect)) { + [scroller setFrame:rect]; + // Clear behind the old scroller frame, or parts of the old + // scroller might still be visible after setFrame:. + [[[self window] contentView] setNeedsDisplayInRect:oldRect]; + [scroller setNeedsDisplay:YES]; + } + } +} + +- (MMScroller *)scrollbarForIdentifier:(long)ident index:(unsigned *)idx +{ + unsigned i, count = [[self scrollbars] count]; + for (i = 0; i < count; ++i) { + MMScroller *scroller = [[self scrollbars] objectAtIndex:i]; + if ([scroller identifier] == ident) { + if (idx) *idx = i; + return scroller; + } + } + + return nil; +} + +- (void)setDefaultColorsBackground:(NSColor *)back foreground:(NSColor *)fore +{ + [textStorage setDefaultColorsBackground:back foreground:fore]; + [textView setBackgroundColor:back]; +} + +- (BOOL)shouldUpdateWindowSize +{ + return shouldUpdateWindowSize; +} + +- (void)setShouldUpdateWindowSize:(BOOL)b +{ + shouldUpdateWindowSize = b; +} + +- (NSSize)contentSizeForTextStorageSize:(NSSize)textViewSize +{ + NSSize size = textViewSize; + + NSUserDefaults *ud = [NSUserDefaults standardUserDefaults]; + int right = [ud integerForKey:MMTextInsetRightKey]; + int bot = [ud integerForKey:MMTextInsetBottomKey]; + + size.width += [[self textView] textContainerOrigin].x + right; + size.height += [[self textView] textContainerOrigin].y + bot; + + if (![[self tabBarControl] isHidden]) + size.height += [[self tabBarControl] frame].size.height; + + if ([self bottomScrollbarVisible]) + size.height += [NSScroller scrollerWidth]; + if ([self leftScrollbarVisible]) + size.width += [NSScroller scrollerWidth]; + if ([self rightScrollbarVisible]) + size.width += [NSScroller scrollerWidth]; + + return size; +} + +- (NSRect)textViewRectForContentSize:(NSSize)contentSize +{ + NSRect rect = { 0, 0, contentSize.width, contentSize.height }; + + if (![[self tabBarControl] isHidden]) + rect.size.height -= [[self tabBarControl] frame].size.height; + + if ([self bottomScrollbarVisible]) { + rect.size.height -= [NSScroller scrollerWidth]; + rect.origin.y += [NSScroller scrollerWidth]; + } + if ([self leftScrollbarVisible]) { + rect.size.width -= [NSScroller scrollerWidth]; + rect.origin.x += [NSScroller scrollerWidth]; + } + if ([self rightScrollbarVisible]) + rect.size.width -= [NSScroller scrollerWidth]; + + return rect; +} + +- (NSSize)textStorageSizeForTextViewSize:(NSSize)textViewSize +{ + NSSize size = textViewSize; + + NSUserDefaults *ud = [NSUserDefaults standardUserDefaults]; + int right = [ud integerForKey:MMTextInsetRightKey]; + int bot = [ud integerForKey:MMTextInsetBottomKey]; + + size.width -= [[self textView] textContainerOrigin].x + right; + size.height -= [[self textView] textContainerOrigin].y + bot; + + return size; +} + + +// -- PSMTabBarControl delegate ---------------------------------------------- + + +- (BOOL)tabView:(NSTabView *)theTabView shouldSelectTabViewItem: + (NSTabViewItem *)tabViewItem +{ + // NOTE: It would be reasonable to think that 'shouldSelect...' implies + // that this message only gets sent when the user clicks the tab. + // Unfortunately it is not so, which is why we need the + // 'vimTaskSelectedTab' flag. + // + // HACK! The selection message should not be propagated to the VimTask if + // the VimTask selected the tab (e.g. as opposed the user clicking the + // tab). The delegate method has no way of knowing who initiated the + // selection so a flag is set when the VimTask initiated the selection. + if (!vimTaskSelectedTab) { + // Propagate the selection message to the VimTask. + int idx = [self representedIndexOfTabViewItem:tabViewItem]; + if (NSNotFound != idx) { + NSData *data = [NSData dataWithBytes:&idx length:sizeof(int)]; + [vimController sendMessage:SelectTabMsgID data:data]; + } + } + + // Unless Vim selected the tab, return NO, and let Vim decide if the tab + // should get selected or not. + return vimTaskSelectedTab; +} + +- (BOOL)tabView:(NSTabView *)theTabView shouldCloseTabViewItem: + (NSTabViewItem *)tabViewItem +{ + // HACK! This method is only called when the user clicks the close button + // on the tab. Instead of letting the tab bar close the tab, we return NO + // and pass a message on to Vim to let it handle the closing. + int idx = [self representedIndexOfTabViewItem:tabViewItem]; + //NSLog(@"Closing tab with index %d", idx); + NSData *data = [NSData dataWithBytes:&idx length:sizeof(int)]; + [vimController sendMessage:CloseTabMsgID data:data]; + + return NO; +} + +- (void)tabView:(NSTabView *)theTabView didDragTabViewItem: + (NSTabViewItem *)tabViewItem toIndex:(int)idx +{ + NSMutableData *data = [NSMutableData data]; + [data appendBytes:&idx length:sizeof(int)]; + + [vimController sendMessage:DraggedTabMsgID data:data]; +} + +@end + + + + +@implementation NSTabView (MMExtras) + +- (void)removeAllTabViewItems +{ + NSArray *existingItems = [self tabViewItems]; + NSEnumerator *e = [existingItems objectEnumerator]; + NSTabViewItem *item; + while (item = [e nextObject]){ + [self removeTabViewItem:item]; + } +} + +@end // NSTabView (MMExtras) + + + + +@implementation MMScroller + +- (id)initWithIdentifier:(long)ident type:(int)theType +{ + // HACK! NSScroller creates a horizontal scroller if it is init'ed with a + // frame whose with exceeds its height; so create a bogus rect and pass it + // to initWithFrame. + NSRect frame = theType == MMScrollerTypeBottom + ? NSMakeRect(0, 0, 1, 0) + : NSMakeRect(0, 0, 0, 1); + + if ((self = [super initWithFrame:frame])) { + identifier = ident; + type = theType; + [self setHidden:YES]; + [self setEnabled:YES]; + } + + return self; +} + +- (long)identifier +{ + return identifier; +} + +- (int)type +{ + return type; +} + +- (NSRange)range +{ + return range; +} + +- (void)setRange:(NSRange)newRange +{ + range = newRange; +} + +- (void)scrollWheel:(NSEvent *)event +{ + // HACK! Pass message on to the text view. + MMWindowController *wc = [[self window] windowController]; + [[wc textView] scrollWheel:event]; +} + +@end // MMScroller diff --git a/MMWindowController.h b/MMWindowController.h index b472f8438d..9977bbe1f4 100644 --- a/MMWindowController.h +++ b/MMWindowController.h @@ -12,31 +12,28 @@ -@class PSMTabBarControl; -@class MMTextView; -@class MMTextStorage; +@class MMFullscreenWindow; @class MMVimController; - +@class MMTextStorage; +@class MMTextView; +@class MMVimView; @interface MMWindowController : NSWindowController { - PSMTabBarControl *tabBarControl; - NSTabView *tabView; NSBox *tablineSeparator; MMVimController *vimController; - BOOL vimTaskSelectedTab; - MMTextView *textView; - MMTextStorage *textStorage; - NSMutableArray *scrollbars; + MMVimView *vimView; BOOL setupDone; BOOL shouldUpdateWindowSize; NSString *windowAutosaveKey; + MMFullscreenWindow *fullscreenWindow; } - (id)initWithVimController:(MMVimController *)controller; - (MMVimController *)vimController; - (MMTextView *)textView; - (MMTextStorage *)textStorage; +- (MMVimView *)vimView; - (NSString *)windowAutosaveKey; - (void)setWindowAutosaveKey:(NSString *)key; - (void)cleanup; @@ -59,6 +56,10 @@ - (void)setMouseShape:(int)shape; - (void)adjustLinespace:(int)linespace; - (void)liveResizeDidEnd; +- (void)placeViews; + +- (void)enterFullscreen; +- (void)leaveFullscreen; - (IBAction)addNewTab:(id)sender; - (IBAction)toggleToolbar:(id)sender; diff --git a/MMWindowController.m b/MMWindowController.m index edac1ac21d..8eb154551c 100644 --- a/MMWindowController.m +++ b/MMWindowController.m @@ -16,35 +16,10 @@ #import "MacVim.h" #import "MMAppController.h" #import "MMTypesetter.h" +#import "MMFullscreenWindow.h" +#import "MMVimView.h" -// Scroller type; these must match SBAR_* in gui.h -enum { - MMScrollerTypeLeft = 0, - MMScrollerTypeRight, - MMScrollerTypeBottom -}; - - - -// TODO: Move! -@interface NSTabView (MMExtras) -- (void)removeAllTabViewItems; -@end - - -// TODO: Move! -@interface MMScroller : NSScroller { - long identifier; - int type; - NSRange range; -} -- (id)initWithIdentifier:(long)ident type:(int)type; -- (long)identifier; -- (int)type; -- (NSRange)range; -- (void)setRange:(NSRange)newRange; -@end @interface MMWindowController (Private) - (NSSize)contentSizeForTextStorageSize:(NSSize)textViewSize; @@ -57,13 +32,8 @@ - (NSTabViewItem *)addNewTabViewItem; - (int)representedIndexOfTabViewItem:(NSTabViewItem *)tvi; - (IBAction)vimMenuItemAction:(id)sender; - (MMScroller *)scrollbarForIdentifier:(long)ident index:(unsigned *)idx; -- (BOOL)bottomScrollbarVisible; -- (BOOL)leftScrollbarVisible; -- (BOOL)rightScrollbarVisible; -- (void)placeScrollbars; -- (void)scroll:(id)sender; -- (void)placeViews; - (BOOL)askBackendForStarRegister:(NSPasteboard *)pb; +- (void)checkWindowNeedsResizing; @end @@ -102,53 +72,20 @@ @implementation MMWindowController - (id)initWithVimController:(MMVimController *)controller { if ((self = [super initWithWindowNibName:@"EmptyWindow"])) { + fullscreenWindow = nil; vimController = controller; - scrollbars = [[NSMutableArray alloc] init]; // Window cascading is handled by MMAppController. [self setShouldCascadeWindows:NO]; - // Setup a complete text system. - textStorage = [[MMTextStorage alloc] init]; - NSLayoutManager *lm = [[NSLayoutManager alloc] init]; - NSTextContainer *tc = [[NSTextContainer alloc] initWithContainerSize: - NSMakeSize(1.0e7,1.0e7)]; - - NSString *typesetterString = [[NSUserDefaults standardUserDefaults] - stringForKey:MMTypesetterKey]; - if (![typesetterString isEqual:@"NSTypesetter"]) { - MMTypesetter *typesetter = [[MMTypesetter alloc] init]; - [lm setTypesetter:typesetter]; - [typesetter release]; - } else { - // Only MMTypesetter supports different cell width multipliers. - [[NSUserDefaults standardUserDefaults] - setFloat:1.0 forKey:MMCellWidthMultiplierKey]; - } - - [tc setWidthTracksTextView:NO]; - [tc setHeightTracksTextView:NO]; - [tc setLineFragmentPadding:0]; - - [textStorage addLayoutManager:lm]; - [lm addTextContainer:tc]; - NSWindow *win = [self window]; NSView *contentView = [win contentView]; - textView = [[MMTextView alloc] initWithFrame:[contentView frame] - textContainer:tc]; - - NSUserDefaults *ud = [NSUserDefaults standardUserDefaults]; - int left = [ud integerForKey:MMTextInsetLeftKey]; - int top = [ud integerForKey:MMTextInsetTopKey]; - [textView setTextContainerInset:NSMakeSize(left, top)]; - - [contentView addSubview:textView]; - - // The text storage retains the layout manager which in turn retains - // the text container. - [tc release]; - [lm release]; + vimView = [[MMVimView alloc] initWithFrame:[contentView frame] + vimController:vimController]; + [contentView addSubview:vimView]; + //[vimView translateOriginToPoint: + // NSMakePoint([contentView frame].size.width, 0)]; + //[vimView rotateByAngle:45.f]; // Create the tabline separator (which may be visible when the tabline // is hidden). @@ -156,44 +93,17 @@ - (id)initWithVimController:(MMVimController *)controller tabSepRect.origin.y = NSMaxY(tabSepRect)-1; tabSepRect.size.height = 1; tablineSeparator = [[NSBox alloc] initWithFrame:tabSepRect]; - - // Create the tab view (which is never visible, but the tab bar control - // needs it to function). - tabView = [[NSTabView alloc] initWithFrame:NSZeroRect]; - - // Create the tab bar control (which is responsible for actually - // drawing the tabline and tabs). - NSRect tabFrame = [contentView frame]; - tabFrame.origin.y = NSMaxY(tabFrame) - 22; - tabFrame.size.height = 22; - tabBarControl = [[PSMTabBarControl alloc] initWithFrame:tabFrame]; - - [tabView setDelegate:tabBarControl]; - - [tabBarControl setTabView:tabView]; - [tabBarControl setDelegate:self]; - [tabBarControl setHidden:YES]; - [tabBarControl setAutoresizingMask:NSViewWidthSizable|NSViewMinYMargin]; - [tabBarControl setCellMinWidth:[ud integerForKey:MMTabMinWidthKey]]; - [tabBarControl setCellMaxWidth:[ud integerForKey:MMTabMaxWidthKey]]; - [tabBarControl setCellOptimumWidth: - [ud integerForKey:MMTabOptimumWidthKey]]; - [tabBarControl setShowAddTabButton:YES]; - [[tabBarControl addTabButton] setTarget:self]; - [[tabBarControl addTabButton] setAction:@selector(addNewTab:)]; - [tabBarControl setAllowsDragBetweenWindows:NO]; - + [tablineSeparator setBoxType:NSBoxSeparator]; [tablineSeparator setHidden:NO]; [tablineSeparator setAutoresizingMask:NSViewWidthSizable | NSViewMinYMargin]; [contentView setAutoresizesSubviews:YES]; - [contentView addSubview:tabBarControl]; [contentView addSubview:tablineSeparator]; [win setDelegate:self]; - [win setInitialFirstResponder:textView]; + [win setInitialFirstResponder:[vimView textView]]; // Make us safe on pre-tiger OSX if ([win respondsToSelector:@selector(_setContentHasShadow:)]) @@ -207,13 +117,8 @@ - (void)dealloc { //NSLog(@"%@ %s", [self className], _cmd); - [tabBarControl release]; tabBarControl = nil; - [tabView release]; tabView = nil; [tablineSeparator release]; tablineSeparator = nil; [windowAutosaveKey release]; windowAutosaveKey = nil; - [scrollbars release]; scrollbars = nil; - [textView release]; textView = nil; - [textStorage release]; textStorage = nil; [super dealloc]; } @@ -230,12 +135,17 @@ - (MMVimController *)vimController - (MMTextView *)textView { - return textView; + return [vimView textView]; } - (MMTextStorage *)textStorage { - return textStorage; + return [vimView textStorage]; +} + +- (MMVimView *)vimView +{ + return vimView; } - (NSString *)windowAutosaveKey @@ -253,34 +163,20 @@ - (void)cleanup { //NSLog(@"%@ %s", [self className], _cmd); + if (fullscreenWindow != nil) { + // if we are closed while still in fullscreen, end fullscreen mode, + // release ourselves (because this won't happen in MMWindowController) + // and perform close operation on the original window + [self leaveFullscreen]; + } + + setupDone = NO; vimController = nil; - // NOTE! There is a bug in PSMTabBarControl in that it retains the delegate - // (which is the MMWindowController) so reset the delegate here, otherwise - // the MMWindowController never gets released resulting in a pretty serious - // memory leak. - [tabView setDelegate:nil]; - [tabBarControl setDelegate:nil]; - [tabBarControl setTabView:nil]; - [[self window] setDelegate:nil]; - - // NOTE! There is another bug in PSMTabBarControl where the control is not - // removed as an observer, so remove it here (else lots of evil nasty bugs - // will come and gnaw at your feet while you are sleeping). - [[NSNotificationCenter defaultCenter] removeObserver:tabBarControl]; - - [tabBarControl removeFromSuperviewWithoutNeedingDisplay]; [tablineSeparator removeFromSuperviewWithoutNeedingDisplay]; - [textView removeFromSuperviewWithoutNeedingDisplay]; - - unsigned i, count = [scrollbars count]; - for (i = 0; i < count; ++i) { - MMScroller *sb = [scrollbars objectAtIndex:i]; - [sb removeFromSuperviewWithoutNeedingDisplay]; - } - - [tabView removeAllTabViewItems]; + [vimView removeFromSuperviewWithoutNeedingDisplay]; + [vimView cleanup]; // TODO: is this necessary? [[self window] orderOut:self]; } @@ -300,135 +196,39 @@ - (void)openWindow - (void)updateTabsWithData:(NSData *)data { - const void *p = [data bytes]; - const void *end = p + [data length]; - int tabIdx = 0; - - // HACK! Current tab is first in the message. This way it is not - // necessary to guess which tab should be the selected one (this can be - // problematic for instance when new tabs are created). - int curtabIdx = *((int*)p); p += sizeof(int); - - NSArray *tabViewItems = [tabBarControl representedTabViewItems]; - - while (p < end) { - //int wincount = *((int*)p); p += sizeof(int); - int length = *((int*)p); p += sizeof(int); - - NSString *label = [[NSString alloc] - initWithBytesNoCopy:(void*)p - length:length - encoding:NSUTF8StringEncoding - freeWhenDone:NO]; - p += length; - - // Set the label of the tab; add a new tab when needed. - NSTabViewItem *tvi = [tabView numberOfTabViewItems] <= tabIdx - ? [self addNewTabViewItem] - : [tabViewItems objectAtIndex:tabIdx]; - - [tvi setLabel:label]; - - [label release]; - - ++tabIdx; - } - - // Remove unused tabs from the NSTabView. Note that when a tab is closed - // the NSTabView will automatically select another tab, but we want Vim to - // take care of which tab to select so set the vimTaskSelectedTab flag to - // prevent the tab selection message to be passed on to the VimTask. - vimTaskSelectedTab = YES; - int i, count = [tabView numberOfTabViewItems]; - for (i = count-1; i >= tabIdx; --i) { - id tvi = [tabViewItems objectAtIndex:i]; - //NSLog(@"Removing tab with index %d", i); - [tabView removeTabViewItem:tvi]; - } - vimTaskSelectedTab = NO; - - [self selectTabWithIndex:curtabIdx]; + [vimView updateTabsWithData:data]; } - (void)selectTabWithIndex:(int)idx { - //NSLog(@"%s%d", _cmd, idx); - - NSArray *tabViewItems = [tabBarControl representedTabViewItems]; - if (idx < 0 || idx >= [tabViewItems count]) { - NSLog(@"WARNING: No tab with index %d exists.", idx); - return; - } - - // Do not try to select a tab if already selected. - NSTabViewItem *tvi = [tabViewItems objectAtIndex:idx]; - if (tvi != [tabView selectedTabViewItem]) { - vimTaskSelectedTab = YES; - [tabView selectTabViewItem:tvi]; - vimTaskSelectedTab = NO; - } + [vimView selectTabWithIndex:idx]; } - (void)setTextDimensionsWithRows:(int)rows columns:(int)cols { //NSLog(@"setTextDimensionsWithRows:%d columns:%d", rows, cols); - [textStorage setMaxRows:rows columns:cols]; + [[vimView textStorage] setMaxRows:rows columns:cols]; - if (setupDone && ![textView inLiveResize]) + if (setupDone && ![vimView inLiveResize]) shouldUpdateWindowSize = YES; } - (void)createScrollbarWithIdentifier:(long)ident type:(int)type { - //NSLog(@"Create scroller %d of type %d", ident, type); - - MMScroller *scroller = [[MMScroller alloc] initWithIdentifier:ident - type:type]; - [scroller setTarget:self]; - [scroller setAction:@selector(scroll:)]; - - [[[self window] contentView] addSubview:scroller]; - [scrollbars addObject:scroller]; - [scroller release]; + [vimView createScrollbarWithIdentifier:ident type:type]; } - (void)destroyScrollbarWithIdentifier:(long)ident { - //NSLog(@"Destroy scroller %d", ident); - - unsigned idx = 0; - MMScroller *scroller = [self scrollbarForIdentifier:ident index:&idx]; - if (scroller) { - [scroller removeFromSuperview]; - [scrollbars removeObjectAtIndex:idx]; - - if (![scroller isHidden]) { - // A visible scroller was removed, so the window must resize to - // fit. - //NSLog(@"Visible scroller %d was destroyed, resizing window.", - // ident); - shouldUpdateWindowSize = YES; - } - } + [vimView destroyScrollbarWithIdentifier:ident]; + [self checkWindowNeedsResizing]; } - (void)showScrollbarWithIdentifier:(long)ident state:(BOOL)visible { - MMScroller *scroller = [self scrollbarForIdentifier:ident index:NULL]; - if (!scroller) return; - - BOOL wasVisible = ![scroller isHidden]; - //NSLog(@"%s scroller %d (was %svisible)", visible ? "Show" : "Hide", - // ident, wasVisible ? "" : "in"); - [scroller setHidden:!visible]; - - if (wasVisible != visible) { - // A scroller was hidden or shown, so the window must resize to fit. - //NSLog(@"%s scroller %d and resize.", visible ? "Show" : "Hide", - // ident); - shouldUpdateWindowSize = YES; - } + [vimView showScrollbarWithIdentifier:ident state:visible]; + [self checkWindowNeedsResizing]; } - (void)setScrollbarPosition:(int)pos length:(int)len identifier:(long)ident @@ -440,17 +240,16 @@ - (void)setScrollbarPosition:(int)pos length:(int)len identifier:(long)ident // NSStringFromRange(range), ident); [scroller setRange:range]; // TODO! Should only do this once per update. - [self placeScrollbars]; + + if (setupDone) // TODO: probably not necessary + [vimView placeScrollbars]; } } - (void)setScrollbarThumbValue:(float)val proportion:(float)prop identifier:(long)ident { - MMScroller *scroller = [self scrollbarForIdentifier:ident index:NULL]; - //NSLog(@"Set thumb value %.2f proportion %.2f for scroller %d", - // val, prop, ident); - [scroller setFloatValue:val knobProportion:prop]; + [vimView setScrollbarThumbValue:val proportion:prop identifier:ident]; } - (void)setDefaultColorsBackground:(NSColor *)back foreground:(NSColor *)fore @@ -460,14 +259,13 @@ - (void)setDefaultColorsBackground:(NSColor *)back foreground:(NSColor *)fore BOOL isOpaque = [back alphaComponent] == 1.0f; [[self window] setOpaque:isOpaque]; - [textStorage setDefaultColorsBackground:back foreground:fore]; - [textView setBackgroundColor:back]; + [vimView setDefaultColorsBackground:back foreground:fore]; } - (void)setFont:(NSFont *)font { [[NSFontManager sharedFontManager] setSelectedFont:font isMultiple:NO]; - [textStorage setFont:font]; + [[vimView textStorage] setFont:font]; [self updateResizeIncrements]; } @@ -475,6 +273,7 @@ - (void)processCommandQueueDidFinish { if (shouldUpdateWindowSize) { shouldUpdateWindowSize = NO; + [vimView setShouldUpdateWindowSize:NO]; [self resizeWindowToFit:self]; } } @@ -485,8 +284,8 @@ - (void)popupMenu:(NSMenu *)menu atRow:(int)row column:(int)col NSEvent *event; if (row >= 0 && col >= 0) { - NSSize cellSize = [textStorage cellSize]; - NSPoint pt = { (col+1)*cellSize.width, [textView frame].size.height + NSSize cellSize = [[vimView textStorage] cellSize]; + NSPoint pt = { (col+1)*cellSize.width, [[vimView textView] frame].size.height - (row+1)*cellSize.height }; event = [NSEvent mouseEventWithType:NSRightMouseDown @@ -499,15 +298,15 @@ - (void)popupMenu:(NSMenu *)menu atRow:(int)row column:(int)col clickCount:0 pressure:1.0]; } else { - event = [textView lastMouseDownEvent]; + event = [[vimView textView] lastMouseDownEvent]; } - [NSMenu popUpContextMenu:menu withEvent:event forView:textView]; + [NSMenu popUpContextMenu:menu withEvent:event forView:[vimView textView]]; } - (void)showTabBar:(BOOL)on { - [tabBarControl setHidden:!on]; + [[vimView tabBarControl] setHidden:!on]; if (!on) { NSToolbar *toolbar = [[self window] toolbar]; @@ -516,8 +315,8 @@ - (void)showTabBar:(BOOL)on [tablineSeparator setHidden:on]; } - if (setupDone) - shouldUpdateWindowSize = YES; + //if (setupDone) + // shouldUpdateWindowSize = YES; } - (void)showToolbar:(BOOL)on size:(int)size mode:(int)mode @@ -532,7 +331,7 @@ - (void)showToolbar:(BOOL)on size:(int)size mode:(int)mode if (!on) { [tablineSeparator setHidden:YES]; } else { - [tablineSeparator setHidden:![tabBarControl isHidden]]; + [tablineSeparator setHidden:![[vimView tabBarControl] isHidden]]; } } @@ -559,8 +358,8 @@ - (void)setMouseShape:(int)shape - (void)adjustLinespace:(int)linespace { - if (textStorage) { - [textStorage setLinespace:(float)linespace]; + if (vimView && [vimView textStorage]) { + [[vimView textStorage] setLinespace:(float)linespace]; shouldUpdateWindowSize = YES; } } @@ -581,8 +380,8 @@ - (void)liveResizeDidEnd NSSize tsSize = [self textStorageSizeForTextViewSize:textViewRect.size]; int dim[2], rows, cols; - [textStorage getMaxRows:&rows columns:&cols]; - [textStorage fitToSize:tsSize rows:&dim[0] columns:&dim[1]]; + [[vimView textStorage] getMaxRows:&rows columns:&cols]; + [[vimView textStorage] fitToSize:tsSize rows:&dim[0] columns:&dim[1]]; if (dim[0] != rows || dim[1] != cols) { NSData *data = [NSData dataWithBytes:dim length:2*sizeof(int)]; @@ -598,9 +397,9 @@ - (void)liveResizeDidEnd timeout:.5]; } - [textView setFrame:textViewRect]; + [[vimView textView] setFrame:textViewRect]; - [self placeScrollbars]; + [vimView placeScrollbars]; if (resizeFailed) { // Force the window size to match the text view size otherwise Vim and @@ -609,73 +408,77 @@ - (void)liveResizeDidEnd } } -- (IBAction)addNewTab:(id)sender +- (void)placeViews { - // NOTE! This can get called a lot if the user holds down the key - // equivalent for this action, which causes the ports to fill up. If we - // wait for the message to be sent then the app might become unresponsive. - [vimController sendMessage:AddNewTabMsgID data:nil]; -} + if (!setupDone) return; -- (IBAction)toggleToolbar:(id)sender -{ - [vimController sendMessage:ToggleToolbarMsgID data:nil]; -} + // NOTE! It is assumed that the window has been resized so that it will + // exactly fit the text storage (possibly after resizing it). If this is + // not the case the display might be messed up. + NSWindow *win = [self window]; + NSRect contentRect = [win contentRectForFrameRect:[win frame]]; + NSRect textViewRect = [self textViewRectForContentSize:contentRect.size]; + NSSize tsSize = [self textStorageSizeForTextViewSize:textViewRect.size]; + int dim[2], rows, cols; + [[vimView textStorage] getMaxRows:&rows columns:&cols]; + [[vimView textStorage] fitToSize:tsSize rows:&dim[0] columns:&dim[1]]; + if (dim[0] != rows || dim[1] != cols) { + //NSLog(@"Notify Vim that text storage dimensions changed to %dx%d", + // dim[0], dim[1]); + NSData *data = [NSData dataWithBytes:dim length:2*sizeof(int)]; -// -- PSMTabBarControl delegate ---------------------------------------------- + [vimController sendMessage:SetTextDimensionsMsgID data:data]; + } + + // XXX: put vimView resizing logic in vimView + [[vimView textView] setFrame:textViewRect]; + + NSRect vimViewRect = textViewRect; + vimViewRect.origin = NSMakePoint(0, 0); + if (![[vimView tabBarControl] isHidden]) + vimViewRect.size.height += [[vimView tabBarControl] frame].size.height; + if ([vimView bottomScrollbarVisible]) + vimViewRect.size.height += [NSScroller scrollerWidth]; + if ([vimView leftScrollbarVisible]) + vimViewRect.size.width += [NSScroller scrollerWidth]; + if ([vimView rightScrollbarVisible]) + vimViewRect.size.width += [NSScroller scrollerWidth]; -- (BOOL)tabView:(NSTabView *)theTabView shouldSelectTabViewItem: - (NSTabViewItem *)tabViewItem -{ - // NOTE: It would be reasonable to think that 'shouldSelect...' implies - // that this message only gets sent when the user clicks the tab. - // Unfortunately it is not so, which is why we need the - // 'vimTaskSelectedTab' flag. - // - // HACK! The selection message should not be propagated to the VimTask if - // the VimTask selected the tab (e.g. as opposed the user clicking the - // tab). The delegate method has no way of knowing who initiated the - // selection so a flag is set when the VimTask initiated the selection. - if (!vimTaskSelectedTab) { - // Propagate the selection message to the VimTask. - int idx = [self representedIndexOfTabViewItem:tabViewItem]; - if (NSNotFound != idx) { - NSData *data = [NSData dataWithBytes:&idx length:sizeof(int)]; - [vimController sendMessage:SelectTabMsgID data:data]; - } - } - // Unless Vim selected the tab, return NO, and let Vim decide if the tab - // should get selected or not. - return vimTaskSelectedTab; + [vimView setFrame:vimViewRect]; + + [vimView placeScrollbars]; } -- (BOOL)tabView:(NSTabView *)theTabView shouldCloseTabViewItem: - (NSTabViewItem *)tabViewItem +- (void)enterFullscreen { - // HACK! This method is only called when the user clicks the close button - // on the tab. Instead of letting the tab bar close the tab, we return NO - // and pass a message on to Vim to let it handle the closing. - int idx = [self representedIndexOfTabViewItem:tabViewItem]; - //NSLog(@"Closing tab with index %d", idx); - NSData *data = [NSData dataWithBytes:&idx length:sizeof(int)]; - [vimController sendMessage:CloseTabMsgID data:data]; - - return NO; + fullscreenWindow = [[MMFullscreenWindow alloc] initWithWindow:[self window] + andView:vimView]; + [fullscreenWindow enterFullscreen]; + + [fullscreenWindow setDelegate:self]; } -- (void)tabView:(NSTabView *)theTabView didDragTabViewItem: - (NSTabViewItem *)tabViewItem toIndex:(int)idx +- (void)leaveFullscreen { - NSMutableData *data = [NSMutableData data]; - [data appendBytes:&idx length:sizeof(int)]; + [fullscreenWindow leaveFullscreen]; + [fullscreenWindow release]; + fullscreenWindow = nil; +} - [vimController sendMessage:DraggedTabMsgID data:data]; + +- (IBAction)addNewTab:(id)sender +{ + [vimView addNewTab:sender]; } +- (IBAction)toggleToolbar:(id)sender +{ + [vimController sendMessage:ToggleToolbarMsgID data:nil]; +} @@ -685,8 +488,8 @@ - (void)windowDidBecomeMain:(NSNotification *)notification { [vimController sendMessage:GotFocusMsgID data:nil]; - if (textStorage) - [[NSFontManager sharedFontManager] setSelectedFont:[textStorage font] + if ([vimView textStorage]) + [[NSFontManager sharedFontManager] setSelectedFont:[[vimView textStorage] font] isMultiple:NO]; } @@ -694,8 +497,8 @@ - (void)windowDidResignMain:(NSNotification *)notification { [vimController sendMessage:LostFocusMsgID data:nil]; - if (textView) - [textView hideMarkedTextField]; + if ([vimView textView]) + [[vimView textView] hideMarkedTextField]; } - (BOOL)windowShouldClose:(id)sender @@ -788,65 +591,24 @@ @implementation MMWindowController (Private) - (NSSize)contentSizeForTextStorageSize:(NSSize)textViewSize { - NSSize size = textViewSize; - - NSUserDefaults *ud = [NSUserDefaults standardUserDefaults]; - int right = [ud integerForKey:MMTextInsetRightKey]; - int bot = [ud integerForKey:MMTextInsetBottomKey]; - - size.width += [textView textContainerOrigin].x + right; - size.height += [textView textContainerOrigin].y + bot; - + NSSize size = [vimView contentSizeForTextStorageSize:textViewSize]; if (![tablineSeparator isHidden]) ++size.height; - if (![tabBarControl isHidden]) - size.height += [tabBarControl frame].size.height; - - if ([self bottomScrollbarVisible]) - size.height += [NSScroller scrollerWidth]; - if ([self leftScrollbarVisible]) - size.width += [NSScroller scrollerWidth]; - if ([self rightScrollbarVisible]) - size.width += [NSScroller scrollerWidth]; - return size; } - (NSRect)textViewRectForContentSize:(NSSize)contentSize { - NSRect rect = { 0, 0, contentSize.width, contentSize.height }; - + NSSize size = { contentSize.width, contentSize.height }; if (![tablineSeparator isHidden]) - --rect.size.height; - if (![tabBarControl isHidden]) - rect.size.height -= [tabBarControl frame].size.height; + --size.height; - if ([self bottomScrollbarVisible]) { - rect.size.height -= [NSScroller scrollerWidth]; - rect.origin.y += [NSScroller scrollerWidth]; - } - if ([self leftScrollbarVisible]) { - rect.size.width -= [NSScroller scrollerWidth]; - rect.origin.x += [NSScroller scrollerWidth]; - } - if ([self rightScrollbarVisible]) - rect.size.width -= [NSScroller scrollerWidth]; - - return rect; + return [vimView textViewRectForContentSize:size]; } - (NSSize)textStorageSizeForTextViewSize:(NSSize)textViewSize { - NSSize size = textViewSize; - - NSUserDefaults *ud = [NSUserDefaults standardUserDefaults]; - int right = [ud integerForKey:MMTextInsetRightKey]; - int bot = [ud integerForKey:MMTextInsetBottomKey]; - - size.width -= [textView textContainerOrigin].x + right; - size.height -= [textView textContainerOrigin].y + bot; - - return size; + return [vimView textStorageSizeForTextViewSize:textViewSize]; } - (void)resizeWindowToFit:(id)sender @@ -863,7 +625,7 @@ - (void)resizeWindowToFit:(id)sender NSWindow *win = [self window]; NSRect frame = [win frame]; NSRect contentRect = [win contentRectForFrameRect:frame]; - NSSize newSize = [self contentSizeForTextStorageSize:[textStorage size]]; + NSSize newSize = [self contentSizeForTextStorageSize:[[vimView textStorage] size]]; // Keep top-left corner of the window fixed when resizing. contentRect.origin.y -= newSize.height - contentRect.size.height; @@ -909,7 +671,7 @@ - (NSRect)fitWindowToFrame:(NSRect)frame NSRect contentRect = [win contentRectForFrameRect:frame]; NSSize size = [self textViewRectForContentSize:contentRect.size].size; size = [self textStorageSizeForTextViewSize:size]; - size = [textStorage fitToSize:size]; + size = [[vimView textStorage] fitToSize:size]; size = [self contentSizeForTextStorageSize:size]; // Keep top-left corner of 'frame' fixed. @@ -923,32 +685,18 @@ - (void)updateResizeIncrements { if (!setupDone) return; - NSSize size = [textStorage cellSize]; + NSSize size = [[vimView textStorage] cellSize]; [[self window] setContentResizeIncrements:size]; } - (NSTabViewItem *)addNewTabViewItem { - // NOTE! A newly created tab is not by selected by default; the VimTask - // decides which tab should be selected at all times. However, the AppKit - // will automatically select the first tab added to a tab view. - - NSTabViewItem *tvi = [[NSTabViewItem alloc] initWithIdentifier:nil]; - - // NOTE: If this is the first tab it will be automatically selected. - vimTaskSelectedTab = YES; - [tabView addTabViewItem:tvi]; - vimTaskSelectedTab = NO; - - [tvi release]; - - return tvi; + return [vimView addNewTabViewItem]; } - (int)representedIndexOfTabViewItem:(NSTabViewItem *)tvi { - NSArray *tabViewItems = [tabBarControl representedTabViewItems]; - return [tabViewItems indexOfObject:tvi]; + return [vimView representedIndexOfTabViewItem:tvi]; } - (IBAction)vimMenuItemAction:(id)sender @@ -963,218 +711,7 @@ - (IBAction)vimMenuItemAction:(id)sender - (MMScroller *)scrollbarForIdentifier:(long)ident index:(unsigned *)idx { - unsigned i, count = [scrollbars count]; - for (i = 0; i < count; ++i) { - MMScroller *scroller = [scrollbars objectAtIndex:i]; - if ([scroller identifier] == ident) { - if (idx) *idx = i; - return scroller; - } - } - - return nil; -} - -- (BOOL)bottomScrollbarVisible -{ - unsigned i, count = [scrollbars count]; - for (i = 0; i < count; ++i) { - MMScroller *scroller = [scrollbars objectAtIndex:i]; - if ([scroller type] == MMScrollerTypeBottom && ![scroller isHidden]) - return YES; - } - - return NO; -} - -- (BOOL)leftScrollbarVisible -{ - unsigned i, count = [scrollbars count]; - for (i = 0; i < count; ++i) { - MMScroller *scroller = [scrollbars objectAtIndex:i]; - if ([scroller type] == MMScrollerTypeLeft && ![scroller isHidden]) - return YES; - } - - return NO; -} - -- (BOOL)rightScrollbarVisible -{ - unsigned i, count = [scrollbars count]; - for (i = 0; i < count; ++i) { - MMScroller *scroller = [scrollbars objectAtIndex:i]; - if ([scroller type] == MMScrollerTypeRight && ![scroller isHidden]) - return YES; - } - - return NO; -} - -- (void)placeScrollbars -{ - if (!setupDone) return; - - NSRect textViewFrame = [textView frame]; - BOOL lsbVisible = [self leftScrollbarVisible]; - - // HACK! Find the lowest left&right vertical scrollbars, as well as the - // rightmost horizontal scrollbar. This hack continues further down. - // - // TODO! Can there be no more than one horizontal scrollbar? If so, the - // code can be simplified. - unsigned lowestLeftSbIdx = (unsigned)-1; - unsigned lowestRightSbIdx = (unsigned)-1; - unsigned rightmostSbIdx = (unsigned)-1; - unsigned rowMaxLeft = 0, rowMaxRight = 0, colMax = 0; - unsigned i, count = [scrollbars count]; - for (i = 0; i < count; ++i) { - MMScroller *scroller = [scrollbars objectAtIndex:i]; - if (![scroller isHidden]) { - NSRange range = [scroller range]; - if ([scroller type] == MMScrollerTypeLeft - && range.location >= rowMaxLeft) { - rowMaxLeft = range.location; - lowestLeftSbIdx = i; - } else if ([scroller type] == MMScrollerTypeRight - && range.location >= rowMaxRight) { - rowMaxRight = range.location; - lowestRightSbIdx = i; - } else if ([scroller type] == MMScrollerTypeBottom - && range.location >= colMax) { - colMax = range.location; - rightmostSbIdx = i; - } - } - } - - // Place the scrollbars. - for (i = 0; i < count; ++i) { - MMScroller *scroller = [scrollbars objectAtIndex:i]; - if ([scroller isHidden]) - continue; - - NSRect rect; - if ([scroller type] == MMScrollerTypeBottom) { - rect = [textStorage rectForColumnsInRange:[scroller range]]; - rect.size.height = [NSScroller scrollerWidth]; - if (lsbVisible) - rect.origin.x += [NSScroller scrollerWidth]; - - // HACK! Make sure the rightmost horizontal scrollbar covers the - // text view all the way to the right, otherwise it looks ugly when - // the user drags the window to resize. - if (i == rightmostSbIdx) { - float w = NSMaxX(textViewFrame) - NSMaxX(rect); - if (w > 0) - rect.size.width += w; - } - - // Make sure scrollbar rect is bounded by the text view frame. - if (rect.origin.x < textViewFrame.origin.x) - rect.origin.x = textViewFrame.origin.x; - else if (rect.origin.x > NSMaxX(textViewFrame)) - rect.origin.x = NSMaxX(textViewFrame); - if (NSMaxX(rect) > NSMaxX(textViewFrame)) - rect.size.width -= NSMaxX(rect) - NSMaxX(textViewFrame); - if (rect.size.width < 0) - rect.size.width = 0; - } else { - rect = [textStorage rectForRowsInRange:[scroller range]]; - // Adjust for the fact that text layout is flipped. - rect.origin.y = NSMaxY(textViewFrame) - rect.origin.y - - rect.size.height; - rect.size.width = [NSScroller scrollerWidth]; - if ([scroller type] == MMScrollerTypeRight) - rect.origin.x = NSMaxX(textViewFrame); - - // HACK! Make sure the lowest vertical scrollbar covers the text - // view all the way to the bottom. This is done because Vim only - // makes the scrollbar cover the (vim-)window it is associated with - // and this means there is always an empty gap in the scrollbar - // region next to the command line. - // TODO! Find a nicer way to do this. - if (i == lowestLeftSbIdx || i == lowestRightSbIdx) { - float h = rect.origin.y + rect.size.height - - textViewFrame.origin.y; - if (rect.size.height < h) { - rect.origin.y = textViewFrame.origin.y; - rect.size.height = h; - } - } - - // Vertical scrollers must not cover the resize box in the - // bottom-right corner of the window. - if (rect.origin.y < [NSScroller scrollerWidth]) { - rect.size.height -= [NSScroller scrollerWidth] - rect.origin.y; - rect.origin.y = [NSScroller scrollerWidth]; - } - - // Make sure scrollbar rect is bounded by the text view frame. - if (rect.origin.y < textViewFrame.origin.y) { - rect.size.height -= textViewFrame.origin.y - rect.origin.y; - rect.origin.y = textViewFrame.origin.y; - } else if (rect.origin.y > NSMaxY(textViewFrame)) - rect.origin.y = NSMaxY(textViewFrame); - if (NSMaxY(rect) > NSMaxY(textViewFrame)) - rect.size.height -= NSMaxY(rect) - NSMaxY(textViewFrame); - if (rect.size.height < 0) - rect.size.height = 0; - } - - //NSLog(@"set scroller #%d frame = %@", i, NSStringFromRect(rect)); - NSRect oldRect = [scroller frame]; - if (!NSEqualRects(oldRect, rect)) { - [scroller setFrame:rect]; - // Clear behind the old scroller frame, or parts of the old - // scroller might still be visible after setFrame:. - [[[self window] contentView] setNeedsDisplayInRect:oldRect]; - [scroller setNeedsDisplay:YES]; - } - } -} - -- (void)scroll:(id)sender -{ - NSMutableData *data = [NSMutableData data]; - long ident = [(MMScroller*)sender identifier]; - int hitPart = [sender hitPart]; - float value = [sender floatValue]; - - [data appendBytes:&ident length:sizeof(long)]; - [data appendBytes:&hitPart length:sizeof(int)]; - [data appendBytes:&value length:sizeof(float)]; - - [vimController sendMessage:ScrollbarEventMsgID data:data]; -} - -- (void)placeViews -{ - if (!setupDone) return; - - // NOTE! It is assumed that the window has been resized so that it will - // exactly fit the text storage (possibly after resizing it). If this is - // not the case the display might be messed up. - NSWindow *win = [self window]; - NSRect contentRect = [win contentRectForFrameRect:[win frame]]; - NSRect textViewRect = [self textViewRectForContentSize:contentRect.size]; - NSSize tsSize = [self textStorageSizeForTextViewSize:textViewRect.size]; - - int dim[2], rows, cols; - [textStorage getMaxRows:&rows columns:&cols]; - [textStorage fitToSize:tsSize rows:&dim[0] columns:&dim[1]]; - - if (dim[0] != rows || dim[1] != cols) { - //NSLog(@"Notify Vim that text storage dimensions changed to %dx%d", - // dim[0], dim[1]); - NSData *data = [NSData dataWithBytes:dim length:2*sizeof(int)]; - - [vimController sendMessage:SetTextDimensionsMsgID data:data]; - } - - [textView setFrame:textViewRect]; - - [self placeScrollbars]; + return [vimView scrollbarForIdentifier:ident index:idx]; } - (BOOL)askBackendForStarRegister:(NSPasteboard *)pb @@ -1194,73 +731,10 @@ - (BOOL)askBackendForStarRegister:(NSPasteboard *)pb return reply; } -@end // MMWindowController (Private) - - - -@implementation NSTabView (MMExtras) - -- (void)removeAllTabViewItems -{ - NSArray *existingItems = [self tabViewItems]; - NSEnumerator *e = [existingItems objectEnumerator]; - NSTabViewItem *item; - while (item = [e nextObject]){ - [self removeTabViewItem:item]; - } -} - -@end // NSTabView (MMExtras) - - - - -@implementation MMScroller - -- (id)initWithIdentifier:(long)ident type:(int)theType -{ - // HACK! NSScroller creates a horizontal scroller if it is init'ed with a - // frame whose with exceeds its height; so create a bogus rect and pass it - // to initWithFrame. - NSRect frame = theType == MMScrollerTypeBottom - ? NSMakeRect(0, 0, 1, 0) - : NSMakeRect(0, 0, 0, 1); - - if ((self = [super initWithFrame:frame])) { - identifier = ident; - type = theType; - [self setHidden:YES]; - [self setEnabled:YES]; - } - - return self; -} - -- (long)identifier +- (void)checkWindowNeedsResizing { - return identifier; + shouldUpdateWindowSize = + shouldUpdateWindowSize || [vimView shouldUpdateWindowSize]; } -- (int)type -{ - return type; -} - -- (NSRange)range -{ - return range; -} - -- (void)setRange:(NSRange)newRange -{ - range = newRange; -} - -- (void)scrollWheel:(NSEvent *)event -{ - // HACK! Pass message on to the text view. - MMWindowController *wc = [[self window] windowController]; - [[wc textView] scrollWheel:event]; -} - -@end // MMScroller +@end // MMWindowController (Private) diff --git a/MacVim.h b/MacVim.h index 0838730d55..29afbf0937 100644 --- a/MacVim.h +++ b/MacVim.h @@ -152,6 +152,8 @@ enum { AdjustLinespaceMsgID, ActivateMsgID, SetServerNameMsgID, + EnterFullscreenMsgID, + LeaveFullscreenMsgID, }; diff --git a/MacVim.m b/MacVim.m index 84bf922cef..b85fd253c0 100644 --- a/MacVim.m +++ b/MacVim.m @@ -59,6 +59,8 @@ "AdjustLinespaceMsgID", "ActivateMsgID", "SetServerNameMsgID", + "EnterFullscreenMsgID", + "LeaveFullscreenMsgID", }; diff --git a/MacVim.xcodeproj/project.pbxproj b/MacVim.xcodeproj/project.pbxproj index b5527d8b61..439589a4d9 100644 --- a/MacVim.xcodeproj/project.pbxproj +++ b/MacVim.xcodeproj/project.pbxproj @@ -32,6 +32,9 @@ 1D71ACBC0BC702AC002F2B60 /* doc-bm-txt.icns in Resources */ = {isa = PBXBuildFile; fileRef = 1D71ACB10BC702AB002F2B60 /* doc-bm-txt.icns */; }; 1D71ACBD0BC702AC002F2B60 /* doc-bm-xml.icns in Resources */ = {isa = PBXBuildFile; fileRef = 1D71ACB20BC702AB002F2B60 /* doc-bm-xml.icns */; }; 1D71ACBE0BC702AC002F2B60 /* doc-bm.icns in Resources */ = {isa = PBXBuildFile; fileRef = 1D71ACB30BC702AB002F2B60 /* doc-bm.icns */; }; + 1D80FBD40CBBD3B700102A1C /* MMFullscreenWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D80FBD00CBBD3B700102A1C /* MMFullscreenWindow.m */; }; + 1D80FBD60CBBD3B700102A1C /* MMVimView.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D80FBD20CBBD3B700102A1C /* MMVimView.m */; }; + 1D80FBE40CBBD6F200102A1C /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D80FBE30CBBD6F200102A1C /* Carbon.framework */; }; 1DD04DEC0C529C5E006CDC2B /* Credits.rtf in Resources */ = {isa = PBXBuildFile; fileRef = 1DD04DEB0C529C5E006CDC2B /* Credits.rtf */; }; 1DD0C20C0C60FFB4008CD84A /* gvimrc in CopyFiles */ = {isa = PBXBuildFile; fileRef = 1DD0C20A0C60FF9A008CD84A /* gvimrc */; }; 1DD66ECE0C803D3600EBDAB3 /* MMApplication.m in Sources */ = {isa = PBXBuildFile; fileRef = 1DD66ECC0C803D3600EBDAB3 /* MMApplication.m */; }; @@ -158,6 +161,11 @@ 1D71ACB10BC702AB002F2B60 /* doc-bm-txt.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = "doc-bm-txt.icns"; sourceTree = ""; }; 1D71ACB20BC702AB002F2B60 /* doc-bm-xml.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = "doc-bm-xml.icns"; sourceTree = ""; }; 1D71ACB30BC702AB002F2B60 /* doc-bm.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = "doc-bm.icns"; sourceTree = ""; }; + 1D80FBCF0CBBD3B700102A1C /* MMFullscreenWindow.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = MMFullscreenWindow.h; sourceTree = ""; }; + 1D80FBD00CBBD3B700102A1C /* MMFullscreenWindow.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = MMFullscreenWindow.m; sourceTree = ""; }; + 1D80FBD10CBBD3B700102A1C /* MMVimView.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = MMVimView.h; sourceTree = ""; }; + 1D80FBD20CBBD3B700102A1C /* MMVimView.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = MMVimView.m; sourceTree = ""; }; + 1D80FBE30CBBD6F200102A1C /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = /Developer/SDKs/MacOSX10.4u.sdk/System/Library/Frameworks/Carbon.framework; sourceTree = ""; }; 1DD04DEB0C529C5E006CDC2B /* Credits.rtf */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; path = Credits.rtf; sourceTree = ""; }; 1DD0C20A0C60FF9A008CD84A /* gvimrc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = gvimrc; sourceTree = ""; }; 1DD66ECB0C803D3600EBDAB3 /* MMApplication.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = MMApplication.h; sourceTree = ""; }; @@ -206,6 +214,7 @@ files = ( 1DFE25A50C527BC4003000F7 /* PSMTabBarControl.framework in Frameworks */, 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */, + 1D80FBE40CBBD6F200102A1C /* Carbon.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -215,6 +224,10 @@ 080E96DDFE201D6D7F000001 /* MacVim Source */ = { isa = PBXGroup; children = ( + 1D80FBCF0CBBD3B700102A1C /* MMFullscreenWindow.h */, + 1D80FBD00CBBD3B700102A1C /* MMFullscreenWindow.m */, + 1D80FBD10CBBD3B700102A1C /* MMVimView.h */, + 1D80FBD20CBBD3B700102A1C /* MMVimView.m */, 1DD66ECB0C803D3600EBDAB3 /* MMApplication.h */, 1DD66ECC0C803D3600EBDAB3 /* MMApplication.m */, 1D09AB3F0C6A4D520045497E /* MMTypesetter.h */, @@ -240,6 +253,7 @@ 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */ = { isa = PBXGroup; children = ( + 1D80FBE30CBBD6F200102A1C /* Carbon.framework */, 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */, ); name = "Linked Frameworks"; @@ -506,6 +520,8 @@ 1D1474BC0C567A910038FA2B /* MMWindowController.m in Sources */, 1D09AB420C6A4D520045497E /* MMTypesetter.m in Sources */, 1DD66ECE0C803D3600EBDAB3 /* MMApplication.m in Sources */, + 1D80FBD40CBBD3B700102A1C /* MMFullscreenWindow.m in Sources */, + 1D80FBD60CBBD3B700102A1C /* MMVimView.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -557,8 +573,10 @@ "$(FRAMEWORK_SEARCH_PATHS_QUOTED_1)", "$(FRAMEWORK_SEARCH_PATHS_QUOTED_2)", "$(FRAMEWORK_SEARCH_PATHS_QUOTED_3)", + "$(FRAMEWORK_SEARCH_PATHS_QUOTED_2)", ); FRAMEWORK_SEARCH_PATHS_QUOTED_1 = "\"$(SRCROOT)/../../../../Library/Frameworks\""; + FRAMEWORK_SEARCH_PATHS_QUOTED_2 = "\"$(SYSTEM_DEVELOPER_DIR)/SDKs/MacOSX10.4u.sdk/System/Library/Frameworks\""; GCC_DYNAMIC_NO_PIC = NO; GCC_ENABLE_FIX_AND_CONTINUE = YES; GCC_ENABLE_OBJC_EXCEPTIONS = YES; @@ -583,8 +601,10 @@ "$(FRAMEWORK_SEARCH_PATHS_QUOTED_1)", "$(FRAMEWORK_SEARCH_PATHS_QUOTED_2)", "$(FRAMEWORK_SEARCH_PATHS_QUOTED_3)", + "$(FRAMEWORK_SEARCH_PATHS_QUOTED_2)", ); FRAMEWORK_SEARCH_PATHS_QUOTED_1 = "\"$(SRCROOT)/../../../../Library/Frameworks\""; + FRAMEWORK_SEARCH_PATHS_QUOTED_2 = "\"$(SYSTEM_DEVELOPER_DIR)/SDKs/MacOSX10.4u.sdk/System/Library/Frameworks\""; GCC_DYNAMIC_NO_PIC = YES; GCC_ENABLE_OBJC_EXCEPTIONS = YES; GCC_GENERATE_DEBUGGING_SYMBOLS = NO; diff --git a/MacVim.xcodeproj/winckler.mode1 b/MacVim.xcodeproj/winckler.mode1 index 772b46f982..ac12bc445e 100644 --- a/MacVim.xcodeproj/winckler.mode1 +++ b/MacVim.xcodeproj/winckler.mode1 @@ -368,9 +368,9 @@ TableOfContents - 1DD15C5B0CA69E1F00C745CE + 1D80FBD80CBBD3DA00102A1C 1CE0B1FE06471DED0097A5F4 - 1DD15C5C0CA69E1F00C745CE + 1D80FBD90CBBD3DA00102A1C 1CE0B20306471E060097A5F4 1CE0B20506471E060097A5F4 @@ -504,9 +504,8 @@ 5 WindowOrderList - 1D16B9EF0BA33E3800A69B33 - 1C0AD2B3069F1EA900FABCE6 /Users/winckler/Projects/vim7/src/MacVim/MacVim.xcodeproj + 1D16B9EF0BA33E3800A69B33 WindowString 165 349 690 397 0 0 1024 746 @@ -547,6 +546,8 @@ 194pt + BecomeActive + ContentConfiguration PBXProjectModuleGUID @@ -586,7 +587,7 @@ TableOfContents 1D16B9EF0BA33E3800A69B33 - 1DD15C5D0CA69E1F00C745CE + 1D80FBCD0CBBD39300102A1C 1CD0528F0623707200166675 XCMainBuildResultsModuleGUID @@ -597,7 +598,7 @@ WindowToolGUID 1D16B9EF0BA33E3800A69B33 WindowToolIsVisible - + FirstTimeWindowDisplayed diff --git a/MacVim.xcodeproj/winckler.pbxuser b/MacVim.xcodeproj/winckler.pbxuser index 994d686a08..e59fd9edc9 100644 --- a/MacVim.xcodeproj/winckler.pbxuser +++ b/MacVim.xcodeproj/winckler.pbxuser @@ -438,8 +438,8 @@ PBXFileDataSource_Warnings_ColumnID, ); }; - PBXPerProjectTemplateStateSaveDate = 212246019; - PBXWorkspaceStateSaveDate = 212246019; + PBXPerProjectTemplateStateSaveDate = 213635967; + PBXWorkspaceStateSaveDate = 213635967; }; sourceControlManager = 1D16B9DD0BA33BB000A69B33 /* Source Control */; userBuildSettings = { diff --git a/PSMTabBarControl/source/PSMMetalTabStyle.m b/PSMTabBarControl/source/PSMMetalTabStyle.m index ca0051f19b..2b2bce45c2 100644 --- a/PSMTabBarControl/source/PSMMetalTabStyle.m +++ b/PSMTabBarControl/source/PSMMetalTabStyle.m @@ -13,6 +13,14 @@ #define kPSMMetalObjectCounterRadius 7.0 #define kPSMMetalCounterMinWidth 20 +// NSDrawWindowBackground() is broken for borderless windows, see +// http://lists.apple.com/archives/cocoa-dev/2006/Feb/msg00130.html +void MyNSDrawWindowBackground(NSRect rect) +{ + [[NSColor windowBackgroundColor] set]; + NSRectFill( rect ); +} + @implementation PSMMetalTabStyle - (NSString *)name @@ -316,7 +324,7 @@ - (void)drawTabCell:(PSMTabBarCell *)cell aRect.size.height -= 0.5; // background - NSDrawWindowBackground(aRect); + MyNSDrawWindowBackground(aRect); aRect.size.height+=0.5; @@ -452,7 +460,7 @@ - (void)drawInteriorWithTabCell:(PSMTabBarCell *)cell inView:(NSView*)controlVie - (void)drawTabBar:(PSMTabBarControl *)bar inRect:(NSRect)rect { - NSDrawWindowBackground(rect); + MyNSDrawWindowBackground(rect); [[NSColor colorWithCalibratedWhite:0.0 alpha:0.2] set]; NSRectFillUsingOperation(rect, NSCompositeSourceAtop); [[NSColor darkGrayColor] set]; diff --git a/gui_macvim.m b/gui_macvim.m index 84bef4726c..53673eaf2c 100644 --- a/gui_macvim.m +++ b/gui_macvim.m @@ -1367,6 +1367,18 @@ return [actionDict objectForKey:action] != nil; } + void +gui_mch_enter_fullscreen() +{ + [[MMBackend sharedInstance] enterFullscreen]; +} + + void +gui_mch_leave_fullscreen() +{ + [[MMBackend sharedInstance] leaveFullscreen]; +} + // -- Client/Server --------------------------------------------------------- From b6d330d46d625b50fe0e29515de7e81c579d103c Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Thu, 11 Oct 2007 14:26:02 +0000 Subject: [PATCH 0272/1156] - Merged patch from Nico (code style, :popup, release vimView) - Removed FRAMEWORK_SEARCH_PATHS_QUOTED_1 from build settings (caused warning) git-svn-id: http://macvim.googlecode.com/svn/trunk@305 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMFullscreenWindow.h | 14 +++++----- MMFullscreenWindow.m | 43 ++++++++++++++++--------------- MMVimController.m | 3 ++- MMWindowController.m | 20 ++++++++------ MacVim.xcodeproj/project.pbxproj | 2 -- MacVim.xcodeproj/winckler.mode1 | 15 ++++++----- MacVim.xcodeproj/winckler.pbxuser | 4 +-- 7 files changed, 53 insertions(+), 48 deletions(-) diff --git a/MMFullscreenWindow.h b/MMFullscreenWindow.h index 62c7da7da3..65d9153b2b 100644 --- a/MMFullscreenWindow.h +++ b/MMFullscreenWindow.h @@ -15,16 +15,16 @@ @class MMVimView; @interface MMFullscreenWindow : NSWindow { - NSWindow* target; - MMVimView* view; - NSPoint oldPosition; - NSString *oldTabBarStyle; + NSWindow *target; + MMVimView *view; + NSPoint oldPosition; + NSString *oldTabBarStyle; } -- (MMFullscreenWindow*)initWithWindow:(NSWindow*)t andView:(MMVimView*)v; +- (MMFullscreenWindow *)initWithWindow:(NSWindow *)t view:(MMVimView *)v; -- (void) enterFullscreen; -- (void) leaveFullscreen; +- (void)enterFullscreen; +- (void)leaveFullscreen; - (BOOL)canBecomeKeyWindow; - (BOOL)canBecomeMainWindow; diff --git a/MMFullscreenWindow.m b/MMFullscreenWindow.m index 1b0bf07a41..ed0dab9085 100644 --- a/MMFullscreenWindow.m +++ b/MMFullscreenWindow.m @@ -19,7 +19,7 @@ @implementation MMFullscreenWindow -- (MMFullscreenWindow*)initWithWindow:(NSWindow*)t andView:(MMVimView*)v +- (MMFullscreenWindow *)initWithWindow:(NSWindow *)t view:(MMVimView *)v { NSScreen* screen = [t screen]; @@ -35,7 +35,7 @@ - (MMFullscreenWindow*)initWithWindow:(NSWindow*)t andView:(MMVimView*)v defer:YES screen:screen]; - if(self == nil) + if (self == nil) return nil; [self setHasShadow:NO]; @@ -49,7 +49,7 @@ - (MMFullscreenWindow*)initWithWindow:(NSWindow*)t andView:(MMVimView*)v return self; } -- (void) dealloc +- (void)dealloc { [target release]; [view release]; @@ -57,7 +57,7 @@ - (void) dealloc [super dealloc]; } -- (void) centerView +- (void)centerView { NSRect outer = [self frame], inner = [view frame]; //NSLog(@"%s %@%@", _cmd, NSStringFromRect(outer), NSStringFromRect(inner)); @@ -67,7 +67,7 @@ - (void) centerView [view setFrameOrigin:origin]; } -- (void) enterFullscreen +- (void)enterFullscreen { // hide menu and dock, both appear on demand SetSystemUIMode(kUIModeAllSuppressed, 0); //requires 10.3 @@ -75,7 +75,7 @@ - (void) enterFullscreen // fade to black Boolean didBlend = NO; CGDisplayFadeReservationToken token; - if(CGAcquireDisplayFadeReservation(.5, &token) == kCGErrorSuccess) { + if (CGAcquireDisplayFadeReservation(.5, &token) == kCGErrorSuccess) { CGDisplayFade(token, .25, kCGDisplayBlendNormal, kCGDisplayBlendSolidColor, .0, .0, .0, true); didBlend = YES; @@ -86,9 +86,9 @@ - (void) enterFullscreen [target setDelegate:nil]; // make target's window controller believe that it's now controlling us - [target retain]; // NSWindowController will release target once in the next - // line - [[target windowController] setWindow: self]; + [target retain]; // NSWindowController will release target once in the + // in the next line + [[target windowController] setWindow:self]; oldTabBarStyle = [[view tabBarControl] styleName]; @@ -100,15 +100,16 @@ - (void) enterFullscreen [[self contentView] addSubview:view]; [self setInitialFirstResponder:[view textView]]; - [self setTitle: [target title]]; + [self setTitle:[target title]]; [self setOpaque:[target isOpaque]]; // make us visible and target invisible [target orderOut:self]; [self makeKeyAndOrderFront:self]; - // don't set this sooner, so we don't get an additional focus gained message - [self setDelegate: delegate]; + // don't set this sooner, so we don't get an additional + // focus gained message + [self setDelegate:delegate]; // update bottom right corner scrollbar (no resize handle in fu mode) [[self windowController] placeViews]; @@ -119,19 +120,19 @@ - (void) enterFullscreen [self display]; // fade back in - if(didBlend) { + if (didBlend) { CGDisplayFade(token, .25, kCGDisplayBlendSolidColor, kCGDisplayBlendNormal, .0, .0, .0, false); CGReleaseDisplayFadeReservation(token); } } -- (void) leaveFullscreen +- (void)leaveFullscreen { // fade to black Boolean didBlend = NO; CGDisplayFadeReservationToken token; - if(CGAcquireDisplayFadeReservation(.5, &token) == kCGErrorSuccess) { + if (CGAcquireDisplayFadeReservation(.5, &token) == kCGErrorSuccess) { CGDisplayFade(token, .25, kCGDisplayBlendNormal, kCGDisplayBlendSolidColor, .0, .0, .0, true); didBlend = YES; @@ -139,7 +140,7 @@ - (void) leaveFullscreen // fix up target controller [self retain]; // NSWindowController releases us once - [[self windowController] setWindow: target]; + [[self windowController] setWindow:target]; [[view tabBarControl] setStyleNamed:oldTabBarStyle]; @@ -153,14 +154,14 @@ - (void) leaveFullscreen // do this _after_ resetting delegate and window controller, so the // window controller doesn't get a focus lost message from the fullscreen // window. - [[target contentView] addSubview: view]; + [[target contentView] addSubview:view]; [view setFrameOrigin:oldPosition]; [self close]; [target makeKeyAndOrderFront:self]; // ...but we don't want a focus gained message either, so don't set this // sooner - [target setDelegate: delegate]; + [target setDelegate:delegate]; // update bottom right corner scrollbar (resize handle reappears) @@ -170,7 +171,7 @@ - (void) leaveFullscreen // fade back in - if(didBlend) { + if (didBlend) { CGDisplayFade(token, .25, kCGDisplayBlendSolidColor, kCGDisplayBlendNormal, .0, .0, .0, false); CGReleaseDisplayFadeReservation(token); @@ -200,7 +201,7 @@ - (BOOL)canBecomeMainWindow // non-fullscreen window. forward those, and interpret the messages that are // interesting for us -- (void)setTitle:(NSString*)title +- (void)setTitle:(NSString *)title { [target setTitle:title]; [super setTitle:title]; @@ -210,7 +211,7 @@ - (void)setTitle:(NSString*)title // to be changed when nofu is set. MMWindowController gets the toolbar object, // so we need to return a toolbar from this method, even if none is visible for // the fullscreen window. Seems to work, though. -- (NSToolbar*)toolbar +- (NSToolbar *)toolbar { return [target toolbar]; } diff --git a/MMVimController.m b/MMVimController.m index 43793fa27b..cf439207f6 100644 --- a/MMVimController.m +++ b/MMVimController.m @@ -877,9 +877,10 @@ - (void)performBatchDrawWithData:(NSData *)data // get drawn as well. if (flags & DRAW_CURSOR) { [textView setShouldDrawInsertionPoint:NO]; + //NSColor *color = [NSColor colorWithRgbInt:bg]; //[textView drawInsertionPointAtRow:row column:col // shape:MMInsertionPointBlock - // color:[NSColor colorWithRgbInt:bg]]; + // color:color]; } [textStorage replaceString:string atRow:row column:col diff --git a/MMWindowController.m b/MMWindowController.m index 8eb154551c..d3efe1f6fb 100644 --- a/MMWindowController.m +++ b/MMWindowController.m @@ -63,7 +63,7 @@ - (void)checkWindowNeedsResizing; // Note: This hack allows us to set content shadowing separately from // the window shadow. This is apparently what webkit and terminal do. @interface NSWindow (NSWindowPrivate) // new Tiger private method -- (void) _setContentHasShadow:(BOOL)shadow; +- (void)_setContentHasShadow:(BOOL)shadow; @end @@ -119,6 +119,7 @@ - (void)dealloc [tablineSeparator release]; tablineSeparator = nil; [windowAutosaveKey release]; windowAutosaveKey = nil; + [vimView release]; vimView = nil; [super dealloc]; } @@ -285,8 +286,8 @@ - (void)popupMenu:(NSMenu *)menu atRow:(int)row column:(int)col NSEvent *event; if (row >= 0 && col >= 0) { NSSize cellSize = [[vimView textStorage] cellSize]; - NSPoint pt = { (col+1)*cellSize.width, [[vimView textView] frame].size.height - - (row+1)*cellSize.height }; + NSPoint pt = { (col+1)*cellSize.width, (row+1)*cellSize.height }; + pt = [[vimView textView] convertPoint:pt toView:nil]; event = [NSEvent mouseEventWithType:NSRightMouseDown location:pt @@ -456,7 +457,7 @@ - (void)placeViews - (void)enterFullscreen { fullscreenWindow = [[MMFullscreenWindow alloc] initWithWindow:[self window] - andView:vimView]; + view:vimView]; [fullscreenWindow enterFullscreen]; [fullscreenWindow setDelegate:self]; @@ -488,9 +489,11 @@ - (void)windowDidBecomeMain:(NSNotification *)notification { [vimController sendMessage:GotFocusMsgID data:nil]; - if ([vimView textStorage]) - [[NSFontManager sharedFontManager] setSelectedFont:[[vimView textStorage] font] - isMultiple:NO]; + if ([vimView textStorage]) { + NSFontManager *fontManager = [NSFontManager sharedFontManager]; + [fontManager setSelectedFont:[[vimView textStorage] font] + isMultiple:NO]; + } } - (void)windowDidResignMain:(NSNotification *)notification @@ -625,7 +628,8 @@ - (void)resizeWindowToFit:(id)sender NSWindow *win = [self window]; NSRect frame = [win frame]; NSRect contentRect = [win contentRectForFrameRect:frame]; - NSSize newSize = [self contentSizeForTextStorageSize:[[vimView textStorage] size]]; + NSSize textStorageSize = [[vimView textStorage] size]; + NSSize newSize = [self contentSizeForTextStorageSize:textStorageSize]; // Keep top-left corner of the window fixed when resizing. contentRect.origin.y -= newSize.height - contentRect.size.height; diff --git a/MacVim.xcodeproj/project.pbxproj b/MacVim.xcodeproj/project.pbxproj index 439589a4d9..b5675b0056 100644 --- a/MacVim.xcodeproj/project.pbxproj +++ b/MacVim.xcodeproj/project.pbxproj @@ -575,7 +575,6 @@ "$(FRAMEWORK_SEARCH_PATHS_QUOTED_3)", "$(FRAMEWORK_SEARCH_PATHS_QUOTED_2)", ); - FRAMEWORK_SEARCH_PATHS_QUOTED_1 = "\"$(SRCROOT)/../../../../Library/Frameworks\""; FRAMEWORK_SEARCH_PATHS_QUOTED_2 = "\"$(SYSTEM_DEVELOPER_DIR)/SDKs/MacOSX10.4u.sdk/System/Library/Frameworks\""; GCC_DYNAMIC_NO_PIC = NO; GCC_ENABLE_FIX_AND_CONTINUE = YES; @@ -603,7 +602,6 @@ "$(FRAMEWORK_SEARCH_PATHS_QUOTED_3)", "$(FRAMEWORK_SEARCH_PATHS_QUOTED_2)", ); - FRAMEWORK_SEARCH_PATHS_QUOTED_1 = "\"$(SRCROOT)/../../../../Library/Frameworks\""; FRAMEWORK_SEARCH_PATHS_QUOTED_2 = "\"$(SYSTEM_DEVELOPER_DIR)/SDKs/MacOSX10.4u.sdk/System/Library/Frameworks\""; GCC_DYNAMIC_NO_PIC = YES; GCC_ENABLE_OBJC_EXCEPTIONS = YES; diff --git a/MacVim.xcodeproj/winckler.mode1 b/MacVim.xcodeproj/winckler.mode1 index ac12bc445e..c5c59484aa 100644 --- a/MacVim.xcodeproj/winckler.mode1 +++ b/MacVim.xcodeproj/winckler.mode1 @@ -368,9 +368,9 @@ TableOfContents - 1D80FBD80CBBD3DA00102A1C + 1DE3752F0CBE67DA00CE48DB 1CE0B1FE06471DED0097A5F4 - 1D80FBD90CBBD3DA00102A1C + 1DE375300CBE67DA00CE48DB 1CE0B20306471E060097A5F4 1CE0B20506471E060097A5F4 @@ -504,8 +504,9 @@ 5 WindowOrderList - /Users/winckler/Projects/vim7/src/MacVim/MacVim.xcodeproj + 1C0AD2B3069F1EA900FABCE6 1D16B9EF0BA33E3800A69B33 + /Users/winckler/Projects/vim7/src/MacVim/MacVim.xcodeproj WindowString 165 349 690 397 0 0 1024 746 @@ -587,7 +588,7 @@ TableOfContents 1D16B9EF0BA33E3800A69B33 - 1D80FBCD0CBBD39300102A1C + 1DE375310CBE67DA00CE48DB 1CD0528F0623707200166675 XCMainBuildResultsModuleGUID @@ -598,7 +599,7 @@ WindowToolGUID 1D16B9EF0BA33E3800A69B33 WindowToolIsVisible - + FirstTimeWindowDisplayed @@ -959,9 +960,9 @@ TableOfContents 1C0AD2B3069F1EA900FABCE6 - 1DD15C570CA69E1700C745CE + 1DE375380CBE697B00CE48DB 1CD0528B0623707200166675 - 1DD15C580CA69E1700C745CE + 1DE375390CBE697B00CE48DB ToolbarConfiguration xcode.toolbar.config.run diff --git a/MacVim.xcodeproj/winckler.pbxuser b/MacVim.xcodeproj/winckler.pbxuser index e59fd9edc9..e29ad723a8 100644 --- a/MacVim.xcodeproj/winckler.pbxuser +++ b/MacVim.xcodeproj/winckler.pbxuser @@ -438,8 +438,8 @@ PBXFileDataSource_Warnings_ColumnID, ); }; - PBXPerProjectTemplateStateSaveDate = 213635967; - PBXWorkspaceStateSaveDate = 213635967; + PBXPerProjectTemplateStateSaveDate = 213804902; + PBXWorkspaceStateSaveDate = 213804902; }; sourceControlManager = 1D16B9DD0BA33BB000A69B33 /* Source Control */; userBuildSettings = { From f57179ff005eda61d4e3f15020072272c4073c51 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Thu, 11 Oct 2007 16:53:02 +0000 Subject: [PATCH 0273/1156] - name changes :menukeyequiv ==> :macmenukey :action ==> :macaction - updated docs and $VIM/gvimrc to reflect the above change - added fontSizeUp/Down to Action list in docs - added "Enter/Leave Fullscreen" menu items to Window menu - 'transparency' range changed to 0-100 git-svn-id: http://macvim.googlecode.com/svn/trunk@306 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMBackend.m | 6 ++- gui_macvim.m | 6 +-- gvimrc | 99 ++++++++++++++++++++++------------------- runtime/doc/gui_mac.txt | 40 +++++++++-------- 4 files changed, 80 insertions(+), 71 deletions(-) diff --git a/MMBackend.m b/MMBackend.m index aa1a1ab9d2..09647dd310 100644 --- a/MMBackend.m +++ b/MMBackend.m @@ -13,10 +13,12 @@ // NOTE: Colors in MMBackend are stored as unsigned ints on the form 0xaarrggbb -// whereas colors in Vim are int without the alpha component. +// whereas colors in Vim are int without the alpha component. Also note that +// 'transp' is assumed to be a value between 0 and 100. #define MM_COLOR(col) ((unsigned)( ((col)&0xffffff) | 0xff000000 )) #define MM_COLOR_WITH_TRANSP(col,transp) \ - ((unsigned)( ((col)&0xffffff) | (((unsigned)(255-(transp))&0xff)<<24) )) + ((unsigned)( ((col)&0xffffff) \ + | ((((unsigned)((((100-(transp))*255)/100)+.5f))&0xff)<<24) )) // This constant controls how often the command queue may be flushed. If it is diff --git a/gui_macvim.m b/gui_macvim.m index 53673eaf2c..655e1f6d98 100644 --- a/gui_macvim.m +++ b/gui_macvim.m @@ -651,8 +651,8 @@ name:(char*)name tip:(char*)tip icon:(char*)icon - keyEquivalent:menu->ke_key - modifiers:menu->ke_mods + keyEquivalent:menu->mac_key + modifiers:menu->mac_mods action:action atIndex:idx]; @@ -1024,7 +1024,7 @@ void -ex_action(eap) +ex_macaction(eap) exarg_T *eap; { if (!gui.in_use) { diff --git a/gvimrc b/gvimrc index 05efb98c5f..fb20b1e9ab 100644 --- a/gvimrc +++ b/gvimrc @@ -36,7 +36,7 @@ aunmenu File.-SEP4- aunmenu File.Exit aunmenu File.Save-Exit -an 10.290 File.New\ Window :action newWindow: +an 10.290 File.New\ Window :maca newWindow: an 10.295 File.New\ Tab :tabnew an 10.328 File.-SEP0- an 10.330 File.Close\ Window:qa :confirm qa @@ -44,24 +44,27 @@ an 10.331 File.Close:q :confirm q "an 10.331 File.Close\ Tab :tabclose an 20.460 Edit.-SEP4- -an 20.465.10 Edit.Font.Show\ Fonts :action orderFrontFontPanel: +an 20.465.10 Edit.Font.Show\ Fonts :maca orderFrontFontPanel: an 20.465.20 Edit.Font.-SEP5- -an 20.465.30 Edit.Font.Bigger :action fontSizeUp: -an 20.465.40 Edit.Font.Smaller :action fontSizeDown: -an 20.470 Edit.Special\ Characters\.\.\. :action orderFrontCharacterPalette: +an 20.465.30 Edit.Font.Bigger :maca fontSizeUp: +an 20.465.40 Edit.Font.Smaller :maca fontSizeDown: +an 20.470 Edit.Special\ Characters\.\.\. :maca orderFrontCharacterPalette: " Window menu (should be next to Help so give it a high priority) aunmenu Window -an 9900.300 Window.Minimize :action performMiniaturize: -an 9900.310 Window.Zoom :action performZoom: -an 9900.320 Window.-SEP1- +an 9900.300 Window.Minimize :maca performMiniaturize: +an 9900.310 Window.Zoom :maca performZoom: +an 9900.320 Window.-SEP1- " TODO! Grey out if no tabs are visible. -an 9900.330 Window.Previous\ Tab :tabprevious -an 9900.340 Window.Next\ Tab :tabnext -an 9900.350 Window.-SEP2- -an 9900.360 Window.Bring\ All\ To\ Front :action arrangeInFront: +an 9900.330 Window.Previous\ Tab :tabprevious +an 9900.340 Window.Next\ Tab :tabnext +an 9900.350 Window.-SEP2- +an 9900.360 Window.Enter\ Fullscreen :set fu +an 9900.370 Window.Leave\ Fullscreen :set nofu +an 9900.380 Window.-SEP3- +an 9900.390 Window.Bring\ All\ To\ Front :maca arrangeInFront: @@ -163,41 +166,43 @@ endif " exists("macvim_hig_shift_movement") " Menu key equivalents (these should always have the 'D' modifier set) " -menukeyequiv File.New\ Window -menukeyequiv File.New\ Tab - -menukeyequiv File.Open\.\.\. -menukeyequiv File.Open\ Tab\.\.\. -menukeyequiv File.Close\ Window -"menukeyequiv File.Close\ Tab -menukeyequiv File.Close -menukeyequiv File.Save -menukeyequiv File.Save\ As\.\.\. -menukeyequiv File.Print - -menukeyequiv Edit.Undo -menukeyequiv Edit.Redo -menukeyequiv Edit.Cut -menukeyequiv Edit.Copy -menukeyequiv Edit.Paste -menukeyequiv Edit.Select\ All -menukeyequiv Edit.Special\ Characters\.\.\. -menukeyequiv Edit.Font.Bigger -menukeyequiv Edit.Font.Smaller - -menukeyequiv Tools.Spelling.To\ Next\ error -menukeyequiv Tools.Spelling.Suggest\ Corrections -menukeyequiv Tools.Make -menukeyequiv Tools.List\ Errors -menukeyequiv Tools.List\ Messages -menukeyequiv Tools.Next\ Error -menukeyequiv Tools.Previous\ Error -menukeyequiv Tools.Older\ List -menukeyequiv Tools.Newer\ List - -menukeyequiv Window.Minimize -menukeyequiv Window.Previous\ Tab -menukeyequiv Window.Next\ Tab +macmenukey File.New\ Window +macmenukey File.New\ Tab + +macmenukey File.Open\.\.\. +macmenukey File.Open\ Tab\.\.\. +macmenukey File.Close\ Window +"macmenukey File.Close\ Tab +macmenukey File.Close +macmenukey File.Save +macmenukey File.Save\ As\.\.\. +macmenukey File.Print + +macmenukey Edit.Undo +macmenukey Edit.Redo +macmenukey Edit.Cut +macmenukey Edit.Copy +macmenukey Edit.Paste +macmenukey Edit.Select\ All +macmenukey Edit.Special\ Characters\.\.\. +macmenukey Edit.Font.Bigger +macmenukey Edit.Font.Smaller + +macmenukey Tools.Spelling.To\ Next\ error +macmenukey Tools.Spelling.Suggest\ Corrections +macmenukey Tools.Make +macmenukey Tools.List\ Errors +macmenukey Tools.List\ Messages +macmenukey Tools.Next\ Error +macmenukey Tools.Previous\ Error +macmenukey Tools.Older\ List +macmenukey Tools.Newer\ List + +macmenukey Window.Minimize +macmenukey Window.Previous\ Tab +macmenukey Window.Next\ Tab +macmenukey Window.Enter\ Fullscreen +macmenukey Window.Leave\ Fullscreen " Restore the previous value of 'cpoptions'. diff --git a/runtime/doc/gui_mac.txt b/runtime/doc/gui_mac.txt index b27ecee2b4..819b677d88 100644 --- a/runtime/doc/gui_mac.txt +++ b/runtime/doc/gui_mac.txt @@ -208,14 +208,14 @@ than the default?) then post them to vim_mac. ============================================================================== 4. Menus *macvim-menus* - *:menukeyequiv* + *:macm* *:macmenukey* MacVim has a special way of binding keys to menu items that differs from other Vim GUI ports. A menu binding is called a "key equivalent" in Mac OS X terminology, this is displayed on the right side of a menu item. The -":menukeyequiv" command is used to set the key equivalent of a menu item. -This command takes two parameters, the first names the menu item to bind to, -the second gives the key combination. For example: > - :menukeyequiv File.New\ Tab +":macmenukey" command is used to set the key equivalent of a menu item. This +command takes two parameters, the first names the menu item to bind to, the +second gives the key combination. For example: > + :macmenukey File.New\ Tab This sets the key equivalent of the "New Tab" menu item under the "File" menu to Cmd+t. @@ -224,31 +224,31 @@ Note that key equivalents: * take precedence over normal mappings made with ":map" * can only be modified during startup (e.g. in .gvimrc) -It is possible to reset a key equivalent by calling :menukeyequiv with a menu +It is possible to reset a key equivalent by calling :macmenukey with a menu name but no key. This is so that the default key equivalents can be reset in "~/.gvimrc". For example, if you would like to free up (which is the key equivalent of "File.Save") then add the following line to "~/.gvimrc": > - menukeyequiv File.Save + macmenukey File.Save Now you can use :map to bind to whatever you like. It is not necessary to reset a key equivalent if all you want to do is to change the key equivalent of a menu item. For example, say you want to use as the key equivalent for "Next Tab", then add the following line to "~/.gvimrc": > - menukeyequiv Window.Next\ Tab + macmenukey Window.Next\ Tab < - *:action* + *:maca* *:macaction* It is typical for menu items in Cocoa applications to bind to Objective-C -selectors. To support this, MacVim introduces the ":action" command. This +selectors. To support this, MacVim introduces the ":macaction" command. This command takes the name of an action message as its only parameter. (An action message is an Objective-C message with "void" return type and a single parameter of type "id".) For example, the "New Window" menu item on the "File" menu is created in the following manner: > - :an 10.290 File.New\ Window :action newWindow: + :an 10.290 File.New\ Window :macaction newWindow: -Note 1: A menu item which is bound to ":action" will automatically be bound to -that action in all modes (as if ":an" was used). It is not possible to bind -to ":action" in one mode only. +Note 1: A menu item which is bound to ":macaction" will automatically be bound +to that action in all modes (as if ":an" was used). It is not possible to +bind to ":macaction" in one mode only. Note 2: The action is "nil-targeted", which means it is passed down the first responder chain. @@ -263,6 +263,8 @@ Here is a random assortment of actions from Actions.plist which might be useful. Action Description ~ +fontSizeDown: Decrease font size +fontSizeUp: Increase font size newWindow: Open a new (empty) window orderFrontCharacterPalette: Show the the "Special Characters" dialog orderFrontFontPanel: Show the Font panel @@ -271,11 +273,11 @@ selectNextWindow: Select next window (similar to ) selectPreviousWindow: Select previous window (similar to ) As an example, to map to performZoom: you could do something like this: > - :map :action performZoom: + :map :macaction performZoom: A better way to map to performZoom: would be to set the key equivalent of the menu item "Window.Zoom" to the above action. This can be done by adding the following line to "~/.gvimrc": > - menukeyequiv Window.Zoom + macmenukey Window.Zoom (Note that key equivalents must contain the 'D' flag.) ============================================================================== @@ -365,8 +367,8 @@ To get around this, set 'tabpagemax' to something big in your .gvimrc file (e.g. ":set tabpagemax=100"). Scenario: ~ -You want to open a file in a tab in an already opened window, but -typing "gvim filename" in Terminal opens it up in a separate window. +You want to open a file in a tab in an already opened window, but typing +"mvim filename" in Terminal opens it up in a separate window. Solution: ~ Use the |--remote-tab| switch. If you have several windows open you might have to specify which window you want the file to open in by using the @@ -374,7 +376,7 @@ might have to specify which window you want the file to open in by using the "VIM" or "VIM3" --- this is the server name of that window. So to open a file named "foobar.txt" in a window whose title ends in "VIM3" you would type (the order of the arguments matters): > - gvim --servername VIM3 --remote-tab foobar.txt + mvim --servername VIM3 --remote-tab foobar.txt For more information, consult the |client-server| manual page. Scenario: ~ From f48d84017f685e88b951ceb564244ed645b8ab57 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Thu, 11 Oct 2007 18:37:42 +0000 Subject: [PATCH 0274/1156] Now works to bind to , , git-svn-id: http://macvim.googlecode.com/svn/trunk@307 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMBackend.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MMBackend.m b/MMBackend.m index 09647dd310..4e003a85fe 100644 --- a/MMBackend.m +++ b/MMBackend.m @@ -1885,7 +1885,7 @@ - (void)handleKeyDown:(NSString *)key modifiers:(int)mods // Unfortunately, the only way to deal with when to clear the modifiers // or not seems to be to have hard-wired rules like this. if ( !((' ' == c) || (0xa0 == c) || (mods & MOD_MASK_CMD) - || 0x9 == c) ) { + || 0x9 == c || 0xd == c) ) { mods &= ~MOD_MASK_SHIFT; mods &= ~MOD_MASK_CTRL; //NSLog(@"clear shift ctrl"); From 390e648dd4a13e1b977301b7486678d6b7e92d18 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Thu, 11 Oct 2007 20:34:07 +0000 Subject: [PATCH 0275/1156] Menu items bound to :macaction are properly recognized (fixes bug where all menu items became inactive when last window closed) git-svn-id: http://macvim.googlecode.com/svn/trunk@308 96c4425d-ca35-0410-94e5-3396d5c13a8f --- gui_macvim.m | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/gui_macvim.m b/gui_macvim.m index 655e1f6d98..bbc211cf1c 100644 --- a/gui_macvim.m +++ b/gui_macvim.m @@ -626,17 +626,17 @@ map_str = CONVERT_TO_UTF8(map_str); #endif - // HACK! Check if menu is mapped to ':action actionName:'; if so, pass the - // action along so that MacVim can bind the menu item to this action. This - // means that if a menu item maps to an action in normal mode, then all - // other modes will also use the same action. + // HACK! Check if menu is mapped to ':macaction actionName:'; if so, pass + // the action along so that MacVim can bind the menu item to this action. + // This means that if a menu item maps to an action in normal mode, then + // all other modes will also use the same action. NSString *action = nil; if (map_str) { NSString *mapping = [NSString stringWithCString:(char*)map_str encoding:NSUTF8StringEncoding]; NSArray *parts = [mapping componentsSeparatedByString:@" "]; if ([parts count] >=2 - && [[parts objectAtIndex:0] isEqual:@":action"]) { + && [[parts objectAtIndex:0] hasPrefix:@":maca"]) { action = [parts objectAtIndex:1]; action = [action stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]]; From 2df36264dcd1b9607aa594f5384d549b0a1a437e Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Fri, 12 Oct 2007 17:42:42 +0000 Subject: [PATCH 0276/1156] - Escape '%' with backslash in drop files - Code cleanup git-svn-id: http://macvim.googlecode.com/svn/trunk@309 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMBackend.m | 559 +++++++++++++++++++++++++--------------------- MMVimController.m | 2 +- MacVim.h | 9 + MacVim.m | 48 ++++ 4 files changed, 364 insertions(+), 254 deletions(-) diff --git a/MMBackend.m b/MMBackend.m index 4e003a85fe..848f20f9e9 100644 --- a/MMBackend.m +++ b/MMBackend.m @@ -57,6 +57,7 @@ - (NSComparisonResult)serverNameCompare:(NSString *)string; @interface MMBackend (Private) - (void)handleMessage:(int)msgid data:(NSData *)data; + (NSDictionary *)specialKeys; +- (void)handleInsertText:(NSData *)data; - (void)handleKeyDown:(NSString *)key modifiers:(int)mods; - (void)queueMessage:(int)msgid data:(NSData *)data; - (void)connectionDidDie:(NSNotification *)notification; @@ -64,6 +65,16 @@ - (void)blinkTimerFired:(NSTimer *)timer; - (void)focusChange:(BOOL)on; - (void)processInputBegin; - (void)processInputEnd; +- (void)handleToggleToolbar; +- (void)handleScrollbarEvent:(NSData *)data; +- (void)handleSetFont:(NSData *)data; +- (void)handleDropFiles:(NSData *)data; +- (void)handleDropString:(NSData *)data; +@end + + + +@interface MMBackend (ClientServer) - (NSString *)connectionNameFromServerName:(NSString *)name; - (NSConnection *)connectionForServerName:(NSString *)name; - (NSConnection *)connectionForServerPort:(int)port; @@ -1403,37 +1414,7 @@ @implementation MMBackend (Private) - (void)handleMessage:(int)msgid data:(NSData *)data { if (InsertTextMsgID == msgid) { - if (!data) return; - NSString *key = [[NSString alloc] initWithData:data - encoding:NSUTF8StringEncoding]; - char_u *str = (char_u*)[key UTF8String]; - int i, len = [key lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; - -#if MM_ENABLE_CONV - char_u *conv_str = NULL; - if (input_conv.vc_type != CONV_NONE) { - conv_str = string_convert(&input_conv, str, &len); - if (conv_str) - str = conv_str; - } -#endif - - for (i = 0; i < len; ++i) { - add_to_input_buf(str+i, 1); - if (CSI == str[i]) { - // NOTE: If the converted string contains the byte CSI, then it - // must be followed by the bytes KS_EXTRA, KE_CSI or things - // won't work. - static char_u extra[2] = { KS_EXTRA, KE_CSI }; - add_to_input_buf(extra, 2); - } - } - -#if MM_ENABLE_CONV - if (conv_str) - vim_free(conv_str); -#endif - [key release]; + [self handleInsertText:data]; } else if (KeyDownMsgID == msgid || CmdKeyMsgID == msgid) { if (!data) return; const void *bytes = [data bytes]; @@ -1545,233 +1526,17 @@ - (void)handleMessage:(int)msgid data:(NSData *)data gui_menu_cb(menu); } } else if (ToggleToolbarMsgID == msgid) { - char_u go[sizeof(GO_ALL)+2]; - char_u *p; - int len; - - STRCPY(go, p_go); - p = vim_strchr(go, GO_TOOLBAR); - len = STRLEN(go); - - if (p != NULL) { - char_u *end = go + len; - while (p < end) { - p[0] = p[1]; - ++p; - } - } else { - go[len] = GO_TOOLBAR; - go[len+1] = NUL; - } - - set_option_value((char_u*)"guioptions", 0, go, 0); - - // Force screen redraw (does it have to be this complicated?). - redraw_all_later(CLEAR); - update_screen(NOT_VALID); - setcursor(); - out_flush(); - gui_update_cursor(FALSE, FALSE); - gui_mch_flush(); + [self handleToggleToolbar]; } else if (ScrollbarEventMsgID == msgid) { - if (!data) return; - const void *bytes = [data bytes]; - long ident = *((long*)bytes); bytes += sizeof(long); - int hitPart = *((int*)bytes); bytes += sizeof(int); - float fval = *((float*)bytes); bytes += sizeof(float); - scrollbar_T *sb = gui_find_scrollbar(ident); - - if (sb) { - scrollbar_T *sb_info = sb->wp ? &sb->wp->w_scrollbars[0] : sb; - long value = sb_info->value; - long size = sb_info->size; - long max = sb_info->max; - BOOL isStillDragging = NO; - BOOL updateKnob = YES; - - switch (hitPart) { - case NSScrollerDecrementPage: - value -= (size > 2 ? size - 2 : 1); - break; - case NSScrollerIncrementPage: - value += (size > 2 ? size - 2 : 1); - break; - case NSScrollerDecrementLine: - --value; - break; - case NSScrollerIncrementLine: - ++value; - break; - case NSScrollerKnob: - isStillDragging = YES; - // fall through ... - case NSScrollerKnobSlot: - value = (long)(fval * (max - size + 1)); - // fall through ... - default: - updateKnob = NO; - break; - } - - //NSLog(@"value %d -> %d", sb_info->value, value); - gui_drag_scrollbar(sb, value, isStillDragging); - - if (updateKnob) { - // Dragging the knob or option+clicking automatically updates - // the knob position (on the actual NSScroller), so we only - // need to set the knob position in the other cases. - if (sb->wp) { - // Update both the left&right vertical scrollbars. - long identLeft = sb->wp->w_scrollbars[SBAR_LEFT].ident; - long identRight = sb->wp->w_scrollbars[SBAR_RIGHT].ident; - [self setScrollbarThumbValue:value size:size max:max - identifier:identLeft]; - [self setScrollbarThumbValue:value size:size max:max - identifier:identRight]; - } else { - // Update the horizontal scrollbar. - [self setScrollbarThumbValue:value size:size max:max - identifier:ident]; - } - } - } + [self handleScrollbarEvent:data]; } else if (SetFontMsgID == msgid) { - if (!data) return; - const void *bytes = [data bytes]; - float pointSize = *((float*)bytes); bytes += sizeof(float); - //unsigned len = *((unsigned*)bytes); bytes += sizeof(unsigned); - bytes += sizeof(unsigned); // len not used - - NSMutableString *name = [NSMutableString stringWithUTF8String:bytes]; - [name appendString:[NSString stringWithFormat:@":h%.2f", pointSize]]; - char_u *s = (char_u*)[name UTF8String]; - -#if MM_ENABLE_CONV - s = CONVERT_FROM_UTF8(s); -#endif - - set_option_value((char_u*)"guifont", 0, s, 0); - -#if MM_ENABLE_CONV - CONVERT_FROM_UTF8_FREE(s); -#endif - - // Force screen redraw (does it have to be this complicated?). - redraw_all_later(CLEAR); - update_screen(NOT_VALID); - setcursor(); - out_flush(); - gui_update_cursor(FALSE, FALSE); - gui_mch_flush(); + [self handleSetFont:data]; } else if (VimShouldCloseMsgID == msgid) { gui_shell_closed(); } else if (DropFilesMsgID == msgid) { -#ifdef FEAT_DND - const void *bytes = [data bytes]; - const void *end = [data bytes] + [data length]; - int n = *((int*)bytes); bytes += sizeof(int); - - if (State & CMDLINE) { - // HACK! If Vim is in command line mode then the files names - // should be added to the command line, instead of opening the - // files in tabs. This is taken care of by gui_handle_drop(). - char_u **fnames = (char_u **)alloc(n * sizeof(char_u *)); - if (fnames) { - int i = 0; - while (bytes < end && i < n) { - int len = *((int*)bytes); bytes += sizeof(int); - char_u *s = (char_u*)bytes; -#if MM_ENABLE_CONV - s = CONVERT_FROM_UTF8(s); -#endif - fnames[i++] = vim_strsave(s); -#if MM_ENABLE_CONV - CONVERT_FROM_UTF8_FREE(s); -#endif - bytes += len; - } - - // NOTE! This function will free 'fnames'. - // HACK! It is assumed that the 'x' and 'y' arguments are - // unused when in command line mode. - gui_handle_drop(0, 0, 0, fnames, i < n ? i : n); - } - } else { - // HACK! I'm not sure how to get Vim to open a list of files in - // tabs, so instead I create a ':tab drop' command with all the - // files to open and execute it. - NSMutableString *cmd = (n > 1) - ? [NSMutableString stringWithString:@":tab drop"] - : [NSMutableString stringWithString:@":drop"]; - - int i; - for (i = 0; i < n && bytes < end; ++i) { - int len = *((int*)bytes); bytes += sizeof(int); - NSMutableString *file = - [NSMutableString stringWithUTF8String:bytes]; - [file replaceOccurrencesOfString:@" " - withString:@"\\ " - options:0 - range:NSMakeRange(0,[file length])]; - bytes += len; - - [cmd appendString:@" "]; - [cmd appendString:file]; - } - - // By going to the last tabpage we ensure that the new tabs will - // appear last (if this call is left out, the taborder becomes - // messy). - goto_tabpage(9999); - - char_u *s = (char_u*)[cmd UTF8String]; -#if MM_ENABLE_CONV - s = CONVERT_FROM_UTF8(s); -#endif - do_cmdline_cmd(s); -#if MM_ENABLE_CONV - CONVERT_FROM_UTF8_FREE(s); -#endif - - // Force screen redraw (does it have to be this complicated?). - // (This code was taken from the end of gui_handle_drop().) - update_screen(NOT_VALID); - setcursor(); - out_flush(); - gui_update_cursor(FALSE, FALSE); - gui_mch_flush(); - } -#endif // FEAT_DND + [self handleDropFiles:data]; } else if (DropStringMsgID == msgid) { -#ifdef FEAT_DND - char_u dropkey[3] = { CSI, KS_EXTRA, (char_u)KE_DROP }; - const void *bytes = [data bytes]; - int len = *((int*)bytes); bytes += sizeof(int); - NSMutableString *string = [NSMutableString stringWithUTF8String:bytes]; - - // Replace unrecognized end-of-line sequences with \x0a (line feed). - NSRange range = { 0, [string length] }; - unsigned n = [string replaceOccurrencesOfString:@"\x0d\x0a" - withString:@"\x0a" options:0 - range:range]; - if (0 == n) { - n = [string replaceOccurrencesOfString:@"\x0d" withString:@"\x0a" - options:0 range:range]; - } - - len = [string lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; - char_u *s = (char_u*)[string UTF8String]; -#if MM_ENABLE_CONV - if (input_conv.vc_type != CONV_NONE) - s = string_convert(&input_conv, s, &len); -#endif - dnd_yank_drag_data(s, len); -#if MM_ENABLE_CONV - if (input_conv.vc_type != CONV_NONE) - vim_free(s); -#endif - add_to_input_buf(dropkey, sizeof(dropkey)); -#endif // FEAT_DND + [self handleDropString:data]; } else if (GotFocusMsgID == msgid) { if (!gui.in_focus) [self focusChange:YES]; @@ -1807,6 +1572,42 @@ + (NSDictionary *)specialKeys return specialKeys; } +- (void)handleInsertText:(NSData *)data +{ + if (!data) return; + + NSString *key = [[NSString alloc] initWithData:data + encoding:NSUTF8StringEncoding]; + char_u *str = (char_u*)[key UTF8String]; + int i, len = [key lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; + +#if MM_ENABLE_CONV + char_u *conv_str = NULL; + if (input_conv.vc_type != CONV_NONE) { + conv_str = string_convert(&input_conv, str, &len); + if (conv_str) + str = conv_str; + } +#endif + + for (i = 0; i < len; ++i) { + add_to_input_buf(str+i, 1); + if (CSI == str[i]) { + // NOTE: If the converted string contains the byte CSI, then it + // must be followed by the bytes KS_EXTRA, KE_CSI or things + // won't work. + static char_u extra[2] = { KS_EXTRA, KE_CSI }; + add_to_input_buf(extra, 2); + } + } + +#if MM_ENABLE_CONV + if (conv_str) + vim_free(conv_str); +#endif + [key release]; +} + - (void)handleKeyDown:(NSString *)key modifiers:(int)mods { char_u special[3]; @@ -2017,6 +1818,258 @@ - (void)processInputEnd inProcessInput = NO; } +- (void)handleToggleToolbar +{ + // If 'go' contains 'T', then remove it, else add it. + + char_u go[sizeof(GO_ALL)+2]; + char_u *p; + int len; + + STRCPY(go, p_go); + p = vim_strchr(go, GO_TOOLBAR); + len = STRLEN(go); + + if (p != NULL) { + char_u *end = go + len; + while (p < end) { + p[0] = p[1]; + ++p; + } + } else { + go[len] = GO_TOOLBAR; + go[len+1] = NUL; + } + + set_option_value((char_u*)"guioptions", 0, go, 0); + + // Force screen redraw (does it have to be this complicated?). + redraw_all_later(CLEAR); + update_screen(NOT_VALID); + setcursor(); + out_flush(); + gui_update_cursor(FALSE, FALSE); + gui_mch_flush(); +} + +- (void)handleScrollbarEvent:(NSData *)data +{ + if (!data) return; + + const void *bytes = [data bytes]; + long ident = *((long*)bytes); bytes += sizeof(long); + int hitPart = *((int*)bytes); bytes += sizeof(int); + float fval = *((float*)bytes); bytes += sizeof(float); + scrollbar_T *sb = gui_find_scrollbar(ident); + + if (sb) { + scrollbar_T *sb_info = sb->wp ? &sb->wp->w_scrollbars[0] : sb; + long value = sb_info->value; + long size = sb_info->size; + long max = sb_info->max; + BOOL isStillDragging = NO; + BOOL updateKnob = YES; + + switch (hitPart) { + case NSScrollerDecrementPage: + value -= (size > 2 ? size - 2 : 1); + break; + case NSScrollerIncrementPage: + value += (size > 2 ? size - 2 : 1); + break; + case NSScrollerDecrementLine: + --value; + break; + case NSScrollerIncrementLine: + ++value; + break; + case NSScrollerKnob: + isStillDragging = YES; + // fall through ... + case NSScrollerKnobSlot: + value = (long)(fval * (max - size + 1)); + // fall through ... + default: + updateKnob = NO; + break; + } + + //NSLog(@"value %d -> %d", sb_info->value, value); + gui_drag_scrollbar(sb, value, isStillDragging); + + if (updateKnob) { + // Dragging the knob or option+clicking automatically updates + // the knob position (on the actual NSScroller), so we only + // need to set the knob position in the other cases. + if (sb->wp) { + // Update both the left&right vertical scrollbars. + long identLeft = sb->wp->w_scrollbars[SBAR_LEFT].ident; + long identRight = sb->wp->w_scrollbars[SBAR_RIGHT].ident; + [self setScrollbarThumbValue:value size:size max:max + identifier:identLeft]; + [self setScrollbarThumbValue:value size:size max:max + identifier:identRight]; + } else { + // Update the horizontal scrollbar. + [self setScrollbarThumbValue:value size:size max:max + identifier:ident]; + } + } + } +} + +- (void)handleSetFont:(NSData *)data +{ + if (!data) return; + + const void *bytes = [data bytes]; + float pointSize = *((float*)bytes); bytes += sizeof(float); + //unsigned len = *((unsigned*)bytes); bytes += sizeof(unsigned); + bytes += sizeof(unsigned); // len not used + + NSMutableString *name = [NSMutableString stringWithUTF8String:bytes]; + [name appendString:[NSString stringWithFormat:@":h%.2f", pointSize]]; + char_u *s = (char_u*)[name UTF8String]; + +#if MM_ENABLE_CONV + s = CONVERT_FROM_UTF8(s); +#endif + + set_option_value((char_u*)"guifont", 0, s, 0); + +#if MM_ENABLE_CONV + CONVERT_FROM_UTF8_FREE(s); +#endif + + // Force screen redraw (does it have to be this complicated?). + redraw_all_later(CLEAR); + update_screen(NOT_VALID); + setcursor(); + out_flush(); + gui_update_cursor(FALSE, FALSE); + gui_mch_flush(); +} + +- (void)handleDropFiles:(NSData *)data +{ + if (!data) return; + +#ifdef FEAT_DND + const void *bytes = [data bytes]; + const void *end = [data bytes] + [data length]; + int n = *((int*)bytes); bytes += sizeof(int); + + if (State & CMDLINE) { + // HACK! If Vim is in command line mode then the files names + // should be added to the command line, instead of opening the + // files in tabs. This is taken care of by gui_handle_drop(). + char_u **fnames = (char_u **)alloc(n * sizeof(char_u *)); + if (fnames) { + int i = 0; + while (bytes < end && i < n) { + int len = *((int*)bytes); bytes += sizeof(int); + char_u *s = (char_u*)bytes; +#if MM_ENABLE_CONV + s = CONVERT_FROM_UTF8(s); +#endif + fnames[i++] = vim_strsave(s); +#if MM_ENABLE_CONV + CONVERT_FROM_UTF8_FREE(s); +#endif + bytes += len; + } + + // NOTE! This function will free 'fnames'. + // HACK! It is assumed that the 'x' and 'y' arguments are + // unused when in command line mode. + gui_handle_drop(0, 0, 0, fnames, i < n ? i : n); + } + } else { + // HACK! I'm not sure how to get Vim to open a list of files in + // tabs, so instead I create a ':tab drop' command with all the + // files to open and execute it. + NSMutableString *cmd = (n > 1) + ? [NSMutableString stringWithString:@":tab drop"] + : [NSMutableString stringWithString:@":drop"]; + + int i; + for (i = 0; i < n && bytes < end; ++i) { + int len = *((int*)bytes); bytes += sizeof(int); + NSString *file = [NSString stringWithUTF8String:bytes]; + file = [file stringByEscapingInvalidFilenameCharacters]; + bytes += len; + + [cmd appendString:@" "]; + [cmd appendString:file]; + } + + // By going to the last tabpage we ensure that the new tabs will + // appear last (if this call is left out, the taborder becomes + // messy). + goto_tabpage(9999); + + char_u *s = (char_u*)[cmd UTF8String]; +#if MM_ENABLE_CONV + s = CONVERT_FROM_UTF8(s); +#endif + do_cmdline_cmd(s); +#if MM_ENABLE_CONV + CONVERT_FROM_UTF8_FREE(s); +#endif + + // Force screen redraw (does it have to be this complicated?). + // (This code was taken from the end of gui_handle_drop().) + update_screen(NOT_VALID); + setcursor(); + out_flush(); + gui_update_cursor(FALSE, FALSE); + gui_mch_flush(); + } +#endif // FEAT_DND +} + +- (void)handleDropString:(NSData *)data +{ + if (!data) return; + +#ifdef FEAT_DND + char_u dropkey[3] = { CSI, KS_EXTRA, (char_u)KE_DROP }; + const void *bytes = [data bytes]; + int len = *((int*)bytes); bytes += sizeof(int); + NSMutableString *string = [NSMutableString stringWithUTF8String:bytes]; + + // Replace unrecognized end-of-line sequences with \x0a (line feed). + NSRange range = { 0, [string length] }; + unsigned n = [string replaceOccurrencesOfString:@"\x0d\x0a" + withString:@"\x0a" options:0 + range:range]; + if (0 == n) { + n = [string replaceOccurrencesOfString:@"\x0d" withString:@"\x0a" + options:0 range:range]; + } + + len = [string lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; + char_u *s = (char_u*)[string UTF8String]; +#if MM_ENABLE_CONV + if (input_conv.vc_type != CONV_NONE) + s = string_convert(&input_conv, s, &len); +#endif + dnd_yank_drag_data(s, len); +#if MM_ENABLE_CONV + if (input_conv.vc_type != CONV_NONE) + vim_free(s); +#endif + add_to_input_buf(dropkey, sizeof(dropkey)); +#endif // FEAT_DND +} + +@end // MMBackend (Private) + + + + +@implementation MMBackend (ClientServer) + - (NSString *)connectionNameFromServerName:(NSString *)name { NSString *bundleIdentifier = [[NSBundle mainBundle] bundleIdentifier]; @@ -2158,7 +2211,7 @@ - (NSString *)alternateServerNameForName:(NSString *)name return nil; } -@end // MMBackend (Private) +@end // MMBackend (ClientServer) diff --git a/MMVimController.m b/MMVimController.m index cf439207f6..2d86a2146e 100644 --- a/MMVimController.m +++ b/MMVimController.m @@ -199,7 +199,7 @@ - (void)dropFiles:(NSArray *)filenames int len = [file lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; if (len > 0) { - ++len; // append NUL as well + ++len; // include NUL as well [data appendBytes:&len length:sizeof(int)]; [data appendBytes:[file UTF8String] length:len]; } diff --git a/MacVim.h b/MacVim.h index 29afbf0937..0fb1965e07 100644 --- a/MacVim.h +++ b/MacVim.h @@ -215,4 +215,13 @@ extern NSString *MMOpenFilesInTabsKey; ATSFontContainerRef loadFonts(); + + +@interface NSString (MMExtras) +- (NSString *)stringByEscapingPercent; +- (NSString *)stringByEscapingSpace; +- (NSString *)stringByEscapingInvalidFilenameCharacters; +@end + + // vim: set ft=objc: diff --git a/MacVim.m b/MacVim.m index b85fd253c0..4342c9fade 100644 --- a/MacVim.m +++ b/MacVim.m @@ -117,3 +117,51 @@ return fontContainerRef; } + + + +@implementation NSString (MMExtras) + +- (NSString *)stringByEscapingPercent +{ + NSMutableString *string = [self mutableCopy]; + + // Some '%' may already be escaped, so un-escape first... + [string replaceOccurrencesOfString:@"\\%" + withString:@"%" + options:NSLiteralSearch + range:NSMakeRange(0, [string length])]; + // ...then escape all '%' + [string replaceOccurrencesOfString:@"%" + withString:@"\\%" + options:NSLiteralSearch + range:NSMakeRange(0, [string length])]; + + return [string autorelease]; +} + +- (NSString *)stringByEscapingSpace +{ + NSMutableString *string = [self mutableCopy]; + + // Some space chars may already be escaped, so un-escape first... + [string replaceOccurrencesOfString:@"\\ " + withString:@" " + options:NSLiteralSearch + range:NSMakeRange(0, [string length])]; + // ...then escape all space chars + [string replaceOccurrencesOfString:@" " + withString:@"\\ " + options:NSLiteralSearch + range:NSMakeRange(0, [string length])]; + + return [string autorelease]; +} + +- (NSString *)stringByEscapingInvalidFilenameCharacters +{ + return [[self stringByEscapingSpace] stringByEscapingPercent]; +} + + +@end // NSString (MMExtras) From 82fdf529ecc8b9c6c071199182d5207e0765304e Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sat, 13 Oct 2007 11:55:37 +0000 Subject: [PATCH 0277/1156] Merged George's underline & draw speed patch git-svn-id: http://macvim.googlecode.com/svn/trunk@310 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMBackend.m | 8 ++- MMTextStorage.m | 158 +++++++++++++++++++++++++++++++--------------- MMVimController.m | 2 +- MacVim.h | 6 +- 4 files changed, 115 insertions(+), 59 deletions(-) diff --git a/MMBackend.m b/MMBackend.m index 848f20f9e9..70e34c93f9 100644 --- a/MMBackend.m +++ b/MMBackend.m @@ -26,6 +26,7 @@ // long periods without the screen updating (e.g. when sourcing a large session // file). (The unit is seconds.) static float MMFlushTimeoutInterval = 0.1f; +static int MMFlushQueueLenHint = 80*40; static unsigned MMServerMax = 1000; @@ -377,7 +378,8 @@ - (void)flushQueue:(BOOL)force // was called MacVim would feel unresponsive. So there is a time out which // ensures that the queue isn't flushed too often. if (!force && lastFlushDate && -[lastFlushDate timeIntervalSinceNow] - < MMFlushTimeoutInterval) + < MMFlushTimeoutInterval + && [drawData length] < MMFlushQueueLenHint) return; if ([drawData length] > 0) { @@ -1016,7 +1018,7 @@ - (void)leaveFullscreen [self queueMessage:LeaveFullscreenMsgID data:nil]; } -- (oneway void)processInput:(int)msgid data:(in NSData *)data +- (oneway void)processInput:(int)msgid data:(in bycopy NSData *)data { // NOTE: This method might get called whenever the run loop is tended to. // Thus it might get called whilst input is being processed. Normally this @@ -1040,7 +1042,7 @@ - (oneway void)processInput:(int)msgid data:(in NSData *)data } } -- (oneway void)processInputAndData:(in NSArray *)messages +- (oneway void)processInputAndData:(in bycopy NSArray *)messages { // NOTE: See comment in processInput:data:. unsigned i, count = [messages count]; diff --git a/MMTextStorage.m b/MMTextStorage.m index 719b18b2b3..af82156e72 100644 --- a/MMTextStorage.m +++ b/MMTextStorage.m @@ -231,12 +231,25 @@ - (void)replaceString:(NSString *)string atRow:(int)row column:(int)col else if (flags & DRAW_ITALIC) theFont = italicFont; - NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys: + NSDictionary *attributes; + + if (flags & DRAW_UNDERC) { + // move the undercurl down a bit so it is visible + attributes = [NSDictionary dictionaryWithObjectsAndKeys: + theFont, NSFontAttributeName, + bg, NSBackgroundColorAttributeName, + fg, NSForegroundColorAttributeName, + sp, NSUnderlineColorAttributeName, + [NSNumber numberWithFloat:2],NSBaselineOffsetAttributeName, + nil]; + } else { + attributes = [NSDictionary dictionaryWithObjectsAndKeys: theFont, NSFontAttributeName, bg, NSBackgroundColorAttributeName, fg, NSForegroundColorAttributeName, sp, NSUnderlineColorAttributeName, nil]; + } [attribString setAttributes:attributes range:range]; if (flags & DRAW_UNDERL) { @@ -282,33 +295,54 @@ - (void)deleteLinesFromRow:(int)row lineCount:(int)count NSRange srcRange = { (row+count)*(maxColumns+1) + left, width }; int i; - for (i = 0; i < move; ++i) { - NSAttributedString *srcString = [attribString - attributedSubstringFromRange:srcRange]; - [attribString replaceCharactersInRange:destRange - withAttributedString:srcString]; - [self edited:(NSTextStorageEditedCharacters - | NSTextStorageEditedAttributes) - range:destRange changeInLength:0]; - destRange.location += maxColumns+1; - srcRange.location += maxColumns+1; - } - - NSRange emptyRange = {0,width}; - NSAttributedString *emptyString = - [emptyRowString attributedSubstringFromRange: emptyRange]; - NSDictionary *attribs = [NSDictionary dictionaryWithObjectsAndKeys: - font, NSFontAttributeName, - color, NSBackgroundColorAttributeName, nil]; - - for (i = 0; i < count; ++i) { - [attribString replaceCharactersInRange:destRange - withAttributedString:emptyString]; - [attribString setAttributes:attribs range:destRange]; + if (width != maxColumns) { // if this is the case, then left must be 0 + for (i = 0; i < move; ++i) { + NSAttributedString *srcString = [attribString + attributedSubstringFromRange:srcRange]; + [attribString replaceCharactersInRange:destRange + withAttributedString:srcString]; + [self edited:(NSTextStorageEditedCharacters + | NSTextStorageEditedAttributes) + range:destRange changeInLength:0]; + destRange.location += maxColumns+1; + srcRange.location += maxColumns+1; + } + + NSRange emptyRange = {0,width}; + NSAttributedString *emptyString = + [emptyRowString attributedSubstringFromRange: emptyRange]; + NSDictionary *attribs = [NSDictionary dictionaryWithObjectsAndKeys: + font, NSFontAttributeName, + color, NSBackgroundColorAttributeName, nil]; + + for (i = 0; i < count; ++i) { + [attribString replaceCharactersInRange:destRange + withAttributedString:emptyString]; + [attribString setAttributes:attribs range:destRange]; + [self edited:(NSTextStorageEditedAttributes + | NSTextStorageEditedCharacters) range:destRange + changeInLength:0]; + destRange.location += maxColumns+1; + } + } else { + NSRange delRange = {row*(maxColumns+1), count*(maxColumns+1)}; + [attribString deleteCharactersInRange: delRange]; + destRange.location += move*(maxColumns+1); + + NSDictionary *attribs = [NSDictionary dictionaryWithObjectsAndKeys: + font, NSFontAttributeName, + color, NSBackgroundColorAttributeName, nil]; + destRange.length = maxColumns; + for (i = 0; i < count; ++i) { + [attribString insertAttributedString:emptyRowString + atIndex:destRange.location]; + [attribString setAttributes:attribs range:destRange]; + destRange.location += maxColumns+1; + } + NSRange editedRange = {row*(maxColumns+1),total*(maxColumns+1)}; [self edited:(NSTextStorageEditedAttributes - | NSTextStorageEditedCharacters) range:destRange - changeInLength:0]; - destRange.location += maxColumns+1; + | NSTextStorageEditedCharacters) range:editedRange + changeInLength:0]; } } @@ -336,33 +370,53 @@ - (void)insertLinesAtRow:(int)row lineCount:(int)count NSRange srcRange = { (row+move-1)*(maxColumns+1) + left, width }; int i; - for (i = 0; i < move; ++i) { - NSAttributedString *srcString = [attribString - attributedSubstringFromRange:srcRange]; - [attribString replaceCharactersInRange:destRange - withAttributedString:srcString]; - [self edited:(NSTextStorageEditedCharacters - | NSTextStorageEditedAttributes) - range:destRange changeInLength:0]; - destRange.location -= maxColumns+1; - srcRange.location -= maxColumns+1; - } - - NSRange emptyRange = {0,width}; - NSAttributedString *emptyString = - [emptyRowString attributedSubstringFromRange:emptyRange]; - NSDictionary *attribs = [NSDictionary dictionaryWithObjectsAndKeys: - font, NSFontAttributeName, - color, NSBackgroundColorAttributeName, nil]; - - for (i = 0; i < count; ++i) { - [attribString replaceCharactersInRange:destRange - withAttributedString:emptyString]; - [attribString setAttributes:attribs range:destRange]; + if (width != maxColumns) { // if this is the case, then left must be 0 + for (i = 0; i < move; ++i) { + NSAttributedString *srcString = [attribString + attributedSubstringFromRange:srcRange]; + [attribString replaceCharactersInRange:destRange + withAttributedString:srcString]; + [self edited:(NSTextStorageEditedCharacters + | NSTextStorageEditedAttributes) + range:destRange changeInLength:0]; + destRange.location -= maxColumns+1; + srcRange.location -= maxColumns+1; + } + + NSRange emptyRange = {0,width}; + NSAttributedString *emptyString = + [emptyRowString attributedSubstringFromRange:emptyRange]; + NSDictionary *attribs = [NSDictionary dictionaryWithObjectsAndKeys: + font, NSFontAttributeName, + color, NSBackgroundColorAttributeName, nil]; + + for (i = 0; i < count; ++i) { + [attribString replaceCharactersInRange:destRange + withAttributedString:emptyString]; + [attribString setAttributes:attribs range:destRange]; + [self edited:(NSTextStorageEditedAttributes + | NSTextStorageEditedCharacters) range:destRange + changeInLength:0]; + destRange.location -= maxColumns+1; + } + } else { + NSRange delRange = {(row+move)*(maxColumns+1),count*(maxColumns+1)}; + [attribString deleteCharactersInRange: delRange]; + + NSDictionary *attribs = [NSDictionary dictionaryWithObjectsAndKeys: + font, NSFontAttributeName, + color, NSBackgroundColorAttributeName, nil]; + + destRange.location = row*(maxColumns+1); + for (i = 0; i < count; ++i) { + [attribString insertAttributedString:emptyRowString + atIndex:destRange.location]; + [attribString setAttributes:attribs range:destRange]; + } + NSRange editedRange = {row*(maxColumns+1),total*(maxColumns+1)}; [self edited:(NSTextStorageEditedAttributes - | NSTextStorageEditedCharacters) range:destRange + | NSTextStorageEditedCharacters) range:editedRange changeInLength:0]; - destRange.location -= maxColumns+1; } } diff --git a/MMVimController.m b/MMVimController.m index 2d86a2146e..19fa0d8470 100644 --- a/MMVimController.m +++ b/MMVimController.m @@ -414,7 +414,7 @@ - (oneway void)presentDialogWithStyle:(int)style [alert release]; } -- (oneway void)processCommandQueue:(in NSArray *)queue +- (oneway void)processCommandQueue:(in bycopy NSArray *)queue { if (!isInitialized) return; diff --git a/MacVim.h b/MacVim.h index 0fb1965e07..81420eb0a3 100644 --- a/MacVim.h +++ b/MacVim.h @@ -30,8 +30,8 @@ // @try/@catch/@finally to deal with timeouts. // @protocol MMBackendProtocol -- (oneway void)processInput:(int)msgid data:(in NSData *)data; -- (oneway void)processInputAndData:(in NSArray *)messages; +- (oneway void)processInput:(int)msgid data:(in bycopy NSData *)data; +- (oneway void)processInputAndData:(in bycopy NSArray *)messages; - (BOOL)checkForModifiedBuffers; - (oneway void)setDialogReturn:(in bycopy id)obj; - (BOOL)starRegisterToPasteboard:(byref NSPasteboard *)pboard; @@ -42,7 +42,7 @@ // This is the protocol MMVimController implements. // @protocol MMFrontendProtocol -- (oneway void)processCommandQueue:(in NSArray *)queue; +- (oneway void)processCommandQueue:(in bycopy NSArray *)queue; - (oneway void)showSavePanelForDirectory:(in bycopy NSString *)dir title:(in bycopy NSString *)title saving:(int)saving; From 66b5689f0d5fdfc2f17559fe0e7d4ab27694a830 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sat, 13 Oct 2007 12:34:01 +0000 Subject: [PATCH 0278/1156] Changes to these colors: - status line - diff - todo git-svn-id: http://macvim.googlecode.com/svn/trunk@311 96c4425d-ca35-0410-94e5-3396d5c13a8f --- runtime/colors/macvim.vim | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/runtime/colors/macvim.vim b/runtime/colors/macvim.vim index 96cc6576d4..b748b6a99a 100644 --- a/runtime/colors/macvim.vim +++ b/runtime/colors/macvim.vim @@ -1,7 +1,7 @@ " MacVim colorscheme " " Maintainer: Bjorn Winckler -" Last Change: 2007 Sep 30 +" Last Change: 2007 Oct 11 " @@ -21,10 +21,10 @@ hi ErrorMsg guibg=Firebrick2 guifg=White hi IncSearch gui=reverse hi ModeMsg gui=bold hi NonText gui=bold guifg=Blue -hi StatusLine gui=NONE guifg=White guibg=Black -hi StatusLineNC gui=NONE guifg=Gray50 guibg=Gray80 -hi VertSplit gui=NONE guifg=White guibg=Gray -hi DiffText gui=bold guibg=Firebrick2 +hi StatusLine gui=NONE guifg=White guibg=DarkSlateGray +hi StatusLineNC gui=NONE guifg=SlateGray guibg=Gray90 +hi VertSplit gui=NONE guifg=DarkSlateGray guibg=Gray90 +hi DiffText gui=NONE guibg=VioletRed hi PmenuThumb gui=reverse hi PmenuSbar guibg=Grey hi TabLineSel gui=bold @@ -53,9 +53,9 @@ hi Folded guibg=#E6E6E6 guifg=DarkBlue hi FoldColumn guibg=Grey guifg=DarkBlue hi SignColumn guibg=Grey guifg=DarkBlue hi Visual guibg=MacSelectedTextBackgroundColor -hi DiffAdd guibg=LightBlue -hi DiffChange guibg=DarkSlateBlue -hi DiffDelete gui=bold guifg=Black guibg=SpringGreen4 +hi DiffAdd guibg=MediumSeaGreen +hi DiffChange guibg=DeepSkyBlue +hi DiffDelete gui=bold guifg=Black guibg=SlateBlue hi TabLine gui=underline guibg=LightGrey hi CursorColumn guibg=#F1F5FA hi CursorLine guibg=#F1F5FA "Data browser list view secondary color @@ -78,7 +78,7 @@ hi Special gui=NONE guifg=BlueViolet guibg=NONE hi Underlined gui=underline guifg=SteelBlue1 hi Ignore gui=NONE guifg=bg guibg=NONE hi Error gui=NONE guifg=White guibg=Firebrick3 -hi Todo gui=NONE guifg=White guibg=Magenta3 +hi Todo gui=NONE guifg=DarkGreen guibg=PaleGreen1 " Change the selection color on focus change (but only if the "macvim" From 535f8115361c3461b6008a3588aa88db4d994751 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sat, 13 Oct 2007 13:17:02 +0000 Subject: [PATCH 0279/1156] Red close button indicates if any buffer is modified git-svn-id: http://macvim.googlecode.com/svn/trunk@312 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMBackend.h | 2 ++ MMBackend.m | 10 ++++++++++ MMVimController.m | 4 ++++ MacVim.h | 2 ++ MacVim.m | 2 ++ gui_macvim.m | 10 ++++++++++ 6 files changed, 30 insertions(+) diff --git a/MMBackend.h b/MMBackend.h index af48b5b676..a432225c1e 100644 --- a/MMBackend.h +++ b/MMBackend.h @@ -119,6 +119,8 @@ - (void)enterFullscreen; - (void)leaveFullscreen; +- (void)updateModifiedFlag; + - (void)registerServerWithName:(NSString *)name; - (BOOL)sendToServer:(NSString *)name string:(NSString *)string reply:(char_u **)reply port:(int *)port expression:(BOOL)expr diff --git a/MMBackend.m b/MMBackend.m index 70e34c93f9..462ad88217 100644 --- a/MMBackend.m +++ b/MMBackend.m @@ -1018,6 +1018,16 @@ - (void)leaveFullscreen [self queueMessage:LeaveFullscreenMsgID data:nil]; } +- (void)updateModifiedFlag +{ + // Notify MacVim if _any_ buffer has changed from unmodified to modified or + // vice versa. + int msgid = [self checkForModifiedBuffers] + ? BuffersModifiedMsgID : BuffersNotModifiedMsgID; + + [self queueMessage:msgid data:nil]; +} + - (oneway void)processInput:(int)msgid data:(in bycopy NSData *)data { // NOTE: This method might get called whenever the run loop is tended to. diff --git a/MMVimController.m b/MMVimController.m index 19fa0d8470..91ffdaf22e 100644 --- a/MMVimController.m +++ b/MMVimController.m @@ -790,6 +790,10 @@ - (void)handleMessage:(int)msgid data:(NSData *)data [windowController enterFullscreen]; } else if (LeaveFullscreenMsgID == msgid) { [windowController leaveFullscreen]; + } else if (BuffersNotModifiedMsgID == msgid) { + [[windowController window] setDocumentEdited:NO]; + } else if (BuffersModifiedMsgID == msgid) { + [[windowController window] setDocumentEdited:YES]; } else { NSLog(@"WARNING: Unknown message received (msgid=%d)", msgid); } diff --git a/MacVim.h b/MacVim.h index 81420eb0a3..ebbd9c0e2a 100644 --- a/MacVim.h +++ b/MacVim.h @@ -154,6 +154,8 @@ enum { SetServerNameMsgID, EnterFullscreenMsgID, LeaveFullscreenMsgID, + BuffersNotModifiedMsgID, + BuffersModifiedMsgID, }; diff --git a/MacVim.m b/MacVim.m index 4342c9fade..814faec1be 100644 --- a/MacVim.m +++ b/MacVim.m @@ -61,6 +61,8 @@ "SetServerNameMsgID", "EnterFullscreenMsgID", "LeaveFullscreenMsgID", + "BuffersNotModifiedMsgID", + "BuffersModifiedMsgID", }; diff --git a/gui_macvim.m b/gui_macvim.m index bbc211cf1c..c5171f090b 100644 --- a/gui_macvim.m +++ b/gui_macvim.m @@ -1367,12 +1367,14 @@ return [actionDict objectForKey:action] != nil; } + void gui_mch_enter_fullscreen() { [[MMBackend sharedInstance] enterFullscreen]; } + void gui_mch_leave_fullscreen() { @@ -1380,6 +1382,14 @@ } + void +gui_macvim_update_modified_flag() +{ + [[MMBackend sharedInstance] updateModifiedFlag]; +} + + + // -- Client/Server --------------------------------------------------------- From 630bde09d3436c611f20437a12cbb65d9faa418c Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sat, 13 Oct 2007 14:29:58 +0000 Subject: [PATCH 0280/1156] Escape more chars (' ', '\t', '\\', '%', '#', '|' '"') in "drop files" git-svn-id: http://macvim.googlecode.com/svn/trunk@313 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMBackend.m | 2 +- MacVim.h | 4 +--- MacVim.m | 44 ++++++++++++++++++++------------------------ 3 files changed, 22 insertions(+), 28 deletions(-) diff --git a/MMBackend.m b/MMBackend.m index 462ad88217..4618d836a7 100644 --- a/MMBackend.m +++ b/MMBackend.m @@ -2008,7 +2008,7 @@ - (void)handleDropFiles:(NSData *)data for (i = 0; i < n && bytes < end; ++i) { int len = *((int*)bytes); bytes += sizeof(int); NSString *file = [NSString stringWithUTF8String:bytes]; - file = [file stringByEscapingInvalidFilenameCharacters]; + file = [file stringByEscapingSpecialFilenameCharacters]; bytes += len; [cmd appendString:@" "]; diff --git a/MacVim.h b/MacVim.h index ebbd9c0e2a..52c16924f9 100644 --- a/MacVim.h +++ b/MacVim.h @@ -220,9 +220,7 @@ ATSFontContainerRef loadFonts(); @interface NSString (MMExtras) -- (NSString *)stringByEscapingPercent; -- (NSString *)stringByEscapingSpace; -- (NSString *)stringByEscapingInvalidFilenameCharacters; +- (NSString *)stringByEscapingSpecialFilenameCharacters; @end diff --git a/MacVim.m b/MacVim.m index 814faec1be..5ad21d863a 100644 --- a/MacVim.m +++ b/MacVim.m @@ -124,46 +124,42 @@ @implementation NSString (MMExtras) -- (NSString *)stringByEscapingPercent +- (NSString *)stringByEscapingSpecialFilenameCharacters { + // NOTE: This code assumes that no characters already have been escaped. NSMutableString *string = [self mutableCopy]; - // Some '%' may already be escaped, so un-escape first... - [string replaceOccurrencesOfString:@"\\%" - withString:@"%" + [string replaceOccurrencesOfString:@"\\" + withString:@"\\\\" + options:NSLiteralSearch + range:NSMakeRange(0, [string length])]; + [string replaceOccurrencesOfString:@" " + withString:@"\\ " + options:NSLiteralSearch + range:NSMakeRange(0, [string length])]; + [string replaceOccurrencesOfString:@"\t" + withString:@"\\\t " options:NSLiteralSearch range:NSMakeRange(0, [string length])]; - // ...then escape all '%' [string replaceOccurrencesOfString:@"%" withString:@"\\%" options:NSLiteralSearch range:NSMakeRange(0, [string length])]; - - return [string autorelease]; -} - -- (NSString *)stringByEscapingSpace -{ - NSMutableString *string = [self mutableCopy]; - - // Some space chars may already be escaped, so un-escape first... - [string replaceOccurrencesOfString:@"\\ " - withString:@" " + [string replaceOccurrencesOfString:@"#" + withString:@"\\#" options:NSLiteralSearch range:NSMakeRange(0, [string length])]; - // ...then escape all space chars - [string replaceOccurrencesOfString:@" " - withString:@"\\ " + [string replaceOccurrencesOfString:@"|" + withString:@"\\|" + options:NSLiteralSearch + range:NSMakeRange(0, [string length])]; + [string replaceOccurrencesOfString:@"\"" + withString:@"\\\"" options:NSLiteralSearch range:NSMakeRange(0, [string length])]; return [string autorelease]; } -- (NSString *)stringByEscapingInvalidFilenameCharacters -{ - return [[self stringByEscapingSpace] stringByEscapingPercent]; -} - @end // NSString (MMExtras) From 7dbb993dcadb651b0652e3e97b5e71831581a153 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sat, 13 Oct 2007 14:35:03 +0000 Subject: [PATCH 0281/1156] Ensure the window title gets set on "drop files" git-svn-id: http://macvim.googlecode.com/svn/trunk@314 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMBackend.m | 1 + 1 file changed, 1 insertion(+) diff --git a/MMBackend.m b/MMBackend.m index 4618d836a7..0651b4d73a 100644 --- a/MMBackend.m +++ b/MMBackend.m @@ -2035,6 +2035,7 @@ - (void)handleDropFiles:(NSData *)data setcursor(); out_flush(); gui_update_cursor(FALSE, FALSE); + maketitle(); gui_mch_flush(); } #endif // FEAT_DND From db8399ba7ef082be45aab71a7cef3318f506adc6 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sat, 13 Oct 2007 14:52:22 +0000 Subject: [PATCH 0282/1156] Added hack to make Ctrl-Tab work on pre 10.5 systems git-svn-id: http://macvim.googlecode.com/svn/trunk@315 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMApplication.m | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/MMApplication.m b/MMApplication.m index 3a9723a477..4aab703b13 100644 --- a/MMApplication.m +++ b/MMApplication.m @@ -10,6 +10,12 @@ #import "MMApplication.h" +// Ctrl-Tab is broken on pre 10.5, so we add a hack to make it work. +#if MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_4 +# import "MMTextView.h" +# define MM_CTRL_TAB_HACK 1 +#endif + @@ -20,6 +26,19 @@ - (void)sendEvent:(NSEvent *)event NSEventType type = [event type]; unsigned flags = [event modifierFlags]; +#ifdef MM_CTRL_TAB_HACK + NSResponder *firstResponder = [[self keyWindow] firstResponder]; + + if (NSKeyDown == type && NSControlKeyMask & flags && 48 == [event keyCode] + && [firstResponder isKindOfClass:[MMTextView class]]) { + // HACK! This is a Ctrl-Tab key down event and the first responder is + // an MMTextView; send the event directly to the text view, else it + // will never receive it on pre 10.5 systems. + [firstResponder keyDown:event]; + return; + } +#endif + // HACK! Intercept 'help' key presses and clear the 'help key flag', else // Cocoa turns the mouse cursor into a question mark and goes into 'context // help mode' (the keyDown: event itself never reaches the text view). By From c06948ead265c5e447a5afcdef3146ff3f472cae Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sat, 13 Oct 2007 15:18:22 +0000 Subject: [PATCH 0283/1156] Changed "Enter/Leave Fullscreen" to "Toggle Full Screen" with key equiv git-svn-id: http://macvim.googlecode.com/svn/trunk@316 96c4425d-ca35-0410-94e5-3396d5c13a8f --- gvimrc | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/gvimrc b/gvimrc index fb20b1e9ab..f443bfb5a4 100644 --- a/gvimrc +++ b/gvimrc @@ -56,15 +56,13 @@ aunmenu Window an 9900.300 Window.Minimize :maca performMiniaturize: an 9900.310 Window.Zoom :maca performZoom: -an 9900.320 Window.-SEP1- +an 9900.320 Window.Toggle\ Full\ Screen\ Mode :set invfullscreen +an 9900.330 Window.-SEP1- " TODO! Grey out if no tabs are visible. -an 9900.330 Window.Previous\ Tab :tabprevious -an 9900.340 Window.Next\ Tab :tabnext -an 9900.350 Window.-SEP2- -an 9900.360 Window.Enter\ Fullscreen :set fu -an 9900.370 Window.Leave\ Fullscreen :set nofu -an 9900.380 Window.-SEP3- -an 9900.390 Window.Bring\ All\ To\ Front :maca arrangeInFront: +an 9900.340 Window.Previous\ Tab :tabprevious +an 9900.350 Window.Next\ Tab :tabnext +an 9900.360 Window.-SEP2- +an 9900.370 Window.Bring\ All\ To\ Front :maca arrangeInFront: @@ -199,10 +197,9 @@ macmenukey Tools.Older\ List macmenukey Tools.Newer\ List macmenukey Window.Minimize +macmenukey Window.Toggle\ Full\ Screen\ Mode macmenukey Window.Previous\ Tab macmenukey Window.Next\ Tab -macmenukey Window.Enter\ Fullscreen -macmenukey Window.Leave\ Fullscreen " Restore the previous value of 'cpoptions'. From 598e1deca6102f74523e926d8ad6a6b318433b00 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sat, 13 Oct 2007 16:55:12 +0000 Subject: [PATCH 0284/1156] Fixed :set gfn=* (stopped working after :action -> :macaction name change) git-svn-id: http://macvim.googlecode.com/svn/trunk@317 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMBackend.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MMBackend.m b/MMBackend.m index 0651b4d73a..615a3c6dba 100644 --- a/MMBackend.m +++ b/MMBackend.m @@ -815,7 +815,7 @@ - (BOOL)setFontWithName:(char *)name if ([fontName isEqual:@"*"]) { // :set gfn=* shows the font panel. - do_cmdline_cmd((char_u*)":action orderFrontFontPanel:"); + do_cmdline_cmd((char_u*)":macaction orderFrontFontPanel:"); return NO; } From 71efa287455d6dc32df79dce0ff67f117ee067a6 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sun, 14 Oct 2007 14:26:02 +0000 Subject: [PATCH 0285/1156] Cache last menu which was searched for a menu item (improves search times) git-svn-id: http://macvim.googlecode.com/svn/trunk@318 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMVimController.h | 1 + MMVimController.m | 75 +++++++++++++++++++++++++++++++---------------- 2 files changed, 51 insertions(+), 25 deletions(-) diff --git a/MMVimController.h b/MMVimController.h index fd1b37d458..c8fb1183bc 100644 --- a/MMVimController.h +++ b/MMVimController.h @@ -39,6 +39,7 @@ int resendMsgid; NSData *resendData; #endif + NSMenu *lastMenuSearched; } - (id)initWithBackend:(id)backend pid:(int)processIdentifier; diff --git a/MMVimController.m b/MMVimController.m index 91ffdaf22e..8e4b2022a8 100644 --- a/MMVimController.m +++ b/MMVimController.m @@ -49,6 +49,7 @@ - (void)performBatchDrawWithData:(NSData *)data; - (void)savePanelDidEnd:(NSSavePanel *)panel code:(int)code context:(void *)context; - (void)alertDidEnd:(MMAlert *)alert code:(int)code context:(void *)context; +- (NSMenuItem *)recurseMenuItemForTag:(int)tag rootMenu:(NSMenu *)root; - (NSMenuItem *)menuItemForTag:(int)tag; - (NSMenu *)menuForTag:(int)tag; - (NSMenu *)topLevelMenuForTitle:(NSString *)title; @@ -81,27 +82,6 @@ + (NSColor *)colorWithArgbInt:(unsigned)argb; -static NSMenuItem *findMenuItemWithTagInMenu(NSMenu *root, int tag) -{ - if (root) { - NSMenuItem *item = [root itemWithTag:tag]; - if (item) return item; - - NSArray *items = [root itemArray]; - unsigned i, count = [items count]; - for (i = 0; i < count; ++i) { - item = [items objectAtIndex:i]; - if ([item hasSubmenu]) { - item = findMenuItemWithTagInMenu([item submenu], tag); - if (item) return item; - } - } - } - - return nil; -} - - @implementation MMVimController @@ -654,6 +634,9 @@ - (void)handleMessage:(int)msgid data:(NSData *)data [item release]; } + + // Reset cached menu, just to be on the safe side. + lastMenuSearched = nil; } else if (EnableMenuItemMsgID == msgid) { const void *bytes = [data bytes]; int tag = *((int*)bytes); bytes += sizeof(int); @@ -965,15 +948,54 @@ - (void)alertDidEnd:(MMAlert *)alert code:(int)code context:(void *)context } } +- (NSMenuItem *)recurseMenuItemForTag:(int)tag rootMenu:(NSMenu *)root +{ + if (root) { + NSMenuItem *item = [root itemWithTag:tag]; + if (item) { + lastMenuSearched = root; + return item; + } + + NSArray *items = [root itemArray]; + unsigned i, count = [items count]; + for (i = 0; i < count; ++i) { + item = [items objectAtIndex:i]; + if ([item hasSubmenu]) { + item = [self recurseMenuItemForTag:tag + rootMenu:[item submenu]]; + if (item) { + lastMenuSearched = [item submenu]; + return item; + } + } + } + } + + return nil; +} + - (NSMenuItem *)menuItemForTag:(int)tag { + // First search the same menu that was search last time this method was + // called. Since this method is often called for each menu item in a + // menu this can significantly improve search times. + if (lastMenuSearched) { + NSMenuItem *item = [self recurseMenuItemForTag:tag + rootMenu:lastMenuSearched]; + if (item) return item; + } + // Search the main menu. int i, count = [mainMenuItems count]; for (i = 0; i < count; ++i) { NSMenuItem *item = [mainMenuItems objectAtIndex:i]; if ([item tag] == tag) return item; - item = findMenuItemWithTagInMenu([item submenu], tag); - if (item) return item; + item = [self recurseMenuItemForTag:tag rootMenu:[item submenu]]; + if (item) { + lastMenuSearched = [item submenu]; + return item; + } } // Search the popup menus. @@ -981,8 +1003,11 @@ - (NSMenuItem *)menuItemForTag:(int)tag for (i = 0; i < count; ++i) { NSMenuItem *item = [popupMenuItems objectAtIndex:i]; if ([item tag] == tag) return item; - item = findMenuItemWithTagInMenu([item submenu], tag); - if (item) return item; + item = [self recurseMenuItemForTag:tag rootMenu:[item submenu]]; + if (item) { + lastMenuSearched = [item submenu]; + return item; + } } return nil; From 2f1b54d15a975df25c424600f1f1c8672e609330 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sun, 14 Oct 2007 14:42:58 +0000 Subject: [PATCH 0286/1156] Added hint on slow downs caused by the "matchparen" plugin. git-svn-id: http://macvim.googlecode.com/svn/trunk@319 96c4425d-ca35-0410-94e5-3396d5c13a8f --- runtime/doc/gui_mac.txt | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/runtime/doc/gui_mac.txt b/runtime/doc/gui_mac.txt index 819b677d88..2fadb4b7f4 100644 --- a/runtime/doc/gui_mac.txt +++ b/runtime/doc/gui_mac.txt @@ -1,4 +1,4 @@ -*gui_mac.txt* For Vim version 7.1. Last change: 2007 Sep 18 +*gui_mac.txt* For Vim version 7.1. Last change: 2007 Oct 14 VIM REFERENCE MANUAL by Bjorn Winckler @@ -411,6 +411,16 @@ horizontally as well as vertically. Solution: ~ Hold down Cmd and click the zoom button. +Scenario: ~ +Typing feels sluggish when the cursor is just before a right bracket (i.e. ')', +'}', or ']'). +Solution: ~ +Disable the "matchparen" plugin (see |matchparen|) by typing :NoMatchParen. +If that helps, then you can permantenly disable "matchparen" by adding the +following line to your "~/.vimrc": > + let loaded_matchparen=1 +< + Scenario: ~ You can't find the information on MacVim you thought should be in this manual page. From 675dab273088e9865bf74414b84288619ea77cf0 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sun, 14 Oct 2007 15:08:41 +0000 Subject: [PATCH 0287/1156] Fixed spelling error git-svn-id: http://macvim.googlecode.com/svn/trunk@320 96c4425d-ca35-0410-94e5-3396d5c13a8f --- runtime/doc/gui_mac.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runtime/doc/gui_mac.txt b/runtime/doc/gui_mac.txt index 2fadb4b7f4..f43a0841e7 100644 --- a/runtime/doc/gui_mac.txt +++ b/runtime/doc/gui_mac.txt @@ -416,7 +416,7 @@ Typing feels sluggish when the cursor is just before a right bracket (i.e. ')', '}', or ']'). Solution: ~ Disable the "matchparen" plugin (see |matchparen|) by typing :NoMatchParen. -If that helps, then you can permantenly disable "matchparen" by adding the +If that helps, then you can permanently disable "matchparen" by adding the following line to your "~/.vimrc": > let loaded_matchparen=1 < From d9001e241dd5601f0decbc25a80b52fd4494ddc7 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Tue, 16 Oct 2007 16:54:55 +0000 Subject: [PATCH 0288/1156] Ensure starting glyph is valid at layout (fixes :set lines=9999 crash) git-svn-id: http://macvim.googlecode.com/svn/trunk@321 96c4425d-ca35-0410-94e5-3396d5c13a8f --- MMTypesetter.m | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/MMTypesetter.m b/MMTypesetter.m index 90a620df49..56ee878f95 100644 --- a/MMTypesetter.m +++ b/MMTypesetter.m @@ -56,7 +56,8 @@ - (void)layoutGlyphsInLayoutManager:(NSLayoutManager *)lm // is centered within a line. float baseline = [font descender] - floor(.5*[ts linespace]); - if (!(ts && tv && tc && font && text && textLen)) + if (!(lm && ts && tv && tc && font && text && textLen + && [lm isValidGlyphIndex:startGlyphIdx])) return; float baselineOffset = [[NSUserDefaults standardUserDefaults] From 60b1286217945a640a7ef3f3fb2e3590e562b81b Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Thu, 18 Oct 2007 11:53:49 +0200 Subject: [PATCH 0289/1156] Initial commit --- .gitignore | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000..e69de29bb2 From 89f8acdb4ad0215de795b18f6c3149c693e756d0 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Thu, 18 Oct 2007 12:43:33 +0200 Subject: [PATCH 0290/1156] Moved MacVim project to src/MacVim and removed runtime folder --- runtime/colors/macvim.vim | 93 ---- runtime/doc/gui_mac.txt | 431 ------------------ Actions.plist => src/MacVim/Actions.plist | 0 Colors.plist => src/MacVim/Colors.plist | 0 Credits.rtf => src/MacVim/Credits.rtf | 0 .../EmptyWindow.nib/classes.nib | 0 .../English.lproj}/EmptyWindow.nib/info.nib | 0 .../EmptyWindow.nib/keyedobjects.nib | Bin .../MacVim/English.lproj}/InfoPlist.strings | Bin .../English.lproj}/MainMenu.nib/classes.nib | 0 .../English.lproj}/MainMenu.nib/info.nib | 0 .../MainMenu.nib/keyedobjects.nib | Bin .../English.lproj}/VimWindow.nib/classes.nib | 0 .../English.lproj}/VimWindow.nib/info.nib | 0 .../VimWindow.nib/keyedobjects.nib | Bin Info.plist => src/MacVim/Info.plist | 0 .../MacVim/MMAppController.h | 0 .../MacVim/MMAppController.m | 0 MMApplication.h => src/MacVim/MMApplication.h | 0 MMApplication.m => src/MacVim/MMApplication.m | 0 MMBackend.h => src/MacVim/MMBackend.h | 0 MMBackend.m => src/MacVim/MMBackend.m | 0 .../MacVim/MMFullscreenWindow.h | 0 .../MacVim/MMFullscreenWindow.m | 0 MMTextStorage.h => src/MacVim/MMTextStorage.h | 0 MMTextStorage.m => src/MacVim/MMTextStorage.m | 0 MMTextView.h => src/MacVim/MMTextView.h | 0 MMTextView.m => src/MacVim/MMTextView.m | 0 MMTypesetter.h => src/MacVim/MMTypesetter.h | 0 MMTypesetter.m => src/MacVim/MMTypesetter.m | 0 .../MacVim/MMVimController.h | 0 .../MacVim/MMVimController.m | 0 MMVimView.h => src/MacVim/MMVimView.h | 0 MMVimView.m => src/MacVim/MMVimView.m | 0 .../MacVim/MMWindowController.h | 0 .../MacVim/MMWindowController.m | 0 MacVim.h => src/MacVim/MacVim.h | 0 MacVim.m => src/MacVim/MacVim.m | 0 .../MacVim/MacVim.xcodeproj}/project.pbxproj | 0 .../MacVim/MacVim.xcodeproj}/winckler.mode1 | 0 .../MacVim/MacVim.xcodeproj}/winckler.pbxuser | 0 .../MacVim/MacVim_Prefix.pch | 0 .../English.lproj/InfoPlist.strings | Bin .../English.lproj/MainMenu.nib/classes.nib | 0 .../English.lproj/MainMenu.nib/info.nib | 0 .../MainMenu.nib/keyedobjects.nib | Bin .../English.lproj/MainMenu.nib/objects.nib | Bin .../PSMTabBarControlInspector.nib/classes.nib | 0 .../PSMTabBarControlInspector.nib/info.nib | 0 .../keyedobjects.nib | Bin .../PSMTabBarControlInspector.nib/objects.nib | Bin .../PSMTabBarControlPalette.nib/classes.nib | 0 .../PSMTabBarControlPalette.nib/info.nib | 0 .../keyedobjects.nib | Bin .../PSMTabBarControlPalette.nib/objects.nib | Bin .../English.lproj/Window.nib/classes.nib | 0 .../English.lproj/Window.nib/info.nib | 0 .../English.lproj/Window.nib/keyedobjects.nib | Bin .../MacVim/PSMTabBarControl}/Info.plist | 0 .../PSMTabBarControl.ibclassdescription | 0 .../PSMTabBarControl.xcodeproj/johnp.mode1 | 0 .../PSMTabBarControl.xcodeproj/johnp.pbxuser | 0 .../project.pbxproj | 0 .../PSMTabBarControl.xcodeproj/winckler.mode1 | 0 .../winckler.pbxuser | 0 .../PSMTabBarControlFramework-Info.plist | 0 .../PSMTabBarControl_Prefix.pch | 0 .../PSMTabBarControl}/ReadMe.rtfd/TXT.rtf | 0 .../ReadMe.rtfd/startpage.gif | Bin .../TabBarControlDemo-Info.plist | 0 .../documentation/PSMTabBarControlDoc.html | 0 .../documentation/frameset_styles.css | 0 .../PSMTabBarControl}/images/32x32_log.tiff | Bin .../PSMTabBarControl}/images/32x32cancel.png | Bin .../images/AquaTabClose_Front.tif | Bin .../images/AquaTabClose_Front_Pressed.tif | Bin .../images/AquaTabClose_Front_Rollover.tif | Bin .../PSMTabBarControl}/images/AquaTabNew.png | Bin .../images/AquaTabNewPressed.png | Bin .../images/AquaTabNewRollover.png | Bin .../images/AquaTabsBackground.png | Bin .../PSMTabBarControl}/images/AquaTabsDown.png | Bin .../images/AquaTabsDownGraphite.png | Bin .../images/AquaTabsDownNonKey.png | Bin .../images/AquaTabsSeparator.png | Bin .../images/AquaTabsSeparatorDown.png | Bin .../PSMTabBarControl}/images/Folder.tif | Bin .../PSMTabBarControl}/images/Globe.tiff | Bin .../images/TabClose_Front.tif | Bin .../images/TabClose_Front_Pressed.tif | Bin .../images/TabClose_Front_Rollover.tif | Bin .../images/TabControlRep.tif | Bin .../PSMTabBarControl}/images/TabIcon.tif | Bin .../PSMTabBarControl}/images/TabNewMetal.png | Bin .../images/TabNewMetalPressed.png | Bin .../images/TabNewMetalRollover.png | Bin .../PSMTabBarControl}/images/Warning.png | Bin .../images/overflowImage.tiff | Bin .../images/overflowImagePressed.tif | Bin .../MacVim/PSMTabBarControl}/images/pi.png | Bin .../MacVim/PSMTabBarControl}/palette.table | 0 .../PSMTabBarControl}/source/AppController.h | 0 .../PSMTabBarControl}/source/AppController.m | 0 .../PSMTabBarControl}/source/FakeModel.h | 0 .../PSMTabBarControl}/source/FakeModel.m | 0 .../source/NSBezierPath_AMShading.h | 0 .../source/NSBezierPath_AMShading.m | 0 .../source/PSMAquaTabStyle.h | 0 .../source/PSMAquaTabStyle.m | 0 .../source/PSMMetalTabStyle.h | 0 .../source/PSMMetalTabStyle.m | 0 .../source/PSMOverflowPopUpButton.h | 0 .../source/PSMOverflowPopUpButton.m | 0 .../source/PSMProgressIndicator.h | 0 .../source/PSMProgressIndicator.m | 0 .../source/PSMRolloverButton.h | 0 .../source/PSMRolloverButton.m | 0 .../PSMTabBarControl}/source/PSMTabBarCell.h | 0 .../PSMTabBarControl}/source/PSMTabBarCell.m | 0 .../source/PSMTabBarControl.h | 0 .../source/PSMTabBarControl.m | 0 .../source/PSMTabBarControlInspector.h | 0 .../source/PSMTabBarControlInspector.m | 0 .../source/PSMTabBarControlPalette.h | 0 .../source/PSMTabBarControlPalette.m | 0 .../source/PSMTabBarControl_Prefix.pch | 0 .../source/PSMTabDragAssistant.h | 0 .../source/PSMTabDragAssistant.m | 0 .../PSMTabBarControl}/source/PSMTabStyle.h | 0 .../source/PSMUnifiedTabStyle.h | 0 .../source/PSMUnifiedTabStyle.m | 0 .../source/WindowController.h | 0 .../source/WindowController.m | 0 .../MacVim/PSMTabBarControl}/source/main.m | 0 .../MacVim/PSMTabBarControl}/version.plist | 0 README => src/MacVim/README | 0 .../MacVim/SpecialKeys.plist | 0 .../MacVim/SystemColors.plist | 0 TODO => src/MacVim/TODO | 0 {Toolbar => src/MacVim/Toolbar}/Attention.png | Bin {Toolbar => src/MacVim/Toolbar}/Copy.png | Bin {Toolbar => src/MacVim/Toolbar}/Cut.png | Bin {Toolbar => src/MacVim/Toolbar}/FindHelp.png | Bin {Toolbar => src/MacVim/Toolbar}/FindNext.png | Bin {Toolbar => src/MacVim/Toolbar}/FindPrev.png | Bin {Toolbar => src/MacVim/Toolbar}/Help.png | Bin {Toolbar => src/MacVim/Toolbar}/LoadSesn.png | Bin {Toolbar => src/MacVim/Toolbar}/Make.png | Bin {Toolbar => src/MacVim/Toolbar}/Open.png | Bin {Toolbar => src/MacVim/Toolbar}/Paste.png | Bin {Toolbar => src/MacVim/Toolbar}/Print.png | Bin {Toolbar => src/MacVim/Toolbar}/Redo.png | Bin {Toolbar => src/MacVim/Toolbar}/Replace.png | Bin {Toolbar => src/MacVim/Toolbar}/RunCtags.png | Bin {Toolbar => src/MacVim/Toolbar}/RunScript.png | Bin {Toolbar => src/MacVim/Toolbar}/Save.png | Bin {Toolbar => src/MacVim/Toolbar}/SaveAll.png | Bin {Toolbar => src/MacVim/Toolbar}/SaveSesn.png | Bin {Toolbar => src/MacVim/Toolbar}/TagJump.png | Bin {Toolbar => src/MacVim/Toolbar}/Undo.png | Bin .../MacVim/dejavu-ttf-2.20}/AUTHORS | 0 .../MacVim/dejavu-ttf-2.20}/BUGS | 0 .../dejavu-ttf-2.20}/DejaVuSansMono-Bold.ttf | Bin .../DejaVuSansMono-BoldOblique.ttf | Bin .../DejaVuSansMono-Oblique.ttf | Bin .../dejavu-ttf-2.20}/DejaVuSansMono.ttf | Bin .../MacVim/dejavu-ttf-2.20}/LICENSE | 0 .../MacVim/dejavu-ttf-2.20}/NEWS | 0 .../MacVim/dejavu-ttf-2.20}/README | 0 .../MacVim/dejavu-ttf-2.20}/langcover.txt | 0 .../MacVim/dejavu-ttf-2.20}/unicover.txt | 0 doc-bm-c.icns => src/MacVim/doc-bm-c.icns | Bin doc-bm-h.icns => src/MacVim/doc-bm-h.icns | Bin .../MacVim/doc-bm-html.icns | Bin .../MacVim/doc-bm-java.icns | Bin doc-bm-php.icns => src/MacVim/doc-bm-php.icns | Bin doc-bm-pl.icns => src/MacVim/doc-bm-pl.icns | Bin doc-bm-sh.icns => src/MacVim/doc-bm-sh.icns | Bin doc-bm-tex.icns => src/MacVim/doc-bm-tex.icns | Bin doc-bm-txt.icns => src/MacVim/doc-bm-txt.icns | Bin doc-bm-xml.icns => src/MacVim/doc-bm-xml.icns | Bin doc-bm.icns => src/MacVim/doc-bm.icns | Bin gui_macvim.m => src/MacVim/gui_macvim.m | 0 gvimrc => src/MacVim/gvimrc | 0 main.m => src/MacVim/main.m | 0 vim_gloss.icns => src/MacVim/vim_gloss.icns | Bin vimrc => src/MacVim/vimrc | 0 187 files changed, 524 deletions(-) delete mode 100644 runtime/colors/macvim.vim delete mode 100644 runtime/doc/gui_mac.txt rename Actions.plist => src/MacVim/Actions.plist (100%) rename Colors.plist => src/MacVim/Colors.plist (100%) rename Credits.rtf => src/MacVim/Credits.rtf (100%) rename {English.lproj => src/MacVim/English.lproj}/EmptyWindow.nib/classes.nib (100%) rename {English.lproj => src/MacVim/English.lproj}/EmptyWindow.nib/info.nib (100%) rename {English.lproj => src/MacVim/English.lproj}/EmptyWindow.nib/keyedobjects.nib (100%) rename {English.lproj => src/MacVim/English.lproj}/InfoPlist.strings (100%) rename {English.lproj => src/MacVim/English.lproj}/MainMenu.nib/classes.nib (100%) rename {English.lproj => src/MacVim/English.lproj}/MainMenu.nib/info.nib (100%) rename {English.lproj => src/MacVim/English.lproj}/MainMenu.nib/keyedobjects.nib (100%) rename {English.lproj => src/MacVim/English.lproj}/VimWindow.nib/classes.nib (100%) rename {English.lproj => src/MacVim/English.lproj}/VimWindow.nib/info.nib (100%) rename {English.lproj => src/MacVim/English.lproj}/VimWindow.nib/keyedobjects.nib (100%) rename Info.plist => src/MacVim/Info.plist (100%) rename MMAppController.h => src/MacVim/MMAppController.h (100%) rename MMAppController.m => src/MacVim/MMAppController.m (100%) rename MMApplication.h => src/MacVim/MMApplication.h (100%) rename MMApplication.m => src/MacVim/MMApplication.m (100%) rename MMBackend.h => src/MacVim/MMBackend.h (100%) rename MMBackend.m => src/MacVim/MMBackend.m (100%) rename MMFullscreenWindow.h => src/MacVim/MMFullscreenWindow.h (100%) rename MMFullscreenWindow.m => src/MacVim/MMFullscreenWindow.m (100%) rename MMTextStorage.h => src/MacVim/MMTextStorage.h (100%) rename MMTextStorage.m => src/MacVim/MMTextStorage.m (100%) rename MMTextView.h => src/MacVim/MMTextView.h (100%) rename MMTextView.m => src/MacVim/MMTextView.m (100%) rename MMTypesetter.h => src/MacVim/MMTypesetter.h (100%) rename MMTypesetter.m => src/MacVim/MMTypesetter.m (100%) rename MMVimController.h => src/MacVim/MMVimController.h (100%) rename MMVimController.m => src/MacVim/MMVimController.m (100%) rename MMVimView.h => src/MacVim/MMVimView.h (100%) rename MMVimView.m => src/MacVim/MMVimView.m (100%) rename MMWindowController.h => src/MacVim/MMWindowController.h (100%) rename MMWindowController.m => src/MacVim/MMWindowController.m (100%) rename MacVim.h => src/MacVim/MacVim.h (100%) rename MacVim.m => src/MacVim/MacVim.m (100%) rename {MacVim.xcodeproj => src/MacVim/MacVim.xcodeproj}/project.pbxproj (100%) rename {MacVim.xcodeproj => src/MacVim/MacVim.xcodeproj}/winckler.mode1 (100%) rename {MacVim.xcodeproj => src/MacVim/MacVim.xcodeproj}/winckler.pbxuser (100%) rename MacVim_Prefix.pch => src/MacVim/MacVim_Prefix.pch (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/English.lproj/InfoPlist.strings (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/English.lproj/MainMenu.nib/classes.nib (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/English.lproj/MainMenu.nib/info.nib (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/English.lproj/MainMenu.nib/keyedobjects.nib (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/English.lproj/MainMenu.nib/objects.nib (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/English.lproj/PSMTabBarControlInspector.nib/classes.nib (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/English.lproj/PSMTabBarControlInspector.nib/info.nib (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/English.lproj/PSMTabBarControlInspector.nib/keyedobjects.nib (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/English.lproj/PSMTabBarControlInspector.nib/objects.nib (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/English.lproj/PSMTabBarControlPalette.nib/classes.nib (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/English.lproj/PSMTabBarControlPalette.nib/info.nib (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/English.lproj/PSMTabBarControlPalette.nib/keyedobjects.nib (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/English.lproj/PSMTabBarControlPalette.nib/objects.nib (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/English.lproj/Window.nib/classes.nib (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/English.lproj/Window.nib/info.nib (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/English.lproj/Window.nib/keyedobjects.nib (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/Info.plist (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/PSMTabBarControl.ibclassdescription (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/PSMTabBarControl.xcodeproj/johnp.mode1 (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/PSMTabBarControl.xcodeproj/johnp.pbxuser (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/PSMTabBarControl.xcodeproj/project.pbxproj (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/PSMTabBarControl.xcodeproj/winckler.mode1 (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/PSMTabBarControl.xcodeproj/winckler.pbxuser (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/PSMTabBarControlFramework-Info.plist (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/PSMTabBarControl_Prefix.pch (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/ReadMe.rtfd/TXT.rtf (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/ReadMe.rtfd/startpage.gif (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/TabBarControlDemo-Info.plist (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/documentation/PSMTabBarControlDoc.html (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/documentation/frameset_styles.css (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/images/32x32_log.tiff (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/images/32x32cancel.png (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/images/AquaTabClose_Front.tif (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/images/AquaTabClose_Front_Pressed.tif (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/images/AquaTabClose_Front_Rollover.tif (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/images/AquaTabNew.png (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/images/AquaTabNewPressed.png (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/images/AquaTabNewRollover.png (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/images/AquaTabsBackground.png (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/images/AquaTabsDown.png (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/images/AquaTabsDownGraphite.png (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/images/AquaTabsDownNonKey.png (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/images/AquaTabsSeparator.png (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/images/AquaTabsSeparatorDown.png (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/images/Folder.tif (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/images/Globe.tiff (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/images/TabClose_Front.tif (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/images/TabClose_Front_Pressed.tif (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/images/TabClose_Front_Rollover.tif (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/images/TabControlRep.tif (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/images/TabIcon.tif (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/images/TabNewMetal.png (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/images/TabNewMetalPressed.png (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/images/TabNewMetalRollover.png (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/images/Warning.png (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/images/overflowImage.tiff (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/images/overflowImagePressed.tif (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/images/pi.png (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/palette.table (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/source/AppController.h (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/source/AppController.m (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/source/FakeModel.h (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/source/FakeModel.m (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/source/NSBezierPath_AMShading.h (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/source/NSBezierPath_AMShading.m (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/source/PSMAquaTabStyle.h (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/source/PSMAquaTabStyle.m (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/source/PSMMetalTabStyle.h (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/source/PSMMetalTabStyle.m (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/source/PSMOverflowPopUpButton.h (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/source/PSMOverflowPopUpButton.m (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/source/PSMProgressIndicator.h (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/source/PSMProgressIndicator.m (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/source/PSMRolloverButton.h (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/source/PSMRolloverButton.m (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/source/PSMTabBarCell.h (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/source/PSMTabBarCell.m (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/source/PSMTabBarControl.h (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/source/PSMTabBarControl.m (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/source/PSMTabBarControlInspector.h (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/source/PSMTabBarControlInspector.m (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/source/PSMTabBarControlPalette.h (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/source/PSMTabBarControlPalette.m (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/source/PSMTabBarControl_Prefix.pch (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/source/PSMTabDragAssistant.h (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/source/PSMTabDragAssistant.m (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/source/PSMTabStyle.h (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/source/PSMUnifiedTabStyle.h (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/source/PSMUnifiedTabStyle.m (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/source/WindowController.h (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/source/WindowController.m (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/source/main.m (100%) rename {PSMTabBarControl => src/MacVim/PSMTabBarControl}/version.plist (100%) rename README => src/MacVim/README (100%) rename SpecialKeys.plist => src/MacVim/SpecialKeys.plist (100%) rename SystemColors.plist => src/MacVim/SystemColors.plist (100%) rename TODO => src/MacVim/TODO (100%) rename {Toolbar => src/MacVim/Toolbar}/Attention.png (100%) rename {Toolbar => src/MacVim/Toolbar}/Copy.png (100%) rename {Toolbar => src/MacVim/Toolbar}/Cut.png (100%) rename {Toolbar => src/MacVim/Toolbar}/FindHelp.png (100%) rename {Toolbar => src/MacVim/Toolbar}/FindNext.png (100%) rename {Toolbar => src/MacVim/Toolbar}/FindPrev.png (100%) rename {Toolbar => src/MacVim/Toolbar}/Help.png (100%) rename {Toolbar => src/MacVim/Toolbar}/LoadSesn.png (100%) rename {Toolbar => src/MacVim/Toolbar}/Make.png (100%) rename {Toolbar => src/MacVim/Toolbar}/Open.png (100%) rename {Toolbar => src/MacVim/Toolbar}/Paste.png (100%) rename {Toolbar => src/MacVim/Toolbar}/Print.png (100%) rename {Toolbar => src/MacVim/Toolbar}/Redo.png (100%) rename {Toolbar => src/MacVim/Toolbar}/Replace.png (100%) rename {Toolbar => src/MacVim/Toolbar}/RunCtags.png (100%) rename {Toolbar => src/MacVim/Toolbar}/RunScript.png (100%) rename {Toolbar => src/MacVim/Toolbar}/Save.png (100%) rename {Toolbar => src/MacVim/Toolbar}/SaveAll.png (100%) rename {Toolbar => src/MacVim/Toolbar}/SaveSesn.png (100%) rename {Toolbar => src/MacVim/Toolbar}/TagJump.png (100%) rename {Toolbar => src/MacVim/Toolbar}/Undo.png (100%) rename {dejavu-ttf-2.20 => src/MacVim/dejavu-ttf-2.20}/AUTHORS (100%) rename {dejavu-ttf-2.20 => src/MacVim/dejavu-ttf-2.20}/BUGS (100%) rename {dejavu-ttf-2.20 => src/MacVim/dejavu-ttf-2.20}/DejaVuSansMono-Bold.ttf (100%) rename {dejavu-ttf-2.20 => src/MacVim/dejavu-ttf-2.20}/DejaVuSansMono-BoldOblique.ttf (100%) rename {dejavu-ttf-2.20 => src/MacVim/dejavu-ttf-2.20}/DejaVuSansMono-Oblique.ttf (100%) rename {dejavu-ttf-2.20 => src/MacVim/dejavu-ttf-2.20}/DejaVuSansMono.ttf (100%) rename {dejavu-ttf-2.20 => src/MacVim/dejavu-ttf-2.20}/LICENSE (100%) rename {dejavu-ttf-2.20 => src/MacVim/dejavu-ttf-2.20}/NEWS (100%) rename {dejavu-ttf-2.20 => src/MacVim/dejavu-ttf-2.20}/README (100%) rename {dejavu-ttf-2.20 => src/MacVim/dejavu-ttf-2.20}/langcover.txt (100%) rename {dejavu-ttf-2.20 => src/MacVim/dejavu-ttf-2.20}/unicover.txt (100%) rename doc-bm-c.icns => src/MacVim/doc-bm-c.icns (100%) rename doc-bm-h.icns => src/MacVim/doc-bm-h.icns (100%) rename doc-bm-html.icns => src/MacVim/doc-bm-html.icns (100%) rename doc-bm-java.icns => src/MacVim/doc-bm-java.icns (100%) rename doc-bm-php.icns => src/MacVim/doc-bm-php.icns (100%) rename doc-bm-pl.icns => src/MacVim/doc-bm-pl.icns (100%) rename doc-bm-sh.icns => src/MacVim/doc-bm-sh.icns (100%) rename doc-bm-tex.icns => src/MacVim/doc-bm-tex.icns (100%) rename doc-bm-txt.icns => src/MacVim/doc-bm-txt.icns (100%) rename doc-bm-xml.icns => src/MacVim/doc-bm-xml.icns (100%) rename doc-bm.icns => src/MacVim/doc-bm.icns (100%) rename gui_macvim.m => src/MacVim/gui_macvim.m (100%) rename gvimrc => src/MacVim/gvimrc (100%) rename main.m => src/MacVim/main.m (100%) rename vim_gloss.icns => src/MacVim/vim_gloss.icns (100%) rename vimrc => src/MacVim/vimrc (100%) diff --git a/runtime/colors/macvim.vim b/runtime/colors/macvim.vim deleted file mode 100644 index b748b6a99a..0000000000 --- a/runtime/colors/macvim.vim +++ /dev/null @@ -1,93 +0,0 @@ -" MacVim colorscheme -" -" Maintainer: Bjorn Winckler -" Last Change: 2007 Oct 11 -" - - -" Tell vim that this is a light color scheme: -set background=light -highlight clear - -" Reset String -> Constant links etc if they were reset -if exists("syntax_on") - syntax reset -endif - -let colors_name = "macvim" - -" `:he highlight-groups` -hi ErrorMsg guibg=Firebrick2 guifg=White -hi IncSearch gui=reverse -hi ModeMsg gui=bold -hi NonText gui=bold guifg=Blue -hi StatusLine gui=NONE guifg=White guibg=DarkSlateGray -hi StatusLineNC gui=NONE guifg=SlateGray guibg=Gray90 -hi VertSplit gui=NONE guifg=DarkSlateGray guibg=Gray90 -hi DiffText gui=NONE guibg=VioletRed -hi PmenuThumb gui=reverse -hi PmenuSbar guibg=Grey -hi TabLineSel gui=bold -hi TabLineFill gui=reverse -hi Cursor guibg=fg guifg=bg -hi CursorIM guibg=fg guifg=bg -hi lCursor guibg=fg guifg=bg - - -hi Directory guifg=#1600FF -hi LineNr guifg=#888888 guibg=#E6E6E6 -hi MoreMsg gui=bold guifg=SeaGreen4 -hi Question gui=bold guifg=Chartreuse4 -hi Search guibg=CadetBlue1 guifg=NONE -hi SpellBad guisp=Firebrick2 gui=undercurl -hi SpellCap guisp=Blue gui=undercurl -hi SpellRare guisp=Magenta gui=undercurl -hi SpellLocal guisp=DarkCyan gui=undercurl -hi Pmenu guibg=LightSteelBlue1 -hi PmenuSel guifg=White guibg=SkyBlue4 -hi SpecialKey guifg=Blue -hi Title gui=bold guifg=DeepSkyBlue3 -hi WarningMsg guifg=Firebrick2 -hi WildMenu guibg=SkyBlue guifg=Black -hi Folded guibg=#E6E6E6 guifg=DarkBlue -hi FoldColumn guibg=Grey guifg=DarkBlue -hi SignColumn guibg=Grey guifg=DarkBlue -hi Visual guibg=MacSelectedTextBackgroundColor -hi DiffAdd guibg=MediumSeaGreen -hi DiffChange guibg=DeepSkyBlue -hi DiffDelete gui=bold guifg=Black guibg=SlateBlue -hi TabLine gui=underline guibg=LightGrey -hi CursorColumn guibg=#F1F5FA -hi CursorLine guibg=#F1F5FA "Data browser list view secondary color -hi MatchParen guifg=White guibg=MediumPurple1 -hi Normal gui=NONE guifg=MacTextColor guibg=MacTextBackgroundColor - - -" Syntax items (`:he group-name` -- more groups are available, these are just -" the top level syntax items for now). - -hi Comment gui=italic guifg=Blue2 guibg=NONE -hi Constant gui=NONE guifg=Magenta1 guibg=NONE -hi String gui=NONE guifg=SkyBlue4 guibg=NONE -hi Boolean gui=NONE guifg=Red3 guibg=NONE -hi Identifier gui=NONE guifg=Aquamarine4 guibg=NONE -hi Statement gui=bold guifg=Maroon guibg=NONE -hi PreProc gui=NONE guifg=DodgerBlue3 guibg=NONE -hi Type gui=bold guifg=Green4 guibg=NONE -hi Special gui=NONE guifg=BlueViolet guibg=NONE -hi Underlined gui=underline guifg=SteelBlue1 -hi Ignore gui=NONE guifg=bg guibg=NONE -hi Error gui=NONE guifg=White guibg=Firebrick3 -hi Todo gui=NONE guifg=DarkGreen guibg=PaleGreen1 - - -" Change the selection color on focus change (but only if the "macvim" -" colorscheme is active). -if !exists("s:augroups_defined") - au FocusLost * if colors_name == "macvim" | hi Visual guibg=MacSecondarySelectedControlColor | endif - au FocusGained * if colors_name == "macvim" | hi Visual guibg=MacSelectedTextBackgroundColor | endif - - let s:augroups_defined = 1 -endif - -" vim: sw=2 diff --git a/runtime/doc/gui_mac.txt b/runtime/doc/gui_mac.txt deleted file mode 100644 index f43a0841e7..0000000000 --- a/runtime/doc/gui_mac.txt +++ /dev/null @@ -1,431 +0,0 @@ -*gui_mac.txt* For Vim version 7.1. Last change: 2007 Oct 14 - - - VIM REFERENCE MANUAL by Bjorn Winckler - - -The MacVim Graphical User Interface *macvim* *gui-macvim* - -0. Important! |macvim-important| -1. MacVim differences |macvim-differences| -2. Starting MacVim |macvim-start| -3. Special colors |macvim-colors| -4. Menus |macvim-menus| -5. Toolbar |macvim-toolbar| -6. Dialogs |macvim-dialogs| -7. System services |macvim-services| -8. Known bugs/missing features |macvim-todo| -9. Hints |macvim-hints| - -Other relevant documentation: -|gui.txt| For generic items of the GUI. -|os_mac.txt| For Mac specific items. - -{Vi does not have a GUI} - -============================================================================== -0. Important! *macvim-important* - -MacVim is still under development...this is not the finished product! If you -have problems with MacVim then make it known either by adding an issue report -on the MacVim project page > - http://code.google.com/p/macvim -or by posting to the vim_mac mailing list > - http://groups.google.com/group/vim_mac - -Remember to keep checking the project page for new snapshots. (If you -downloaded this copy from somewhere else, you might want to go there now to -make sure that you have got the latest version.) - -============================================================================== -1. MacVim differences *macvim-differences* - -One of the goals of MacVim is to make Vim behave like a proper Mac OS X -application. For this reason MacVim behaves slightly different from other GUI -ports of Vim. Most of the modifications are provided in the system gvimrc -file; you can quickly open this file and look at it yourself by typing: > - :tabe $VIM/gvimrc -Note that this file will be overwritten each time you update MacVim, so it is -better to keep your own modifications inside "~/.gvimrc". - - *macvim-windows* -There is some confusion regarding the term "window" in MacVim since it means -one thing to Vim and another to MacVim. A "window" in Vim is what opens up -when you type ":sp", whereas a "window" in MacVim is the GUI window which -contains the text view, scrollbars, toolbar and tabline. To avoid confusion, -the former is referred to as a Vim-window, whereas the latter is simply called -a window. - - *macvim-encoding* -It is not possible to modify 'termencoding' in MacVim; this option is forcibly -set to "utf-8". The option 'encoding' also defaults to "utf-8" (as opposed to -"latin1" in the other GUI ports). - -Note: UTF-8 can represent all characters defined in Unicode, which includes -all characters in all other standard encodings, so it should be perfectly safe -to edit files in any encoding while 'encoding' is set to "utf-8". Of course, -you may need to set 'fileencodings' to auto-detect the encoding of the files -you edit, or force the detection with |++enc| on the command line. - -However, if you are editing files that use multiple encodings (container -formats like MIME or Unix mbox files) or no standard encoding (binary data, -see also |edit-binary|), you may want to prevent MacVim from re-encoding the -file at all. In this situation, you will need to set both 'encoding' and -'fileencodings' to a simple single-byte encoding such as Latin1 so that when -the file is read into memory, the original bytes are left untouched. - - *macvim-movement* -Some Mac OS X standard key mappings involving Cmd or Option and an arrow key -are set up by default in "$VIM/gvimrc". You can quickly disable all of these -by adding the following lines to your "~/.vimrc" (not .gvimrc) file: > - if has("gui_macvim") - let macvim_skip_cmd_opt_movement = 1 - endif -Note: These are the only key mappings that MacVim make (not counting menu key -equivalents which are not set up with :map). - - *macvim-shift-movement* -Text editors on Mac OS X lets the user hold down shift+movement key to extend -the selection. Also, pressing a printable key whilst selecting replaces the -current selection with that character. MacVim can emulate this kind of -behaviour (by providing key bindings and by setting 'keymodel' and -'selectmode' to non-default values) although it is not enabled by default. To -make MacVim behave more like TextEdit and less like Vim, add the following -lines to your "~/.vimrc" (not .gvimrc) file: > - if has("gui_macvim") - let macvim_hig_shift_movement = 1 - endif -< - *macvim-drag-n-drop* -Dragging files and dropping them on a window opens those files in tabs in that -window, unless Vim is in command-line mode. In command-line mode the names of -the files are added to the command line. Holding down modifier keys whilst -dragging is not supported. - - *macvim-default-menu* -The default menu in MacVim has been changed to conform better with the Apple -Human Interface Guidelines (HIG). At the moment this breaks the localized -menus, so only English menus are supported. - -Note: The menus are a work in progress. If you know something about the HIG -and want to contribute to MacVim you could do so by making the menus better. - - *macvim-window-title* -The default window title does not include the argument list because it looks -really bad once you start using tabs. For example, dropping two files, then -dropping two more, and switching back to the first tab would cause weird -strings like "((3) of 2)" to appear in the window title. - - *macvim-options* -These are the non-standard options that MacVim supports: - 'toolbariconsize' 'transparency' - -============================================================================== -2. Starting MacVim *macvim-start* - -The easiest way to start MacVim is by double-clicking its icon in the Finder, -but most users will probably prefer to use the Terminal. First some Finder -related ways of starting MacVim are described, then Terminal is discussed. -Note that you can put MacVim anywhere on your hard drive, but in this help -file it is assumed that you have put it inside your /Applications folder. - -MacVim automatically registers itself as an editor of several standard file -formats. This enables you to double-click a file to open it with MacVim (if -it is not associated with another program), or to right-click a file to bring -up the "Open with" menu. You can also drag and drop files onto the Dock icon -to open them in tabs in a new window, or you can drop them in an already open -window to open the files in tabs in that specific window. Finally, you can -use Mac OS X System Services to open files in MacVim, see |macvim-services|. - -There are essentially two ways to start MacVim from Terminal: either call the -Vim binary with the -g switch > - /Applications/MacVim.app/Contents/MacOS/Vim -g file ... -or use the "open" command (which is of limited use since it cannot be used to -pass parameters to Vim) > - open -a MacVim file ... -< - *mvim* -To save yourself from having to type the entire path to the Vim binary each -time you start MacVim, you could create an alias such as > - alias gvim='/Applications/MacVim.app/Contents/MacOS/Vim -g' -and add that to "~/.profile". A more flexible way to start MacVim is to use -the shell script "mvim" which comes bundled with MacVim. Put this script in a -folder in your path and then simply type "mvim" to start MacVim. This script -will try to find MacVim.app in various typical folders such as > - ~/Applications ~/Applications/vim - /Applications /Applications/vim - /Applications/Utilities /Applications/Utilities/vim -If you would rather put MacVim.app in some other directory then that is also -possible, simply set the environment variable VIM_APP_DIR to whatever folder -you have placed MacVim.app in. - -Once in terminal Vim it is possible to start MacVim by using the following -command: - :gui [++opt] [+cmd] [-f|-b] [files...] -Note: Forking ("-b") currently does not work. - -============================================================================== -3. Special colors *macvim-colors* - -The colors in MacVim are defined in two dictionaries inside the "Resources" -folder of the application bundle (MacVim.app/Contents/Resources). It is -possible to add more colors by modifying these files. Color names are case -insensitive when accessed from Vim, but in the dictionary they must be -lowercase. - - *SystemColors.plist* -There are only a few system colors that can be accessed from Vim. These -colors are defined in the dictionary "SystemColors.plist". This dictionary -stores (key, value) pairs where the key is the name of the color and the -value is an NSColor selector name. - -The most useful system colors are: > - MacSelectedTextBackgroundColor - MacSecondarySelectedColor -The former is the "Highlight Color" which can be changed in the "Appearance" -section of the System Preferences. The latter is the selection color used by -a Cocoa application when it is not in focus. - - *Colors.plist* -Apart from the system colors, it is also possible to use the standard X11 -color names (see http://en.wikipedia.org/wiki/X11_color_names) which usually -come in a file called "rgb.txt". MacVim does not have such a file, instead it -keeps these colors in a dictionary called "Colors.plist". The key in this -dictionary is the name of the color and the value is an RGB value on the form -#rrggbb stored as an integer. - - *macvim-colorscheme* -MacVim ships with a custom colorscheme that can be used as an alternative to -the default Vim colorscheme. You can try it out by typing: > - :colorscheme macvim -The colorscheme uses the the system "Highlight Color", which can be changed in -the "Appearance" pane of the System Preferences. It also changes the -highlight color when a window becomes inactive. - -If you have any comments regarding this colorscheme (is it better or worse -than the default?) then post them to vim_mac. - -============================================================================== -4. Menus *macvim-menus* - - *:macm* *:macmenukey* -MacVim has a special way of binding keys to menu items that differs from other -Vim GUI ports. A menu binding is called a "key equivalent" in Mac OS X -terminology, this is displayed on the right side of a menu item. The -":macmenukey" command is used to set the key equivalent of a menu item. This -command takes two parameters, the first names the menu item to bind to, the -second gives the key combination. For example: > - :macmenukey File.New\ Tab -This sets the key equivalent of the "New Tab" menu item under the "File" menu -to Cmd+t. - -Note that key equivalents: - * must contain the Cmd modifier flag () - * take precedence over normal mappings made with ":map" - * can only be modified during startup (e.g. in .gvimrc) - -It is possible to reset a key equivalent by calling :macmenukey with a menu -name but no key. This is so that the default key equivalents can be reset in -"~/.gvimrc". For example, if you would like to free up (which is the -key equivalent of "File.Save") then add the following line to "~/.gvimrc": > - macmenukey File.Save -Now you can use :map to bind to whatever you like. - -It is not necessary to reset a key equivalent if all you want to do is to -change the key equivalent of a menu item. For example, say you want to use - as the key equivalent for "Next Tab", then add the following line -to "~/.gvimrc": > - macmenukey Window.Next\ Tab -< - *:maca* *:macaction* -It is typical for menu items in Cocoa applications to bind to Objective-C -selectors. To support this, MacVim introduces the ":macaction" command. This -command takes the name of an action message as its only parameter. (An action -message is an Objective-C message with "void" return type and a single -parameter of type "id".) For example, the "New Window" menu item on the -"File" menu is created in the following manner: > - :an 10.290 File.New\ Window :macaction newWindow: - -Note 1: A menu item which is bound to ":macaction" will automatically be bound -to that action in all modes (as if ":an" was used). It is not possible to -bind to ":macaction" in one mode only. -Note 2: The action is "nil-targeted", which means it is passed down the first -responder chain. - - *Actions.plist* -Some action messages would not be suitable to call from within Vim, so there -is a dictionary called "Actions.plist" (in the Resources folder of the -application bundle) which contains all actions that may be called. The key in -this dictionary is the name of the action message (case sensitive), the value -is not used. - -Here is a random assortment of actions from Actions.plist which might be -useful. - -Action Description ~ -fontSizeDown: Decrease font size -fontSizeUp: Increase font size -newWindow: Open a new (empty) window -orderFrontCharacterPalette: Show the the "Special Characters" dialog -orderFrontFontPanel: Show the Font panel -performZoom: Zoom window (same as clicking the green blob) -selectNextWindow: Select next window (similar to ) -selectPreviousWindow: Select previous window (similar to ) - -As an example, to map to performZoom: you could do something like this: > - :map :macaction performZoom: -A better way to map to performZoom: would be to set the key equivalent of the -menu item "Window.Zoom" to the above action. This can be done by adding the -following line to "~/.gvimrc": > - macmenukey Window.Zoom -(Note that key equivalents must contain the 'D' flag.) - -============================================================================== -5. Toolbar *macvim-toolbar* - -The toolbar in MacVim works just like in the other GUIs (see |gui-toolbar|), -with the addition of two separator items (see |menu-separator|). You can use -them as follows: > - :an ToolBar.-space1- - :an ToolBar.-flexspace2- -The first example creates an empty space on the toolbar, the second creates an -empty space which will shink or expand so that the items to the right of it -are right-aligned. A space (flexspace) will be created for any toolbar item -whose name begins with "-space" ("-flexspace") and ends with "-" - -Note: Only a subset of the builtin toolbar items presently have icons. If no -icon can be found a warning triangle is displayed instead. - -============================================================================== -6. Dialogs *macvim-dialogs* - -Dialogs can be controlled with the keyboard in two ways. By default each -button in a dialog is bound to a key. The button that is highlighted by blue -is bound to Enter, and any button with the title "Cancel" is bound to Escape. -Other buttons are usually bound to the first letter in the title of the -button. There is no visual feedback to indicate which letter a button is -bound to, so sometimes some experimentation might be required in order to -figure out which key to press. - -The second way of controlling dialogs with the keyboard is to enable "Full -keyboard access" in the "Keyboard & Mouse" pane of the System Preferences (you -can also toggle this on or off by pressing Ctrl-F7). Once keyboard access is -enabled it is possible to move between buttons with Tab and pressing Space to -select the current button. The current button is indicated with a blue -outline. - -============================================================================== -7. System services *macvim-services* - -MacVim supports a few system services. These can be accessed from the MacVim -submenu in the Services menu. For services to work, MacVim.app should be -located in the /Applications folder. (You might have to logout and then login -again before Mac OS X detects the MacVim services.) - -These are the currently supported services: -* New Tab Containing Selection: Opens a new tab in the topmost window and - pastes the currently selected text in that tab. A new window will be - opened if necessary. -* Open Selected File in Tab: If the selected text represents a file - name, then the corresponding file is opened in a new tab in the topmost - window. -* Open Selected File in Window: Same as the above, but always open in a new - window. - -============================================================================== -8. Known bugs/missing features *macvim-todo* - -Here are some of the bigger bugs in MacVim. Of course there are others, but -these are ones that are know and/or which were judged major. - -- Localized menus are not supported. Choosing anything but "English" in the - "International" pane of "System Prefences" may break the menus (and - toolbar). -- Composing characters are not supported, they will mess up the display -- Sometimes multibyte characters look "too wide", i.e. they overlap the - following character. It might help to change 'ambiwidth'. -- Printing -- No find/replace dialog - -If you find new bugs then add a new issue at http://code.google.com/p/macvim/ -or post your findings to the vim_mac mailing list. If you are missing feature -X in MacVim then voice your opinion on the vim_mac mailing list; it might be -simple to implement, but unless somebody asks for a particular feature then -there is little incentive to add it. - -============================================================================== -9. Hints *macvim-hints* - -In this section some general (not necessarily MacVim specific) hints are -given. - -Scenario: ~ -You try opening a bunch of files in tabs but not all files get -opened in their own tab. -Solution: ~ -To get around this, set 'tabpagemax' to something big in your -.gvimrc file (e.g. ":set tabpagemax=100"). - -Scenario: ~ -You want to open a file in a tab in an already opened window, but typing -"mvim filename" in Terminal opens it up in a separate window. -Solution: ~ -Use the |--remote-tab| switch. If you have several windows open you -might have to specify which window you want the file to open in by using the -|--servername| switch. The title of a window usually ends in something like -"VIM" or "VIM3" --- this is the server name of that window. So to open a file -named "foobar.txt" in a window whose title ends in "VIM3" you would type (the -order of the arguments matters): > - mvim --servername VIM3 --remote-tab foobar.txt -For more information, consult the |client-server| manual page. - -Scenario: ~ -You like to be able to select text by holding down shift and -pressing the arrow keys and find the Vim way of selecting text strange. -Solution: ~ -See |macvim-shift-movement|. - -Scenario: ~ -You do not want MacVim to set up any key mappings. -Solution: ~ -See |macvim-movement|. - -Scenario: ~ -Enabling localized menus breaks the toolbar and the menus as well. -Solution: ~ -This is a know problem, see |macvim-todo|. - -Scenario: ~ -You dislike the default font (DejaVu Sans Mono). -Solution: ~ -The standard fixed width font on other Mac OS X applications is -Monaco. If you prefer this font then add the following line to your -"~/.gvimrc" (note that Monaco does not come in italic and bold variants): > - set guifont=Monaco:h10 -The suffix ":h10" specifies the point size of the font should be "10" (see -'guifont' for more information on how to set the font). - -Scenario: ~ -When you click the (green) zoom button you want the window to maximize -horizontally as well as vertically. -Solution: ~ -Hold down Cmd and click the zoom button. - -Scenario: ~ -Typing feels sluggish when the cursor is just before a right bracket (i.e. ')', -'}', or ']'). -Solution: ~ -Disable the "matchparen" plugin (see |matchparen|) by typing :NoMatchParen. -If that helps, then you can permanently disable "matchparen" by adding the -following line to your "~/.vimrc": > - let loaded_matchparen=1 -< - -Scenario: ~ -You can't find the information on MacVim you thought should be in -this manual page. -Solution: ~ -Post your question on the vim_mac mailing list and wait for an -answer. - - vim:tw=78:sw=4:ts=8:ft=help:norl: diff --git a/Actions.plist b/src/MacVim/Actions.plist similarity index 100% rename from Actions.plist rename to src/MacVim/Actions.plist diff --git a/Colors.plist b/src/MacVim/Colors.plist similarity index 100% rename from Colors.plist rename to src/MacVim/Colors.plist diff --git a/Credits.rtf b/src/MacVim/Credits.rtf similarity index 100% rename from Credits.rtf rename to src/MacVim/Credits.rtf diff --git a/English.lproj/EmptyWindow.nib/classes.nib b/src/MacVim/English.lproj/EmptyWindow.nib/classes.nib similarity index 100% rename from English.lproj/EmptyWindow.nib/classes.nib rename to src/MacVim/English.lproj/EmptyWindow.nib/classes.nib diff --git a/English.lproj/EmptyWindow.nib/info.nib b/src/MacVim/English.lproj/EmptyWindow.nib/info.nib similarity index 100% rename from English.lproj/EmptyWindow.nib/info.nib rename to src/MacVim/English.lproj/EmptyWindow.nib/info.nib diff --git a/English.lproj/EmptyWindow.nib/keyedobjects.nib b/src/MacVim/English.lproj/EmptyWindow.nib/keyedobjects.nib similarity index 100% rename from English.lproj/EmptyWindow.nib/keyedobjects.nib rename to src/MacVim/English.lproj/EmptyWindow.nib/keyedobjects.nib diff --git a/English.lproj/InfoPlist.strings b/src/MacVim/English.lproj/InfoPlist.strings similarity index 100% rename from English.lproj/InfoPlist.strings rename to src/MacVim/English.lproj/InfoPlist.strings diff --git a/English.lproj/MainMenu.nib/classes.nib b/src/MacVim/English.lproj/MainMenu.nib/classes.nib similarity index 100% rename from English.lproj/MainMenu.nib/classes.nib rename to src/MacVim/English.lproj/MainMenu.nib/classes.nib diff --git a/English.lproj/MainMenu.nib/info.nib b/src/MacVim/English.lproj/MainMenu.nib/info.nib similarity index 100% rename from English.lproj/MainMenu.nib/info.nib rename to src/MacVim/English.lproj/MainMenu.nib/info.nib diff --git a/English.lproj/MainMenu.nib/keyedobjects.nib b/src/MacVim/English.lproj/MainMenu.nib/keyedobjects.nib similarity index 100% rename from English.lproj/MainMenu.nib/keyedobjects.nib rename to src/MacVim/English.lproj/MainMenu.nib/keyedobjects.nib diff --git a/English.lproj/VimWindow.nib/classes.nib b/src/MacVim/English.lproj/VimWindow.nib/classes.nib similarity index 100% rename from English.lproj/VimWindow.nib/classes.nib rename to src/MacVim/English.lproj/VimWindow.nib/classes.nib diff --git a/English.lproj/VimWindow.nib/info.nib b/src/MacVim/English.lproj/VimWindow.nib/info.nib similarity index 100% rename from English.lproj/VimWindow.nib/info.nib rename to src/MacVim/English.lproj/VimWindow.nib/info.nib diff --git a/English.lproj/VimWindow.nib/keyedobjects.nib b/src/MacVim/English.lproj/VimWindow.nib/keyedobjects.nib similarity index 100% rename from English.lproj/VimWindow.nib/keyedobjects.nib rename to src/MacVim/English.lproj/VimWindow.nib/keyedobjects.nib diff --git a/Info.plist b/src/MacVim/Info.plist similarity index 100% rename from Info.plist rename to src/MacVim/Info.plist diff --git a/MMAppController.h b/src/MacVim/MMAppController.h similarity index 100% rename from MMAppController.h rename to src/MacVim/MMAppController.h diff --git a/MMAppController.m b/src/MacVim/MMAppController.m similarity index 100% rename from MMAppController.m rename to src/MacVim/MMAppController.m diff --git a/MMApplication.h b/src/MacVim/MMApplication.h similarity index 100% rename from MMApplication.h rename to src/MacVim/MMApplication.h diff --git a/MMApplication.m b/src/MacVim/MMApplication.m similarity index 100% rename from MMApplication.m rename to src/MacVim/MMApplication.m diff --git a/MMBackend.h b/src/MacVim/MMBackend.h similarity index 100% rename from MMBackend.h rename to src/MacVim/MMBackend.h diff --git a/MMBackend.m b/src/MacVim/MMBackend.m similarity index 100% rename from MMBackend.m rename to src/MacVim/MMBackend.m diff --git a/MMFullscreenWindow.h b/src/MacVim/MMFullscreenWindow.h similarity index 100% rename from MMFullscreenWindow.h rename to src/MacVim/MMFullscreenWindow.h diff --git a/MMFullscreenWindow.m b/src/MacVim/MMFullscreenWindow.m similarity index 100% rename from MMFullscreenWindow.m rename to src/MacVim/MMFullscreenWindow.m diff --git a/MMTextStorage.h b/src/MacVim/MMTextStorage.h similarity index 100% rename from MMTextStorage.h rename to src/MacVim/MMTextStorage.h diff --git a/MMTextStorage.m b/src/MacVim/MMTextStorage.m similarity index 100% rename from MMTextStorage.m rename to src/MacVim/MMTextStorage.m diff --git a/MMTextView.h b/src/MacVim/MMTextView.h similarity index 100% rename from MMTextView.h rename to src/MacVim/MMTextView.h diff --git a/MMTextView.m b/src/MacVim/MMTextView.m similarity index 100% rename from MMTextView.m rename to src/MacVim/MMTextView.m diff --git a/MMTypesetter.h b/src/MacVim/MMTypesetter.h similarity index 100% rename from MMTypesetter.h rename to src/MacVim/MMTypesetter.h diff --git a/MMTypesetter.m b/src/MacVim/MMTypesetter.m similarity index 100% rename from MMTypesetter.m rename to src/MacVim/MMTypesetter.m diff --git a/MMVimController.h b/src/MacVim/MMVimController.h similarity index 100% rename from MMVimController.h rename to src/MacVim/MMVimController.h diff --git a/MMVimController.m b/src/MacVim/MMVimController.m similarity index 100% rename from MMVimController.m rename to src/MacVim/MMVimController.m diff --git a/MMVimView.h b/src/MacVim/MMVimView.h similarity index 100% rename from MMVimView.h rename to src/MacVim/MMVimView.h diff --git a/MMVimView.m b/src/MacVim/MMVimView.m similarity index 100% rename from MMVimView.m rename to src/MacVim/MMVimView.m diff --git a/MMWindowController.h b/src/MacVim/MMWindowController.h similarity index 100% rename from MMWindowController.h rename to src/MacVim/MMWindowController.h diff --git a/MMWindowController.m b/src/MacVim/MMWindowController.m similarity index 100% rename from MMWindowController.m rename to src/MacVim/MMWindowController.m diff --git a/MacVim.h b/src/MacVim/MacVim.h similarity index 100% rename from MacVim.h rename to src/MacVim/MacVim.h diff --git a/MacVim.m b/src/MacVim/MacVim.m similarity index 100% rename from MacVim.m rename to src/MacVim/MacVim.m diff --git a/MacVim.xcodeproj/project.pbxproj b/src/MacVim/MacVim.xcodeproj/project.pbxproj similarity index 100% rename from MacVim.xcodeproj/project.pbxproj rename to src/MacVim/MacVim.xcodeproj/project.pbxproj diff --git a/MacVim.xcodeproj/winckler.mode1 b/src/MacVim/MacVim.xcodeproj/winckler.mode1 similarity index 100% rename from MacVim.xcodeproj/winckler.mode1 rename to src/MacVim/MacVim.xcodeproj/winckler.mode1 diff --git a/MacVim.xcodeproj/winckler.pbxuser b/src/MacVim/MacVim.xcodeproj/winckler.pbxuser similarity index 100% rename from MacVim.xcodeproj/winckler.pbxuser rename to src/MacVim/MacVim.xcodeproj/winckler.pbxuser diff --git a/MacVim_Prefix.pch b/src/MacVim/MacVim_Prefix.pch similarity index 100% rename from MacVim_Prefix.pch rename to src/MacVim/MacVim_Prefix.pch diff --git a/PSMTabBarControl/English.lproj/InfoPlist.strings b/src/MacVim/PSMTabBarControl/English.lproj/InfoPlist.strings similarity index 100% rename from PSMTabBarControl/English.lproj/InfoPlist.strings rename to src/MacVim/PSMTabBarControl/English.lproj/InfoPlist.strings diff --git a/PSMTabBarControl/English.lproj/MainMenu.nib/classes.nib b/src/MacVim/PSMTabBarControl/English.lproj/MainMenu.nib/classes.nib similarity index 100% rename from PSMTabBarControl/English.lproj/MainMenu.nib/classes.nib rename to src/MacVim/PSMTabBarControl/English.lproj/MainMenu.nib/classes.nib diff --git a/PSMTabBarControl/English.lproj/MainMenu.nib/info.nib b/src/MacVim/PSMTabBarControl/English.lproj/MainMenu.nib/info.nib similarity index 100% rename from PSMTabBarControl/English.lproj/MainMenu.nib/info.nib rename to src/MacVim/PSMTabBarControl/English.lproj/MainMenu.nib/info.nib diff --git a/PSMTabBarControl/English.lproj/MainMenu.nib/keyedobjects.nib b/src/MacVim/PSMTabBarControl/English.lproj/MainMenu.nib/keyedobjects.nib similarity index 100% rename from PSMTabBarControl/English.lproj/MainMenu.nib/keyedobjects.nib rename to src/MacVim/PSMTabBarControl/English.lproj/MainMenu.nib/keyedobjects.nib diff --git a/PSMTabBarControl/English.lproj/MainMenu.nib/objects.nib b/src/MacVim/PSMTabBarControl/English.lproj/MainMenu.nib/objects.nib similarity index 100% rename from PSMTabBarControl/English.lproj/MainMenu.nib/objects.nib rename to src/MacVim/PSMTabBarControl/English.lproj/MainMenu.nib/objects.nib diff --git a/PSMTabBarControl/English.lproj/PSMTabBarControlInspector.nib/classes.nib b/src/MacVim/PSMTabBarControl/English.lproj/PSMTabBarControlInspector.nib/classes.nib similarity index 100% rename from PSMTabBarControl/English.lproj/PSMTabBarControlInspector.nib/classes.nib rename to src/MacVim/PSMTabBarControl/English.lproj/PSMTabBarControlInspector.nib/classes.nib diff --git a/PSMTabBarControl/English.lproj/PSMTabBarControlInspector.nib/info.nib b/src/MacVim/PSMTabBarControl/English.lproj/PSMTabBarControlInspector.nib/info.nib similarity index 100% rename from PSMTabBarControl/English.lproj/PSMTabBarControlInspector.nib/info.nib rename to src/MacVim/PSMTabBarControl/English.lproj/PSMTabBarControlInspector.nib/info.nib diff --git a/PSMTabBarControl/English.lproj/PSMTabBarControlInspector.nib/keyedobjects.nib b/src/MacVim/PSMTabBarControl/English.lproj/PSMTabBarControlInspector.nib/keyedobjects.nib similarity index 100% rename from PSMTabBarControl/English.lproj/PSMTabBarControlInspector.nib/keyedobjects.nib rename to src/MacVim/PSMTabBarControl/English.lproj/PSMTabBarControlInspector.nib/keyedobjects.nib diff --git a/PSMTabBarControl/English.lproj/PSMTabBarControlInspector.nib/objects.nib b/src/MacVim/PSMTabBarControl/English.lproj/PSMTabBarControlInspector.nib/objects.nib similarity index 100% rename from PSMTabBarControl/English.lproj/PSMTabBarControlInspector.nib/objects.nib rename to src/MacVim/PSMTabBarControl/English.lproj/PSMTabBarControlInspector.nib/objects.nib diff --git a/PSMTabBarControl/English.lproj/PSMTabBarControlPalette.nib/classes.nib b/src/MacVim/PSMTabBarControl/English.lproj/PSMTabBarControlPalette.nib/classes.nib similarity index 100% rename from PSMTabBarControl/English.lproj/PSMTabBarControlPalette.nib/classes.nib rename to src/MacVim/PSMTabBarControl/English.lproj/PSMTabBarControlPalette.nib/classes.nib diff --git a/PSMTabBarControl/English.lproj/PSMTabBarControlPalette.nib/info.nib b/src/MacVim/PSMTabBarControl/English.lproj/PSMTabBarControlPalette.nib/info.nib similarity index 100% rename from PSMTabBarControl/English.lproj/PSMTabBarControlPalette.nib/info.nib rename to src/MacVim/PSMTabBarControl/English.lproj/PSMTabBarControlPalette.nib/info.nib diff --git a/PSMTabBarControl/English.lproj/PSMTabBarControlPalette.nib/keyedobjects.nib b/src/MacVim/PSMTabBarControl/English.lproj/PSMTabBarControlPalette.nib/keyedobjects.nib similarity index 100% rename from PSMTabBarControl/English.lproj/PSMTabBarControlPalette.nib/keyedobjects.nib rename to src/MacVim/PSMTabBarControl/English.lproj/PSMTabBarControlPalette.nib/keyedobjects.nib diff --git a/PSMTabBarControl/English.lproj/PSMTabBarControlPalette.nib/objects.nib b/src/MacVim/PSMTabBarControl/English.lproj/PSMTabBarControlPalette.nib/objects.nib similarity index 100% rename from PSMTabBarControl/English.lproj/PSMTabBarControlPalette.nib/objects.nib rename to src/MacVim/PSMTabBarControl/English.lproj/PSMTabBarControlPalette.nib/objects.nib diff --git a/PSMTabBarControl/English.lproj/Window.nib/classes.nib b/src/MacVim/PSMTabBarControl/English.lproj/Window.nib/classes.nib similarity index 100% rename from PSMTabBarControl/English.lproj/Window.nib/classes.nib rename to src/MacVim/PSMTabBarControl/English.lproj/Window.nib/classes.nib diff --git a/PSMTabBarControl/English.lproj/Window.nib/info.nib b/src/MacVim/PSMTabBarControl/English.lproj/Window.nib/info.nib similarity index 100% rename from PSMTabBarControl/English.lproj/Window.nib/info.nib rename to src/MacVim/PSMTabBarControl/English.lproj/Window.nib/info.nib diff --git a/PSMTabBarControl/English.lproj/Window.nib/keyedobjects.nib b/src/MacVim/PSMTabBarControl/English.lproj/Window.nib/keyedobjects.nib similarity index 100% rename from PSMTabBarControl/English.lproj/Window.nib/keyedobjects.nib rename to src/MacVim/PSMTabBarControl/English.lproj/Window.nib/keyedobjects.nib diff --git a/PSMTabBarControl/Info.plist b/src/MacVim/PSMTabBarControl/Info.plist similarity index 100% rename from PSMTabBarControl/Info.plist rename to src/MacVim/PSMTabBarControl/Info.plist diff --git a/PSMTabBarControl/PSMTabBarControl.ibclassdescription b/src/MacVim/PSMTabBarControl/PSMTabBarControl.ibclassdescription similarity index 100% rename from PSMTabBarControl/PSMTabBarControl.ibclassdescription rename to src/MacVim/PSMTabBarControl/PSMTabBarControl.ibclassdescription diff --git a/PSMTabBarControl/PSMTabBarControl.xcodeproj/johnp.mode1 b/src/MacVim/PSMTabBarControl/PSMTabBarControl.xcodeproj/johnp.mode1 similarity index 100% rename from PSMTabBarControl/PSMTabBarControl.xcodeproj/johnp.mode1 rename to src/MacVim/PSMTabBarControl/PSMTabBarControl.xcodeproj/johnp.mode1 diff --git a/PSMTabBarControl/PSMTabBarControl.xcodeproj/johnp.pbxuser b/src/MacVim/PSMTabBarControl/PSMTabBarControl.xcodeproj/johnp.pbxuser similarity index 100% rename from PSMTabBarControl/PSMTabBarControl.xcodeproj/johnp.pbxuser rename to src/MacVim/PSMTabBarControl/PSMTabBarControl.xcodeproj/johnp.pbxuser diff --git a/PSMTabBarControl/PSMTabBarControl.xcodeproj/project.pbxproj b/src/MacVim/PSMTabBarControl/PSMTabBarControl.xcodeproj/project.pbxproj similarity index 100% rename from PSMTabBarControl/PSMTabBarControl.xcodeproj/project.pbxproj rename to src/MacVim/PSMTabBarControl/PSMTabBarControl.xcodeproj/project.pbxproj diff --git a/PSMTabBarControl/PSMTabBarControl.xcodeproj/winckler.mode1 b/src/MacVim/PSMTabBarControl/PSMTabBarControl.xcodeproj/winckler.mode1 similarity index 100% rename from PSMTabBarControl/PSMTabBarControl.xcodeproj/winckler.mode1 rename to src/MacVim/PSMTabBarControl/PSMTabBarControl.xcodeproj/winckler.mode1 diff --git a/PSMTabBarControl/PSMTabBarControl.xcodeproj/winckler.pbxuser b/src/MacVim/PSMTabBarControl/PSMTabBarControl.xcodeproj/winckler.pbxuser similarity index 100% rename from PSMTabBarControl/PSMTabBarControl.xcodeproj/winckler.pbxuser rename to src/MacVim/PSMTabBarControl/PSMTabBarControl.xcodeproj/winckler.pbxuser diff --git a/PSMTabBarControl/PSMTabBarControlFramework-Info.plist b/src/MacVim/PSMTabBarControl/PSMTabBarControlFramework-Info.plist similarity index 100% rename from PSMTabBarControl/PSMTabBarControlFramework-Info.plist rename to src/MacVim/PSMTabBarControl/PSMTabBarControlFramework-Info.plist diff --git a/PSMTabBarControl/PSMTabBarControl_Prefix.pch b/src/MacVim/PSMTabBarControl/PSMTabBarControl_Prefix.pch similarity index 100% rename from PSMTabBarControl/PSMTabBarControl_Prefix.pch rename to src/MacVim/PSMTabBarControl/PSMTabBarControl_Prefix.pch diff --git a/PSMTabBarControl/ReadMe.rtfd/TXT.rtf b/src/MacVim/PSMTabBarControl/ReadMe.rtfd/TXT.rtf similarity index 100% rename from PSMTabBarControl/ReadMe.rtfd/TXT.rtf rename to src/MacVim/PSMTabBarControl/ReadMe.rtfd/TXT.rtf diff --git a/PSMTabBarControl/ReadMe.rtfd/startpage.gif b/src/MacVim/PSMTabBarControl/ReadMe.rtfd/startpage.gif similarity index 100% rename from PSMTabBarControl/ReadMe.rtfd/startpage.gif rename to src/MacVim/PSMTabBarControl/ReadMe.rtfd/startpage.gif diff --git a/PSMTabBarControl/TabBarControlDemo-Info.plist b/src/MacVim/PSMTabBarControl/TabBarControlDemo-Info.plist similarity index 100% rename from PSMTabBarControl/TabBarControlDemo-Info.plist rename to src/MacVim/PSMTabBarControl/TabBarControlDemo-Info.plist diff --git a/PSMTabBarControl/documentation/PSMTabBarControlDoc.html b/src/MacVim/PSMTabBarControl/documentation/PSMTabBarControlDoc.html similarity index 100% rename from PSMTabBarControl/documentation/PSMTabBarControlDoc.html rename to src/MacVim/PSMTabBarControl/documentation/PSMTabBarControlDoc.html diff --git a/PSMTabBarControl/documentation/frameset_styles.css b/src/MacVim/PSMTabBarControl/documentation/frameset_styles.css similarity index 100% rename from PSMTabBarControl/documentation/frameset_styles.css rename to src/MacVim/PSMTabBarControl/documentation/frameset_styles.css diff --git a/PSMTabBarControl/images/32x32_log.tiff b/src/MacVim/PSMTabBarControl/images/32x32_log.tiff similarity index 100% rename from PSMTabBarControl/images/32x32_log.tiff rename to src/MacVim/PSMTabBarControl/images/32x32_log.tiff diff --git a/PSMTabBarControl/images/32x32cancel.png b/src/MacVim/PSMTabBarControl/images/32x32cancel.png similarity index 100% rename from PSMTabBarControl/images/32x32cancel.png rename to src/MacVim/PSMTabBarControl/images/32x32cancel.png diff --git a/PSMTabBarControl/images/AquaTabClose_Front.tif b/src/MacVim/PSMTabBarControl/images/AquaTabClose_Front.tif similarity index 100% rename from PSMTabBarControl/images/AquaTabClose_Front.tif rename to src/MacVim/PSMTabBarControl/images/AquaTabClose_Front.tif diff --git a/PSMTabBarControl/images/AquaTabClose_Front_Pressed.tif b/src/MacVim/PSMTabBarControl/images/AquaTabClose_Front_Pressed.tif similarity index 100% rename from PSMTabBarControl/images/AquaTabClose_Front_Pressed.tif rename to src/MacVim/PSMTabBarControl/images/AquaTabClose_Front_Pressed.tif diff --git a/PSMTabBarControl/images/AquaTabClose_Front_Rollover.tif b/src/MacVim/PSMTabBarControl/images/AquaTabClose_Front_Rollover.tif similarity index 100% rename from PSMTabBarControl/images/AquaTabClose_Front_Rollover.tif rename to src/MacVim/PSMTabBarControl/images/AquaTabClose_Front_Rollover.tif diff --git a/PSMTabBarControl/images/AquaTabNew.png b/src/MacVim/PSMTabBarControl/images/AquaTabNew.png similarity index 100% rename from PSMTabBarControl/images/AquaTabNew.png rename to src/MacVim/PSMTabBarControl/images/AquaTabNew.png diff --git a/PSMTabBarControl/images/AquaTabNewPressed.png b/src/MacVim/PSMTabBarControl/images/AquaTabNewPressed.png similarity index 100% rename from PSMTabBarControl/images/AquaTabNewPressed.png rename to src/MacVim/PSMTabBarControl/images/AquaTabNewPressed.png diff --git a/PSMTabBarControl/images/AquaTabNewRollover.png b/src/MacVim/PSMTabBarControl/images/AquaTabNewRollover.png similarity index 100% rename from PSMTabBarControl/images/AquaTabNewRollover.png rename to src/MacVim/PSMTabBarControl/images/AquaTabNewRollover.png diff --git a/PSMTabBarControl/images/AquaTabsBackground.png b/src/MacVim/PSMTabBarControl/images/AquaTabsBackground.png similarity index 100% rename from PSMTabBarControl/images/AquaTabsBackground.png rename to src/MacVim/PSMTabBarControl/images/AquaTabsBackground.png diff --git a/PSMTabBarControl/images/AquaTabsDown.png b/src/MacVim/PSMTabBarControl/images/AquaTabsDown.png similarity index 100% rename from PSMTabBarControl/images/AquaTabsDown.png rename to src/MacVim/PSMTabBarControl/images/AquaTabsDown.png diff --git a/PSMTabBarControl/images/AquaTabsDownGraphite.png b/src/MacVim/PSMTabBarControl/images/AquaTabsDownGraphite.png similarity index 100% rename from PSMTabBarControl/images/AquaTabsDownGraphite.png rename to src/MacVim/PSMTabBarControl/images/AquaTabsDownGraphite.png diff --git a/PSMTabBarControl/images/AquaTabsDownNonKey.png b/src/MacVim/PSMTabBarControl/images/AquaTabsDownNonKey.png similarity index 100% rename from PSMTabBarControl/images/AquaTabsDownNonKey.png rename to src/MacVim/PSMTabBarControl/images/AquaTabsDownNonKey.png diff --git a/PSMTabBarControl/images/AquaTabsSeparator.png b/src/MacVim/PSMTabBarControl/images/AquaTabsSeparator.png similarity index 100% rename from PSMTabBarControl/images/AquaTabsSeparator.png rename to src/MacVim/PSMTabBarControl/images/AquaTabsSeparator.png diff --git a/PSMTabBarControl/images/AquaTabsSeparatorDown.png b/src/MacVim/PSMTabBarControl/images/AquaTabsSeparatorDown.png similarity index 100% rename from PSMTabBarControl/images/AquaTabsSeparatorDown.png rename to src/MacVim/PSMTabBarControl/images/AquaTabsSeparatorDown.png diff --git a/PSMTabBarControl/images/Folder.tif b/src/MacVim/PSMTabBarControl/images/Folder.tif similarity index 100% rename from PSMTabBarControl/images/Folder.tif rename to src/MacVim/PSMTabBarControl/images/Folder.tif diff --git a/PSMTabBarControl/images/Globe.tiff b/src/MacVim/PSMTabBarControl/images/Globe.tiff similarity index 100% rename from PSMTabBarControl/images/Globe.tiff rename to src/MacVim/PSMTabBarControl/images/Globe.tiff diff --git a/PSMTabBarControl/images/TabClose_Front.tif b/src/MacVim/PSMTabBarControl/images/TabClose_Front.tif similarity index 100% rename from PSMTabBarControl/images/TabClose_Front.tif rename to src/MacVim/PSMTabBarControl/images/TabClose_Front.tif diff --git a/PSMTabBarControl/images/TabClose_Front_Pressed.tif b/src/MacVim/PSMTabBarControl/images/TabClose_Front_Pressed.tif similarity index 100% rename from PSMTabBarControl/images/TabClose_Front_Pressed.tif rename to src/MacVim/PSMTabBarControl/images/TabClose_Front_Pressed.tif diff --git a/PSMTabBarControl/images/TabClose_Front_Rollover.tif b/src/MacVim/PSMTabBarControl/images/TabClose_Front_Rollover.tif similarity index 100% rename from PSMTabBarControl/images/TabClose_Front_Rollover.tif rename to src/MacVim/PSMTabBarControl/images/TabClose_Front_Rollover.tif diff --git a/PSMTabBarControl/images/TabControlRep.tif b/src/MacVim/PSMTabBarControl/images/TabControlRep.tif similarity index 100% rename from PSMTabBarControl/images/TabControlRep.tif rename to src/MacVim/PSMTabBarControl/images/TabControlRep.tif diff --git a/PSMTabBarControl/images/TabIcon.tif b/src/MacVim/PSMTabBarControl/images/TabIcon.tif similarity index 100% rename from PSMTabBarControl/images/TabIcon.tif rename to src/MacVim/PSMTabBarControl/images/TabIcon.tif diff --git a/PSMTabBarControl/images/TabNewMetal.png b/src/MacVim/PSMTabBarControl/images/TabNewMetal.png similarity index 100% rename from PSMTabBarControl/images/TabNewMetal.png rename to src/MacVim/PSMTabBarControl/images/TabNewMetal.png diff --git a/PSMTabBarControl/images/TabNewMetalPressed.png b/src/MacVim/PSMTabBarControl/images/TabNewMetalPressed.png similarity index 100% rename from PSMTabBarControl/images/TabNewMetalPressed.png rename to src/MacVim/PSMTabBarControl/images/TabNewMetalPressed.png diff --git a/PSMTabBarControl/images/TabNewMetalRollover.png b/src/MacVim/PSMTabBarControl/images/TabNewMetalRollover.png similarity index 100% rename from PSMTabBarControl/images/TabNewMetalRollover.png rename to src/MacVim/PSMTabBarControl/images/TabNewMetalRollover.png diff --git a/PSMTabBarControl/images/Warning.png b/src/MacVim/PSMTabBarControl/images/Warning.png similarity index 100% rename from PSMTabBarControl/images/Warning.png rename to src/MacVim/PSMTabBarControl/images/Warning.png diff --git a/PSMTabBarControl/images/overflowImage.tiff b/src/MacVim/PSMTabBarControl/images/overflowImage.tiff similarity index 100% rename from PSMTabBarControl/images/overflowImage.tiff rename to src/MacVim/PSMTabBarControl/images/overflowImage.tiff diff --git a/PSMTabBarControl/images/overflowImagePressed.tif b/src/MacVim/PSMTabBarControl/images/overflowImagePressed.tif similarity index 100% rename from PSMTabBarControl/images/overflowImagePressed.tif rename to src/MacVim/PSMTabBarControl/images/overflowImagePressed.tif diff --git a/PSMTabBarControl/images/pi.png b/src/MacVim/PSMTabBarControl/images/pi.png similarity index 100% rename from PSMTabBarControl/images/pi.png rename to src/MacVim/PSMTabBarControl/images/pi.png diff --git a/PSMTabBarControl/palette.table b/src/MacVim/PSMTabBarControl/palette.table similarity index 100% rename from PSMTabBarControl/palette.table rename to src/MacVim/PSMTabBarControl/palette.table diff --git a/PSMTabBarControl/source/AppController.h b/src/MacVim/PSMTabBarControl/source/AppController.h similarity index 100% rename from PSMTabBarControl/source/AppController.h rename to src/MacVim/PSMTabBarControl/source/AppController.h diff --git a/PSMTabBarControl/source/AppController.m b/src/MacVim/PSMTabBarControl/source/AppController.m similarity index 100% rename from PSMTabBarControl/source/AppController.m rename to src/MacVim/PSMTabBarControl/source/AppController.m diff --git a/PSMTabBarControl/source/FakeModel.h b/src/MacVim/PSMTabBarControl/source/FakeModel.h similarity index 100% rename from PSMTabBarControl/source/FakeModel.h rename to src/MacVim/PSMTabBarControl/source/FakeModel.h diff --git a/PSMTabBarControl/source/FakeModel.m b/src/MacVim/PSMTabBarControl/source/FakeModel.m similarity index 100% rename from PSMTabBarControl/source/FakeModel.m rename to src/MacVim/PSMTabBarControl/source/FakeModel.m diff --git a/PSMTabBarControl/source/NSBezierPath_AMShading.h b/src/MacVim/PSMTabBarControl/source/NSBezierPath_AMShading.h similarity index 100% rename from PSMTabBarControl/source/NSBezierPath_AMShading.h rename to src/MacVim/PSMTabBarControl/source/NSBezierPath_AMShading.h diff --git a/PSMTabBarControl/source/NSBezierPath_AMShading.m b/src/MacVim/PSMTabBarControl/source/NSBezierPath_AMShading.m similarity index 100% rename from PSMTabBarControl/source/NSBezierPath_AMShading.m rename to src/MacVim/PSMTabBarControl/source/NSBezierPath_AMShading.m diff --git a/PSMTabBarControl/source/PSMAquaTabStyle.h b/src/MacVim/PSMTabBarControl/source/PSMAquaTabStyle.h similarity index 100% rename from PSMTabBarControl/source/PSMAquaTabStyle.h rename to src/MacVim/PSMTabBarControl/source/PSMAquaTabStyle.h diff --git a/PSMTabBarControl/source/PSMAquaTabStyle.m b/src/MacVim/PSMTabBarControl/source/PSMAquaTabStyle.m similarity index 100% rename from PSMTabBarControl/source/PSMAquaTabStyle.m rename to src/MacVim/PSMTabBarControl/source/PSMAquaTabStyle.m diff --git a/PSMTabBarControl/source/PSMMetalTabStyle.h b/src/MacVim/PSMTabBarControl/source/PSMMetalTabStyle.h similarity index 100% rename from PSMTabBarControl/source/PSMMetalTabStyle.h rename to src/MacVim/PSMTabBarControl/source/PSMMetalTabStyle.h diff --git a/PSMTabBarControl/source/PSMMetalTabStyle.m b/src/MacVim/PSMTabBarControl/source/PSMMetalTabStyle.m similarity index 100% rename from PSMTabBarControl/source/PSMMetalTabStyle.m rename to src/MacVim/PSMTabBarControl/source/PSMMetalTabStyle.m diff --git a/PSMTabBarControl/source/PSMOverflowPopUpButton.h b/src/MacVim/PSMTabBarControl/source/PSMOverflowPopUpButton.h similarity index 100% rename from PSMTabBarControl/source/PSMOverflowPopUpButton.h rename to src/MacVim/PSMTabBarControl/source/PSMOverflowPopUpButton.h diff --git a/PSMTabBarControl/source/PSMOverflowPopUpButton.m b/src/MacVim/PSMTabBarControl/source/PSMOverflowPopUpButton.m similarity index 100% rename from PSMTabBarControl/source/PSMOverflowPopUpButton.m rename to src/MacVim/PSMTabBarControl/source/PSMOverflowPopUpButton.m diff --git a/PSMTabBarControl/source/PSMProgressIndicator.h b/src/MacVim/PSMTabBarControl/source/PSMProgressIndicator.h similarity index 100% rename from PSMTabBarControl/source/PSMProgressIndicator.h rename to src/MacVim/PSMTabBarControl/source/PSMProgressIndicator.h diff --git a/PSMTabBarControl/source/PSMProgressIndicator.m b/src/MacVim/PSMTabBarControl/source/PSMProgressIndicator.m similarity index 100% rename from PSMTabBarControl/source/PSMProgressIndicator.m rename to src/MacVim/PSMTabBarControl/source/PSMProgressIndicator.m diff --git a/PSMTabBarControl/source/PSMRolloverButton.h b/src/MacVim/PSMTabBarControl/source/PSMRolloverButton.h similarity index 100% rename from PSMTabBarControl/source/PSMRolloverButton.h rename to src/MacVim/PSMTabBarControl/source/PSMRolloverButton.h diff --git a/PSMTabBarControl/source/PSMRolloverButton.m b/src/MacVim/PSMTabBarControl/source/PSMRolloverButton.m similarity index 100% rename from PSMTabBarControl/source/PSMRolloverButton.m rename to src/MacVim/PSMTabBarControl/source/PSMRolloverButton.m diff --git a/PSMTabBarControl/source/PSMTabBarCell.h b/src/MacVim/PSMTabBarControl/source/PSMTabBarCell.h similarity index 100% rename from PSMTabBarControl/source/PSMTabBarCell.h rename to src/MacVim/PSMTabBarControl/source/PSMTabBarCell.h diff --git a/PSMTabBarControl/source/PSMTabBarCell.m b/src/MacVim/PSMTabBarControl/source/PSMTabBarCell.m similarity index 100% rename from PSMTabBarControl/source/PSMTabBarCell.m rename to src/MacVim/PSMTabBarControl/source/PSMTabBarCell.m diff --git a/PSMTabBarControl/source/PSMTabBarControl.h b/src/MacVim/PSMTabBarControl/source/PSMTabBarControl.h similarity index 100% rename from PSMTabBarControl/source/PSMTabBarControl.h rename to src/MacVim/PSMTabBarControl/source/PSMTabBarControl.h diff --git a/PSMTabBarControl/source/PSMTabBarControl.m b/src/MacVim/PSMTabBarControl/source/PSMTabBarControl.m similarity index 100% rename from PSMTabBarControl/source/PSMTabBarControl.m rename to src/MacVim/PSMTabBarControl/source/PSMTabBarControl.m diff --git a/PSMTabBarControl/source/PSMTabBarControlInspector.h b/src/MacVim/PSMTabBarControl/source/PSMTabBarControlInspector.h similarity index 100% rename from PSMTabBarControl/source/PSMTabBarControlInspector.h rename to src/MacVim/PSMTabBarControl/source/PSMTabBarControlInspector.h diff --git a/PSMTabBarControl/source/PSMTabBarControlInspector.m b/src/MacVim/PSMTabBarControl/source/PSMTabBarControlInspector.m similarity index 100% rename from PSMTabBarControl/source/PSMTabBarControlInspector.m rename to src/MacVim/PSMTabBarControl/source/PSMTabBarControlInspector.m diff --git a/PSMTabBarControl/source/PSMTabBarControlPalette.h b/src/MacVim/PSMTabBarControl/source/PSMTabBarControlPalette.h similarity index 100% rename from PSMTabBarControl/source/PSMTabBarControlPalette.h rename to src/MacVim/PSMTabBarControl/source/PSMTabBarControlPalette.h diff --git a/PSMTabBarControl/source/PSMTabBarControlPalette.m b/src/MacVim/PSMTabBarControl/source/PSMTabBarControlPalette.m similarity index 100% rename from PSMTabBarControl/source/PSMTabBarControlPalette.m rename to src/MacVim/PSMTabBarControl/source/PSMTabBarControlPalette.m diff --git a/PSMTabBarControl/source/PSMTabBarControl_Prefix.pch b/src/MacVim/PSMTabBarControl/source/PSMTabBarControl_Prefix.pch similarity index 100% rename from PSMTabBarControl/source/PSMTabBarControl_Prefix.pch rename to src/MacVim/PSMTabBarControl/source/PSMTabBarControl_Prefix.pch diff --git a/PSMTabBarControl/source/PSMTabDragAssistant.h b/src/MacVim/PSMTabBarControl/source/PSMTabDragAssistant.h similarity index 100% rename from PSMTabBarControl/source/PSMTabDragAssistant.h rename to src/MacVim/PSMTabBarControl/source/PSMTabDragAssistant.h diff --git a/PSMTabBarControl/source/PSMTabDragAssistant.m b/src/MacVim/PSMTabBarControl/source/PSMTabDragAssistant.m similarity index 100% rename from PSMTabBarControl/source/PSMTabDragAssistant.m rename to src/MacVim/PSMTabBarControl/source/PSMTabDragAssistant.m diff --git a/PSMTabBarControl/source/PSMTabStyle.h b/src/MacVim/PSMTabBarControl/source/PSMTabStyle.h similarity index 100% rename from PSMTabBarControl/source/PSMTabStyle.h rename to src/MacVim/PSMTabBarControl/source/PSMTabStyle.h diff --git a/PSMTabBarControl/source/PSMUnifiedTabStyle.h b/src/MacVim/PSMTabBarControl/source/PSMUnifiedTabStyle.h similarity index 100% rename from PSMTabBarControl/source/PSMUnifiedTabStyle.h rename to src/MacVim/PSMTabBarControl/source/PSMUnifiedTabStyle.h diff --git a/PSMTabBarControl/source/PSMUnifiedTabStyle.m b/src/MacVim/PSMTabBarControl/source/PSMUnifiedTabStyle.m similarity index 100% rename from PSMTabBarControl/source/PSMUnifiedTabStyle.m rename to src/MacVim/PSMTabBarControl/source/PSMUnifiedTabStyle.m diff --git a/PSMTabBarControl/source/WindowController.h b/src/MacVim/PSMTabBarControl/source/WindowController.h similarity index 100% rename from PSMTabBarControl/source/WindowController.h rename to src/MacVim/PSMTabBarControl/source/WindowController.h diff --git a/PSMTabBarControl/source/WindowController.m b/src/MacVim/PSMTabBarControl/source/WindowController.m similarity index 100% rename from PSMTabBarControl/source/WindowController.m rename to src/MacVim/PSMTabBarControl/source/WindowController.m diff --git a/PSMTabBarControl/source/main.m b/src/MacVim/PSMTabBarControl/source/main.m similarity index 100% rename from PSMTabBarControl/source/main.m rename to src/MacVim/PSMTabBarControl/source/main.m diff --git a/PSMTabBarControl/version.plist b/src/MacVim/PSMTabBarControl/version.plist similarity index 100% rename from PSMTabBarControl/version.plist rename to src/MacVim/PSMTabBarControl/version.plist diff --git a/README b/src/MacVim/README similarity index 100% rename from README rename to src/MacVim/README diff --git a/SpecialKeys.plist b/src/MacVim/SpecialKeys.plist similarity index 100% rename from SpecialKeys.plist rename to src/MacVim/SpecialKeys.plist diff --git a/SystemColors.plist b/src/MacVim/SystemColors.plist similarity index 100% rename from SystemColors.plist rename to src/MacVim/SystemColors.plist diff --git a/TODO b/src/MacVim/TODO similarity index 100% rename from TODO rename to src/MacVim/TODO diff --git a/Toolbar/Attention.png b/src/MacVim/Toolbar/Attention.png similarity index 100% rename from Toolbar/Attention.png rename to src/MacVim/Toolbar/Attention.png diff --git a/Toolbar/Copy.png b/src/MacVim/Toolbar/Copy.png similarity index 100% rename from Toolbar/Copy.png rename to src/MacVim/Toolbar/Copy.png diff --git a/Toolbar/Cut.png b/src/MacVim/Toolbar/Cut.png similarity index 100% rename from Toolbar/Cut.png rename to src/MacVim/Toolbar/Cut.png diff --git a/Toolbar/FindHelp.png b/src/MacVim/Toolbar/FindHelp.png similarity index 100% rename from Toolbar/FindHelp.png rename to src/MacVim/Toolbar/FindHelp.png diff --git a/Toolbar/FindNext.png b/src/MacVim/Toolbar/FindNext.png similarity index 100% rename from Toolbar/FindNext.png rename to src/MacVim/Toolbar/FindNext.png diff --git a/Toolbar/FindPrev.png b/src/MacVim/Toolbar/FindPrev.png similarity index 100% rename from Toolbar/FindPrev.png rename to src/MacVim/Toolbar/FindPrev.png diff --git a/Toolbar/Help.png b/src/MacVim/Toolbar/Help.png similarity index 100% rename from Toolbar/Help.png rename to src/MacVim/Toolbar/Help.png diff --git a/Toolbar/LoadSesn.png b/src/MacVim/Toolbar/LoadSesn.png similarity index 100% rename from Toolbar/LoadSesn.png rename to src/MacVim/Toolbar/LoadSesn.png diff --git a/Toolbar/Make.png b/src/MacVim/Toolbar/Make.png similarity index 100% rename from Toolbar/Make.png rename to src/MacVim/Toolbar/Make.png diff --git a/Toolbar/Open.png b/src/MacVim/Toolbar/Open.png similarity index 100% rename from Toolbar/Open.png rename to src/MacVim/Toolbar/Open.png diff --git a/Toolbar/Paste.png b/src/MacVim/Toolbar/Paste.png similarity index 100% rename from Toolbar/Paste.png rename to src/MacVim/Toolbar/Paste.png diff --git a/Toolbar/Print.png b/src/MacVim/Toolbar/Print.png similarity index 100% rename from Toolbar/Print.png rename to src/MacVim/Toolbar/Print.png diff --git a/Toolbar/Redo.png b/src/MacVim/Toolbar/Redo.png similarity index 100% rename from Toolbar/Redo.png rename to src/MacVim/Toolbar/Redo.png diff --git a/Toolbar/Replace.png b/src/MacVim/Toolbar/Replace.png similarity index 100% rename from Toolbar/Replace.png rename to src/MacVim/Toolbar/Replace.png diff --git a/Toolbar/RunCtags.png b/src/MacVim/Toolbar/RunCtags.png similarity index 100% rename from Toolbar/RunCtags.png rename to src/MacVim/Toolbar/RunCtags.png diff --git a/Toolbar/RunScript.png b/src/MacVim/Toolbar/RunScript.png similarity index 100% rename from Toolbar/RunScript.png rename to src/MacVim/Toolbar/RunScript.png diff --git a/Toolbar/Save.png b/src/MacVim/Toolbar/Save.png similarity index 100% rename from Toolbar/Save.png rename to src/MacVim/Toolbar/Save.png diff --git a/Toolbar/SaveAll.png b/src/MacVim/Toolbar/SaveAll.png similarity index 100% rename from Toolbar/SaveAll.png rename to src/MacVim/Toolbar/SaveAll.png diff --git a/Toolbar/SaveSesn.png b/src/MacVim/Toolbar/SaveSesn.png similarity index 100% rename from Toolbar/SaveSesn.png rename to src/MacVim/Toolbar/SaveSesn.png diff --git a/Toolbar/TagJump.png b/src/MacVim/Toolbar/TagJump.png similarity index 100% rename from Toolbar/TagJump.png rename to src/MacVim/Toolbar/TagJump.png diff --git a/Toolbar/Undo.png b/src/MacVim/Toolbar/Undo.png similarity index 100% rename from Toolbar/Undo.png rename to src/MacVim/Toolbar/Undo.png diff --git a/dejavu-ttf-2.20/AUTHORS b/src/MacVim/dejavu-ttf-2.20/AUTHORS similarity index 100% rename from dejavu-ttf-2.20/AUTHORS rename to src/MacVim/dejavu-ttf-2.20/AUTHORS diff --git a/dejavu-ttf-2.20/BUGS b/src/MacVim/dejavu-ttf-2.20/BUGS similarity index 100% rename from dejavu-ttf-2.20/BUGS rename to src/MacVim/dejavu-ttf-2.20/BUGS diff --git a/dejavu-ttf-2.20/DejaVuSansMono-Bold.ttf b/src/MacVim/dejavu-ttf-2.20/DejaVuSansMono-Bold.ttf similarity index 100% rename from dejavu-ttf-2.20/DejaVuSansMono-Bold.ttf rename to src/MacVim/dejavu-ttf-2.20/DejaVuSansMono-Bold.ttf diff --git a/dejavu-ttf-2.20/DejaVuSansMono-BoldOblique.ttf b/src/MacVim/dejavu-ttf-2.20/DejaVuSansMono-BoldOblique.ttf similarity index 100% rename from dejavu-ttf-2.20/DejaVuSansMono-BoldOblique.ttf rename to src/MacVim/dejavu-ttf-2.20/DejaVuSansMono-BoldOblique.ttf diff --git a/dejavu-ttf-2.20/DejaVuSansMono-Oblique.ttf b/src/MacVim/dejavu-ttf-2.20/DejaVuSansMono-Oblique.ttf similarity index 100% rename from dejavu-ttf-2.20/DejaVuSansMono-Oblique.ttf rename to src/MacVim/dejavu-ttf-2.20/DejaVuSansMono-Oblique.ttf diff --git a/dejavu-ttf-2.20/DejaVuSansMono.ttf b/src/MacVim/dejavu-ttf-2.20/DejaVuSansMono.ttf similarity index 100% rename from dejavu-ttf-2.20/DejaVuSansMono.ttf rename to src/MacVim/dejavu-ttf-2.20/DejaVuSansMono.ttf diff --git a/dejavu-ttf-2.20/LICENSE b/src/MacVim/dejavu-ttf-2.20/LICENSE similarity index 100% rename from dejavu-ttf-2.20/LICENSE rename to src/MacVim/dejavu-ttf-2.20/LICENSE diff --git a/dejavu-ttf-2.20/NEWS b/src/MacVim/dejavu-ttf-2.20/NEWS similarity index 100% rename from dejavu-ttf-2.20/NEWS rename to src/MacVim/dejavu-ttf-2.20/NEWS diff --git a/dejavu-ttf-2.20/README b/src/MacVim/dejavu-ttf-2.20/README similarity index 100% rename from dejavu-ttf-2.20/README rename to src/MacVim/dejavu-ttf-2.20/README diff --git a/dejavu-ttf-2.20/langcover.txt b/src/MacVim/dejavu-ttf-2.20/langcover.txt similarity index 100% rename from dejavu-ttf-2.20/langcover.txt rename to src/MacVim/dejavu-ttf-2.20/langcover.txt diff --git a/dejavu-ttf-2.20/unicover.txt b/src/MacVim/dejavu-ttf-2.20/unicover.txt similarity index 100% rename from dejavu-ttf-2.20/unicover.txt rename to src/MacVim/dejavu-ttf-2.20/unicover.txt diff --git a/doc-bm-c.icns b/src/MacVim/doc-bm-c.icns similarity index 100% rename from doc-bm-c.icns rename to src/MacVim/doc-bm-c.icns diff --git a/doc-bm-h.icns b/src/MacVim/doc-bm-h.icns similarity index 100% rename from doc-bm-h.icns rename to src/MacVim/doc-bm-h.icns diff --git a/doc-bm-html.icns b/src/MacVim/doc-bm-html.icns similarity index 100% rename from doc-bm-html.icns rename to src/MacVim/doc-bm-html.icns diff --git a/doc-bm-java.icns b/src/MacVim/doc-bm-java.icns similarity index 100% rename from doc-bm-java.icns rename to src/MacVim/doc-bm-java.icns diff --git a/doc-bm-php.icns b/src/MacVim/doc-bm-php.icns similarity index 100% rename from doc-bm-php.icns rename to src/MacVim/doc-bm-php.icns diff --git a/doc-bm-pl.icns b/src/MacVim/doc-bm-pl.icns similarity index 100% rename from doc-bm-pl.icns rename to src/MacVim/doc-bm-pl.icns diff --git a/doc-bm-sh.icns b/src/MacVim/doc-bm-sh.icns similarity index 100% rename from doc-bm-sh.icns rename to src/MacVim/doc-bm-sh.icns diff --git a/doc-bm-tex.icns b/src/MacVim/doc-bm-tex.icns similarity index 100% rename from doc-bm-tex.icns rename to src/MacVim/doc-bm-tex.icns diff --git a/doc-bm-txt.icns b/src/MacVim/doc-bm-txt.icns similarity index 100% rename from doc-bm-txt.icns rename to src/MacVim/doc-bm-txt.icns diff --git a/doc-bm-xml.icns b/src/MacVim/doc-bm-xml.icns similarity index 100% rename from doc-bm-xml.icns rename to src/MacVim/doc-bm-xml.icns diff --git a/doc-bm.icns b/src/MacVim/doc-bm.icns similarity index 100% rename from doc-bm.icns rename to src/MacVim/doc-bm.icns diff --git a/gui_macvim.m b/src/MacVim/gui_macvim.m similarity index 100% rename from gui_macvim.m rename to src/MacVim/gui_macvim.m diff --git a/gvimrc b/src/MacVim/gvimrc similarity index 100% rename from gvimrc rename to src/MacVim/gvimrc diff --git a/main.m b/src/MacVim/main.m similarity index 100% rename from main.m rename to src/MacVim/main.m diff --git a/vim_gloss.icns b/src/MacVim/vim_gloss.icns similarity index 100% rename from vim_gloss.icns rename to src/MacVim/vim_gloss.icns diff --git a/vimrc b/src/MacVim/vimrc similarity index 100% rename from vimrc rename to src/MacVim/vimrc From 724ad5ca2940c3b3b1a53249f2664d19a3434562 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Thu, 18 Oct 2007 12:46:52 +0200 Subject: [PATCH 0291/1156] Applied MacVim r320 patch --- runtime/colors/macvim.vim | 93 ++++++++ runtime/doc/eval.txt | 3 +- runtime/doc/gui.txt | 23 +- runtime/doc/gui_mac.txt | 431 ++++++++++++++++++++++++++++++++++++++ runtime/doc/help.txt | 1 + runtime/doc/index.txt | 2 + runtime/doc/options.txt | 91 +++++--- runtime/doc/quickref.txt | 4 +- runtime/doc/remote.txt | 20 ++ runtime/doc/syntax.txt | 4 +- runtime/menu.vim | 3 +- runtime/optwin.vim | 6 + runtime/syntax/vim.vim | 2 +- src/Makefile | 25 +++ src/buffer.c | 6 + src/configure.in | 62 ++++-- src/eval.c | 25 ++- src/ex_cmds.h | 4 + src/ex_docmd.c | 17 +- src/feature.h | 43 +++- src/fileio.c | 3 +- src/globals.h | 4 +- src/gui.c | 35 +++- src/gui.h | 6 +- src/if_xcmdsrv.c | 3 +- src/main.c | 77 ++++++- src/menu.c | 149 ++++++++++++- src/normal.c | 6 +- src/option.c | 79 ++++++- src/option.h | 9 +- src/os_unix.c | 6 +- src/proto.h | 3 + src/proto/gui_macvim.pro | 196 +++++++++++++++++ src/proto/menu.pro | 3 + src/structs.h | 4 + src/syntax.c | 3 +- src/ui.c | 13 +- src/version.c | 31 ++- src/vim.h | 1 + 39 files changed, 1375 insertions(+), 121 deletions(-) create mode 100644 runtime/colors/macvim.vim create mode 100644 runtime/doc/gui_mac.txt create mode 100644 src/proto/gui_macvim.pro diff --git a/runtime/colors/macvim.vim b/runtime/colors/macvim.vim new file mode 100644 index 0000000000..b748b6a99a --- /dev/null +++ b/runtime/colors/macvim.vim @@ -0,0 +1,93 @@ +" MacVim colorscheme +" +" Maintainer: Bjorn Winckler +" Last Change: 2007 Oct 11 +" + + +" Tell vim that this is a light color scheme: +set background=light +highlight clear + +" Reset String -> Constant links etc if they were reset +if exists("syntax_on") + syntax reset +endif + +let colors_name = "macvim" + +" `:he highlight-groups` +hi ErrorMsg guibg=Firebrick2 guifg=White +hi IncSearch gui=reverse +hi ModeMsg gui=bold +hi NonText gui=bold guifg=Blue +hi StatusLine gui=NONE guifg=White guibg=DarkSlateGray +hi StatusLineNC gui=NONE guifg=SlateGray guibg=Gray90 +hi VertSplit gui=NONE guifg=DarkSlateGray guibg=Gray90 +hi DiffText gui=NONE guibg=VioletRed +hi PmenuThumb gui=reverse +hi PmenuSbar guibg=Grey +hi TabLineSel gui=bold +hi TabLineFill gui=reverse +hi Cursor guibg=fg guifg=bg +hi CursorIM guibg=fg guifg=bg +hi lCursor guibg=fg guifg=bg + + +hi Directory guifg=#1600FF +hi LineNr guifg=#888888 guibg=#E6E6E6 +hi MoreMsg gui=bold guifg=SeaGreen4 +hi Question gui=bold guifg=Chartreuse4 +hi Search guibg=CadetBlue1 guifg=NONE +hi SpellBad guisp=Firebrick2 gui=undercurl +hi SpellCap guisp=Blue gui=undercurl +hi SpellRare guisp=Magenta gui=undercurl +hi SpellLocal guisp=DarkCyan gui=undercurl +hi Pmenu guibg=LightSteelBlue1 +hi PmenuSel guifg=White guibg=SkyBlue4 +hi SpecialKey guifg=Blue +hi Title gui=bold guifg=DeepSkyBlue3 +hi WarningMsg guifg=Firebrick2 +hi WildMenu guibg=SkyBlue guifg=Black +hi Folded guibg=#E6E6E6 guifg=DarkBlue +hi FoldColumn guibg=Grey guifg=DarkBlue +hi SignColumn guibg=Grey guifg=DarkBlue +hi Visual guibg=MacSelectedTextBackgroundColor +hi DiffAdd guibg=MediumSeaGreen +hi DiffChange guibg=DeepSkyBlue +hi DiffDelete gui=bold guifg=Black guibg=SlateBlue +hi TabLine gui=underline guibg=LightGrey +hi CursorColumn guibg=#F1F5FA +hi CursorLine guibg=#F1F5FA "Data browser list view secondary color +hi MatchParen guifg=White guibg=MediumPurple1 +hi Normal gui=NONE guifg=MacTextColor guibg=MacTextBackgroundColor + + +" Syntax items (`:he group-name` -- more groups are available, these are just +" the top level syntax items for now). + +hi Comment gui=italic guifg=Blue2 guibg=NONE +hi Constant gui=NONE guifg=Magenta1 guibg=NONE +hi String gui=NONE guifg=SkyBlue4 guibg=NONE +hi Boolean gui=NONE guifg=Red3 guibg=NONE +hi Identifier gui=NONE guifg=Aquamarine4 guibg=NONE +hi Statement gui=bold guifg=Maroon guibg=NONE +hi PreProc gui=NONE guifg=DodgerBlue3 guibg=NONE +hi Type gui=bold guifg=Green4 guibg=NONE +hi Special gui=NONE guifg=BlueViolet guibg=NONE +hi Underlined gui=underline guifg=SteelBlue1 +hi Ignore gui=NONE guifg=bg guibg=NONE +hi Error gui=NONE guifg=White guibg=Firebrick3 +hi Todo gui=NONE guifg=DarkGreen guibg=PaleGreen1 + + +" Change the selection color on focus change (but only if the "macvim" +" colorscheme is active). +if !exists("s:augroups_defined") + au FocusLost * if colors_name == "macvim" | hi Visual guibg=MacSecondarySelectedControlColor | endif + au FocusGained * if colors_name == "macvim" | hi Visual guibg=MacSelectedTextBackgroundColor | endif + + let s:augroups_defined = 1 +endif + +" vim: sw=2 diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt index 6857ee5198..2a8931a1b9 100644 --- a/runtime/doc/eval.txt +++ b/runtime/doc/eval.txt @@ -5338,7 +5338,8 @@ gui Compiled with GUI enabled. gui_athena Compiled with Athena GUI. gui_gtk Compiled with GTK+ GUI (any version). gui_gtk2 Compiled with GTK+ 2 GUI (gui_gtk is also defined). -gui_mac Compiled with Macintosh GUI. +gui_mac Compiled with Macintosh GUI (Carbon). +gui_macvim Compiled with MacVim GUI. gui_motif Compiled with Motif GUI. gui_photon Compiled with Photon GUI. gui_win32 Compiled with MS Windows Win32 GUI. diff --git a/runtime/doc/gui.txt b/runtime/doc/gui.txt index b5ae414d68..4e407e052c 100644 --- a/runtime/doc/gui.txt +++ b/runtime/doc/gui.txt @@ -25,8 +25,8 @@ Other GUI documentation: First you must make sure you actually have a version of Vim with the GUI code included. You can check this with the ":version" command, it says "with xxx -GUI", where "xxx" is X11-Motif, X11-Athena, Photon, GTK, GTK2, etc., or -"MS-Windows 32 bit GUI version". +GUI", where "xxx" is Macvim, X11-Motif, X11-Athena, Photon, GTK, GTK2, etc., +or "MS-Windows 32 bit GUI version". How to start the GUI depends on the system used. Mostly you can run the GUI version of Vim with: @@ -93,7 +93,7 @@ and initialize other things that you may want to set up differently from the terminal version. Recommended place for your personal GUI initializations: - Unix $HOME/.gvimrc + Unix and Mac OS X $HOME/.gvimrc OS/2 $HOME/.gvimrc or $VIM/.gvimrc MS-DOS and Win32 $HOME/_gvimrc or $VIM/_gvimrc Amiga s:.gvimrc or $VIM/.gvimrc @@ -665,9 +665,10 @@ because the item will never be selected. Use a single colon to keep it simple. *gui-toolbar* -The toolbar is currently available in the Win32, Athena, Motif, GTK+ (X11), -and Photon GUI. It should turn up in other GUIs in due course. The -default toolbar is setup in menu.vim. +The toolbar is currently available in the MacVim, Win32, Athena, Motif, GTK+ +(X11), and Photon GUI. It should turn up in other GUIs in due course. The +default toolbar is setup in menu.vim. (Note: The MacVim toolbar is modified +in "$VIM/gvimrc".) The display of the toolbar is controlled by the 'guioptions' letter 'T'. You can thus have menu & toolbar together, or either on its own, or neither. The appearance is controlled by the 'toolbar' option. You can chose between @@ -904,9 +905,9 @@ a menu item - you don't need to do a :tunmenu as well. 5.9 Popup Menus -In the Win32 and GTK+ GUI, you can cause a menu to popup at the cursor. -This behaves similarly to the PopUp menus except that any menu tree can -be popped up. +In the Win32, MacVim, and GTK+ GUI, you can cause a menu to popup at the +cursor. This behaves similarly to the PopUp menus except that any menu tree +can be popped up. This command is for backwards compatibility, using it is discouraged, because it behaves in a strange way. @@ -915,7 +916,7 @@ it behaves in a strange way. :popu[p] {name} Popup the menu {name}. The menu named must have at least one subentry, but need not appear on the menu-bar (see |hidden-menus|). - {only available for Win32 and GTK GUI} + {only available for Win32, MacVim, and GTK GUI} :popu[p]! {name} Like above, but use the position of the mouse pointer instead of the cursor. @@ -969,6 +970,8 @@ This section describes other features which are related to the GUI. :set guifont=*-lucidatypewriter-medium-r-normal-*-*-180-*-*-m-*-* elseif has("gui_win32") :set guifont=Luxi_Mono:h12:cANSI + elseif has("gui_macvim") + :set guifont=DejaVu\ Sans\ Mono:h13 endif endif diff --git a/runtime/doc/gui_mac.txt b/runtime/doc/gui_mac.txt new file mode 100644 index 0000000000..f43a0841e7 --- /dev/null +++ b/runtime/doc/gui_mac.txt @@ -0,0 +1,431 @@ +*gui_mac.txt* For Vim version 7.1. Last change: 2007 Oct 14 + + + VIM REFERENCE MANUAL by Bjorn Winckler + + +The MacVim Graphical User Interface *macvim* *gui-macvim* + +0. Important! |macvim-important| +1. MacVim differences |macvim-differences| +2. Starting MacVim |macvim-start| +3. Special colors |macvim-colors| +4. Menus |macvim-menus| +5. Toolbar |macvim-toolbar| +6. Dialogs |macvim-dialogs| +7. System services |macvim-services| +8. Known bugs/missing features |macvim-todo| +9. Hints |macvim-hints| + +Other relevant documentation: +|gui.txt| For generic items of the GUI. +|os_mac.txt| For Mac specific items. + +{Vi does not have a GUI} + +============================================================================== +0. Important! *macvim-important* + +MacVim is still under development...this is not the finished product! If you +have problems with MacVim then make it known either by adding an issue report +on the MacVim project page > + http://code.google.com/p/macvim +or by posting to the vim_mac mailing list > + http://groups.google.com/group/vim_mac + +Remember to keep checking the project page for new snapshots. (If you +downloaded this copy from somewhere else, you might want to go there now to +make sure that you have got the latest version.) + +============================================================================== +1. MacVim differences *macvim-differences* + +One of the goals of MacVim is to make Vim behave like a proper Mac OS X +application. For this reason MacVim behaves slightly different from other GUI +ports of Vim. Most of the modifications are provided in the system gvimrc +file; you can quickly open this file and look at it yourself by typing: > + :tabe $VIM/gvimrc +Note that this file will be overwritten each time you update MacVim, so it is +better to keep your own modifications inside "~/.gvimrc". + + *macvim-windows* +There is some confusion regarding the term "window" in MacVim since it means +one thing to Vim and another to MacVim. A "window" in Vim is what opens up +when you type ":sp", whereas a "window" in MacVim is the GUI window which +contains the text view, scrollbars, toolbar and tabline. To avoid confusion, +the former is referred to as a Vim-window, whereas the latter is simply called +a window. + + *macvim-encoding* +It is not possible to modify 'termencoding' in MacVim; this option is forcibly +set to "utf-8". The option 'encoding' also defaults to "utf-8" (as opposed to +"latin1" in the other GUI ports). + +Note: UTF-8 can represent all characters defined in Unicode, which includes +all characters in all other standard encodings, so it should be perfectly safe +to edit files in any encoding while 'encoding' is set to "utf-8". Of course, +you may need to set 'fileencodings' to auto-detect the encoding of the files +you edit, or force the detection with |++enc| on the command line. + +However, if you are editing files that use multiple encodings (container +formats like MIME or Unix mbox files) or no standard encoding (binary data, +see also |edit-binary|), you may want to prevent MacVim from re-encoding the +file at all. In this situation, you will need to set both 'encoding' and +'fileencodings' to a simple single-byte encoding such as Latin1 so that when +the file is read into memory, the original bytes are left untouched. + + *macvim-movement* +Some Mac OS X standard key mappings involving Cmd or Option and an arrow key +are set up by default in "$VIM/gvimrc". You can quickly disable all of these +by adding the following lines to your "~/.vimrc" (not .gvimrc) file: > + if has("gui_macvim") + let macvim_skip_cmd_opt_movement = 1 + endif +Note: These are the only key mappings that MacVim make (not counting menu key +equivalents which are not set up with :map). + + *macvim-shift-movement* +Text editors on Mac OS X lets the user hold down shift+movement key to extend +the selection. Also, pressing a printable key whilst selecting replaces the +current selection with that character. MacVim can emulate this kind of +behaviour (by providing key bindings and by setting 'keymodel' and +'selectmode' to non-default values) although it is not enabled by default. To +make MacVim behave more like TextEdit and less like Vim, add the following +lines to your "~/.vimrc" (not .gvimrc) file: > + if has("gui_macvim") + let macvim_hig_shift_movement = 1 + endif +< + *macvim-drag-n-drop* +Dragging files and dropping them on a window opens those files in tabs in that +window, unless Vim is in command-line mode. In command-line mode the names of +the files are added to the command line. Holding down modifier keys whilst +dragging is not supported. + + *macvim-default-menu* +The default menu in MacVim has been changed to conform better with the Apple +Human Interface Guidelines (HIG). At the moment this breaks the localized +menus, so only English menus are supported. + +Note: The menus are a work in progress. If you know something about the HIG +and want to contribute to MacVim you could do so by making the menus better. + + *macvim-window-title* +The default window title does not include the argument list because it looks +really bad once you start using tabs. For example, dropping two files, then +dropping two more, and switching back to the first tab would cause weird +strings like "((3) of 2)" to appear in the window title. + + *macvim-options* +These are the non-standard options that MacVim supports: + 'toolbariconsize' 'transparency' + +============================================================================== +2. Starting MacVim *macvim-start* + +The easiest way to start MacVim is by double-clicking its icon in the Finder, +but most users will probably prefer to use the Terminal. First some Finder +related ways of starting MacVim are described, then Terminal is discussed. +Note that you can put MacVim anywhere on your hard drive, but in this help +file it is assumed that you have put it inside your /Applications folder. + +MacVim automatically registers itself as an editor of several standard file +formats. This enables you to double-click a file to open it with MacVim (if +it is not associated with another program), or to right-click a file to bring +up the "Open with" menu. You can also drag and drop files onto the Dock icon +to open them in tabs in a new window, or you can drop them in an already open +window to open the files in tabs in that specific window. Finally, you can +use Mac OS X System Services to open files in MacVim, see |macvim-services|. + +There are essentially two ways to start MacVim from Terminal: either call the +Vim binary with the -g switch > + /Applications/MacVim.app/Contents/MacOS/Vim -g file ... +or use the "open" command (which is of limited use since it cannot be used to +pass parameters to Vim) > + open -a MacVim file ... +< + *mvim* +To save yourself from having to type the entire path to the Vim binary each +time you start MacVim, you could create an alias such as > + alias gvim='/Applications/MacVim.app/Contents/MacOS/Vim -g' +and add that to "~/.profile". A more flexible way to start MacVim is to use +the shell script "mvim" which comes bundled with MacVim. Put this script in a +folder in your path and then simply type "mvim" to start MacVim. This script +will try to find MacVim.app in various typical folders such as > + ~/Applications ~/Applications/vim + /Applications /Applications/vim + /Applications/Utilities /Applications/Utilities/vim +If you would rather put MacVim.app in some other directory then that is also +possible, simply set the environment variable VIM_APP_DIR to whatever folder +you have placed MacVim.app in. + +Once in terminal Vim it is possible to start MacVim by using the following +command: + :gui [++opt] [+cmd] [-f|-b] [files...] +Note: Forking ("-b") currently does not work. + +============================================================================== +3. Special colors *macvim-colors* + +The colors in MacVim are defined in two dictionaries inside the "Resources" +folder of the application bundle (MacVim.app/Contents/Resources). It is +possible to add more colors by modifying these files. Color names are case +insensitive when accessed from Vim, but in the dictionary they must be +lowercase. + + *SystemColors.plist* +There are only a few system colors that can be accessed from Vim. These +colors are defined in the dictionary "SystemColors.plist". This dictionary +stores (key, value) pairs where the key is the name of the color and the +value is an NSColor selector name. + +The most useful system colors are: > + MacSelectedTextBackgroundColor + MacSecondarySelectedColor +The former is the "Highlight Color" which can be changed in the "Appearance" +section of the System Preferences. The latter is the selection color used by +a Cocoa application when it is not in focus. + + *Colors.plist* +Apart from the system colors, it is also possible to use the standard X11 +color names (see http://en.wikipedia.org/wiki/X11_color_names) which usually +come in a file called "rgb.txt". MacVim does not have such a file, instead it +keeps these colors in a dictionary called "Colors.plist". The key in this +dictionary is the name of the color and the value is an RGB value on the form +#rrggbb stored as an integer. + + *macvim-colorscheme* +MacVim ships with a custom colorscheme that can be used as an alternative to +the default Vim colorscheme. You can try it out by typing: > + :colorscheme macvim +The colorscheme uses the the system "Highlight Color", which can be changed in +the "Appearance" pane of the System Preferences. It also changes the +highlight color when a window becomes inactive. + +If you have any comments regarding this colorscheme (is it better or worse +than the default?) then post them to vim_mac. + +============================================================================== +4. Menus *macvim-menus* + + *:macm* *:macmenukey* +MacVim has a special way of binding keys to menu items that differs from other +Vim GUI ports. A menu binding is called a "key equivalent" in Mac OS X +terminology, this is displayed on the right side of a menu item. The +":macmenukey" command is used to set the key equivalent of a menu item. This +command takes two parameters, the first names the menu item to bind to, the +second gives the key combination. For example: > + :macmenukey File.New\ Tab +This sets the key equivalent of the "New Tab" menu item under the "File" menu +to Cmd+t. + +Note that key equivalents: + * must contain the Cmd modifier flag () + * take precedence over normal mappings made with ":map" + * can only be modified during startup (e.g. in .gvimrc) + +It is possible to reset a key equivalent by calling :macmenukey with a menu +name but no key. This is so that the default key equivalents can be reset in +"~/.gvimrc". For example, if you would like to free up (which is the +key equivalent of "File.Save") then add the following line to "~/.gvimrc": > + macmenukey File.Save +Now you can use :map to bind to whatever you like. + +It is not necessary to reset a key equivalent if all you want to do is to +change the key equivalent of a menu item. For example, say you want to use + as the key equivalent for "Next Tab", then add the following line +to "~/.gvimrc": > + macmenukey Window.Next\ Tab +< + *:maca* *:macaction* +It is typical for menu items in Cocoa applications to bind to Objective-C +selectors. To support this, MacVim introduces the ":macaction" command. This +command takes the name of an action message as its only parameter. (An action +message is an Objective-C message with "void" return type and a single +parameter of type "id".) For example, the "New Window" menu item on the +"File" menu is created in the following manner: > + :an 10.290 File.New\ Window :macaction newWindow: + +Note 1: A menu item which is bound to ":macaction" will automatically be bound +to that action in all modes (as if ":an" was used). It is not possible to +bind to ":macaction" in one mode only. +Note 2: The action is "nil-targeted", which means it is passed down the first +responder chain. + + *Actions.plist* +Some action messages would not be suitable to call from within Vim, so there +is a dictionary called "Actions.plist" (in the Resources folder of the +application bundle) which contains all actions that may be called. The key in +this dictionary is the name of the action message (case sensitive), the value +is not used. + +Here is a random assortment of actions from Actions.plist which might be +useful. + +Action Description ~ +fontSizeDown: Decrease font size +fontSizeUp: Increase font size +newWindow: Open a new (empty) window +orderFrontCharacterPalette: Show the the "Special Characters" dialog +orderFrontFontPanel: Show the Font panel +performZoom: Zoom window (same as clicking the green blob) +selectNextWindow: Select next window (similar to ) +selectPreviousWindow: Select previous window (similar to ) + +As an example, to map to performZoom: you could do something like this: > + :map :macaction performZoom: +A better way to map to performZoom: would be to set the key equivalent of the +menu item "Window.Zoom" to the above action. This can be done by adding the +following line to "~/.gvimrc": > + macmenukey Window.Zoom +(Note that key equivalents must contain the 'D' flag.) + +============================================================================== +5. Toolbar *macvim-toolbar* + +The toolbar in MacVim works just like in the other GUIs (see |gui-toolbar|), +with the addition of two separator items (see |menu-separator|). You can use +them as follows: > + :an ToolBar.-space1- + :an ToolBar.-flexspace2- +The first example creates an empty space on the toolbar, the second creates an +empty space which will shink or expand so that the items to the right of it +are right-aligned. A space (flexspace) will be created for any toolbar item +whose name begins with "-space" ("-flexspace") and ends with "-" + +Note: Only a subset of the builtin toolbar items presently have icons. If no +icon can be found a warning triangle is displayed instead. + +============================================================================== +6. Dialogs *macvim-dialogs* + +Dialogs can be controlled with the keyboard in two ways. By default each +button in a dialog is bound to a key. The button that is highlighted by blue +is bound to Enter, and any button with the title "Cancel" is bound to Escape. +Other buttons are usually bound to the first letter in the title of the +button. There is no visual feedback to indicate which letter a button is +bound to, so sometimes some experimentation might be required in order to +figure out which key to press. + +The second way of controlling dialogs with the keyboard is to enable "Full +keyboard access" in the "Keyboard & Mouse" pane of the System Preferences (you +can also toggle this on or off by pressing Ctrl-F7). Once keyboard access is +enabled it is possible to move between buttons with Tab and pressing Space to +select the current button. The current button is indicated with a blue +outline. + +============================================================================== +7. System services *macvim-services* + +MacVim supports a few system services. These can be accessed from the MacVim +submenu in the Services menu. For services to work, MacVim.app should be +located in the /Applications folder. (You might have to logout and then login +again before Mac OS X detects the MacVim services.) + +These are the currently supported services: +* New Tab Containing Selection: Opens a new tab in the topmost window and + pastes the currently selected text in that tab. A new window will be + opened if necessary. +* Open Selected File in Tab: If the selected text represents a file + name, then the corresponding file is opened in a new tab in the topmost + window. +* Open Selected File in Window: Same as the above, but always open in a new + window. + +============================================================================== +8. Known bugs/missing features *macvim-todo* + +Here are some of the bigger bugs in MacVim. Of course there are others, but +these are ones that are know and/or which were judged major. + +- Localized menus are not supported. Choosing anything but "English" in the + "International" pane of "System Prefences" may break the menus (and + toolbar). +- Composing characters are not supported, they will mess up the display +- Sometimes multibyte characters look "too wide", i.e. they overlap the + following character. It might help to change 'ambiwidth'. +- Printing +- No find/replace dialog + +If you find new bugs then add a new issue at http://code.google.com/p/macvim/ +or post your findings to the vim_mac mailing list. If you are missing feature +X in MacVim then voice your opinion on the vim_mac mailing list; it might be +simple to implement, but unless somebody asks for a particular feature then +there is little incentive to add it. + +============================================================================== +9. Hints *macvim-hints* + +In this section some general (not necessarily MacVim specific) hints are +given. + +Scenario: ~ +You try opening a bunch of files in tabs but not all files get +opened in their own tab. +Solution: ~ +To get around this, set 'tabpagemax' to something big in your +.gvimrc file (e.g. ":set tabpagemax=100"). + +Scenario: ~ +You want to open a file in a tab in an already opened window, but typing +"mvim filename" in Terminal opens it up in a separate window. +Solution: ~ +Use the |--remote-tab| switch. If you have several windows open you +might have to specify which window you want the file to open in by using the +|--servername| switch. The title of a window usually ends in something like +"VIM" or "VIM3" --- this is the server name of that window. So to open a file +named "foobar.txt" in a window whose title ends in "VIM3" you would type (the +order of the arguments matters): > + mvim --servername VIM3 --remote-tab foobar.txt +For more information, consult the |client-server| manual page. + +Scenario: ~ +You like to be able to select text by holding down shift and +pressing the arrow keys and find the Vim way of selecting text strange. +Solution: ~ +See |macvim-shift-movement|. + +Scenario: ~ +You do not want MacVim to set up any key mappings. +Solution: ~ +See |macvim-movement|. + +Scenario: ~ +Enabling localized menus breaks the toolbar and the menus as well. +Solution: ~ +This is a know problem, see |macvim-todo|. + +Scenario: ~ +You dislike the default font (DejaVu Sans Mono). +Solution: ~ +The standard fixed width font on other Mac OS X applications is +Monaco. If you prefer this font then add the following line to your +"~/.gvimrc" (note that Monaco does not come in italic and bold variants): > + set guifont=Monaco:h10 +The suffix ":h10" specifies the point size of the font should be "10" (see +'guifont' for more information on how to set the font). + +Scenario: ~ +When you click the (green) zoom button you want the window to maximize +horizontally as well as vertically. +Solution: ~ +Hold down Cmd and click the zoom button. + +Scenario: ~ +Typing feels sluggish when the cursor is just before a right bracket (i.e. ')', +'}', or ']'). +Solution: ~ +Disable the "matchparen" plugin (see |matchparen|) by typing :NoMatchParen. +If that helps, then you can permanently disable "matchparen" by adding the +following line to your "~/.vimrc": > + let loaded_matchparen=1 +< + +Scenario: ~ +You can't find the information on MacVim you thought should be in +this manual page. +Solution: ~ +Post your question on the vim_mac mailing list and wait for an +answer. + + vim:tw=78:sw=4:ts=8:ft=help:norl: diff --git a/runtime/doc/help.txt b/runtime/doc/help.txt index 5bc8800e07..b4fa58f537 100644 --- a/runtime/doc/help.txt +++ b/runtime/doc/help.txt @@ -152,6 +152,7 @@ GUI ~ |gui_w16.txt| Windows 3.1 GUI |gui_w32.txt| Win32 GUI |gui_x11.txt| X11 GUI +|gui_mac.txt| MacVim GUI Interfaces ~ |if_cscop.txt| using Cscope with Vim diff --git a/runtime/doc/index.txt b/runtime/doc/index.txt index f587cc902b..cf37974233 100644 --- a/runtime/doc/index.txt +++ b/runtime/doc/index.txt @@ -1039,6 +1039,7 @@ The commands are sorted on the non-optional part of their name. |:abbreviate| :ab[breviate] enter abbreviation |:abclear| :abc[lear] remove all abbreviations |:aboveleft| :abo[veleft] make split window appear left or above +|:action| :ac[tion] send action message |:all| :al[l] open a window for each file in the argument list |:amenu| :am[enu] enter new menu item for all modes @@ -1295,6 +1296,7 @@ The commands are sorted on the non-optional part of their name. |:marks| :marks list all marks |:match| :mat[ch] define a match to highlight |:menu| :me[nu] enter a new menu item +|:menukeyequiv| :menuk[eyequiv] set key equivalent for menu item |:menutranslate| :menut[ranslate] add a menu translation item |:messages| :mes[sages] view previously displayed messages |:mkexrc| :mk[exrc] write current mappings and settings to a file diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt index 9ee985025d..4ebca01b0c 100644 --- a/runtime/doc/options.txt +++ b/runtime/doc/options.txt @@ -669,13 +669,14 @@ A jump table for the options with a short description can be found at |Q_op|. 'antialias' 'anti' boolean (default: off) global {not in Vi} - {only available when compiled with GUI enabled + {only available when compiled with Carbon GUI enabled on Mac OS X} - This option only has an effect in the GUI version of Vim on Mac OS X - v10.2 or later. When on, Vim will use smooth ("antialiased") fonts, - which can be easier to read at certain sizes on certain displays. - Setting this option can sometimes cause problems if 'guifont' is set - to its default (empty string). + This option only has an effect in the Carbon GUI version of Vim on Mac + OS X v10.2 or later. When on, Vim will use smooth ("antialiased") + fonts, which can be easier to read at certain sizes on certain + displays. Setting this option can sometimes cause problems if + 'guifont' is set to its default (empty string). + Note: Antialiasing is handled automatically on MacVim. *'autochdir'* *'acd'* *'noautochdir'* *'noacd'* 'autochdir' 'acd' boolean (default off) @@ -2345,8 +2346,8 @@ A jump table for the options with a short description can be found at |Q_op|. It should normally be kept at its default value, or set when Vim starts up. See |multibyte|. To reload the menus see |:menutrans|. - NOTE: For GTK+ 2 it is highly recommended to set 'encoding' to - "utf-8". Although care has been taken to allow different values of + NOTE: For MacVim and GTK+ 2 it is highly recommended to set 'encoding' + to "utf-8". Although care has been taken to allow different values of 'encoding', "utf-8" is the natural choice for the environment and avoids unnecessary conversion overhead. "utf-8" has not been made the default to prevent different behavior of the GUI and terminal @@ -3027,8 +3028,8 @@ A jump table for the options with a short description can be found at |Q_op|. The expression may be evaluated in the |sandbox|, see |sandbox-option|. - *'fsync'* *'fs'* -'fsync' 'fs' boolean (default on) + *'fsync'* *'fs'* *'nofsync'* *'nofs'* +'fsync' 'fs' boolean (default on) global {not in Vi} When on, the library function fsync() will be called after writing a @@ -3041,6 +3042,20 @@ A jump table for the options with a short description can be found at |Q_op|. off. Also see 'swapsync' for controlling fsync() on swap files. + *'fullscreen'* *'fu'* *'nofullscreen'* *'nofu'* +'fullscreen' 'fu' boolean (default off) + global + {not in Vi} + {only available in the MacVim GUI} + When this option is set, the whole screen is covered by vim. Screen + decorations drawn by the operating system (such as the dock or the + menu bar) are hidden. Most of vim's window chrome is hidden as well + (e.g. toolbar, title bar). The tab bar and scroll bars remains visible. + + Most of the screen is black, only a 'columns' x 'lines' part of the + screen is covered by the actual vim control. The control is centered. + Updates to the window position are ignored in fullscreen mode. + *'gdefault'* *'gd'* *'nogdefault'* *'nogd'* 'gdefault' 'gd' boolean (default off) global @@ -3209,6 +3224,9 @@ A jump table for the options with a short description can be found at |Q_op|. For Win32, GTK, Mac OS and Photon: > :set guifont=* < will bring up a font requester, where you can pick the font you want. + In MacVim ":set guifont=*" calls: > + :action orderFrontFontPanel: +< which is the same as choosing "Show Fonts..." from the main menu. The font name depends on the GUI used. See |setting-guifont| for a way to set 'guifont' for various systems. @@ -3217,12 +3235,15 @@ A jump table for the options with a short description can be found at |Q_op|. :set guifont=Andale\ Mono\ 11 < That's all. XLFDs are no longer accepted. - For Mac OSX you can use something like this: > + For Mac OS X you can use something like this: > :set guifont=Monaco:h10 -< Also see 'macatsui', it can help fix display problems. +< Also see 'macatsui', it can help fix display problems {not in MacVim}. + In MacVim, fonts with spaces are set like this: > + :set guifont=DejaVu\ Sans\ Mono:h13 +< *E236* Note that the fonts must be mono-spaced (all characters have the same - width). An exception is GTK 2: all fonts are accepted, but + width). An exception is MacVim and GTK 2: all fonts are accepted, but mono-spaced fonts look best. To preview a font on X11, you might be able to use the "xfontsel" @@ -3286,7 +3307,7 @@ A jump table for the options with a short description can be found at |Q_op|. Note: The size of these fonts must be exactly twice as wide as the one specified with 'guifont' and the same height. - All GUI versions but GTK+ 2: + All GUI versions but MacVim and GTK+ 2: 'guifontwide' is only used when 'encoding' is set to "utf-8" and 'guifontset' is empty or invalid. @@ -3294,6 +3315,11 @@ A jump table for the options with a short description can be found at |Q_op|. 'guifontwide' is empty Vim will attempt to find a matching double-width font and set 'guifontwide' to it. + MacVim only: *guifontwide_macvim* + + MacVim performs automatic font substitution, setting 'guifontwide' has + no effect. + GTK+ 2 GUI only: *guifontwide_gtk2* If set and valid, 'guifontwide' is always used for double width @@ -4350,7 +4376,7 @@ A jump table for the options with a short description can be found at |Q_op|. *'macatsui'* *'nomacatsui'* 'macatsui' boolean (default on) global - {only available in Mac GUI version} + {only available in Mac Carbon GUI version} This is a workaround for when drawing doesn't work properly. When set and compiled with multi-byte support ATSUI text drawing is used. When not set ATSUI text drawing is not used. Switch this option off when @@ -4362,6 +4388,7 @@ A jump table for the options with a short description can be found at |Q_op|. endif < Another option to check if you have drawing problems is 'termencoding'. + Note: MacVim does not use this option. *'magic'* *'nomagic'* 'magic' boolean (default on) @@ -6700,8 +6727,9 @@ A jump table for the options with a short description can be found at |Q_op|. For further details see |arabic.txt|. *'termencoding'* *'tenc'* -'termencoding' 'tenc' string (default ""; with GTK+ 2 GUI: "utf-8"; with - Macintosh GUI: "macroman") +'termencoding' 'tenc' string (default "" + with GTK+ 2 and MacVim GUIs: "utf-8" + with Macintosh (Carbon) GUI: "macroman") global {only available when compiled with the |+multi_byte| feature} @@ -6710,14 +6738,14 @@ A jump table for the options with a short description can be found at |Q_op|. encoding the keyboard produces and the display will understand. For the GUI it only applies to the keyboard ('encoding' is used for the display). Except for the Mac when 'macatsui' is off, then - 'termencoding' should be "macroman". + 'termencoding' should be "macroman" (for the Carbon GUI). In the Win32 console version the default value is the console codepage when it differs from the ANSI codepage. *E617* - Note: This does not apply to the GTK+ 2 GUI. After the GUI has been - successfully initialized, 'termencoding' is forcibly set to "utf-8". - Any attempts to set a different value will be rejected, and an error - message is shown. + Note: This does not apply to the GTK+ 2 and MacVim GUIs. After the + GUI has been successfully initialized, 'termencoding' is forcibly set + to "utf-8". Any attempts to set a different value will be rejected, + and an error message is shown. For the Win32 GUI 'termencoding' is not used for typed characters, because the Win32 system always passes Unicode characters. When empty, the same encoding is used as for the 'encoding' option. @@ -6954,8 +6982,8 @@ A jump table for the options with a short description can be found at |Q_op|. *'toolbar'* *'tb'* 'toolbar' 'tb' string (default "icons,tooltips") global - {only for |+GUI_GTK|, |+GUI_Athena|, |+GUI_Motif| and - |+GUI_Photon|} + {only for |+GUI_GTK|, |+GUI_Athena|, |+GUI_Motif|, + |+GUI_Photon| and |gui_macvim|} The contents of this option controls various toolbar settings. The possible values are: icons Toolbar buttons are shown with icons. @@ -6965,6 +6993,7 @@ A jump table for the options with a short description can be found at |Q_op|. tooltips Tooltips are active for toolbar buttons. Tooltips refer to the popup help text which appears after the mouse cursor is placed over a toolbar button for a brief moment. + Note: Tooltips are always enabled in MacVim. If you want the toolbar to be shown with icons as well as text, do the following: > @@ -6982,7 +7011,7 @@ A jump table for the options with a short description can be found at |Q_op|. 'toolbariconsize' 'tbis' string (default "small") global {not in Vi} - {only in the GTK+ 2 GUI} + {only in the GTK+ 2 and MacVim GUIs} Controls the size of toolbar icons. The possible values are: tiny Use tiny toolbar icons. small Use small toolbar icons (default). @@ -6990,11 +7019,21 @@ A jump table for the options with a short description can be found at |Q_op|. large Use large toolbar icons. The exact dimensions in pixels of the various icon sizes depend on the current theme. Common dimensions are large=32x32, medium=24x24, - small=20x20 and tiny=16x16. + small=20x20 and tiny=16x16. In MacVim, both tiny and small equal + 24x24, whereas medium and large equal 32x32. If 'toolbariconsize' is empty, the global default size as determined by user preferences or the current theme is used. + *'transparency'* *'transp'* +'transparency' 'transp' number (default 0) + global + {not in Vi} + {only in MacVim GUI} + Transparency of the window background as a percent, with 0 meaning + opaque and 100 meaning completely transparent. Trying to set a value + outside the range 0-100 results in an error. + *'ttybuiltin'* *'tbi'* *'nottybuiltin'* *'notbi'* 'ttybuiltin' 'tbi' boolean (default on) global diff --git a/runtime/doc/quickref.txt b/runtime/doc/quickref.txt index 0f05d8b0bc..1f2cbaec4f 100644 --- a/runtime/doc/quickref.txt +++ b/runtime/doc/quickref.txt @@ -696,6 +696,7 @@ Short explanation of each option: *option-list* 'formatprg' 'fp' name of external program used with "gq" command 'formatexpr' 'fex' expression used with "gq" command 'fsync' 'fs' whether to invoke fsync() after file write +'fullscreen' 'fu' let vim cover the whole screen (MacVim only) 'gdefault' 'gd' the ":substitute" flag 'g' is default on 'grepformat' 'gfm' format of 'grepprg' output 'grepprg' 'gp' program to use for ":grep" @@ -890,7 +891,8 @@ Short explanation of each option: *option-list* 'titleold' old title, restored when exiting 'titlestring' string to use for the Vim window title 'toolbar' 'tb' GUI: which items to show in the toolbar -'toolbariconsize' 'tbis' size of the toolbar icons (for GTK 2 only) +'toolbariconsize' 'tbis' size of the toolbar icons (MacVim and GTK 2 only) +'transparency' 'transp' transparency of the GUI window (MacVim only) 'ttimeout' time out on mappings 'ttimeoutlen' 'ttm' time out time for key codes in milliseconds 'ttybuiltin' 'tbi' use built-in termcap before external termcap diff --git a/runtime/doc/remote.txt b/runtime/doc/remote.txt index 5b328c1f25..d11e7a85b2 100644 --- a/runtime/doc/remote.txt +++ b/runtime/doc/remote.txt @@ -9,6 +9,7 @@ Vim client-server communication *client-server* 1. Common functionality |clientserver| 2. X11 specific items |x11-clientserver| 3. MS-Windows specific items |w32-clientserver| +4. MacVim specific items |macvim-clientserver| {Vi does not have any of these commands} @@ -198,4 +199,23 @@ When using gvim, the --remote-wait only works properly this way: > start /w gvim --remote-wait file.txt < +============================================================================== +4. MacVim specific items *macvim-clientserver* + +MacVim uses distributed objects for interprocess communication. A server +listens to a named port for new connections, and clients connect to this port +to send messages. Server listings are made possible by the frontend (MacVim) +keeping a list of all currently running servers. Thus, server are not aware +of each other directly; only MacVim knows which servers are running. + +A client is any object which implements the MMVimClientProtocol (see +MacVim.h). Take a look at MMBackend if you wish to implement this protocol in +your own application. The current implementation assumes that the +NSConnections use mach ports for interprocess communication. This means that +you can only use Vim's client/server feature on a local machine (and not +across a network). + +Note: Client mode always works, but server mode only works when the GUI is +started. + vim:tw=78:sw=4:ts=8:ft=help:norl: diff --git a/runtime/doc/syntax.txt b/runtime/doc/syntax.txt index acde5428b6..8d335b2494 100644 --- a/runtime/doc/syntax.txt +++ b/runtime/doc/syntax.txt @@ -4066,8 +4066,8 @@ guisp={color-name} *highlight-guisp* Black White Orange Purple Violet - In the Win32 GUI version, additional system colors are available. See - |win32-colors|. + In the Win32 and MacVim GUI versions, additional system colors are + available. See |win32-colors| and |macvim-colors| respectively. You can also specify a color by its Red, Green and Blue values. The format is "#rrggbb", where diff --git a/runtime/menu.vim b/runtime/menu.vim index 8924206c49..76334193aa 100644 --- a/runtime/menu.vim +++ b/runtime/menu.vim @@ -17,7 +17,8 @@ if !exists("did_install_default_menus") let did_install_default_menus = 1 -if exists("v:lang") || &langmenu != "" +" Localized menus currently not supported in MacVim +if !has("gui_macvim") && (exists("v:lang") || &langmenu != "") " Try to find a menu translation file for the current language. if &langmenu != "" if &langmenu =~ "none" diff --git a/runtime/optwin.vim b/runtime/optwin.vim index c0cbf2b6e0..f54ea52040 100644 --- a/runtime/optwin.vim +++ b/runtime/optwin.vim @@ -612,6 +612,12 @@ if has("gui") call append("$", "macatsui\tuse ATSUI text drawing; disable to avoid display problems") call OptionG("macatsui", &macatsui) endif + if has("gui_macvim") + call append("$", "transparency\ttransparency of the text background as a percent") + call append("$", " \tset transparency=" . &transp) + call append("$", "fullscreen\tdisplay vim in fullscreen mode") + call BinOptionG("fullscreen", &fullscreen) + endif endif if has("printer") diff --git a/runtime/syntax/vim.vim b/runtime/syntax/vim.vim index 56be4324d9..5e946bf1bf 100644 --- a/runtime/syntax/vim.vim +++ b/runtime/syntax/vim.vim @@ -16,7 +16,7 @@ syn keyword vimTodo contained COMBAK FIXME TODO XXX syn cluster vimCommentGroup contains=vimTodo,@Spell " regular vim commands {{{2 -syn keyword vimCommand contained ab[breviate] abc[lear] abo[veleft] al[l] arga[dd] argd[elete] argdo arge[dit] argg[lobal] argl[ocal] ar[gs] argu[ment] as[cii] bad[d] ba[ll] bd[elete] be bel[owright] bf[irst] bl[ast] bm[odified] bn[ext] bN[ext] bo[tright] bp[revious] brea[k] breaka[dd] breakd[el] breakl[ist] br[ewind] bro[wse] bufdo b[uffer] buffers bun[load] bw[ipeout] ca[bbrev] cabc[lear] caddb[uffer] cad[dexpr] caddf[ile] cal[l] cat[ch] cb[uffer] cc ccl[ose] cd ce[nter] cex[pr] cf[ile] cfir[st] cgetb[uffer] cgete[xpr] cg[etfile] c[hange] changes chd[ir] che[ckpath] checkt[ime] cla[st] cl[ist] clo[se] cmapc[lear] cnew[er] cn[ext] cN[ext] cnf[ile] cNf[ile] cnorea[bbrev] col[der] colo[rscheme] comc[lear] comp[iler] conf[irm] con[tinue] cope[n] co[py] cpf[ile] cp[revious] cq[uit] cr[ewind] cuna[bbrev] cu[nmap] cw[indow] debugg[reedy] delc[ommand] d[elete] delf[unction] delm[arks] diffg[et] diffoff diffpatch diffpu[t] diffsplit diffthis diffu[pdate] dig[raphs] di[splay] dj[ump] dl[ist] dr[op] ds[earch] dsp[lit] earlier echoe[rr] echom[sg] echon e[dit] el[se] elsei[f] em[enu] emenu* endfo[r] endf[unction] en[dif] endt[ry] endw[hile] ene[w] ex exi[t] exu[sage] f[ile] files filetype fina[lly] fin[d] fini[sh] fir[st] fix[del] fo[ld] foldc[lose] folddoc[losed] foldd[oopen] foldo[pen] for fu[nction] go[to] gr[ep] grepa[dd] ha[rdcopy] h[elp] helpf[ind] helpg[rep] helpt[ags] hid[e] his[tory] ia[bbrev] iabc[lear] if ij[ump] il[ist] imapc[lear] inorea[bbrev] is[earch] isp[lit] iuna[bbrev] iu[nmap] j[oin] ju[mps] k keepalt keepj[umps] kee[pmarks] laddb[uffer] lad[dexpr] laddf[ile] lan[guage] la[st] later lb[uffer] lc[d] lch[dir] lcl[ose] le[ft] lefta[bove] lex[pr] lf[ile] lfir[st] lgetb[uffer] lgete[xpr] lg[etfile] lgr[ep] lgrepa[dd] lh[elpgrep] l[ist] ll lla[st] lli[st] lmak[e] lm[ap] lmapc[lear] lnew[er] lne[xt] lN[ext] lnf[ile] lNf[ile] ln[oremap] lo[adview] loc[kmarks] lockv[ar] lol[der] lop[en] lpf[ile] lp[revious] lr[ewind] ls lt[ag] lu[nmap] lv[imgrep] lvimgrepa[dd] lw[indow] mak[e] ma[rk] marks mat[ch] menut[ranslate] mk[exrc] mks[ession] mksp[ell] mkvie[w] mkv[imrc] mod[e] m[ove] mzf[ile] mz[scheme] nbkey new n[ext] N[ext] nmapc[lear] noh[lsearch] norea[bbrev] nu[mber] nun[map] omapc[lear] on[ly] o[pen] opt[ions] ou[nmap] pc[lose] ped[it] pe[rl] perld[o] po[p] popu popu[p] pp[op] pre[serve] prev[ious] p[rint] P[rint] profd[el] prof[ile] promptf[ind] promptr[epl] ps[earch] pta[g] ptf[irst] ptj[ump] ptl[ast] ptn[ext] ptN[ext] ptp[revious] ptr[ewind] pts[elect] pu[t] pw[d] pyf[ile] py[thon] qa[ll] q[uit] quita[ll] r[ead] rec[over] redi[r] red[o] redr[aw] redraws[tatus] reg[isters] res[ize] ret[ab] retu[rn] rew[ind] ri[ght] rightb[elow] rub[y] rubyd[o] rubyf[ile] ru[ntime] rv[iminfo] sal[l] san[dbox] sa[rgument] sav[eas] sba[ll] sbf[irst] sbl[ast] sbm[odified] sbn[ext] sbN[ext] sbp[revious] sbr[ewind] sb[uffer] scripte[ncoding] scrip[tnames] se[t] setf[iletype] setg[lobal] setl[ocal] sf[ind] sfir[st] sh[ell] sign sil[ent] sim[alt] sla[st] sl[eep] sm[agic] sm[ap] smapc[lear] sme smenu sn[ext] sN[ext] sni[ff] sno[magic] snor[emap] snoreme snoremenu sor[t] so[urce] spelld[ump] spe[llgood] spelli[nfo] spellr[epall] spellu[ndo] spellw[rong] sp[lit] spr[evious] sre[wind] sta[g] startg[replace] star[tinsert] startr[eplace] stj[ump] st[op] stopi[nsert] sts[elect] sun[hide] sunm[ap] sus[pend] sv[iew] syncbind t tab tabc[lose] tabd[o] tabe[dit] tabf[ind] tabfir[st] tabl[ast] tabm[ove] tabnew tabn[ext] tabN[ext] tabo[nly] tabp[revious] tabr[ewind] tabs ta[g] tags tc[l] tcld[o] tclf[ile] te[aroff] tf[irst] th[row] tj[ump] tl[ast] tm tm[enu] tn[ext] tN[ext] to[pleft] tp[revious] tr[ewind] try ts[elect] tu tu[nmenu] una[bbreviate] u[ndo] undoj[oin] undol[ist] unh[ide] unlo[ckvar] unm[ap] up[date] verb[ose] ve[rsion] vert[ical] vie[w] vim[grep] vimgrepa[dd] vi[sual] viu[sage] vmapc[lear] vne[w] vs[plit] vu[nmap] wa[ll] wh[ile] winc[md] windo winp[os] win[size] wn[ext] wN[ext] wp[revious] wq wqa[ll] w[rite] ws[verb] wv[iminfo] X xa[ll] x[it] xm[ap] xmapc[lear] xme xmenu XMLent XMLns xn[oremap] xnoreme xnoremenu xu[nmap] y[ank] +syn keyword vimCommand contained ab[breviate] abc[lear] abo[veleft] al[l] arga[dd] argd[elete] argdo arge[dit] argg[lobal] argl[ocal] ar[gs] argu[ment] as[cii] bad[d] ba[ll] bd[elete] be bel[owright] bf[irst] bl[ast] bm[odified] bn[ext] bN[ext] bo[tright] bp[revious] brea[k] breaka[dd] breakd[el] breakl[ist] br[ewind] bro[wse] bufdo b[uffer] buffers bun[load] bw[ipeout] ca[bbrev] cabc[lear] caddb[uffer] cad[dexpr] caddf[ile] cal[l] cat[ch] cb[uffer] cc ccl[ose] cd ce[nter] cex[pr] cf[ile] cfir[st] cgetb[uffer] cgete[xpr] cg[etfile] c[hange] changes chd[ir] che[ckpath] checkt[ime] cla[st] cl[ist] clo[se] cmapc[lear] cnew[er] cn[ext] cN[ext] cnf[ile] cNf[ile] cnorea[bbrev] col[der] colo[rscheme] comc[lear] comp[iler] conf[irm] con[tinue] cope[n] co[py] cpf[ile] cp[revious] cq[uit] cr[ewind] cuna[bbrev] cu[nmap] cw[indow] debugg[reedy] delc[ommand] d[elete] delf[unction] delm[arks] diffg[et] diffoff diffpatch diffpu[t] diffsplit diffthis diffu[pdate] dig[raphs] di[splay] dj[ump] dl[ist] dr[op] ds[earch] dsp[lit] earlier echoe[rr] echom[sg] echon e[dit] el[se] elsei[f] em[enu] emenu* endfo[r] endf[unction] en[dif] endt[ry] endw[hile] ene[w] ex exi[t] exu[sage] f[ile] files filetype fina[lly] fin[d] fini[sh] fir[st] fix[del] fo[ld] foldc[lose] folddoc[losed] foldd[oopen] foldo[pen] for fu[nction] go[to] gr[ep] grepa[dd] ha[rdcopy] h[elp] helpf[ind] helpg[rep] helpt[ags] hid[e] his[tory] ia[bbrev] iabc[lear] if ij[ump] il[ist] imapc[lear] inorea[bbrev] is[earch] isp[lit] iuna[bbrev] iu[nmap] j[oin] ju[mps] k keepalt keepj[umps] kee[pmarks] laddb[uffer] lad[dexpr] laddf[ile] lan[guage] la[st] later lb[uffer] lc[d] lch[dir] lcl[ose] le[ft] lefta[bove] lex[pr] lf[ile] lfir[st] lgetb[uffer] lgete[xpr] lg[etfile] lgr[ep] lgrepa[dd] lh[elpgrep] l[ist] ll lla[st] lli[st] lmak[e] lm[ap] lmapc[lear] lnew[er] lne[xt] lN[ext] lnf[ile] lNf[ile] ln[oremap] lo[adview] loc[kmarks] lockv[ar] lol[der] lop[en] lpf[ile] lp[revious] lr[ewind] ls lt[ag] lu[nmap] lv[imgrep] lvimgrepa[dd] lw[indow] mak[e] ma[rk] marks mat[ch] maca[ction] macm[enukey] menut[ranslate] mk[exrc] mks[ession] mksp[ell] mkvie[w] mkv[imrc] mod[e] m[ove] mzf[ile] mz[scheme] nbkey new n[ext] N[ext] nmapc[lear] noh[lsearch] norea[bbrev] nu[mber] nun[map] omapc[lear] on[ly] o[pen] opt[ions] ou[nmap] pc[lose] ped[it] pe[rl] perld[o] po[p] popu popu[p] pp[op] pre[serve] prev[ious] p[rint] P[rint] profd[el] prof[ile] promptf[ind] promptr[epl] ps[earch] pta[g] ptf[irst] ptj[ump] ptl[ast] ptn[ext] ptN[ext] ptp[revious] ptr[ewind] pts[elect] pu[t] pw[d] pyf[ile] py[thon] qa[ll] q[uit] quita[ll] r[ead] rec[over] redi[r] red[o] redr[aw] redraws[tatus] reg[isters] res[ize] ret[ab] retu[rn] rew[ind] ri[ght] rightb[elow] rub[y] rubyd[o] rubyf[ile] ru[ntime] rv[iminfo] sal[l] san[dbox] sa[rgument] sav[eas] sba[ll] sbf[irst] sbl[ast] sbm[odified] sbn[ext] sbN[ext] sbp[revious] sbr[ewind] sb[uffer] scripte[ncoding] scrip[tnames] se[t] setf[iletype] setg[lobal] setl[ocal] sf[ind] sfir[st] sh[ell] sign sil[ent] sim[alt] sla[st] sl[eep] sm[agic] sm[ap] smapc[lear] sme smenu sn[ext] sN[ext] sni[ff] sno[magic] snor[emap] snoreme snoremenu sor[t] so[urce] spelld[ump] spe[llgood] spelli[nfo] spellr[epall] spellu[ndo] spellw[rong] sp[lit] spr[evious] sre[wind] sta[g] startg[replace] star[tinsert] startr[eplace] stj[ump] st[op] stopi[nsert] sts[elect] sun[hide] sunm[ap] sus[pend] sv[iew] syncbind t tab tabc[lose] tabd[o] tabe[dit] tabf[ind] tabfir[st] tabl[ast] tabm[ove] tabnew tabn[ext] tabN[ext] tabo[nly] tabp[revious] tabr[ewind] tabs ta[g] tags tc[l] tcld[o] tclf[ile] te[aroff] tf[irst] th[row] tj[ump] tl[ast] tm tm[enu] tn[ext] tN[ext] to[pleft] tp[revious] tr[ewind] try ts[elect] tu tu[nmenu] una[bbreviate] u[ndo] undoj[oin] undol[ist] unh[ide] unlo[ckvar] unm[ap] up[date] verb[ose] ve[rsion] vert[ical] vie[w] vim[grep] vimgrepa[dd] vi[sual] viu[sage] vmapc[lear] vne[w] vs[plit] vu[nmap] wa[ll] wh[ile] winc[md] windo winp[os] win[size] wn[ext] wN[ext] wp[revious] wq wqa[ll] w[rite] ws[verb] wv[iminfo] X xa[ll] x[it] xm[ap] xmapc[lear] xme xmenu XMLent XMLns xn[oremap] xnoreme xnoremenu xu[nmap] y[ank] syn match vimCommand contained "\/dev/null`" = Darwin; then CPPFLAGS="$CPPFLAGS -I/Developer/Headers/FlatCarbon" fi - dnl If Carbon is found, assume we don't want X11 - dnl unless it was specifically asked for (--with-x) + dnl If Carbon or Cocoa is found, assume we don't want + dnl X11 unless it was specifically asked for (--with-x) dnl or Motif, Athena or GTK GUI is used. AC_CHECK_HEADER(Carbon/Carbon.h, CARBON=yes) - if test "x$CARBON" = "xyes"; then + + SAVE_CPPFLAGS=$CPPFLAGS + SAVE_CFLAGS=$CFLAGS + CPPFLAGS="$CPPFLAGS -ObjC" + CFLAGS="$CFLAGS -ObjC" + AC_CHECK_HEADER(Cocoa/Cocoa.h, COCOA=yes) + CPPFLAGS=$SAVE_CPPFLAGS + CFLAGS=$SAVE_CFLAGS + + if test "x$CARBON" = "xyes" -o "x$COCOA" = "xyes"; then if test -z "$with_x" -a "X$enable_gui" != Xmotif -a "X$enable_gui" != Xathena -a "X$enable_gui" != Xgtk -a "X$enable_gui" != Xgtk2; then with_x=no fi @@ -1152,7 +1161,7 @@ test "x$with_x" = xno -a "x$MACOSX" != "xyes" -a "x$QNX" != "xyes" && enable_gui AC_MSG_CHECKING(--enable-gui argument) AC_ARG_ENABLE(gui, - [ --enable-gui[=OPTS] X11 GUI [default=auto] [OPTS=auto/no/gtk/gtk2/gnome/gnome2/motif/athena/neXtaw/photon/carbon]], , enable_gui="auto") + [ --enable-gui[=OPTS] X11 GUI [default=auto] [OPTS=auto/no/gtk/gtk2/gnome/gnome2/motif/athena/neXtaw/photon/carbon/macvim]], , enable_gui="auto") dnl Canonicalize the --enable-gui= argument so that it can be easily compared. dnl Do not use character classes for portability with old tools. @@ -1168,6 +1177,7 @@ SKIP_ATHENA=YES SKIP_NEXTAW=YES SKIP_PHOTON=YES SKIP_CARBON=YES +SKIP_MACVIM=YES GUITYPE=NONE if test "x$QNX" = "xyes" -a "x$with_x" = "xno" ; then @@ -1184,14 +1194,20 @@ if test "x$QNX" = "xyes" -a "x$with_x" = "xno" ; then elif test "x$MACOSX" = "xyes" -a "x$with_x" = "xno" ; then SKIP_CARBON= + SKIP_MACVIM= case "$enable_gui_canon" in no) AC_MSG_RESULT(no GUI support) - SKIP_CARBON=YES ;; + SKIP_CARBON=YES + SKIP_MACVIM=YES ;; yes|"") AC_MSG_RESULT(yes - automatic GUI support) ;; auto) AC_MSG_RESULT(auto - automatic GUI support) ;; - carbon) AC_MSG_RESULT(Carbon GUI support) ;; - *) AC_MSG_RESULT([Sorry, $enable_gui GUI is not supported]) + carbon) AC_MSG_RESULT(Carbon GUI support) + SKIP_MACVIM=YES ;; + macvim) AC_MSG_RESULT(MacVim GUI support) SKIP_CARBON=YES ;; + *) AC_MSG_RESULT([Sorry, $enable_gui GUI is not supported]) + SKIP_CARBON=YES + SKIP_MACVIM=YES ;; esac else @@ -1205,6 +1221,7 @@ else SKIP_MOTIF= SKIP_ATHENA= SKIP_NEXTAW= + SKIP_MACVIM= SKIP_CARBON=;; gtk) AC_MSG_RESULT(GTK+ 1.x GUI support) SKIP_GTK=;; @@ -1309,12 +1326,30 @@ if test "x$SKIP_CARBON" != "xYES" -a "$enable_gui_canon" != "carbon"; then fi fi +if test "x$SKIP_MACVIM" != "xYES" -a "$enable_gui_canon" != "macvim"; then + AC_MSG_CHECKING(whether or not to look for MacVim) + AC_ARG_ENABLE(macvim-check, + [ --enable-macvim-check If auto-select GUI, check for MacVim [default=yes]], + , enable_macvim_check="yes") + AC_MSG_RESULT($enable_macvim_check); + if test "x$enable_macvim_check" = "xno"; then + SKIP_MACVIM=YES + fi +fi + +if test "x$MACOSX" = "xyes"; then + if test -z "$SKIP_CARBON" -a "x$CARBON" = "xyes"; then + AC_MSG_CHECKING(for Carbon GUI) + dnl already did the check, just give the message + AC_MSG_RESULT(yes); + GUITYPE=CARBONGUI + elif test -z "$SKIP_MACVIM" -a "x$COCOA" = "xyes"; then + AC_MSG_CHECKING(for MacVim GUI) + dnl already did the check, just give the message + AC_MSG_RESULT(yes); + GUITYPE=MACVIMGUI + fi -if test "x$MACOSX" = "xyes" -a -z "$SKIP_CARBON" -a "x$CARBON" = "xyes"; then - AC_MSG_CHECKING(for Carbon GUI) - dnl already did the check, just give the message - AC_MSG_RESULT(yes); - GUITYPE=CARBONGUI if test "$VIMNAME" = "vim"; then VIMNAME=Vim fi @@ -1335,6 +1370,7 @@ if test "x$MACOSX" = "xyes" -a -z "$SKIP_CARBON" -a "x$CARBON" = "xyes"; then SKIP_ATHENA=YES; SKIP_NEXTAW=YES; SKIP_PHOTON=YES; + SKIP_MACVIM=YES; SKIP_CARBON=YES fi @@ -2859,7 +2895,7 @@ if test "x$MACOSX" = "xyes" -a -n "$PERL"; then fi if test "x$MACOSX" = "xyes" && test "x$CARBON" = "xyes" \ - && test "x$GUITYPE" != "xCARBONGUI"; then + && test "x$GUITYPE" != "xCARBONGUI" && test "x$GUITYPE" != "xMACVIMGUI"; then AC_MSG_CHECKING(whether we need -framework Carbon) dnl check for MACOSX without Carbon GUI, but with FEAT_MBYTE if test "x$enable_multibyte" = "xyes" || test "x$features" = "xbig" \ diff --git a/src/eval.c b/src/eval.c index ca9e2dcc13..fe81d74349 100644 --- a/src/eval.c +++ b/src/eval.c @@ -10890,6 +10890,9 @@ f_has(argvars, rettv) #ifdef FEAT_GUI_MAC "gui_mac", #endif +#ifdef FEAT_GUI_MACVIM + "gui_macvim", +#endif #ifdef FEAT_GUI_MOTIF "gui_motif", #endif @@ -13338,8 +13341,10 @@ remote_common(argvars, rettv, expr) char_u buf[NUMBUFLEN]; # ifdef WIN32 HWND w; -# else +# elif defined(FEAT_X11) Window w; +# elif defined(MAC_CLIENTSERVER) + int w; // This is the port number ('w' is a bit confusing) # endif if (check_restricted() || check_secure()) @@ -13356,9 +13361,11 @@ remote_common(argvars, rettv, expr) keys = get_tv_string_buf(&argvars[1], buf); # ifdef WIN32 if (serverSendToVim(server_name, keys, &r, &w, expr, TRUE) < 0) -# else +# elif defined(FEAT_X11) if (serverSendToVim(X_DISPLAY, server_name, keys, &r, &w, expr, 0, TRUE) < 0) +# elif defined(MAC_CLIENTSERVER) + if (serverSendToVim(server_name, keys, &r, &w, expr, TRUE) < 0) # endif { if (r != NULL) @@ -13422,7 +13429,7 @@ f_remote_foreground(argvars, rettv) if (server_name != NULL) serverForeground(server_name); } -# else +# elif defined(FEAT_X11) || defined(MAC_CLIENTSERVER) /* Send a foreground() expression to the server. */ argvars[1].v_type = VAR_STRING; argvars[1].vval.v_string = vim_strsave((char_u *)"foreground()"); @@ -13467,13 +13474,15 @@ f_remote_peek(argvars, rettv) s = serverGetReply((HWND)n, FALSE, FALSE, FALSE); rettv->vval.v_number = (s != NULL); } -# else +# elif defined(FEAT_X11) rettv->vval.v_number = 0; if (check_connection() == FAIL) return; rettv->vval.v_number = serverPeekReply(X_DISPLAY, serverStrToWin(serverid), &s); +# elif defined(MAC_CLIENTSERVER) + rettv->vval.v_number = serverPeekReply(serverStrToPort(serverid), &s); # endif if (argvars[1].v_type != VAR_UNKNOWN && rettv->vval.v_number > 0) @@ -13513,9 +13522,11 @@ f_remote_read(argvars, rettv) if (n != 0) r = serverGetReply((HWND)n, FALSE, TRUE, TRUE); if (r == NULL) -# else +# elif defined(FEAT_X11) if (check_connection() == FAIL || serverReadReply(X_DISPLAY, serverStrToWin(serverid), &r, FALSE) < 0) +# elif defined(MAC_CLIENTSERVER) + if (serverReadReply(serverStrToPort(serverid), &r) < 0) # endif EMSG(_("E277: Unable to read a server reply")); } @@ -14450,9 +14461,9 @@ f_serverlist(argvars, rettv) char_u *r = NULL; #ifdef FEAT_CLIENTSERVER -# ifdef WIN32 +# if defined(WIN32) || defined(MAC_CLIENTSERVER) r = serverGetVimNames(); -# else +# elif defined(FEAT_X11) make_connection(); if (X_DISPLAY != NULL) r = serverGetVimNames(X_DISPLAY); diff --git a/src/ex_cmds.h b/src/ex_cmds.h index d06e031819..505acd5a57 100644 --- a/src/ex_cmds.h +++ b/src/ex_cmds.h @@ -595,6 +595,10 @@ EX(CMD_marks, "marks", do_marks, EXTRA|TRLBAR|CMDWIN), EX(CMD_match, "match", ex_match, RANGE|NOTADR|EXTRA|CMDWIN), +EX(CMD_macaction, "macaction", ex_macaction, + EXTRA|NOSPC|NEEDARG), +EX(CMD_macmenukey, "macmenukey", ex_macmenukey, + EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN), EX(CMD_menu, "menu", ex_menu, RANGE|NOTADR|ZEROR|BANG|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN), EX(CMD_menutranslate, "menutranslate", ex_menutranslate, diff --git a/src/ex_docmd.c b/src/ex_docmd.c index 72b939bdb6..9f7de860fd 100644 --- a/src/ex_docmd.c +++ b/src/ex_docmd.c @@ -215,7 +215,8 @@ static void ex_tearoff __ARGS((exarg_T *eap)); #else # define ex_tearoff ex_ni #endif -#if (defined(FEAT_GUI_MSWIN) || defined(FEAT_GUI_GTK)) && defined(FEAT_MENU) +#if defined(FEAT_MENU) && (defined(FEAT_GUI_MSWIN) || defined(FEAT_GUI_GTK) \ + || defined(FEAT_GUI_MACVIM)) static void ex_popup __ARGS((exarg_T *eap)); #else # define ex_popup ex_ni @@ -463,6 +464,11 @@ static void ex_folddo __ARGS((exarg_T *eap)); # define ex_profile ex_ni #endif +#ifndef FEAT_GUI_MACVIM +# define ex_macaction ex_ni +# define ex_macmenukey ex_ni +#endif + /* * Declare cmdnames[]. */ @@ -3726,6 +3732,9 @@ set_one_cmd_context(xp, buff) case CMD_cmenu: case CMD_cnoremenu: case CMD_cunmenu: case CMD_tmenu: case CMD_tunmenu: case CMD_popup: case CMD_tearoff: case CMD_emenu: +#ifdef FEAT_GUI_MACVIM + case CMD_macmenukey: +#endif return set_context_in_menu_cmd(xp, cmd, arg, forceit); #endif @@ -6665,7 +6674,8 @@ ex_shell(eap) || (defined(FEAT_GUI_GTK) && defined(FEAT_DND)) \ || defined(FEAT_GUI_MSWIN) \ || defined(FEAT_GUI_MAC) \ - || defined(PROTO) + || defined(PROTO) \ + || defined(FEAT_GUI_MACVIM) /* * Handle a file drop. The code is here because a drop is *nearly* like an @@ -7583,7 +7593,8 @@ ex_tearoff(eap) } #endif -#if (defined(FEAT_GUI_MSWIN) || defined(FEAT_GUI_GTK)) && defined(FEAT_MENU) +#if defined(FEAT_MENU) && (defined(FEAT_GUI_MSWIN) || defined(FEAT_GUI_GTK) \ + || defined(FEAT_GUI_MACVIM)) static void ex_popup(eap) exarg_T *eap; diff --git a/src/feature.h b/src/feature.h index 734f6e64c1..a139b0db2f 100644 --- a/src/feature.h +++ b/src/feature.h @@ -620,7 +620,8 @@ * Disabled for EBCDIC: * Multibyte support doesn't work on OS390 Unix currently. */ -#if (defined(FEAT_BIG) || defined(HAVE_GTK2) || defined(FEAT_ARABIC)) \ +#if (defined(FEAT_BIG) || defined(HAVE_GTK2) || defined(FEAT_ARABIC) \ + || defined(FEAT_GUI_MACVIM)) \ && !defined(FEAT_MBYTE) && !defined(WIN16) \ && SIZEOF_INT >= 4 && !defined(EBCDIC) # define FEAT_MBYTE @@ -741,7 +742,8 @@ || defined(FEAT_GUI_MSWIN) \ || ((defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_ATHENA)) \ && defined(HAVE_XPM)) \ - || defined(FEAT_GUI_PHOTON)) + || defined(FEAT_GUI_PHOTON) \ + || defined(FEAT_GUI_MACVIM)) # define FEAT_TOOLBAR #endif @@ -755,6 +757,7 @@ */ #if defined(FEAT_WINDOWS) && defined(FEAT_NORMAL) \ && (defined(FEAT_GUI_GTK) \ + || defined(FEAT_GUI_MACVIM) \ || (defined(FEAT_GUI_MOTIF) && defined(HAVE_XM_NOTEBOOK_H)) \ || defined(FEAT_GUI_MAC) \ || (defined(FEAT_GUI_MSWIN) && (!defined(_MSC_VER) || _MSC_VER > 1020))) @@ -764,7 +767,7 @@ /* * +browse ":browse" command. */ -#if defined(FEAT_NORMAL) && (defined(FEAT_GUI_MSWIN) || defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_ATHENA) || defined(FEAT_GUI_GTK) || defined(FEAT_GUI_PHOTON) || defined(FEAT_GUI_MAC)) +#if defined(FEAT_NORMAL) && (defined(FEAT_GUI_MSWIN) || defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_ATHENA) || defined(FEAT_GUI_GTK) || defined(FEAT_GUI_PHOTON) || defined(FEAT_GUI_MAC) || defined(FEAT_GUI_MACVIM)) # define FEAT_BROWSE #endif @@ -779,7 +782,8 @@ || defined(FEAT_GUI_GTK) \ || defined(FEAT_GUI_PHOTON) \ || defined(FEAT_GUI_MSWIN) \ - || defined(FEAT_GUI_MAC) + || defined(FEAT_GUI_MAC) \ + || defined(FEAT_GUI_MACVIM) # define FEAT_CON_DIALOG # define FEAT_GUI_DIALOG # else @@ -794,7 +798,8 @@ #if defined(FEAT_GUI_DIALOG) && \ (defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_ATHENA) \ || defined(FEAT_GUI_GTK) || defined(FEAT_GUI_MSWIN) \ - || defined(FEAT_GUI_PHOTON) || defined(FEAT_GUI_MAC)) + || defined(FEAT_GUI_PHOTON) || defined(FEAT_GUI_MAC) \ + || defined(FEAT_GUI_MACVIM)) # define FEAT_GUI_TEXTDIALOG #endif @@ -1069,9 +1074,10 @@ #endif /* - * +dnd Drag'n'drop support. Always used for the GTK+ GUI. + * +dnd Drag'n'drop support. Always used for the GTK+ GUI and MacVim. */ -#if defined(FEAT_CLIPBOARD) && defined(FEAT_GUI_GTK) +#if defined(FEAT_CLIPBOARD) && (defined(FEAT_GUI_GTK) \ + || defined(FEAT_GUI_MACVIM)) # define FEAT_DND #endif @@ -1089,7 +1095,12 @@ * +clientserver Remote control via the remote_send() function * and the --remote argument */ -#if (defined(WIN32) || defined(FEAT_XCLIPBOARD)) && defined(FEAT_EVAL) +#if defined(FEAT_GUI_MACVIM) +#define MAC_CLIENTSERVER +#endif + +#if (defined(WIN32) || defined(FEAT_XCLIPBOARD) || defined(MAC_CLIENTSERVER)) \ + && defined(FEAT_EVAL) # define FEAT_CLIENTSERVER #endif @@ -1113,7 +1124,7 @@ # endif # if defined(FEAT_GUI_W32) || defined(FEAT_GUI_W16) || defined(FEAT_GUI_MOTIF) \ || defined(FEAT_GUI_ATHENA) || defined(FEAT_GUI_GTK) \ - || defined(FEAT_GUI_PHOTON) + || defined(FEAT_GUI_PHOTON) || defined(FEAT_GUI_MACVIM) # define FEAT_MOUSESHAPE # endif #endif @@ -1257,3 +1268,17 @@ || defined(FEAT_BIG) # define FEAT_AUTOCHDIR #endif + +/* + * +transparency 'transparency' option. + */ +#if defined(FEAT_GUI_MACVIM) +# define FEAT_TRANSPARENCY +#endif + +/* + * +fullscreen 'fullscreen' option + */ +#ifdef FEAT_GUI_MACVIM +# define FEAT_FULLSCREEN +#endif diff --git a/src/fileio.c b/src/fileio.c index 594daf335b..9911abfca0 100644 --- a/src/fileio.c +++ b/src/fileio.c @@ -5685,7 +5685,8 @@ shorten_fnames(force) #if (defined(FEAT_DND) && defined(FEAT_GUI_GTK)) \ || defined(FEAT_GUI_MSWIN) \ || defined(FEAT_GUI_MAC) \ - || defined(PROTO) + || defined(PROTO) \ + || defined(FEAT_GUI_MACVIM) /* * Shorten all filenames in "fnames[count]" by current directory. */ diff --git a/src/globals.h b/src/globals.h index 7fec4e6435..07eb8ab373 100644 --- a/src/globals.h +++ b/src/globals.h @@ -1275,11 +1275,13 @@ EXTERN Window commWindow INIT(= None); EXTERN Window clientWindow INIT(= None); EXTERN Atom commProperty INIT(= None); EXTERN char_u *serverDelayedStartName INIT(= NULL); -# else +# elif defined(WIN32) # ifdef PROTO typedef int HWND; # endif EXTERN HWND clientWindow INIT(= 0); +# elif defined(MAC_CLIENTSERVER) +EXTERN int clientWindow INIT(= 0); # endif #endif diff --git a/src/gui.c b/src/gui.c index b2b8e8499d..7e4f890d72 100644 --- a/src/gui.c +++ b/src/gui.c @@ -268,7 +268,7 @@ gui_init_check() # endif # endif gui.menu_is_active = TRUE; /* default: include menu */ -# ifndef FEAT_GUI_GTK +# if !(defined(FEAT_GUI_GTK) || defined(FEAT_GUI_MACVIM)) gui.menu_height = MENU_DEFAULT_HEIGHT; gui.menu_width = 0; # endif @@ -636,7 +636,8 @@ gui_exit(rc) } #if defined(FEAT_GUI_GTK) || defined(FEAT_GUI_X11) || defined(FEAT_GUI_MSWIN) \ - || defined(FEAT_GUI_PHOTON) || defined(FEAT_GUI_MAC) || defined(PROTO) + || defined(FEAT_GUI_PHOTON) || defined(FEAT_GUI_MAC) \ + || defined(PROTO) || defined(FEAT_GUI_MACVIM) # define NEED_GUI_UPDATE_SCREEN 1 /* * Called when the GUI shell is closed by the user. If there are no changed @@ -708,6 +709,17 @@ gui_init_font(font_list, fontset) /* Isolate one comma separated font name. */ (void)copy_option_part(&font_list, font_name, FONTLEN, ","); +#if defined(FEAT_GUI_MACVIM) + /* The font dialog is modeless in Mac OS X, so when + * gui_mch_init_font() is called with "*" it brings up the + * dialog and returns immediately. In this case we don't want + * it to be called again with NULL, so return here. */ + if (STRCMP(font_name, "*") == 0) { + gui_mch_init_font(font_name, FALSE); + return FALSE; + } +#endif + /* Careful!!! The Win32 version of gui_mch_init_font(), when * called with "*" will change p_guifont to the selected font * name, which frees the old value. This makes font_list @@ -1120,7 +1132,8 @@ gui_update_cursor(force, clear_selection) void gui_position_menu() { -# if !defined(FEAT_GUI_GTK) && !defined(FEAT_GUI_MOTIF) +# if !(defined(FEAT_GUI_GTK) || defined(FEAT_GUI_MOTIF) \ + || defined(FEAT_GUI_MACVIM)) if (gui.menu_is_active && gui.in_use) gui_mch_set_menu_pos(0, 0, gui.menu_width, gui.menu_height); # endif @@ -1149,7 +1162,8 @@ gui_position_components(total_width) text_area_x += gui.scrollbar_width; text_area_y = 0; -#if defined(FEAT_MENU) && !(defined(FEAT_GUI_GTK) || defined(FEAT_GUI_PHOTON)) +#if defined(FEAT_MENU) && !(defined(FEAT_GUI_GTK) || defined(FEAT_GUI_PHOTON) \ + || defined(FEAT_GUI_MACVIM)) gui.menu_width = total_width; if (gui.menu_is_active) text_area_y += gui.menu_height; @@ -1233,7 +1247,7 @@ gui_get_base_height() /* We can't take the sizes properly into account until anything is * realized. Therefore we recalculate all the values here just before * setting the size. (--mdcki) */ -#else +#elif !defined(FEAT_GUI_MACVIM) # ifdef FEAT_MENU if (gui.menu_is_active) base_height += gui.menu_height; @@ -2158,7 +2172,7 @@ gui_outstr_nowrap(s, len, flags, fg, bg, back) if (back != 0 && ((draw_flags & DRAW_BOLD) || (highlight_mask & HL_ITALIC))) return FAIL; -#if defined(RISCOS) || defined(HAVE_GTK2) +#if defined(RISCOS) || defined(HAVE_GTK2) || defined(FEAT_GUI_MACVIM) /* If there's no italic font, then fake it. * For GTK2, we don't need a different font for italic style. */ if (hl_mask_todo & HL_ITALIC) @@ -2190,6 +2204,9 @@ gui_outstr_nowrap(s, len, flags, fg, bg, back) #ifdef HAVE_GTK2 /* The value returned is the length in display cells */ len = gui_gtk2_draw_string(gui.row, col, s, len, draw_flags); +#elif defined(FEAT_GUI_MACVIM) + /* The value returned is the length in display cells */ + len = gui_macvim_draw_string(gui.row, col, s, len, draw_flags); #else # ifdef FEAT_MBYTE if (enc_utf8) @@ -4002,7 +4019,8 @@ gui_update_scrollbars(force) /* Calculate height and position in pixels */ h = (sb->height + sb->status_height) * gui.char_height; y = sb->top * gui.char_height + gui.border_offset; -#if defined(FEAT_MENU) && !defined(FEAT_GUI_GTK) && !defined(FEAT_GUI_MOTIF) && !defined(FEAT_GUI_PHOTON) +#if defined(FEAT_MENU) && !(defined(FEAT_GUI_GTK) || defined(FEAT_GUI_MOTIF) \ + || defined(FEAT_GUI_PHOTON) || defined(FEAT_GUI_MACVIM)) if (gui.menu_is_active) y += gui.menu_height; #endif @@ -5062,7 +5080,8 @@ gui_do_findrepl(flags, find_text, repl_text, down) #if (defined(FEAT_DND) && defined(FEAT_GUI_GTK)) \ || defined(FEAT_GUI_MSWIN) \ || defined(FEAT_GUI_MAC) \ - || defined(PROTO) + || defined(PROTO) \ + || defined(FEAT_GUI_MACVIM) #ifdef FEAT_WINDOWS static void gui_wingoto_xy __ARGS((int x, int y)); diff --git a/src/gui.h b/src/gui.h index e4ee182bcf..3bf4da8619 100644 --- a/src/gui.h +++ b/src/gui.h @@ -151,7 +151,7 @@ #define DRAW_BOLD 0x02 /* draw bold text */ #define DRAW_UNDERL 0x04 /* draw underline text */ #define DRAW_UNDERC 0x08 /* draw undercurl text */ -#if defined(RISCOS) || defined(HAVE_GTK2) +#if defined(RISCOS) || defined(HAVE_GTK2) || defined(FEAT_GUI_MACVIM) # define DRAW_ITALIC 0x10 /* draw italic text */ #endif #define DRAW_CURSOR 0x20 /* drawing block cursor (win32) */ @@ -294,7 +294,7 @@ typedef struct Gui int right_sbar_x; /* Calculated x coord for right scrollbar */ #ifdef FEAT_MENU -# ifndef FEAT_GUI_GTK +# if !(defined(FEAT_GUI_GTK) || defined(FEAT_GUI_MACVIM)) int menu_height; /* Height of the menu bar */ int menu_width; /* Width of the menu bar */ # endif @@ -522,7 +522,7 @@ typedef enum # define FRD_MATCH_CASE 0x10 /* match case */ #endif -#ifdef HAVE_GTK2 +#ifdef HAVE_GTK2 || FEAT_GUI_MACVIM /* * Convenience macros to convert from 'encoding' to 'termencoding' and * vice versa. If no conversion is necessary the passed-in pointer is diff --git a/src/if_xcmdsrv.c b/src/if_xcmdsrv.c index 041ed5a461..19c0e3fdc6 100644 --- a/src/if_xcmdsrv.c +++ b/src/if_xcmdsrv.c @@ -14,7 +14,8 @@ #include "vim.h" #include "version.h" -#if defined(FEAT_CLIENTSERVER) || defined(PROTO) +#if (defined(FEAT_CLIENTSERVER) || defined(PROTO)) \ + && !defined(MAC_CLIENTSERVER) # ifdef FEAT_X11 # include diff --git a/src/main.c b/src/main.c index 6bd9ff4a5d..f5533abbd5 100644 --- a/src/main.c +++ b/src/main.c @@ -29,6 +29,10 @@ # include #endif +#if FEAT_GUI_MACVIM +#include /* for objc_*() and sel_*() */ +#endif + /* Maximum number of commands from + or -c arguments. */ #define MAX_ARG_CMDS 10 @@ -176,6 +180,15 @@ main mparm_T params; /* various parameters passed between * main() and other functions. */ +#if FEAT_GUI_MACVIM + // Cocoa needs an NSAutoreleasePool in place or it will leak memory. + // This particular pool will hold autorelease objects created during + // initialization. + id autoreleasePool = objc_msgSend(objc_msgSend( + objc_getClass("NSAutoreleasePool"),sel_getUid("alloc") + ), sel_getUid("init")); +#endif + /* * Do any system-specific initialisations. These can NOT use IObuff or * NameBuff. Thus emsg2() cannot be called! @@ -445,7 +458,7 @@ main params.want_full_screen = FALSE; #endif -#if defined(FEAT_GUI_MAC) && defined(MACOS_X_UNIX) +#if (defined(FEAT_GUI_MAC) || defined(FEAT_GUI_MACVIM)) && defined(MACOS_X_UNIX) /* When the GUI is started from Finder, need to display messages in a * message box. isatty(2) returns TRUE anyway, thus we need to check the * name to know we're not started from a terminal. */ @@ -934,11 +947,27 @@ main TIME_MSG("before starting main loop"); +#if FEAT_GUI_MACVIM + // The autorelease pool might have filled up quite a bit during + // initialization, so purge it before entering the main loop. + objc_msgSend(autoreleasePool, sel_getUid("release")); + + // The main loop sets up its own autorelease pool, but to be safe we still + // realloc this one here. + autoreleasePool = objc_msgSend(objc_msgSend( + objc_getClass("NSAutoreleasePool"),sel_getUid("alloc") + ), sel_getUid("init")); +#endif + /* * Call the main command loop. This never returns. */ main_loop(FALSE, FALSE); +#if FEAT_GUI_MACVIM + objc_msgSend(autoreleasePool, sel_getUid("release")); +#endif + return 0; } #endif /* PROTO */ @@ -997,6 +1026,14 @@ main_loop(cmdwin, noexmode) #endif ) { +#if FEAT_GUI_MACVIM + // Cocoa needs an NSAutoreleasePool in place or it will leak memory. + // This particular pool gets released once every loop. + id autoreleasePool = objc_msgSend(objc_msgSend( + objc_getClass("NSAutoreleasePool"),sel_getUid("alloc") + ), sel_getUid("init")); +#endif + if (stuff_empty()) { did_check_timestamps = FALSE; @@ -1179,6 +1216,12 @@ main_loop(cmdwin, noexmode) } else normal_cmd(&oa, TRUE); + +#if FEAT_GUI_MACVIM + // TODO! Make sure there are no continue statements that will cause + // this not to be called or MacVim will leak memory! + objc_msgSend(autoreleasePool, sel_getUid("release")); +#endif } } @@ -2739,7 +2782,7 @@ source_startup_scripts(parmp) #ifdef SYS_VIMRC_FILE (void)do_source((char_u *)SYS_VIMRC_FILE, FALSE, DOSO_NONE); #endif -#ifdef MACOS_X +#if defined(MACOS_X) && !defined(FEAT_GUI_MACVIM) (void)do_source((char_u *)"$VIMRUNTIME/macmap.vim", FALSE, DOSO_NONE); #endif @@ -3362,6 +3405,14 @@ prepare_server(parmp) } else serverDelayedStartName = parmp->servername; +# elif defined(MAC_CLIENTSERVER) + // NOTE: Can't set server name at same time as WIN32 because gui.in_use + // isn't set then. Servers are only supported in GUI mode. + if (parmp->servername != NULL && gui.in_use) + { + serverRegisterName(parmp->servername); + vim_free(parmp->servername); + } # endif /* @@ -3401,9 +3452,11 @@ cmdsrv_main(argc, argv, serverName_arg, serverStr) #define ARGTYPE_SEND 3 int silent = FALSE; int tabs = FALSE; -# ifndef FEAT_X11 +# ifdef WIN32 HWND srv; -# else +# elif defined(MAC_CLIENTSERVER) + int srv; +# elif defined(FEAT_X11) Window srv; setup_term_clip(); @@ -3495,7 +3548,7 @@ cmdsrv_main(argc, argv, serverName_arg, serverStr) else ret = serverSendToVim(xterm_dpy, sname, *serverStr, NULL, &srv, 0, 0, silent); -# else +# elif defined(WIN32) || defined(MAC_CLIENTSERVER) /* Win32 always works? */ ret = serverSendToVim(sname, *serverStr, NULL, &srv, 0, silent); # endif @@ -3560,9 +3613,12 @@ cmdsrv_main(argc, argv, serverName_arg, serverStr) p = serverGetReply(srv, NULL, TRUE, TRUE); if (p == NULL) break; -# else +# elif defined(FEAT_X11) if (serverReadReply(xterm_dpy, srv, &p, TRUE) < 0) break; +# elif defined(MAC_CLIENTSERVER) + if (serverReadReply(srv, &p) < 0) + break; # endif j = atoi((char *)p); if (j >= 0 && j < numFiles) @@ -3589,11 +3645,14 @@ cmdsrv_main(argc, argv, serverName_arg, serverStr) /* Win32 always works? */ if (serverSendToVim(sname, (char_u *)argv[i + 1], &res, NULL, 1, FALSE) < 0) -# else +# elif defined(FEAT_X11) if (xterm_dpy == NULL) mch_errmsg(_("No display: Send expression failed.\n")); else if (serverSendToVim(xterm_dpy, sname, (char_u *)argv[i + 1], &res, NULL, 1, 1, FALSE) < 0) +# elif defined(MAC_CLIENTSERVER) + if (serverSendToVim(sname, (char_u *)argv[i + 1], + &res, NULL, 1, FALSE) < 0) # endif { if (res != NULL && *res != NUL) @@ -3608,10 +3667,10 @@ cmdsrv_main(argc, argv, serverName_arg, serverStr) } else if (STRICMP(argv[i], "--serverlist") == 0) { -# ifdef WIN32 +# if defined(WIN32) || defined(MAC_CLIENTSERVER) /* Win32 always works? */ res = serverGetVimNames(); -# else +# elif defined(FEAT_X11) if (xterm_dpy != NULL) res = serverGetVimNames(xterm_dpy); # endif diff --git a/src/menu.c b/src/menu.c index f0683512ec..bd4b4f292c 100644 --- a/src/menu.c +++ b/src/menu.c @@ -97,7 +97,7 @@ ex_menu(eap) char_u *arg; char_u *p; int i; -#if defined(FEAT_GUI) && !defined(FEAT_GUI_GTK) +#if defined(FEAT_GUI) && !(defined(FEAT_GUI_GTK) || defined(FEAT_GUI_MACVIM)) int old_menu_height; # if defined(FEAT_TOOLBAR) && !defined(FEAT_GUI_W32) && !defined(FEAT_GUI_W16) int old_toolbar_height; @@ -322,7 +322,8 @@ ex_menu(eap) EMSG(_(e_trailing)); goto theend; } -#if defined(FEAT_GUI) && !(defined(FEAT_GUI_GTK) || defined(FEAT_GUI_PHOTON)) +#if defined(FEAT_GUI) && !(defined(FEAT_GUI_GTK) || defined(FEAT_GUI_PHOTON) \ + || defined(FEAT_GUI_MACVIM)) old_menu_height = gui.menu_height; # if defined(FEAT_TOOLBAR) && !defined(FEAT_GUI_W32) && !defined(FEAT_GUI_W16) old_toolbar_height = gui.toolbar_height; @@ -441,7 +442,7 @@ ex_menu(eap) vim_free(map_buf); } -#if defined(FEAT_GUI) && !(defined(FEAT_GUI_GTK)) +#if defined(FEAT_GUI) && !(defined(FEAT_GUI_GTK) || defined(FEAT_GUI_MACVIM)) /* If the menubar height changed, resize the window */ if (gui.in_use && (gui.menu_height != old_menu_height @@ -2259,7 +2260,7 @@ ex_emenu(eap) EMSG2(_("E335: Menu not defined for %s mode"), mode); } -#if defined(FEAT_GUI_MSWIN) \ +#if defined(FEAT_GUI_MSWIN) || defined(FEAT_GUI_MACVIM)\ || (defined(FEAT_GUI_GTK) && defined(FEAT_MENU)) \ || defined(FEAT_BEVAL_TIP) || defined(PROTO) /* @@ -2470,4 +2471,144 @@ menutrans_lookup(name, len) } #endif /* FEAT_MULTI_LANG */ + +#ifdef FEAT_GUI_MACVIM + void +ex_macmenukey(eap) + exarg_T *eap; +{ + char_u *arg = eap->arg; + char_u *keys, *name, *p; + vimmenu_T *menu; + char_u *last_dash; + int modifiers; + int bit; + int key; + + /* + * Isolate the menu name. + */ + name = arg; + if (*name == '.') + { + EMSG2(_(e_invarg2), name); + return; + } + + while (*arg && !vim_iswhite(*arg)) + { + if ((*arg == '\\' || *arg == Ctrl_V) && arg[1] != NUL) + arg++; + arg++; + } + if (*arg != NUL) + *arg++ = NUL; + arg = skipwhite(arg); + keys = arg; + + // TODO: move to gui_find_menu_item(path_name) + menu = root_menu; + while (*name) + { + /* find the end of one dot-separated name and put a NUL at the dot */ + p = menu_name_skip(name); + + while (menu != NULL) + { + if (STRCMP(name, menu->name) == 0 || STRCMP(name, menu->dname) == 0) + { + if (*p == NUL) + { + if (menu->children != NULL) + menu = NULL; + goto search_end; + } + break; + } + menu = menu->next; + } + if (menu == NULL) /* didn't find it */ + break; + + /* Found a match, search the sub-menu. */ + menu = menu->children; + name = p; + } + +search_end: + if (!menu) { + EMSG(_("E337: Menu not found - check menu names")); + return; + } + + if (keys[0] == '<') + { + key = 0; + + /* Find end of modifier list */ + last_dash = keys; + for (p = keys + 1; *p == '-' || vim_isIDc(*p); p++) + { + if (*p == '-') + { + last_dash = p; + if (p[1] != NUL && p[2] == '>') + ++p; /* anything accepted, like */ + } + if (p[0] == 't' && p[1] == '_' && p[2] && p[3]) + p += 3; /* skip t_xx, xx may be '-' or '>' */ + } + + if (*p == '>') /* found matching '>' */ + { + /* Which modifiers are given? */ + modifiers = 0x0; + for (p = keys + 1; p < last_dash; p++) + { + if (*p != '-') + { + bit = name_to_mod_mask(*p); + if (bit == 0x0) + break; /* Illegal modifier name */ + modifiers |= bit; + } + } + + /* + * Legal modifier name. + */ + if (p >= last_dash) + { + /* + * Modifier with single letter, or special key name. + */ + if (modifiers != 0 && last_dash[2] == '>') + key = last_dash[1]; + else + { + key = get_special_key_code(last_dash + 1); + key = handle_x_keys(key); + } + } + } + + if (key != 0) + { + menu->mac_key = key; + menu->mac_mods = modifiers; + } + } + else if (keys[0] == NUL) + { + /* Clear the key equivalent */ + menu->mac_key = 0; + menu->mac_mods = 0; + } + else + { + EMSG(_(e_invarg)); + } +} +#endif /* FEAT_GUI_MACVIM */ + #endif /* FEAT_MENU */ diff --git a/src/normal.c b/src/normal.c index 0b19d53771..30a45a3e5c 100644 --- a/src/normal.c +++ b/src/normal.c @@ -2528,7 +2528,8 @@ do_mouse(oap, c, dir, count, fixindent) * Windows only shows the popup menu on the button up event. */ #if defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_GTK) \ - || defined(FEAT_GUI_PHOTON) || defined(FEAT_GUI_MAC) + || defined(FEAT_GUI_PHOTON) || defined(FEAT_GUI_MAC) \ + || defined(FEAT_GUI_MACVIM) if (!is_click) return FALSE; #endif @@ -2538,7 +2539,8 @@ do_mouse(oap, c, dir, count, fixindent) #endif #if defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_GTK) \ || defined(FEAT_GUI_ATHENA) || defined(FEAT_GUI_MSWIN) \ - || defined(FEAT_GUI_MAC) || defined(FEAT_GUI_PHOTON) + || defined(FEAT_GUI_MAC) || defined(FEAT_GUI_PHOTON) \ + || defined(FEAT_GUI_MACVIM) if (gui.in_use) { jump_flags = 0; diff --git a/src/option.c b/src/option.c index d0fc1b2090..021729f022 100644 --- a/src/option.c +++ b/src/option.c @@ -1152,6 +1152,13 @@ static struct vimoption {(char_u *)FALSE, (char_u *)0L} #endif }, + {"fullscreen", "fu", P_BOOL, +#ifdef FEAT_FULLSCREEN + (char_u *)&p_fullscreen, PV_NONE, +#else + (char_u *)NULL, PV_NONE, +#endif + {(char_u *)FALSE, (char_u *)0L}}, {"gdefault", "gd", P_BOOL|P_VI_DEF|P_VIM, (char_u *)&p_gd, PV_NONE, {(char_u *)FALSE, (char_u *)0L}}, @@ -2511,11 +2518,19 @@ static struct vimoption (char_u *)&p_toolbar, PV_NONE, {(char_u *)"icons,tooltips", (char_u *)0L}}, #endif -#if defined(FEAT_TOOLBAR) && defined(FEAT_GUI_GTK) && defined(HAVE_GTK2) +#if defined(FEAT_TOOLBAR) && ((defined(FEAT_GUI_GTK) && defined(HAVE_GTK2)) \ + || defined(FEAT_GUI_MACVIM)) {"toolbariconsize", "tbis", P_STRING|P_VI_DEF, (char_u *)&p_tbis, PV_NONE, {(char_u *)"small", (char_u *)0L}}, #endif + {"transparency", "transp", P_NUM|P_VIM|P_RCLR, +#ifdef FEAT_TRANSPARENCY + (char_u *)&p_transp, PV_NONE, +#else + (char_u *)NULL, PV_NONE, +#endif + {(char_u *)0L, (char_u *)0L} }, {"ttimeout", NULL, P_BOOL|P_VI_DEF|P_VIM, (char_u *)&p_ttimeout, PV_NONE, {(char_u *)FALSE, (char_u *)0L}}, @@ -2936,6 +2951,9 @@ set_init_1() char_u *p; int opt_idx; long_u n; +#ifdef FEAT_GUI_MACVIM + int did_mb_init; +#endif #ifdef FEAT_LANGMAP langmap_init(); @@ -3302,7 +3320,22 @@ set_init_1() p_enc = vim_strsave((char_u *)"cp936"); vim_free(p); } +#if defined(FEAT_GUI_MACVIM) + did_mb_init = (mb_init() == NULL); + if (!did_mb_init) + { + /* The encoding returned by enc_locale() was invalid, so fall back + * on using utf-8 as the default encoding in MacVim. */ + vim_free(p_enc); + p_enc = vim_strsave((char_u *)"utf-8"); + did_mb_init = (mb_init() == NULL); + } + + /* did_mb_init should always be TRUE, but check just in case. */ + if (did_mb_init) +#else if (mb_init() == NULL) +#endif { opt_idx = findoption((char_u *)"encoding"); if (opt_idx >= 0) @@ -5043,7 +5076,8 @@ didset_options() #if defined(FEAT_TOOLBAR) && !defined(FEAT_GUI_W32) (void)opt_strings_flags(p_toolbar, p_toolbar_values, &toolbar_flags, TRUE); #endif -#if defined(FEAT_TOOLBAR) && defined(FEAT_GUI_GTK) && defined(HAVE_GTK2) +#if defined(FEAT_TOOLBAR) && ((defined(FEAT_GUI_GTK) && defined(HAVE_GTK2)) \ + || defined(FEAT_GUI_MACVIM)) (void)opt_strings_flags(p_tbis, p_tbis_values, &tbis_flags, FALSE); #endif #ifdef FEAT_CMDWIN @@ -5698,12 +5732,16 @@ did_set_string_option(opt_idx, varp, new_value_alloced, oldval, errbuf, } } -# if defined(FEAT_GUI_GTK) && defined(HAVE_GTK2) +# if (defined(FEAT_GUI_GTK) && defined(HAVE_GTK2)) || defined(FEAT_GUI_MACVIM) if (errmsg == NULL && varp == &p_tenc && gui.in_use) { - /* GTK+ 2 uses only a single encoding, and that is UTF-8. */ + /* MacVim and GTK+ 2 GUIs force 'tenc' to UTF-8. */ if (STRCMP(p_tenc, "utf-8") != 0) +# if defined(FEAT_GUI_MACVIM) + errmsg = (char_u *)N_("E617: Cannot be changed in MacVim"); +# else errmsg = (char_u *)N_("E617: Cannot be changed in the GTK+ 2 GUI"); +# endif } # endif @@ -6046,7 +6084,8 @@ did_set_string_option(opt_idx, varp, new_value_alloced, oldval, errbuf, # endif if (p != NULL && gui_init_font(p_guifont, FALSE) != OK) { -# if defined(FEAT_GUI_MSWIN) || defined(FEAT_GUI_PHOTON) +# if defined(FEAT_GUI_MSWIN) || defined(FEAT_GUI_PHOTON) \ + || defined(FEAT_GUI_MACVIM) if (STRCMP(p_guifont, "*") == 0) { /* Dialog was cancelled: Keep the old value without giving @@ -6427,8 +6466,9 @@ did_set_string_option(opt_idx, varp, new_value_alloced, oldval, errbuf, } #endif -#if defined(FEAT_TOOLBAR) && defined(FEAT_GUI_GTK) && defined(HAVE_GTK2) - /* 'toolbariconsize': GTK+ 2 only */ +#if defined(FEAT_TOOLBAR) && ((defined(FEAT_GUI_GTK) && defined(HAVE_GTK2)) \ + || defined(FEAT_GUI_MACVIM)) + /* 'toolbariconsize': GTK+ 2 and MacVim only */ else if (varp == &p_tbis) { if (opt_strings_flags(p_tbis, p_tbis_values, &tbis_flags, FALSE) != OK) @@ -7250,6 +7290,17 @@ set_bool_option(opt_idx, varp, value, opt_flags) set_fileformat(curbuf->b_p_tx ? EOL_DOS : EOL_UNIX, opt_flags); } +#ifdef FEAT_FULLSCREEN + /* when 'fullscreen' changes, forward it to the gui */ + else if ((int *)varp == &p_fullscreen && gui.in_use) + { + if (p_fullscreen && !old_value) + gui_mch_enter_fullscreen(); + else if (!p_fullscreen && old_value) + gui_mch_leave_fullscreen(); + } +#endif + /* when 'textauto' is set or reset also change 'fileformats' */ else if ((int *)varp == &p_ta) set_string_option_direct((char_u *)"ffs", -1, @@ -7880,6 +7931,20 @@ set_num_option(opt_idx, varp, value, errbuf, errbuflen, opt_flags) } #endif +#if defined(FEAT_TRANSPARENCY) + /* 'transparency' is a number between 0 and 100 */ + else if (pp == &p_transp) + { + if (p_transp < 0 || p_transp > 100) + { + errmsg = e_invarg; + p_transp = old_value; + } + else if (gui.in_use) + gui_mch_new_colors(); + } +#endif + /* * Check the bounds for numeric options here */ diff --git a/src/option.h b/src/option.h index 6208a1c2ab..249e8baa35 100644 --- a/src/option.h +++ b/src/option.h @@ -468,6 +468,9 @@ EXTERN char_u *p_fp; /* 'formatprg' */ #ifdef HAVE_FSYNC EXTERN int p_fs; /* 'fsync' */ #endif +#ifdef FEAT_FULLSCREEN +EXTERN int p_fullscreen; +#endif EXTERN int p_gd; /* 'gdefault' */ #ifdef FEAT_PRINTER EXTERN char_u *p_pdev; /* 'printdevice' */ @@ -764,6 +767,9 @@ EXTERN char_u *p_titlestring; /* 'titlestring' */ #ifdef FEAT_INS_EXPAND EXTERN char_u *p_tsr; /* 'thesaurus' */ #endif +#ifdef FEAT_TRANSPARENCY +EXTERN long p_transp; /* 'transparency' */ +#endif EXTERN int p_ttimeout; /* 'ttimeout' */ EXTERN long p_ttm; /* 'ttimeoutlen' */ EXTERN int p_tbi; /* 'ttybuiltin' */ @@ -779,7 +785,8 @@ static char *(p_toolbar_values[]) = {"text", "icons", "tooltips", "horiz", NULL} # define TOOLBAR_TOOLTIPS 0x04 # define TOOLBAR_HORIZ 0x08 #endif -#if defined(FEAT_TOOLBAR) && defined(FEAT_GUI_GTK) && defined(HAVE_GTK2) +#if defined(FEAT_TOOLBAR) && ((defined(FEAT_GUI_GTK) && defined(HAVE_GTK2)) \ + || defined(FEAT_GUI_MACVIM)) EXTERN char_u *p_tbis; /* 'toolbariconsize' */ EXTERN unsigned tbis_flags; # ifdef IN_OPTION_C diff --git a/src/os_unix.c b/src/os_unix.c index c062ad1bf3..9acb344ef7 100644 --- a/src/os_unix.c +++ b/src/os_unix.c @@ -1934,7 +1934,8 @@ mch_settitle(title, icon) if (get_x11_windis() == OK) type = 1; #else -# if defined(FEAT_GUI_PHOTON) || defined(FEAT_GUI_MAC) || defined(FEAT_GUI_GTK) +# if defined(FEAT_GUI_PHOTON) || defined(FEAT_GUI_MAC) \ + || defined(FEAT_GUI_GTK) || defined(FEAT_GUI_MACVIM) if (gui.in_use) type = 1; # endif @@ -1963,7 +1964,8 @@ mch_settitle(title, icon) set_x11_title(title); /* x11 */ #endif #if defined(FEAT_GUI_GTK) \ - || defined(FEAT_GUI_PHOTON) || defined(FEAT_GUI_MAC) + || defined(FEAT_GUI_PHOTON) || defined(FEAT_GUI_MAC) \ + || defined(FEAT_GUI_MACVIM) else gui_mch_settitle(title, icon); #endif diff --git a/src/proto.h b/src/proto.h index 85f49378c7..3cf7e48c86 100644 --- a/src/proto.h +++ b/src/proto.h @@ -214,6 +214,9 @@ extern char *vim_SelFile __ARGS((Widget toplevel, char *prompt, char *init_path, # ifdef FEAT_GUI_MAC # include "gui_mac.pro" # endif +# ifdef FEAT_GUI_MACVIM +# include "gui_macvim.pro" +# endif # ifdef FEAT_GUI_X11 # include "gui_x11.pro" # endif diff --git a/src/proto/gui_macvim.pro b/src/proto/gui_macvim.pro new file mode 100644 index 0000000000..b821f5b2e3 --- /dev/null +++ b/src/proto/gui_macvim.pro @@ -0,0 +1,196 @@ + + void +gui_mch_prepare(int *argc, char **argv); + int +gui_mch_init_check(void); + int +gui_mch_init(void); + void +gui_mch_exit(int rc); + int +gui_mch_open(void); + void +gui_mch_update(void); + void +gui_mch_flush(void); + void +gui_macvim_force_flush(void); + int +gui_mch_wait_for_chars(int wtime); + void +gui_mch_clear_all(void); + void +gui_mch_clear_block(int row1, int col1, int row2, int col2); + void +gui_mch_delete_lines(int row, int num_lines); + void +gui_mch_draw_string(int row, int col, char_u *s, int len, int flags); + int +gui_macvim_draw_string(int row, int col, char_u *s, int len, int flags); + void +gui_mch_insert_lines(int row, int num_lines); + void +gui_mch_set_curtab(int nr); + int +gui_mch_showing_tabline(void); + void +gui_mch_update_tabline(void); + void +gui_mch_show_tabline(int showit); + void +clip_mch_lose_selection(VimClipboard *cbd); + int +clip_mch_own_selection(VimClipboard *cbd); + void +clip_mch_request_selection(VimClipboard *cbd); + void +clip_mch_set_selection(VimClipboard *cbd); + void +gui_mch_add_menu(vimmenu_T *menu, int idx); + void +gui_mch_add_menu_item(vimmenu_T *menu, int idx); + void +gui_mch_destroy_menu(vimmenu_T *menu); + void +gui_mch_menu_grey(vimmenu_T *menu, int grey); + void +gui_mch_menu_hidden(vimmenu_T *menu, int hidden); + void +gui_mch_show_popupmenu(vimmenu_T *menu); + void +gui_mch_draw_menubar(void); + void +gui_mch_enable_menu(int flag); + void +gui_mch_show_toolbar(int showit); + void +gui_mch_free_font(GuiFont font); + GuiFont +gui_mch_get_font(char_u *name, int giveErrorIfMissing); + char_u * +gui_mch_get_fontname(GuiFont font, char_u *name); + int +gui_mch_init_font(char_u *font_name, int fontset); + void +gui_mch_set_font(GuiFont font); + int +gui_mch_adjust_charheight(void); + void +gui_mch_beep(void); + char_u * +gui_mch_browse( + int saving, + char_u *title, + char_u *dflt, + char_u *ext, + char_u *initdir, + char_u *filter); + void +gui_mch_create_scrollbar( + scrollbar_T *sb, + int orient); + void +gui_mch_destroy_scrollbar(scrollbar_T *sb); + int +gui_mch_dialog( + int type, + char_u *title, + char_u *message, + char_u *buttons, + int dfltbutton, + char_u *textfield); + void +gui_mch_draw_hollow_cursor(guicolor_T color); + void +gui_mch_draw_part_cursor(int w, int h, guicolor_T color); + void +gui_mch_enable_scrollbar( + scrollbar_T *sb, + int flag); + void +gui_mch_flash(int msec); + guicolor_T +gui_mch_get_color(char_u *name); + long_u +gui_mch_get_rgb(guicolor_T pixel); + void +gui_mch_get_screen_dimensions(int *screen_w, int *screen_h); + int +gui_mch_get_winpos(int *x, int *y); + void +gui_mch_getmouse(int *x, int *y); + int +gui_mch_haskey(char_u *name); + void +gui_mch_iconify(void); + void +gui_mch_invert_rectangle(int r, int c, int nr, int nc); + void +gui_mch_new_colors(void); + void +gui_mch_set_bg_color(guicolor_T color); + void +gui_mch_set_blinking(long wait, long on, long off); + void +gui_mch_set_fg_color(guicolor_T color); + void +gui_mch_set_foreground(void); + void +gui_mch_set_scrollbar_pos( + scrollbar_T *sb, + int x, + int y, + int w, + int h); + void +gui_mch_set_scrollbar_thumb( + scrollbar_T *sb, + long val, + long size, + long max); + void +gui_mch_set_shellsize( + int width, + int height, + int min_width, + int min_height, + int base_width, + int base_height, + int direction); + void +gui_mch_set_sp_color(guicolor_T color); + void +gui_mch_set_text_area_pos(int x, int y, int w, int h); + void +gui_mch_set_winpos(int x, int y); + void +gui_mch_setmouse(int x, int y); + void +gui_mch_settitle(char_u *title, char_u *icon); + void +gui_mch_start_blink(void); + void +gui_mch_stop_blink(void); + void +gui_mch_toggle_tearoffs(int enable); + void +mch_set_mouse_shape(int shape); + void +gui_mch_def_colors(); + void +ex_macaction(exarg_T *eap); + void +gui_make_popup(char_u *path_name, int mouse_pos); + +void serverRegisterName(char_u *name); +int serverSendToVim(char_u *name, char_u *cmd, char_u **result, int *server, int asExpr, int silent); +char_u *serverGetVimNames(void); +int serverStrToPort(char_u *str); +int serverPeekReply(int port, char_u **str); +int serverReadReply(int port, char_u **str); +int serverSendReply(char_u *serverid, char_u *str); + +void gui_mch_enter_fullscreen(void); +void gui_mch_leave_fullscreen(void); + +void gui_macvim_update_modified_flag(); diff --git a/src/proto/menu.pro b/src/proto/menu.pro index a816bc58ba..3d85d7562b 100644 --- a/src/proto/menu.pro +++ b/src/proto/menu.pro @@ -19,4 +19,7 @@ void gui_mch_toggle_tearoffs __ARGS((int enable)); void ex_emenu __ARGS((exarg_T *eap)); vimmenu_T *gui_find_menu __ARGS((char_u *path_name)); void ex_menutranslate __ARGS((exarg_T *eap)); +#ifdef FEAT_GUI_MACVIM +void ex_macmenukey __ARGS((exarg_T *eap)); +#endif /* vim: set ft=c : */ diff --git a/src/structs.h b/src/structs.h index 0a56d02e16..2a6487f8c9 100644 --- a/src/structs.h +++ b/src/structs.h @@ -2245,6 +2245,10 @@ struct VimMenu PtWidget_t *id; PtWidget_t *submenu_id; #endif +#ifdef FEAT_GUI_MACVIM + int mac_key; + int mac_mods; +#endif }; #else /* For generating prototypes when FEAT_MENU isn't defined. */ diff --git a/src/syntax.c b/src/syntax.c index e321313bed..a1ed8b142c 100644 --- a/src/syntax.c +++ b/src/syntax.c @@ -6650,7 +6650,8 @@ do_highlight(line, forceit, init) gui_init_menu_font(); # endif } -# if defined(FEAT_GUI_MSWIN) || defined(FEAT_GUI_X11) +# if defined(FEAT_GUI_MSWIN) || defined(FEAT_GUI_X11) \ + || defined(FEAT_GUI_MACVIM) gui_mch_def_colors(); # endif # ifdef FEAT_GUI_X11 diff --git a/src/ui.c b/src/ui.c index 5a8c37d80c..5e4f69f10c 100644 --- a/src/ui.c +++ b/src/ui.c @@ -247,8 +247,18 @@ ui_delay(msec, ignoreinput) if (gui.in_use && !ignoreinput) gui_wait_for_chars(msec); else +#endif + { +#if defined(FEAT_GUI_MACVIM) + /* MacVim tries to be conservative with flushing, but when Vim takes a + * nap it really must flush (else timed error messages might not appear + * etc.). Note that gui_mch_wait_for_chars() already does force a + * flush, so only do it here. */ + if (gui.in_use) + gui_macvim_force_flush(); #endif mch_delay(msec, ignoreinput); + } } /* @@ -2938,7 +2948,8 @@ mouse_find_win(rowp, colp) #if defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_GTK) || defined (FEAT_GUI_MAC) \ || defined(FEAT_GUI_ATHENA) || defined(FEAT_GUI_MSWIN) \ - || defined(FEAT_GUI_PHOTON) || defined(PROTO) + || defined(FEAT_GUI_PHOTON) || defined(PROTO) \ + || defined(FEAT_GUI_MACVIM) /* * Translate window coordinates to buffer position without any side effects */ diff --git a/src/version.c b/src/version.c index 6763d6667d..be38a78fa0 100644 --- a/src/version.c +++ b/src/version.c @@ -231,6 +231,11 @@ static char *(features[]) = #if !defined(USE_SYSTEM) && defined(UNIX) "+fork()", #endif +#ifdef FEAT_FULLSCREEN + "+fullscreen", +#else + "-fullscreen", +#endif #ifdef FEAT_GETTEXT # ifdef DYNAMIC_GETTEXT "+gettext/dyn", @@ -561,6 +566,11 @@ static char *(features[]) = #else "-toolbar", #endif +#ifdef FEAT_TRANSPARENCY + "+transparency", +#else + "-transparency", +#endif #ifdef FEAT_USR_CMDS "+user_commands", #else @@ -1165,15 +1175,19 @@ list_version() # if defined(MSWIN) MSG_PUTS(_("with GUI.")); # else -# if defined (TARGET_API_MAC_CARBON) && TARGET_API_MAC_CARBON +# if defined FEAT_GUI_MACVIM + MSG_PUTS(_("with MacVim GUI.")); +# else +# if defined (TARGET_API_MAC_CARBON) && TARGET_API_MAC_CARBON MSG_PUTS(_("with Carbon GUI.")); -# else -# if defined (TARGET_API_MAC_OSX) && TARGET_API_MAC_OSX - MSG_PUTS(_("with Cocoa GUI.")); # else -# if defined (MACOS) +# if defined (TARGET_API_MAC_OSX) && TARGET_API_MAC_OSX + MSG_PUTS(_("with Cocoa GUI.")); +# else +# if defined (MACOS) MSG_PUTS(_("with (classic) GUI.")); -# endif +# endif +# endif # endif # endif # endif @@ -1332,7 +1346,12 @@ intro_message(colon) "", N_("type :q to exit "), N_("type :help or for on-line help"), +#ifdef FEAT_GUI_MACVIM + // TODO: Don't steal the show from version7 help? + N_("type :help macvim for MacVim help "), +#else N_("type :help version7 for version info"), +#endif NULL, "", N_("Running in Vi compatible mode"), diff --git a/src/vim.h b/src/vim.h index 05efc9a20e..9b25537ce1 100644 --- a/src/vim.h +++ b/src/vim.h @@ -93,6 +93,7 @@ || defined(FEAT_GUI_GTK) \ || defined(FEAT_GUI_ATHENA) \ || defined(FEAT_GUI_MAC) \ + || defined(FEAT_GUI_MACVIM) \ || defined(FEAT_GUI_W32) \ || defined(FEAT_GUI_W16) \ || defined(FEAT_GUI_PHOTON) From b87efbbe54f3eb25e6a2bf514247f620243a9404 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Thu, 18 Oct 2007 17:44:44 +0200 Subject: [PATCH 0292/1156] Generated configure script --- src/configure | 16789 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 16782 insertions(+), 7 deletions(-) diff --git a/src/configure b/src/configure index d8595a5244..89ed9bc068 100755 --- a/src/configure +++ b/src/configure @@ -1,10 +1,16785 @@ #! /bin/sh -# run the automatically generated configure script -CONFIG_STATUS=auto/config.status \ - auto/configure "$@" --srcdir="${srcdir:-.}" --cache-file=auto/config.cache -result=$? +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.59. +# +# Copyright (C) 2003 Free Software Foundation, Inc. +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. +## --------------------- ## +## M4sh Initialization. ## +## --------------------- ## + +# Be Bourne compatible +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' +elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then + set -o posix +fi +DUALCASE=1; export DUALCASE # for MKS sh + +# Support unset when possible. +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + + +# Work around bugs in pre-3.0 UWIN ksh. +$as_unset ENV MAIL MAILPATH +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +for as_var in \ + LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ + LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ + LC_TELEPHONE LC_TIME +do + if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then + eval $as_var=C; export $as_var + else + $as_unset $as_var + fi +done + +# Required to use basename. +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr +else + as_expr=false +fi + +if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + + +# Name of the executable. +as_me=`$as_basename "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)$' \| \ + . : '\(.\)' 2>/dev/null || +echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } + /^X\/\(\/\/\)$/{ s//\1/; q; } + /^X\/\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + + +# PATH needs CR, and LINENO needs CR and PATH. +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" || { + # Find who we are. Look in the path if we contain no path at all + # relative or not. + case $0 in + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break +done + + ;; + esac + # We did not find ourselves, most probably we were run as `sh COMMAND' + # in which case we are not to be found in the path. + if test "x$as_myself" = x; then + as_myself=$0 + fi + if test ! -f "$as_myself"; then + { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2 + { (exit 1); exit 1; }; } + fi + case $CONFIG_SHELL in + '') + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for as_base in sh bash ksh sh5; do + case $as_dir in + /*) + if ("$as_dir/$as_base" -c ' + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then + $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } + $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } + CONFIG_SHELL=$as_dir/$as_base + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$0" ${1+"$@"} + fi;; + esac + done +done +;; + esac + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line before each line; the second 'sed' does the real + # work. The second script uses 'N' to pair each line-number line + # with the numbered line, and appends trailing '-' during + # substitution so that $LINENO is not a special case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) + sed '=' <$as_myself | + sed ' + N + s,$,-, + : loop + s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, + t loop + s,-$,, + s,^['$as_cr_digits']*\n,, + ' >$as_me.lineno && + chmod +x $as_me.lineno || + { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 + { (exit 1); exit 1; }; } + + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensible to this). + . ./$as_me.lineno + # Exit status is that of the last command. + exit +} + + +case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in + *c*,-n*) ECHO_N= ECHO_C=' +' ECHO_T=' ' ;; + *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; + *) ECHO_N= ECHO_C='\c' ECHO_T= ;; +esac + +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr +else + as_expr=false +fi + +rm -f conf$$ conf$$.exe conf$$.file +echo >conf$$.file +if ln -s conf$$.file conf$$ 2>/dev/null; then + # We could just check for DJGPP; but this test a) works b) is more generic + # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). + if test -f conf$$.exe; then + # Don't use ln at all; we don't have any links + as_ln_s='cp -p' + else + as_ln_s='ln -s' + fi +elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.file + +if mkdir -p . 2>/dev/null; then + as_mkdir_p=: +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +as_executable_p="test -f" + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +# IFS +# We need space, tab and new line, in precisely that order. +as_nl=' +' +IFS=" $as_nl" + +# CDPATH. +$as_unset CDPATH + + +# Name of the host. +# hostname on some systems (SVR3.2, Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +exec 6>&1 + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_config_libobj_dir=. +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= +SHELL=${CONFIG_SHELL-/bin/sh} + +# Maximum number of lines to put in a shell here document. +# This variable seems obsolete. It should probably be removed, and +# only ac_max_sed_lines should be used. +: ${ac_max_here_lines=38} + +# Identity of this package. +PACKAGE_NAME= +PACKAGE_TARNAME= +PACKAGE_VERSION= +PACKAGE_STRING= +PACKAGE_BUGREPORT= + +ac_unique_file="vim.h" +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#if HAVE_SYS_TYPES_H +# include +#endif +#if HAVE_SYS_STAT_H +# include +#endif +#if STDC_HEADERS +# include +# include +#else +# if HAVE_STDLIB_H +# include +# endif +#endif +#if HAVE_STRING_H +# if !STDC_HEADERS && HAVE_MEMORY_H +# include +# endif +# include +#endif +#if HAVE_STRINGS_H +# include +#endif +#if HAVE_INTTYPES_H +# include +#else +# if HAVE_STDINT_H +# include +# endif +#endif +#if HAVE_UNISTD_H +# include +#endif" + +ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS SET_MAKE CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT CPP EGREP AWK STRIP CPP_MM OS_EXTRA_SRC OS_EXTRA_OBJ VIMNAME EXNAME VIEWNAME line_break dovimdiff dogvimdiff compiledby vi_cv_path_mzscheme MZSCHEME_SRC MZSCHEME_OBJ MZSCHEME_PRO MZSCHEME_LIBS MZSCHEME_CFLAGS vi_cv_path_perl vi_cv_perllib shrpenv PERL_SRC PERL_OBJ PERL_PRO PERL_CFLAGS PERL_LIBS vi_cv_path_python PYTHON_CONFDIR PYTHON_LIBS PYTHON_GETPATH_CFLAGS PYTHON_CFLAGS PYTHON_SRC PYTHON_OBJ vi_cv_path_tcl TCL_SRC TCL_OBJ TCL_PRO TCL_CFLAGS TCL_LIBS vi_cv_path_ruby RUBY_SRC RUBY_OBJ RUBY_PRO RUBY_CFLAGS RUBY_LIBS WORKSHOP_SRC WORKSHOP_OBJ NETBEANS_SRC NETBEANS_OBJ SNIFF_SRC SNIFF_OBJ xmkmfpath X_CFLAGS X_PRE_LIBS X_LIBS X_EXTRA_LIBS X_LIB GTK_CONFIG GTK12_CONFIG PKG_CONFIG GTK_CFLAGS GTK_LIBS GTK_LIBNAME GNOME_LIBS GNOME_LIBDIR GNOME_INCLUDEDIR GNOME_CONFIG MOTIF_LIBNAME NARROW_PROTO GUI_INC_LOC GUI_LIB_LOC GUITYPE GUI_X_LIBS HANGULIN_SRC HANGULIN_OBJ TAGPRG INSTALL_LANGS INSTALL_TOOL_LANGS MSGFMT MAKEMO DEPEND_CFLAGS_FILTER LIBOBJS LTLIBOBJS' +ac_subst_files='' + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datadir='${prefix}/share' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +libdir='${exec_prefix}/lib' +includedir='${prefix}/include' +oldincludedir='/usr/include' +infodir='${prefix}/info' +mandir='${prefix}/man' + +ac_prev= +for ac_option +do + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval "$ac_prev=\$ac_option" + ac_prev= + continue + fi + + ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'` + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $ac_option in + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad | --data | --dat | --da) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ + | --da=*) + datadir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid feature name: $ac_feature" >&2 + { (exit 1); exit 1; }; } + ac_feature=`echo $ac_feature | sed 's/-/_/g'` + eval "enable_$ac_feature=no" ;; + + -enable-* | --enable-*) + ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid feature name: $ac_feature" >&2 + { (exit 1); exit 1; }; } + ac_feature=`echo $ac_feature | sed 's/-/_/g'` + case $ac_option in + *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; + *) ac_optarg=yes ;; + esac + eval "enable_$ac_feature='$ac_optarg'" ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir=$ac_optarg ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir=$ac_optarg ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir=$ac_optarg ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst \ + | --locals | --local | --loca | --loc | --lo) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* \ + | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) + localstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid package name: $ac_package" >&2 + { (exit 1); exit 1; }; } + ac_package=`echo $ac_package| sed 's/-/_/g'` + case $ac_option in + *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; + *) ac_optarg=yes ;; + esac + eval "with_$ac_package='$ac_optarg'" ;; + + -without-* | --without-*) + ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid package name: $ac_package" >&2 + { (exit 1); exit 1; }; } + ac_package=`echo $ac_package | sed 's/-/_/g'` + eval "with_$ac_package=no" ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes=$ac_optarg ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + + -*) { echo "$as_me: error: unrecognized option: $ac_option +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; } + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid variable name: $ac_envvar" >&2 + { (exit 1); exit 1; }; } + ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` + eval "$ac_envvar='$ac_optarg'" + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + { echo "$as_me: error: missing argument to $ac_option" >&2 + { (exit 1); exit 1; }; } +fi + +# Be sure to have absolute paths. +for ac_var in exec_prefix prefix +do + eval ac_val=$`echo $ac_var` + case $ac_val in + [\\/$]* | ?:[\\/]* | NONE | '' ) ;; + *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 + { (exit 1); exit 1; }; };; + esac +done + +# Be sure to have absolute paths. +for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \ + localstatedir libdir includedir oldincludedir infodir mandir +do + eval ac_val=$`echo $ac_var` + case $ac_val in + [\\/$]* | ?:[\\/]* ) ;; + *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 + { (exit 1); exit 1; }; };; + esac +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. + If a cross compiler is detected then cross compile mode will be used." >&2 + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then its parent. + ac_confdir=`(dirname "$0") 2>/dev/null || +$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$0" : 'X\(//\)[^/]' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$0" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + srcdir=$ac_confdir + if test ! -r $srcdir/$ac_unique_file; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r $srcdir/$ac_unique_file; then + if test "$ac_srcdir_defaulted" = yes; then + { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2 + { (exit 1); exit 1; }; } + else + { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 + { (exit 1); exit 1; }; } + fi +fi +(cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null || + { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2 + { (exit 1); exit 1; }; } +srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'` +ac_env_build_alias_set=${build_alias+set} +ac_env_build_alias_value=$build_alias +ac_cv_env_build_alias_set=${build_alias+set} +ac_cv_env_build_alias_value=$build_alias +ac_env_host_alias_set=${host_alias+set} +ac_env_host_alias_value=$host_alias +ac_cv_env_host_alias_set=${host_alias+set} +ac_cv_env_host_alias_value=$host_alias +ac_env_target_alias_set=${target_alias+set} +ac_env_target_alias_value=$target_alias +ac_cv_env_target_alias_set=${target_alias+set} +ac_cv_env_target_alias_value=$target_alias +ac_env_CC_set=${CC+set} +ac_env_CC_value=$CC +ac_cv_env_CC_set=${CC+set} +ac_cv_env_CC_value=$CC +ac_env_CFLAGS_set=${CFLAGS+set} +ac_env_CFLAGS_value=$CFLAGS +ac_cv_env_CFLAGS_set=${CFLAGS+set} +ac_cv_env_CFLAGS_value=$CFLAGS +ac_env_LDFLAGS_set=${LDFLAGS+set} +ac_env_LDFLAGS_value=$LDFLAGS +ac_cv_env_LDFLAGS_set=${LDFLAGS+set} +ac_cv_env_LDFLAGS_value=$LDFLAGS +ac_env_CPPFLAGS_set=${CPPFLAGS+set} +ac_env_CPPFLAGS_value=$CPPFLAGS +ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set} +ac_cv_env_CPPFLAGS_value=$CPPFLAGS +ac_env_CPP_set=${CPP+set} +ac_env_CPP_value=$CPP +ac_cv_env_CPP_set=${CPP+set} +ac_cv_env_CPP_value=$CPP + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +\`configure' configures this package to adapt to many kinds of systems. + +Usage: $0 [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print \`checking...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or \`..'] + +_ACEOF + + cat <<_ACEOF +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [PREFIX] + +By default, \`make install' will install all the files in +\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +an installation prefix other than \`$ac_default_prefix' using \`--prefix', +for instance \`--prefix=\$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --datadir=DIR read-only architecture-independent data [PREFIX/share] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --infodir=DIR info documentation [PREFIX/info] + --mandir=DIR man documentation [PREFIX/man] +_ACEOF + + cat <<\_ACEOF + +X features: + --x-includes=DIR X include files are in DIR + --x-libraries=DIR X library files are in DIR +_ACEOF +fi + +if test -n "$ac_init_help"; then + + cat <<\_ACEOF + +Optional Features: + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --disable-darwin Disable Darwin (Mac OS X) support. + --disable-xsmp Disable XSMP session management + --disable-xsmp-interact Disable XSMP interaction + --enable-mzschemeinterp Include MzScheme interpreter. + --enable-perlinterp Include Perl interpreter. + --enable-pythoninterp Include Python interpreter. + --enable-tclinterp Include Tcl interpreter. + --enable-rubyinterp Include Ruby interpreter. + --enable-cscope Include cscope interface. + --enable-workshop Include Sun Visual Workshop support. + --disable-netbeans Disable NetBeans integration support. + --enable-sniff Include Sniff interface. + --enable-multibyte Include multibyte editing support. + --enable-hangulinput Include Hangul input support. + --enable-xim Include XIM input support. + --enable-fontset Include X fontset output support. + --enable-gui=OPTS X11 GUI default=auto OPTS=auto/no/gtk/gtk2/gnome/gnome2/motif/athena/neXtaw/photon/carbon/macvim + --enable-gtk-check If auto-select GUI, check for GTK default=yes + --enable-gtk2-check If GTK GUI, check for GTK+ 2 default=yes + --enable-gnome-check If GTK GUI, check for GNOME default=no + --enable-motif-check If auto-select GUI, check for Motif default=yes + --enable-athena-check If auto-select GUI, check for Athena default=yes + --enable-nextaw-check If auto-select GUI, check for neXtaw default=yes + --enable-carbon-check If auto-select GUI, check for Carbon default=yes + --enable-macvim-check If auto-select GUI, check for MacVim default=yes + --disable-gtktest Do not try to compile and run a test GTK program + --disable-acl Don't check for ACL support. + --disable-gpm Don't use gpm (Linux mouse daemon). + --disable-nls Don't support NLS (gettext()). + +Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --with-mac-arch=ARCH current, intel, ppc or both + --with-vim-name=NAME what to call the Vim executable + --with-ex-name=NAME what to call the Ex executable + --with-view-name=NAME what to call the View executable + --with-global-runtime=DIR global runtime directory in 'runtimepath' + --with-modified-by=NAME name of who modified a release version + --with-features=TYPE tiny, small, normal, big or huge (default: normal) + --with-compiledby=NAME name to show in :version message + --with-plthome=PLTHOME Use PLTHOME. + --with-python-config-dir=PATH Python's config directory + --with-tclsh=PATH which tclsh to use (default: tclsh8.0) + --with-x use the X Window System + --with-gtk-prefix=PFX Prefix where GTK is installed (optional) + --with-gtk-exec-prefix=PFX Exec prefix where GTK is installed (optional) + --with-gnome-includes=DIR Specify location of GNOME headers + --with-gnome-libs=DIR Specify location of GNOME libs + --with-gnome Specify prefix for GNOME files + --with-motif-lib=STRING Library for Motif + --with-tlib=library terminal library to be used + +Some influential environment variables: + CC C compiler command + CFLAGS C compiler flags + LDFLAGS linker flags, e.g. -L if you have libraries in a + nonstandard directory + CPPFLAGS C/C++ preprocessor flags, e.g. -I if you have + headers in a nonstandard directory + CPP C preprocessor + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +_ACEOF +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + ac_popdir=`pwd` + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d $ac_dir || continue + ac_builddir=. + +if test "$ac_dir" != .; then + ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` + # A "../" for each directory in $ac_dir_suffix. + ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` +else + ac_dir_suffix= ac_top_builddir= +fi + +case $srcdir in + .) # No --srcdir option. We are building in place. + ac_srcdir=. + if test -z "$ac_top_builddir"; then + ac_top_srcdir=. + else + ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` + fi ;; + [\\/]* | ?:[\\/]* ) # Absolute path. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir ;; + *) # Relative path. + ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_builddir$srcdir ;; +esac + +# Do not use `cd foo && pwd` to compute absolute paths, because +# the directories may not exist. +case `pwd` in +.) ac_abs_builddir="$ac_dir";; +*) + case "$ac_dir" in + .) ac_abs_builddir=`pwd`;; + [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; + *) ac_abs_builddir=`pwd`/"$ac_dir";; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_top_builddir=${ac_top_builddir}.;; +*) + case ${ac_top_builddir}. in + .) ac_abs_top_builddir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; + *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_srcdir=$ac_srcdir;; +*) + case $ac_srcdir in + .) ac_abs_srcdir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; + *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_top_srcdir=$ac_top_srcdir;; +*) + case $ac_top_srcdir in + .) ac_abs_top_srcdir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; + *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; + esac;; +esac + + cd $ac_dir + # Check for guested configure; otherwise get Cygnus style configure. + if test -f $ac_srcdir/configure.gnu; then + echo + $SHELL $ac_srcdir/configure.gnu --help=recursive + elif test -f $ac_srcdir/configure; then + echo + $SHELL $ac_srcdir/configure --help=recursive + elif test -f $ac_srcdir/configure.ac || + test -f $ac_srcdir/configure.in; then + echo + $ac_configure --help + else + echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi + cd $ac_popdir + done +fi + +test -n "$ac_init_help" && exit 0 +if $ac_init_version; then + cat <<\_ACEOF + +Copyright (C) 2003 Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +_ACEOF + exit 0 +fi +exec 5>config.log +cat >&5 <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by $as_me, which was +generated by GNU Autoconf 2.59. Invocation command line was + + $ $0 $@ + +_ACEOF +{ +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +hostinfo = `(hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + echo "PATH: $as_dir" +done + +} >&5 + +cat >&5 <<_ACEOF + + +## ----------- ## +## Core tests. ## +## ----------- ## + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Strip out --silent because we don't want to record it for future runs. +# Also quote any args containing shell meta-characters. +# Make two passes to allow for proper duplicate-argument suppression. +ac_configure_args= +ac_configure_args0= +ac_configure_args1= +ac_sep= +ac_must_keep_next=false +for ac_pass in 1 2 +do + for ac_arg + do + case $ac_arg in + -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) + ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; + 2) + ac_configure_args1="$ac_configure_args1 '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'" + # Get rid of the leading space. + ac_sep=" " + ;; + esac + done +done +$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } +$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; } + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Be sure not to use single quotes in there, as some shells, +# such as our DU 5.0 friend, will then `close' the trap. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + + cat <<\_ASBOX +## ---------------- ## +## Cache variables. ## +## ---------------- ## +_ASBOX + echo + # The following way of writing the cache mishandles newlines in values, +{ + (set) 2>&1 | + case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in + *ac_space=\ *) + sed -n \ + "s/'"'"'/'"'"'\\\\'"'"''"'"'/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p" + ;; + *) + sed -n \ + "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + ;; + esac; +} + echo + + cat <<\_ASBOX +## ----------------- ## +## Output variables. ## +## ----------------- ## +_ASBOX + echo + for ac_var in $ac_subst_vars + do + eval ac_val=$`echo $ac_var` + echo "$ac_var='"'"'$ac_val'"'"'" + done | sort + echo + + if test -n "$ac_subst_files"; then + cat <<\_ASBOX +## ------------- ## +## Output files. ## +## ------------- ## +_ASBOX + echo + for ac_var in $ac_subst_files + do + eval ac_val=$`echo $ac_var` + echo "$ac_var='"'"'$ac_val'"'"'" + done | sort + echo + fi + + if test -s confdefs.h; then + cat <<\_ASBOX +## ----------- ## +## confdefs.h. ## +## ----------- ## +_ASBOX + echo + sed "/^$/d" confdefs.h | sort + echo + fi + test "$ac_signal" != 0 && + echo "$as_me: caught signal $ac_signal" + echo "$as_me: exit $exit_status" + } >&5 + rm -f core *.core && + rm -rf conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status + ' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -rf conftest* confdefs.h +# AIX cpp loses on an empty file, so make sure it contains at least a newline. +echo >confdefs.h + +# Predefined preprocessor variables. + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_NAME "$PACKAGE_NAME" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_TARNAME "$PACKAGE_TARNAME" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_VERSION "$PACKAGE_VERSION" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_STRING "$PACKAGE_STRING" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +_ACEOF + + +# Let the site file select an alternate cache file if it wants to. +# Prefer explicitly selected file to automatically selected ones. +if test -z "$CONFIG_SITE"; then + if test "x$prefix" != xNONE; then + CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" + else + CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" + fi +fi +for ac_site_file in $CONFIG_SITE; do + if test -r "$ac_site_file"; then + { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 +echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special + # files actually), so we avoid doing that. + if test -f "$cache_file"; then + { echo "$as_me:$LINENO: loading cache $cache_file" >&5 +echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . $cache_file;; + *) . ./$cache_file;; + esac + fi +else + { echo "$as_me:$LINENO: creating cache $cache_file" >&5 +echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in `(set) 2>&1 | + sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val="\$ac_cv_env_${ac_var}_value" + eval ac_new_val="\$ac_env_${ac_var}_value" + case $ac_old_set,$ac_new_set in + set,) + { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 +echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 +echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 +echo "$as_me: former value: $ac_old_val" >&2;} + { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 +echo "$as_me: current value: $ac_new_val" >&2;} + ac_cache_corrupted=: + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) + ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 +echo "$as_me: error: changes in the environment can compromise the build" >&2;} + { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 +echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} + { (exit 1); exit 1; }; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + + + + + + + + + + + + + + + + + + ac_config_headers="$ac_config_headers auto/config.h:config.h.in" + + +cat >>confdefs.h <<\_ACEOF +#define UNIX 1 +_ACEOF + +echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6 +set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,:./+-,___p_,'` +if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.make <<\_ACEOF +all: + @echo 'ac_maketemp="$(MAKE)"' +_ACEOF +# GNU make sometimes prints "make[1]: Entering...", which would confuse us. +eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=` +if test -n "$ac_maketemp"; then + eval ac_cv_prog_make_${ac_make}_set=yes +else + eval ac_cv_prog_make_${ac_make}_set=no +fi +rm -f conftest.make +fi +if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + SET_MAKE= +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + SET_MAKE="MAKE=${MAKE-make}" +fi + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="gcc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + CC=$ac_ct_CC +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="cc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + CC=$ac_ct_CC +else + CC="$ac_cv_prog_CC" +fi + +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$ac_ct_CC" && break +done + + CC=$ac_ct_CC +fi + +fi + + +test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&5 +echo "$as_me: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } + +# Provide some information about the compiler. +echo "$as_me:$LINENO:" \ + "checking for C compiler version" >&5 +ac_compiler=`set X $ac_compile; echo $2` +{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 + (eval $ac_compiler --version &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 + (eval $ac_compiler -v &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 + (eval $ac_compiler -V &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.exe b.out" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +echo "$as_me:$LINENO: checking for C compiler default output file name" >&5 +echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6 +ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` +if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5 + (eval $ac_link_default) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + # Find the output, starting from the most likely. This scheme is +# not robust to junk in `.', hence go to wildcards (a.*) only as a last +# resort. + +# Be careful to initialize this variable, since it used to be cached. +# Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile. +ac_cv_exeext= +# b.out is created by i960 compilers. +for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) + ;; + conftest.$ac_ext ) + # This is the source file. + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + # FIXME: I believe we export ac_cv_exeext for Libtool, + # but it would be cool to find out if it's true. Does anybody + # maintain Libtool? --akim. + export ac_cv_exeext + break;; + * ) + break;; + esac +done +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { echo "$as_me:$LINENO: error: C compiler cannot create executables +See \`config.log' for more details." >&5 +echo "$as_me: error: C compiler cannot create executables +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; } +fi + +ac_exeext=$ac_cv_exeext +echo "$as_me:$LINENO: result: $ac_file" >&5 +echo "${ECHO_T}$ac_file" >&6 + +# Check the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +echo "$as_me:$LINENO: checking whether the C compiler works" >&5 +echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6 +# FIXME: These cross compiler hacks should be removed for Autoconf 3.0 +# If not cross compiling, check that we can run a simple program. +if test "$cross_compiling" != yes; then + if { ac_try='./$ac_file' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { echo "$as_me:$LINENO: error: cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } + fi + fi +fi +echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + +rm -f a.out a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +# Check the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 +echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6 +echo "$as_me:$LINENO: result: $cross_compiling" >&5 +echo "${ECHO_T}$cross_compiling" >&6 + +echo "$as_me:$LINENO: checking for suffix of executables" >&5 +echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6 +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in conftest.exe conftest conftest.*; do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + export ac_cv_exeext + break;; + * ) break;; + esac +done +else + { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +fi + +rm -f conftest$ac_cv_exeext +echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 +echo "${ECHO_T}$ac_cv_exeext" >&6 + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +echo "$as_me:$LINENO: checking for suffix of object files" >&5 +echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6 +if test "${ac_cv_objext+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot compute suffix of object files: cannot compile +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +fi + +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 +echo "${ECHO_T}$ac_cv_objext" >&6 +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 +echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6 +if test "${ac_cv_c_compiler_gnu+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_compiler_gnu=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_compiler_gnu=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 +echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6 +GCC=`test $ac_compiler_gnu = yes && echo yes` +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +CFLAGS="-g" +echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 +echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6 +if test "${ac_cv_prog_cc_g+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_prog_cc_g=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_prog_cc_g=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 +echo "${ECHO_T}$ac_cv_prog_cc_g" >&6 +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5 +echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6 +if test "${ac_cv_prog_cc_stdc+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_prog_cc_stdc=no +ac_save_CC=$CC +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#include +#include +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std1 is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std1. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +# Don't try gcc -ansi; that turns off useful extensions and +# breaks some systems' header files. +# AIX -qlanglvl=ansi +# Ultrix and OSF/1 -std1 +# HP-UX 10.20 and later -Ae +# HP-UX older versions -Aa -D_HPUX_SOURCE +# SVR4 -Xc -D__EXTENSIONS__ +for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_prog_cc_stdc=$ac_arg +break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext +done +rm -f conftest.$ac_ext conftest.$ac_objext +CC=$ac_save_CC + +fi + +case "x$ac_cv_prog_cc_stdc" in + x|xno) + echo "$as_me:$LINENO: result: none needed" >&5 +echo "${ECHO_T}none needed" >&6 ;; + *) + echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5 +echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6 + CC="$CC $ac_cv_prog_cc_stdc" ;; +esac + +# Some people use a C++ compiler to compile C. Since we use `exit', +# in C++ we need to declare it. In case someone uses the same compiler +# for both compiling C and C++ we need to have the C++ compiler decide +# the declaration of exit, since it's the most demanding environment. +cat >conftest.$ac_ext <<_ACEOF +#ifndef __cplusplus + choke me +#endif +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + for ac_declaration in \ + '' \ + 'extern "C" void std::exit (int) throw (); using std::exit;' \ + 'extern "C" void std::exit (int); using std::exit;' \ + 'extern "C" void exit (int) throw ();' \ + 'extern "C" void exit (int);' \ + 'void exit (int);' +do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_declaration +#include +int +main () +{ +exit (42); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +continue +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_declaration +int +main () +{ +exit (42); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +done +rm -f conftest* +if test -n "$ac_declaration"; then + echo '#ifdef __cplusplus' >>confdefs.h + echo $ac_declaration >>confdefs.h + echo '#endif' >>confdefs.h +fi + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 +echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6 +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if test "${ac_cv_prog_CPP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether non-existent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + # Broken: success on invalid input. +continue +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +echo "$as_me:$LINENO: result: $CPP" >&5 +echo "${ECHO_T}$CPP" >&6 +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether non-existent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + # Broken: success on invalid input. +continue +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + : +else + { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details." >&5 +echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +echo "$as_me:$LINENO: checking for egrep" >&5 +echo $ECHO_N "checking for egrep... $ECHO_C" >&6 +if test "${ac_cv_prog_egrep+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if echo a | (grep -E '(a|b)') >/dev/null 2>&1 + then ac_cv_prog_egrep='grep -E' + else ac_cv_prog_egrep='egrep' + fi +fi +echo "$as_me:$LINENO: result: $ac_cv_prog_egrep" >&5 +echo "${ECHO_T}$ac_cv_prog_egrep" >&6 + EGREP=$ac_cv_prog_egrep + + +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "" >/dev/null 2>&1; then + : +fi +rm -f conftest* + echo "$as_me:$LINENO: checking for library containing strerror" >&5 +echo $ECHO_N "checking for library containing strerror... $ECHO_C" >&6 +if test "${ac_cv_search_strerror+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_func_search_save_LIBS=$LIBS +ac_cv_search_strerror=no +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char strerror (); +int +main () +{ +strerror (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_search_strerror="none required" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +if test "$ac_cv_search_strerror" = no; then + for ac_lib in cposix; do + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char strerror (); +int +main () +{ +strerror (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_search_strerror="-l$ac_lib" +break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + done +fi +LIBS=$ac_func_search_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_search_strerror" >&5 +echo "${ECHO_T}$ac_cv_search_strerror" >&6 +if test "$ac_cv_search_strerror" != no; then + test "$ac_cv_search_strerror" = "none required" || LIBS="$ac_cv_search_strerror $LIBS" + +fi + for ac_prog in gawk mawk nawk awk +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_AWK+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$AWK"; then + ac_cv_prog_AWK="$AWK" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AWK="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +AWK=$ac_cv_prog_AWK +if test -n "$AWK"; then + echo "$as_me:$LINENO: result: $AWK" >&5 +echo "${ECHO_T}$AWK" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$AWK" && break +done + +# Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_STRIP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_STRIP="strip" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + + test -z "$ac_cv_prog_STRIP" && ac_cv_prog_STRIP=":" +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + echo "$as_me:$LINENO: result: $STRIP" >&5 +echo "${ECHO_T}$STRIP" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + + + +if test -z "$CFLAGS"; then + CFLAGS="-O" + test "$GCC" = yes && CFLAGS="-O2 -fno-strength-reduce -Wall" +fi +if test "$GCC" = yes; then + gccversion=`"$CC" -dumpversion` + if test "x$gccversion" = "x"; then + gccversion=`"$CC" --version | sed -e '2,$d' -e 's/darwin.//' -e 's/^[^0-9]*\([0-9]\.[0-9.]*\).*$/\1/g'` + fi + if test "$gccversion" = "3.0.1" -o "$gccversion" = "3.0.2" -o "$gccversion" = "4.0.1"; then + echo 'GCC [34].0.[12] has a bug in the optimizer, disabling "-O#"' + CFLAGS=`echo "$CFLAGS" | sed 's/-O[23456789]/-O/'` + else + if test "$gccversion" = "3.1" -o "$gccversion" = "3.2" -o "$gccversion" = "3.2.1" && `echo "$CFLAGS" | grep -v fno-strength-reduce >/dev/null`; then + echo 'GCC 3.1 and 3.2 have a bug in the optimizer, adding "-fno-strength-reduce"' + CFLAGS="$CFLAGS -fno-strength-reduce" + fi + fi +fi + +if test "$cross_compiling" = yes; then + { { echo "$as_me:$LINENO: error: cannot compile a simple program, check CC and CFLAGS + (cross compiling doesn't work)" >&5 +echo "$as_me: error: cannot compile a simple program, check CC and CFLAGS + (cross compiling doesn't work)" >&2;} + { (exit 1); exit 1; }; } +fi + +test "$GCC" = yes && CPP_MM=M; + +if test -f ./toolcheck; then + { echo "$as_me:$LINENO: checking for buggy tools..." >&5 +echo "$as_me: checking for buggy tools..." >&6;} + sh ./toolcheck 1>&6 +fi + +OS_EXTRA_SRC=""; OS_EXTRA_OBJ="" + +echo "$as_me:$LINENO: checking for BeOS" >&5 +echo $ECHO_N "checking for BeOS... $ECHO_C" >&6 +case `uname` in + BeOS) OS_EXTRA_SRC=os_beos.c; OS_EXTRA_OBJ=objects/os_beos.o + BEOS=yes; echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6;; + *) BEOS=no; echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6;; +esac + +echo "$as_me:$LINENO: checking for QNX" >&5 +echo $ECHO_N "checking for QNX... $ECHO_C" >&6 +case `uname` in + QNX) OS_EXTRA_SRC=os_qnx.c; OS_EXTRA_OBJ=objects/os_qnx.o + test -z "$with_x" && with_x=no + QNX=yes; echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6;; + *) QNX=no; echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6;; +esac + +echo "$as_me:$LINENO: checking for Darwin (Mac OS X)" >&5 +echo $ECHO_N "checking for Darwin (Mac OS X)... $ECHO_C" >&6 +if test "`(uname) 2>/dev/null`" = Darwin; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + + echo "$as_me:$LINENO: checking --disable-darwin argument" >&5 +echo $ECHO_N "checking --disable-darwin argument... $ECHO_C" >&6 + # Check whether --enable-darwin or --disable-darwin was given. +if test "${enable_darwin+set}" = set; then + enableval="$enable_darwin" + +else + enable_darwin="yes" +fi; + if test "$enable_darwin" = "yes"; then + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + echo "$as_me:$LINENO: checking if Darwin files are there" >&5 +echo $ECHO_N "checking if Darwin files are there... $ECHO_C" >&6 + if test -f os_macosx.c; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + else + echo "$as_me:$LINENO: result: no, Darwin support disabled" >&5 +echo "${ECHO_T}no, Darwin support disabled" >&6 + enable_darwin=no + fi + else + echo "$as_me:$LINENO: result: yes, Darwin support excluded" >&5 +echo "${ECHO_T}yes, Darwin support excluded" >&6 + fi + + echo "$as_me:$LINENO: checking --with-mac-arch argument" >&5 +echo $ECHO_N "checking --with-mac-arch argument... $ECHO_C" >&6 + +# Check whether --with-mac-arch or --without-mac-arch was given. +if test "${with_mac_arch+set}" = set; then + withval="$with_mac_arch" + MACARCH="$withval"; echo "$as_me:$LINENO: result: $MACARCH" >&5 +echo "${ECHO_T}$MACARCH" >&6 +else + MACARCH="current"; echo "$as_me:$LINENO: result: defaulting to $MACARCH" >&5 +echo "${ECHO_T}defaulting to $MACARCH" >&6 +fi; + + if test "x$MACARCH" = "xboth"; then + echo "$as_me:$LINENO: checking for 10.4 universal SDK" >&5 +echo $ECHO_N "checking for 10.4 universal SDK... $ECHO_C" >&6 + save_cppflags="$CPPFLAGS" + save_cflags="$CFLAGS" + save_ldflags="$LDFLAGS" + CFLAGS="$CFLAGS -isysroot /Developer/SDKs/MacOSX10.4u.sdk -arch i386 -arch ppc" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + echo "$as_me:$LINENO: result: found" >&5 +echo "${ECHO_T}found" >&6 +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +echo "$as_me:$LINENO: result: not found" >&5 +echo "${ECHO_T}not found" >&6 + CFLAGS="$save_cflags" + echo "$as_me:$LINENO: checking if Intel architecture is supported" >&5 +echo $ECHO_N "checking if Intel architecture is supported... $ECHO_C" >&6 + CPPFLAGS="$CPPFLAGS -arch i386" + LDFLAGS="$save_ldflags -arch i386" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; MACARCH="intel" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + MACARCH="ppc" + CPPFLAGS="$save_cppflags -arch ppc" + LDFLAGS="$save_ldflags -arch ppc" +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + elif test "x$MACARCH" = "xintel"; then + CPPFLAGS="$CPPFLAGS -arch intel" + LDFLAGS="$LDFLAGS -arch intel" + elif test "x$MACARCH" = "xppc"; then + CPPFLAGS="$CPPFLAGS -arch ppc" + LDFLAGS="$LDFLAGS -arch ppc" + fi + + if test "$enable_darwin" = "yes"; then + MACOSX=yes + OS_EXTRA_SCR="os_macosx.c os_mac_conv.c"; + OS_EXTRA_OBJ="objects/os_macosx.o objects/os_mac_conv.o" + CPPFLAGS="$CPPFLAGS -DMACOS_X_UNIX -no-cpp-precomp" + if test "x$MACARCH" = "xboth"; then + CPPFLAGS="$CPPFLAGS -I/Developer/SDKs/MacOSX10.4u.sdk/Developer/Headers/FlatCarbon" + else + CPPFLAGS="$CPPFLAGS -I/Developer/Headers/FlatCarbon" + fi + + echo "$as_me:$LINENO: checking for ANSI C header files" >&5 +echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6 +if test "${ac_cv_header_stdc+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_header_stdc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_header_stdc=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then + : +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then + : +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then + : +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + exit(2); + exit (0); +} +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_header_stdc=no +fi +rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +fi +fi +echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 +echo "${ECHO_T}$ac_cv_header_stdc" >&6 +if test $ac_cv_header_stdc = yes; then + +cat >>confdefs.h <<\_ACEOF +#define STDC_HEADERS 1 +_ACEOF + +fi + +# On IRIX 5.3, sys/types and inttypes.h are conflicting. + + + + + + + + + +for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ + inttypes.h stdint.h unistd.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default + +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_Header=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +eval "$as_ac_Header=no" +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + +if test "${ac_cv_header_Carbon_Carbon_h+set}" = set; then + echo "$as_me:$LINENO: checking for Carbon/Carbon.h" >&5 +echo $ECHO_N "checking for Carbon/Carbon.h... $ECHO_C" >&6 +if test "${ac_cv_header_Carbon_Carbon_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +echo "$as_me:$LINENO: result: $ac_cv_header_Carbon_Carbon_h" >&5 +echo "${ECHO_T}$ac_cv_header_Carbon_Carbon_h" >&6 +else + # Is the header compilable? +echo "$as_me:$LINENO: checking Carbon/Carbon.h usability" >&5 +echo $ECHO_N "checking Carbon/Carbon.h usability... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_header_compiler=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_header_compiler=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6 + +# Is the header present? +echo "$as_me:$LINENO: checking Carbon/Carbon.h presence" >&5 +echo $ECHO_N "checking Carbon/Carbon.h presence... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_header_preproc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi +rm -f conftest.err conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6 + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { echo "$as_me:$LINENO: WARNING: Carbon/Carbon.h: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: Carbon/Carbon.h: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: Carbon/Carbon.h: proceeding with the compiler's result" >&5 +echo "$as_me: WARNING: Carbon/Carbon.h: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { echo "$as_me:$LINENO: WARNING: Carbon/Carbon.h: present but cannot be compiled" >&5 +echo "$as_me: WARNING: Carbon/Carbon.h: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: Carbon/Carbon.h: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: Carbon/Carbon.h: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: Carbon/Carbon.h: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: Carbon/Carbon.h: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: Carbon/Carbon.h: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: Carbon/Carbon.h: section \"Present But Cannot Be Compiled\"" >&2;} + { echo "$as_me:$LINENO: WARNING: Carbon/Carbon.h: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: Carbon/Carbon.h: proceeding with the preprocessor's result" >&2;} + { echo "$as_me:$LINENO: WARNING: Carbon/Carbon.h: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: Carbon/Carbon.h: in the future, the compiler will take precedence" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------------ ## +## Report this to the AC_PACKAGE_NAME lists. ## +## ------------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +echo "$as_me:$LINENO: checking for Carbon/Carbon.h" >&5 +echo $ECHO_N "checking for Carbon/Carbon.h... $ECHO_C" >&6 +if test "${ac_cv_header_Carbon_Carbon_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_header_Carbon_Carbon_h=$ac_header_preproc +fi +echo "$as_me:$LINENO: result: $ac_cv_header_Carbon_Carbon_h" >&5 +echo "${ECHO_T}$ac_cv_header_Carbon_Carbon_h" >&6 + +fi +if test $ac_cv_header_Carbon_Carbon_h = yes; then + CARBON=yes +fi + + + + SAVE_CPPFLAGS=$CPPFLAGS + SAVE_CFLAGS=$CFLAGS + CPPFLAGS="$CPPFLAGS -ObjC" + CFLAGS="$CFLAGS -ObjC" + if test "${ac_cv_header_Cocoa_Cocoa_h+set}" = set; then + echo "$as_me:$LINENO: checking for Cocoa/Cocoa.h" >&5 +echo $ECHO_N "checking for Cocoa/Cocoa.h... $ECHO_C" >&6 +if test "${ac_cv_header_Cocoa_Cocoa_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +echo "$as_me:$LINENO: result: $ac_cv_header_Cocoa_Cocoa_h" >&5 +echo "${ECHO_T}$ac_cv_header_Cocoa_Cocoa_h" >&6 +else + # Is the header compilable? +echo "$as_me:$LINENO: checking Cocoa/Cocoa.h usability" >&5 +echo $ECHO_N "checking Cocoa/Cocoa.h usability... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_header_compiler=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_header_compiler=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6 + +# Is the header present? +echo "$as_me:$LINENO: checking Cocoa/Cocoa.h presence" >&5 +echo $ECHO_N "checking Cocoa/Cocoa.h presence... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_header_preproc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi +rm -f conftest.err conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6 + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { echo "$as_me:$LINENO: WARNING: Cocoa/Cocoa.h: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: Cocoa/Cocoa.h: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: Cocoa/Cocoa.h: proceeding with the compiler's result" >&5 +echo "$as_me: WARNING: Cocoa/Cocoa.h: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { echo "$as_me:$LINENO: WARNING: Cocoa/Cocoa.h: present but cannot be compiled" >&5 +echo "$as_me: WARNING: Cocoa/Cocoa.h: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: Cocoa/Cocoa.h: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: Cocoa/Cocoa.h: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: Cocoa/Cocoa.h: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: Cocoa/Cocoa.h: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: Cocoa/Cocoa.h: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: Cocoa/Cocoa.h: section \"Present But Cannot Be Compiled\"" >&2;} + { echo "$as_me:$LINENO: WARNING: Cocoa/Cocoa.h: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: Cocoa/Cocoa.h: proceeding with the preprocessor's result" >&2;} + { echo "$as_me:$LINENO: WARNING: Cocoa/Cocoa.h: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: Cocoa/Cocoa.h: in the future, the compiler will take precedence" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------------ ## +## Report this to the AC_PACKAGE_NAME lists. ## +## ------------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +echo "$as_me:$LINENO: checking for Cocoa/Cocoa.h" >&5 +echo $ECHO_N "checking for Cocoa/Cocoa.h... $ECHO_C" >&6 +if test "${ac_cv_header_Cocoa_Cocoa_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_header_Cocoa_Cocoa_h=$ac_header_preproc +fi +echo "$as_me:$LINENO: result: $ac_cv_header_Cocoa_Cocoa_h" >&5 +echo "${ECHO_T}$ac_cv_header_Cocoa_Cocoa_h" >&6 + +fi +if test $ac_cv_header_Cocoa_Cocoa_h = yes; then + COCOA=yes +fi + + + CPPFLAGS=$SAVE_CPPFLAGS + CFLAGS=$SAVE_CFLAGS + + if test "x$CARBON" = "xyes" -o "x$COCOA" = "xyes"; then + if test -z "$with_x" -a "X$enable_gui" != Xmotif -a "X$enable_gui" != Xathena -a "X$enable_gui" != Xgtk -a "X$enable_gui" != Xgtk2; then + with_x=no + fi + fi + fi + + if test "$MACARCH" = "intel" -o "$MACARCH" = "both"; then + CFLAGS=`echo "$CFLAGS" | sed 's/-O[23456789]/-Oz/'` + fi + +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + + + +have_local_include='' +have_local_lib='' +if test "$GCC" = yes; then + echo 'void f(){}' > conftest.c + have_local_include=`${CC-cc} -no-cpp-precomp -c -v conftest.c 2>&1 | grep '/usr/local/include'` + have_local_lib=`${CC-cc} -c -v conftest.c 2>&1 | grep '/usr/local/lib'` + rm -f conftest.c conftest.o +fi +if test -z "$have_local_lib" -a -d /usr/local/lib; then + tt=`echo "$LDFLAGS" | sed -e 's+-L/usr/local/lib ++g' -e 's+-L/usr/local/lib$++g'` + if test "$tt" = "$LDFLAGS"; then + LDFLAGS="$LDFLAGS -L/usr/local/lib" + fi +fi +if test -z "$have_local_include" -a -d /usr/local/include; then + tt=`echo "$CPPFLAGS" | sed -e 's+-I/usr/local/include ++g' -e 's+-I/usr/local/include$++g'` + if test "$tt" = "$CPPFLAGS"; then + CPPFLAGS="$CPPFLAGS -I/usr/local/include" + fi +fi + +echo "$as_me:$LINENO: checking --with-vim-name argument" >&5 +echo $ECHO_N "checking --with-vim-name argument... $ECHO_C" >&6 + +# Check whether --with-vim-name or --without-vim-name was given. +if test "${with_vim_name+set}" = set; then + withval="$with_vim_name" + VIMNAME="$withval"; echo "$as_me:$LINENO: result: $VIMNAME" >&5 +echo "${ECHO_T}$VIMNAME" >&6 +else + VIMNAME="vim"; echo "$as_me:$LINENO: result: Defaulting to $VIMNAME" >&5 +echo "${ECHO_T}Defaulting to $VIMNAME" >&6 +fi; + +echo "$as_me:$LINENO: checking --with-ex-name argument" >&5 +echo $ECHO_N "checking --with-ex-name argument... $ECHO_C" >&6 + +# Check whether --with-ex-name or --without-ex-name was given. +if test "${with_ex_name+set}" = set; then + withval="$with_ex_name" + EXNAME="$withval"; echo "$as_me:$LINENO: result: $EXNAME" >&5 +echo "${ECHO_T}$EXNAME" >&6 +else + EXNAME="ex"; echo "$as_me:$LINENO: result: Defaulting to ex" >&5 +echo "${ECHO_T}Defaulting to ex" >&6 +fi; + +echo "$as_me:$LINENO: checking --with-view-name argument" >&5 +echo $ECHO_N "checking --with-view-name argument... $ECHO_C" >&6 + +# Check whether --with-view-name or --without-view-name was given. +if test "${with_view_name+set}" = set; then + withval="$with_view_name" + VIEWNAME="$withval"; echo "$as_me:$LINENO: result: $VIEWNAME" >&5 +echo "${ECHO_T}$VIEWNAME" >&6 +else + VIEWNAME="view"; echo "$as_me:$LINENO: result: Defaulting to view" >&5 +echo "${ECHO_T}Defaulting to view" >&6 +fi; + + +echo "$as_me:$LINENO: checking --with-global-runtime argument" >&5 +echo $ECHO_N "checking --with-global-runtime argument... $ECHO_C" >&6 + +# Check whether --with-global-runtime or --without-global-runtime was given. +if test "${with_global_runtime+set}" = set; then + withval="$with_global_runtime" + echo "$as_me:$LINENO: result: $withval" >&5 +echo "${ECHO_T}$withval" >&6; cat >>confdefs.h <<_ACEOF +#define RUNTIME_GLOBAL "$withval" +_ACEOF + +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi; + +echo "$as_me:$LINENO: checking --with-modified-by argument" >&5 +echo $ECHO_N "checking --with-modified-by argument... $ECHO_C" >&6 + +# Check whether --with-modified-by or --without-modified-by was given. +if test "${with_modified_by+set}" = set; then + withval="$with_modified_by" + echo "$as_me:$LINENO: result: $withval" >&5 +echo "${ECHO_T}$withval" >&6; cat >>confdefs.h <<_ACEOF +#define MODIFIED_BY "$withval" +_ACEOF + +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi; + +echo "$as_me:$LINENO: checking if character set is EBCDIC" >&5 +echo $ECHO_N "checking if character set is EBCDIC... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + /* TryCompile function for CharSet. + Treat any failure as ASCII for compatibility with existing art. + Use compile-time rather than run-time tests for cross-compiler + tolerance. */ +#if '0'!=240 +make an error "Character set is not EBCDIC" +#endif + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + # TryCompile action if true +cf_cv_ebcdic=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # TryCompile action if false +cf_cv_ebcdic=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +# end of TryCompile ]) +# end of CacheVal CvEbcdic +echo "$as_me:$LINENO: result: $cf_cv_ebcdic" >&5 +echo "${ECHO_T}$cf_cv_ebcdic" >&6 +case "$cf_cv_ebcdic" in #(vi + yes) cat >>confdefs.h <<\_ACEOF +#define EBCDIC 1 +_ACEOF + + line_break='"\\n"' + ;; + *) line_break='"\\012"';; +esac + + +if test "$cf_cv_ebcdic" = "yes"; then +echo "$as_me:$LINENO: checking for OS/390 Unix" >&5 +echo $ECHO_N "checking for OS/390 Unix... $ECHO_C" >&6 +case `uname` in + OS/390) OS390Unix="yes"; + if test "$CC" = "cc"; then + ccm="$_CC_CCMODE" + ccn="CC" + else + if test "$CC" = "c89"; then + ccm="$_CC_C89MODE" + ccn="C89" + else + ccm=1 + fi + fi + if test "$ccm" != "1"; then + echo "" + echo "------------------------------------------" + echo " On OS/390 Unix, the environment variable" + echo " __CC_${ccn}MODE must be set to \"1\"!" + echo " Do:" + echo " export _CC_${ccn}MODE=1" + echo " and then call configure again." + echo "------------------------------------------" + exit 1 + fi + CFLAGS="$CFLAGS -D_ALL_SOURCE"; LDFLAGS="$LDFLAGS -Wl,EDIT=NO" + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + ;; + *) OS390Unix="no"; + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + ;; +esac +fi + + + +echo "$as_me:$LINENO: checking --with-features argument" >&5 +echo $ECHO_N "checking --with-features argument... $ECHO_C" >&6 + +# Check whether --with-features or --without-features was given. +if test "${with_features+set}" = set; then + withval="$with_features" + features="$withval"; echo "$as_me:$LINENO: result: $features" >&5 +echo "${ECHO_T}$features" >&6 +else + features="normal"; echo "$as_me:$LINENO: result: Defaulting to normal" >&5 +echo "${ECHO_T}Defaulting to normal" >&6 +fi; + +dovimdiff="" +dogvimdiff="" +case "$features" in + tiny) cat >>confdefs.h <<\_ACEOF +#define FEAT_TINY 1 +_ACEOF + ;; + small) cat >>confdefs.h <<\_ACEOF +#define FEAT_SMALL 1 +_ACEOF + ;; + normal) cat >>confdefs.h <<\_ACEOF +#define FEAT_NORMAL 1 +_ACEOF + dovimdiff="installvimdiff"; + dogvimdiff="installgvimdiff" ;; + big) cat >>confdefs.h <<\_ACEOF +#define FEAT_BIG 1 +_ACEOF + dovimdiff="installvimdiff"; + dogvimdiff="installgvimdiff" ;; + huge) cat >>confdefs.h <<\_ACEOF +#define FEAT_HUGE 1 +_ACEOF + dovimdiff="installvimdiff"; + dogvimdiff="installgvimdiff" ;; + *) echo "$as_me:$LINENO: result: Sorry, $features is not supported" >&5 +echo "${ECHO_T}Sorry, $features is not supported" >&6 ;; +esac + + + + +echo "$as_me:$LINENO: checking --with-compiledby argument" >&5 +echo $ECHO_N "checking --with-compiledby argument... $ECHO_C" >&6 + +# Check whether --with-compiledby or --without-compiledby was given. +if test "${with_compiledby+set}" = set; then + withval="$with_compiledby" + compiledby="$withval"; echo "$as_me:$LINENO: result: $withval" >&5 +echo "${ECHO_T}$withval" >&6 +else + compiledby=""; echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi; + + +echo "$as_me:$LINENO: checking --disable-xsmp argument" >&5 +echo $ECHO_N "checking --disable-xsmp argument... $ECHO_C" >&6 +# Check whether --enable-xsmp or --disable-xsmp was given. +if test "${enable_xsmp+set}" = set; then + enableval="$enable_xsmp" + +else + enable_xsmp="yes" +fi; + +if test "$enable_xsmp" = "yes"; then + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + echo "$as_me:$LINENO: checking --disable-xsmp-interact argument" >&5 +echo $ECHO_N "checking --disable-xsmp-interact argument... $ECHO_C" >&6 + # Check whether --enable-xsmp-interact or --disable-xsmp-interact was given. +if test "${enable_xsmp_interact+set}" = set; then + enableval="$enable_xsmp_interact" + +else + enable_xsmp_interact="yes" +fi; + if test "$enable_xsmp_interact" = "yes"; then + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + cat >>confdefs.h <<\_ACEOF +#define USE_XSMP_INTERACT 1 +_ACEOF + + else + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + fi +else + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +fi + +echo "$as_me:$LINENO: checking --enable-mzschemeinterp argument" >&5 +echo $ECHO_N "checking --enable-mzschemeinterp argument... $ECHO_C" >&6 +# Check whether --enable-mzschemeinterp or --disable-mzschemeinterp was given. +if test "${enable_mzschemeinterp+set}" = set; then + enableval="$enable_mzschemeinterp" + +else + enable_mzschemeinterp="no" +fi; +echo "$as_me:$LINENO: result: $enable_mzschemeinterp" >&5 +echo "${ECHO_T}$enable_mzschemeinterp" >&6 + +if test "$enable_mzschemeinterp" = "yes"; then + + + echo "$as_me:$LINENO: checking --with-plthome argument" >&5 +echo $ECHO_N "checking --with-plthome argument... $ECHO_C" >&6 + +# Check whether --with-plthome or --without-plthome was given. +if test "${with_plthome+set}" = set; then + withval="$with_plthome" + with_plthome="$withval"; echo "$as_me:$LINENO: result: $with_plthome" >&5 +echo "${ECHO_T}$with_plthome" >&6 +else + with_plthome="";echo "$as_me:$LINENO: result: \"no\"" >&5 +echo "${ECHO_T}\"no\"" >&6 +fi; + + if test "X$with_plthome" != "X"; then + vi_cv_path_mzscheme_pfx="$with_plthome" + else + echo "$as_me:$LINENO: checking PLTHOME environment var" >&5 +echo $ECHO_N "checking PLTHOME environment var... $ECHO_C" >&6 + if test "X$PLTHOME" != "X"; then + echo "$as_me:$LINENO: result: \"$PLTHOME\"" >&5 +echo "${ECHO_T}\"$PLTHOME\"" >&6 + vi_cv_path_mzscheme_pfx="$PLTHOME" + else + echo "$as_me:$LINENO: result: \"not set\"" >&5 +echo "${ECHO_T}\"not set\"" >&6 + # Extract the first word of "mzscheme", so it can be a program name with args. +set dummy mzscheme; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_path_vi_cv_path_mzscheme+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $vi_cv_path_mzscheme in + [\\/]* | ?:[\\/]*) + ac_cv_path_vi_cv_path_mzscheme="$vi_cv_path_mzscheme" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_vi_cv_path_mzscheme="$as_dir/$ac_word$ac_exec_ext" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + + ;; +esac +fi +vi_cv_path_mzscheme=$ac_cv_path_vi_cv_path_mzscheme + +if test -n "$vi_cv_path_mzscheme"; then + echo "$as_me:$LINENO: result: $vi_cv_path_mzscheme" >&5 +echo "${ECHO_T}$vi_cv_path_mzscheme" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + + if test "X$vi_cv_path_mzscheme" != "X"; then + lsout=`ls -l $vi_cv_path_mzscheme` + if echo "$lsout" | grep -e '->' >/dev/null 2>/dev/null; then + vi_cv_path_mzscheme=`echo "$lsout" | sed 's/.*-> \(.*\)/\1/'` + fi + fi + + if test "X$vi_cv_path_mzscheme" != "X"; then + echo "$as_me:$LINENO: checking MzScheme install prefix" >&5 +echo $ECHO_N "checking MzScheme install prefix... $ECHO_C" >&6 +if test "${vi_cv_path_mzscheme_pfx+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + vi_cv_path_mzscheme_pfx=` + ${vi_cv_path_mzscheme} -evm \ + "(display (simplify-path \ + (build-path (call-with-values \ + (lambda () (split-path (find-system-path (quote exec-file)))) \ + (lambda (base name must-be-dir?) base)) (quote up))))"` +fi +echo "$as_me:$LINENO: result: $vi_cv_path_mzscheme_pfx" >&5 +echo "${ECHO_T}$vi_cv_path_mzscheme_pfx" >&6 + vi_cv_path_mzscheme_pfx=`echo "$vi_cv_path_mzscheme_pfx" | sed 's+/$++'` + fi + fi + fi + + SCHEME_INC= + if test "X$vi_cv_path_mzscheme_pfx" != "X"; then + echo "$as_me:$LINENO: checking if scheme.h can be found in $vi_cv_path_mzscheme_pfx/include" >&5 +echo $ECHO_N "checking if scheme.h can be found in $vi_cv_path_mzscheme_pfx/include... $ECHO_C" >&6 + if test -f $vi_cv_path_mzscheme_pfx/include/scheme.h; then + echo "$as_me:$LINENO: result: \"yes\"" >&5 +echo "${ECHO_T}\"yes\"" >&6 + else + echo "$as_me:$LINENO: result: \"no\"" >&5 +echo "${ECHO_T}\"no\"" >&6 + echo "$as_me:$LINENO: checking if scheme.h can be found in $vi_cv_path_mzscheme_pfx/plt/include" >&5 +echo $ECHO_N "checking if scheme.h can be found in $vi_cv_path_mzscheme_pfx/plt/include... $ECHO_C" >&6 + if test -f $vi_cv_path_mzscheme_pfx/include/plt/scheme.h; then + echo "$as_me:$LINENO: result: \"yes\"" >&5 +echo "${ECHO_T}\"yes\"" >&6 + SCHEME_INC=/plt + else + echo "$as_me:$LINENO: result: \"no\"" >&5 +echo "${ECHO_T}\"no\"" >&6 + vi_cv_path_mzscheme_pfx= + fi + fi + fi + + if test "X$vi_cv_path_mzscheme_pfx" != "X"; then + if test "x$MACOSX" = "xyes"; then + MZSCHEME_LIBS="-framework PLT_MzScheme" + elif test -f "${vi_cv_path_mzscheme_pfx}/lib/libmzgc.a"; then + MZSCHEME_LIBS="${vi_cv_path_mzscheme_pfx}/lib/libmzscheme.a ${vi_cv_path_mzscheme_pfx}/lib/libmzgc.a" + else + MZSCHEME_LIBS="-L${vi_cv_path_mzscheme_pfx}/lib -lmzscheme -lmzgc" + if test "$GCC" = yes; then + MZSCHEME_LIBS="$MZSCHEME_LIBS -Wl,-rpath -Wl,${vi_cv_path_mzscheme_pfx}/lib" + elif test "`(uname) 2>/dev/null`" = SunOS && + uname -r | grep '^5' >/dev/null; then + MZSCHEME_LIBS="$MZSCHEME_LIBS -R ${vi_cv_path_mzscheme_pfx}/lib" + fi + fi + if test -d $vi_cv_path_mzscheme_pfx/lib/plt/collects; then + SCHEME_COLLECTS=lib/plt/ + fi + MZSCHEME_CFLAGS="-I${vi_cv_path_mzscheme_pfx}/include${SCHEME_INC} \ + -DMZSCHEME_COLLECTS='\"${vi_cv_path_mzscheme_pfx}/${SCHEME_COLLECTS}collects\"'" + MZSCHEME_SRC="if_mzsch.c" + MZSCHEME_OBJ="objects/if_mzsch.o" + MZSCHEME_PRO="if_mzsch.pro" + cat >>confdefs.h <<\_ACEOF +#define FEAT_MZSCHEME 1 +_ACEOF + + fi + + + + + +fi + + +echo "$as_me:$LINENO: checking --enable-perlinterp argument" >&5 +echo $ECHO_N "checking --enable-perlinterp argument... $ECHO_C" >&6 +# Check whether --enable-perlinterp or --disable-perlinterp was given. +if test "${enable_perlinterp+set}" = set; then + enableval="$enable_perlinterp" + +else + enable_perlinterp="no" +fi; +echo "$as_me:$LINENO: result: $enable_perlinterp" >&5 +echo "${ECHO_T}$enable_perlinterp" >&6 +if test "$enable_perlinterp" = "yes"; then + + # Extract the first word of "perl", so it can be a program name with args. +set dummy perl; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_path_vi_cv_path_perl+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $vi_cv_path_perl in + [\\/]* | ?:[\\/]*) + ac_cv_path_vi_cv_path_perl="$vi_cv_path_perl" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_vi_cv_path_perl="$as_dir/$ac_word$ac_exec_ext" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + + ;; +esac +fi +vi_cv_path_perl=$ac_cv_path_vi_cv_path_perl + +if test -n "$vi_cv_path_perl"; then + echo "$as_me:$LINENO: result: $vi_cv_path_perl" >&5 +echo "${ECHO_T}$vi_cv_path_perl" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + if test "X$vi_cv_path_perl" != "X"; then + echo "$as_me:$LINENO: checking Perl version" >&5 +echo $ECHO_N "checking Perl version... $ECHO_C" >&6 + if $vi_cv_path_perl -e 'require 5.003_01' >/dev/null 2>/dev/null; then + eval `$vi_cv_path_perl -V:usethreads` + if test "X$usethreads" = "XUNKNOWN" -o "X$usethreads" = "Xundef"; then + badthreads=no + else + if $vi_cv_path_perl -e 'require 5.6.0' >/dev/null 2>/dev/null; then + eval `$vi_cv_path_perl -V:use5005threads` + if test "X$use5005threads" = "XUNKNOWN" -o "X$use5005threads" = "Xundef"; then + badthreads=no + else + badthreads=yes + echo "$as_me:$LINENO: result: >>> Perl > 5.6 with 5.5 threads cannot be used <<<" >&5 +echo "${ECHO_T}>>> Perl > 5.6 with 5.5 threads cannot be used <<<" >&6 + fi + else + badthreads=yes + echo "$as_me:$LINENO: result: >>> Perl 5.5 with threads cannot be used <<<" >&5 +echo "${ECHO_T}>>> Perl 5.5 with threads cannot be used <<<" >&6 + fi + fi + if test $badthreads = no; then + echo "$as_me:$LINENO: result: OK" >&5 +echo "${ECHO_T}OK" >&6 + eval `$vi_cv_path_perl -V:shrpenv` + if test "X$shrpenv" = "XUNKNOWN"; then # pre 5.003_04 + shrpenv="" + fi + vi_cv_perllib=`$vi_cv_path_perl -MConfig -e 'print $Config{privlibexp}'` + + perlcppflags=`$vi_cv_path_perl -Mlib=$srcdir -MExtUtils::Embed \ + -e 'ccflags;perl_inc;print"\n"' | sed -e 's/-fno[^ ]*//'` + perllibs=`cd $srcdir; $vi_cv_path_perl -MExtUtils::Embed -e 'ldopts' | \ + sed -e '/Warning/d' -e '/Note (probably harmless)/d' \ + -e 's/-bE:perl.exp//' -e 's/-lc //'` + perlldflags=`cd $srcdir; $vi_cv_path_perl -MExtUtils::Embed \ + -e 'ccdlflags' | sed -e 's/-bE:perl.exp//'` + + echo "$as_me:$LINENO: checking if compile and link flags for Perl are sane" >&5 +echo $ECHO_N "checking if compile and link flags for Perl are sane... $ECHO_C" >&6 + cflags_save=$CFLAGS + libs_save=$LIBS + ldflags_save=$LDFLAGS + CFLAGS="$CFLAGS $perlcppflags" + LIBS="$LIBS $perllibs" + LDFLAGS="$perlldflags $LDFLAGS" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; perl_ok=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +echo "$as_me:$LINENO: result: no: PERL DISABLED" >&5 +echo "${ECHO_T}no: PERL DISABLED" >&6; perl_ok=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + CFLAGS=$cflags_save + LIBS=$libs_save + LDFLAGS=$ldflags_save + if test $perl_ok = yes; then + if test "X$perlcppflags" != "X"; then + PERL_CFLAGS=`echo "$perlcppflags" | sed -e 's/-pipe //' -e 's/-W[^ ]*//'` + fi + if test "X$perlldflags" != "X"; then + LDFLAGS="$perlldflags $LDFLAGS" + fi + PERL_LIBS=$perllibs + PERL_SRC="auto/if_perl.c if_perlsfio.c" + PERL_OBJ="objects/if_perl.o objects/if_perlsfio.o" + PERL_PRO="if_perl.pro if_perlsfio.pro" + cat >>confdefs.h <<\_ACEOF +#define FEAT_PERL 1 +_ACEOF + + fi + fi + else + echo "$as_me:$LINENO: result: >>> too old; need Perl version 5.003_01 or later <<<" >&5 +echo "${ECHO_T}>>> too old; need Perl version 5.003_01 or later <<<" >&6 + fi + fi + + if test "x$MACOSX" = "xyes"; then + dir=/System/Library/Perl + darwindir=$dir/darwin + if test -d $darwindir; then + PERL=/usr/bin/perl + else + dir=/System/Library/Perl/5.8.1 + darwindir=$dir/darwin-thread-multi-2level + if test -d $darwindir; then + PERL=/usr/bin/perl + fi + fi + if test -n "$PERL"; then + PERL_DIR="$dir" + PERL_CFLAGS="-DFEAT_PERL -I$darwindir/CORE" + PERL_OBJ="objects/if_perl.o objects/if_perlsfio.o $darwindir/auto/DynaLoader/DynaLoader.a" + PERL_LIBS="-L$darwindir/CORE -lperl" + fi + fi +fi + + + + + + + +echo "$as_me:$LINENO: checking --enable-pythoninterp argument" >&5 +echo $ECHO_N "checking --enable-pythoninterp argument... $ECHO_C" >&6 +# Check whether --enable-pythoninterp or --disable-pythoninterp was given. +if test "${enable_pythoninterp+set}" = set; then + enableval="$enable_pythoninterp" + +else + enable_pythoninterp="no" +fi; +echo "$as_me:$LINENO: result: $enable_pythoninterp" >&5 +echo "${ECHO_T}$enable_pythoninterp" >&6 +if test "$enable_pythoninterp" = "yes"; then + # Extract the first word of "python", so it can be a program name with args. +set dummy python; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_path_vi_cv_path_python+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $vi_cv_path_python in + [\\/]* | ?:[\\/]*) + ac_cv_path_vi_cv_path_python="$vi_cv_path_python" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_vi_cv_path_python="$as_dir/$ac_word$ac_exec_ext" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + + ;; +esac +fi +vi_cv_path_python=$ac_cv_path_vi_cv_path_python + +if test -n "$vi_cv_path_python"; then + echo "$as_me:$LINENO: result: $vi_cv_path_python" >&5 +echo "${ECHO_T}$vi_cv_path_python" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + if test "X$vi_cv_path_python" != "X"; then + + echo "$as_me:$LINENO: checking Python version" >&5 +echo $ECHO_N "checking Python version... $ECHO_C" >&6 +if test "${vi_cv_var_python_version+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + vi_cv_var_python_version=` + ${vi_cv_path_python} -c 'import sys; print sys.version[:3]'` + +fi +echo "$as_me:$LINENO: result: $vi_cv_var_python_version" >&5 +echo "${ECHO_T}$vi_cv_var_python_version" >&6 + + echo "$as_me:$LINENO: checking Python is 1.4 or better" >&5 +echo $ECHO_N "checking Python is 1.4 or better... $ECHO_C" >&6 + if ${vi_cv_path_python} -c \ + "import sys; sys.exit(${vi_cv_var_python_version} < 1.4)" + then + echo "$as_me:$LINENO: result: yep" >&5 +echo "${ECHO_T}yep" >&6 + + echo "$as_me:$LINENO: checking Python's install prefix" >&5 +echo $ECHO_N "checking Python's install prefix... $ECHO_C" >&6 +if test "${vi_cv_path_python_pfx+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + vi_cv_path_python_pfx=` + ${vi_cv_path_python} -c \ + "import sys; print sys.prefix"` +fi +echo "$as_me:$LINENO: result: $vi_cv_path_python_pfx" >&5 +echo "${ECHO_T}$vi_cv_path_python_pfx" >&6 + + echo "$as_me:$LINENO: checking Python's execution prefix" >&5 +echo $ECHO_N "checking Python's execution prefix... $ECHO_C" >&6 +if test "${vi_cv_path_python_epfx+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + vi_cv_path_python_epfx=` + ${vi_cv_path_python} -c \ + "import sys; print sys.exec_prefix"` +fi +echo "$as_me:$LINENO: result: $vi_cv_path_python_epfx" >&5 +echo "${ECHO_T}$vi_cv_path_python_epfx" >&6 + + + if test "${vi_cv_path_pythonpath+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + vi_cv_path_pythonpath=` + unset PYTHONPATH; + ${vi_cv_path_python} -c \ + "import sys, string; print string.join(sys.path,':')"` +fi + + + + +# Check whether --with-python-config-dir or --without-python-config-dir was given. +if test "${with_python_config_dir+set}" = set; then + withval="$with_python_config_dir" + vi_cv_path_python_conf="${withval}" +fi; + + echo "$as_me:$LINENO: checking Python's configuration directory" >&5 +echo $ECHO_N "checking Python's configuration directory... $ECHO_C" >&6 +if test "${vi_cv_path_python_conf+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + vi_cv_path_python_conf= + for path in "${vi_cv_path_python_pfx}" "${vi_cv_path_python_epfx}"; do + for subdir in lib share; do + d="${path}/${subdir}/python${vi_cv_var_python_version}/config" + if test -d "$d" && test -f "$d/config.c"; then + vi_cv_path_python_conf="$d" + fi + done + done + +fi +echo "$as_me:$LINENO: result: $vi_cv_path_python_conf" >&5 +echo "${ECHO_T}$vi_cv_path_python_conf" >&6 + + PYTHON_CONFDIR="${vi_cv_path_python_conf}" + + if test "X$PYTHON_CONFDIR" = "X"; then + echo "$as_me:$LINENO: result: can't find it!" >&5 +echo "${ECHO_T}can't find it!" >&6 + else + + if test "${vi_cv_path_python_plibs+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + tmp_mkf="/tmp/Makefile-conf$$" + cat ${PYTHON_CONFDIR}/Makefile - <<'eof' >${tmp_mkf} +__: + @echo "python_MODLIBS='$(MODLIBS)'" + @echo "python_LIBS='$(LIBS)'" + @echo "python_SYSLIBS='$(SYSLIBS)'" + @echo "python_LINKFORSHARED='$(LINKFORSHARED)'" +eof + eval "`cd ${PYTHON_CONFDIR} && make -f ${tmp_mkf} __ | sed '/ directory /d'`" + rm -f ${tmp_mkf} + if test "x$MACOSX" = "xyes" && ${vi_cv_path_python} -c \ + "import sys; sys.exit(${vi_cv_var_python_version} < 2.3)"; then + vi_cv_path_python_plibs="-framework Python" + else + if test "${vi_cv_var_python_version}" = "1.4"; then + vi_cv_path_python_plibs="${PYTHON_CONFDIR}/libModules.a ${PYTHON_CONFDIR}/libPython.a ${PYTHON_CONFDIR}/libObjects.a ${PYTHON_CONFDIR}/libParser.a" + else + vi_cv_path_python_plibs="-L${PYTHON_CONFDIR} -lpython${vi_cv_var_python_version}" + fi + vi_cv_path_python_plibs="${vi_cv_path_python_plibs} ${python_MODLIBS} ${python_LIBS} ${python_SYSLIBS} ${python_LINKFORSHARED}" + vi_cv_path_python_plibs=`echo $vi_cv_path_python_plibs | sed s/-ltermcap//` + fi + +fi + + + PYTHON_LIBS="${vi_cv_path_python_plibs}" + if test "${vi_cv_path_python_pfx}" = "${vi_cv_path_python_epfx}"; then + PYTHON_CFLAGS="-I${vi_cv_path_python_pfx}/include/python${vi_cv_var_python_version}" + else + PYTHON_CFLAGS="-I${vi_cv_path_python_pfx}/include/python${vi_cv_var_python_version} -I${vi_cv_path_python_epfx}/include/python${vi_cv_var_python_version}" + fi + PYTHON_SRC="if_python.c" + if test "x$MACOSX" = "xyes"; then + PYTHON_OBJ="objects/if_python.o" + else + PYTHON_OBJ="objects/if_python.o objects/py_config.o" + fi + if test "${vi_cv_var_python_version}" = "1.4"; then + PYTHON_OBJ="$PYTHON_OBJ objects/py_getpath.o" + fi + PYTHON_GETPATH_CFLAGS="-DPYTHONPATH='\"${vi_cv_path_pythonpath}\"' -DPREFIX='\"${vi_cv_path_python_pfx}\"' -DEXEC_PREFIX='\"${vi_cv_path_python_epfx}\"'" + + echo "$as_me:$LINENO: checking if -pthread should be used" >&5 +echo $ECHO_N "checking if -pthread should be used... $ECHO_C" >&6 + threadsafe_flag= + thread_lib= + if test "`(uname) 2>/dev/null`" != Darwin; then + test "$GCC" = yes && threadsafe_flag="-pthread" + if test "`(uname) 2>/dev/null`" = FreeBSD; then + threadsafe_flag="-D_THREAD_SAFE" + thread_lib="-pthread" + fi + fi + libs_save_old=$LIBS + if test -n "$threadsafe_flag"; then + cflags_save=$CFLAGS + CFLAGS="$CFLAGS $threadsafe_flag" + LIBS="$LIBS $thread_lib" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; PYTHON_CFLAGS="$PYTHON_CFLAGS $threadsafe_flag" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; LIBS=$libs_save_old + +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + CFLAGS=$cflags_save + else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + fi + + echo "$as_me:$LINENO: checking if compile and link flags for Python are sane" >&5 +echo $ECHO_N "checking if compile and link flags for Python are sane... $ECHO_C" >&6 + cflags_save=$CFLAGS + libs_save=$LIBS + CFLAGS="$CFLAGS $PYTHON_CFLAGS" + LIBS="$LIBS $PYTHON_LIBS" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; python_ok=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +echo "$as_me:$LINENO: result: no: PYTHON DISABLED" >&5 +echo "${ECHO_T}no: PYTHON DISABLED" >&6; python_ok=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + CFLAGS=$cflags_save + LIBS=$libs_save + if test $python_ok = yes; then + cat >>confdefs.h <<\_ACEOF +#define FEAT_PYTHON 1 +_ACEOF + + else + LIBS=$libs_save_old + PYTHON_SRC= + PYTHON_OBJ= + PYTHON_LIBS= + PYTHON_CFLAGS= + fi + + fi + else + echo "$as_me:$LINENO: result: too old" >&5 +echo "${ECHO_T}too old" >&6 + fi + fi +fi + + + + + + + +echo "$as_me:$LINENO: checking --enable-tclinterp argument" >&5 +echo $ECHO_N "checking --enable-tclinterp argument... $ECHO_C" >&6 +# Check whether --enable-tclinterp or --disable-tclinterp was given. +if test "${enable_tclinterp+set}" = set; then + enableval="$enable_tclinterp" + +else + enable_tclinterp="no" +fi; +echo "$as_me:$LINENO: result: $enable_tclinterp" >&5 +echo "${ECHO_T}$enable_tclinterp" >&6 + +if test "$enable_tclinterp" = "yes"; then + + echo "$as_me:$LINENO: checking --with-tclsh argument" >&5 +echo $ECHO_N "checking --with-tclsh argument... $ECHO_C" >&6 + +# Check whether --with-tclsh or --without-tclsh was given. +if test "${with_tclsh+set}" = set; then + withval="$with_tclsh" + tclsh_name="$withval"; echo "$as_me:$LINENO: result: $tclsh_name" >&5 +echo "${ECHO_T}$tclsh_name" >&6 +else + tclsh_name="tclsh8.4"; echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi; + # Extract the first word of "$tclsh_name", so it can be a program name with args. +set dummy $tclsh_name; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_path_vi_cv_path_tcl+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $vi_cv_path_tcl in + [\\/]* | ?:[\\/]*) + ac_cv_path_vi_cv_path_tcl="$vi_cv_path_tcl" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_vi_cv_path_tcl="$as_dir/$ac_word$ac_exec_ext" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + + ;; +esac +fi +vi_cv_path_tcl=$ac_cv_path_vi_cv_path_tcl + +if test -n "$vi_cv_path_tcl"; then + echo "$as_me:$LINENO: result: $vi_cv_path_tcl" >&5 +echo "${ECHO_T}$vi_cv_path_tcl" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + + + if test "X$vi_cv_path_tcl" = "X" -a $tclsh_name = "tclsh8.4"; then + tclsh_name="tclsh8.2" + # Extract the first word of "$tclsh_name", so it can be a program name with args. +set dummy $tclsh_name; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_path_vi_cv_path_tcl+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $vi_cv_path_tcl in + [\\/]* | ?:[\\/]*) + ac_cv_path_vi_cv_path_tcl="$vi_cv_path_tcl" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_vi_cv_path_tcl="$as_dir/$ac_word$ac_exec_ext" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + + ;; +esac +fi +vi_cv_path_tcl=$ac_cv_path_vi_cv_path_tcl + +if test -n "$vi_cv_path_tcl"; then + echo "$as_me:$LINENO: result: $vi_cv_path_tcl" >&5 +echo "${ECHO_T}$vi_cv_path_tcl" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + fi + if test "X$vi_cv_path_tcl" = "X" -a $tclsh_name = "tclsh8.2"; then + tclsh_name="tclsh8.0" + # Extract the first word of "$tclsh_name", so it can be a program name with args. +set dummy $tclsh_name; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_path_vi_cv_path_tcl+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $vi_cv_path_tcl in + [\\/]* | ?:[\\/]*) + ac_cv_path_vi_cv_path_tcl="$vi_cv_path_tcl" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_vi_cv_path_tcl="$as_dir/$ac_word$ac_exec_ext" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + + ;; +esac +fi +vi_cv_path_tcl=$ac_cv_path_vi_cv_path_tcl + +if test -n "$vi_cv_path_tcl"; then + echo "$as_me:$LINENO: result: $vi_cv_path_tcl" >&5 +echo "${ECHO_T}$vi_cv_path_tcl" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + fi + if test "X$vi_cv_path_tcl" = "X"; then + tclsh_name="tclsh" + # Extract the first word of "$tclsh_name", so it can be a program name with args. +set dummy $tclsh_name; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_path_vi_cv_path_tcl+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $vi_cv_path_tcl in + [\\/]* | ?:[\\/]*) + ac_cv_path_vi_cv_path_tcl="$vi_cv_path_tcl" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_vi_cv_path_tcl="$as_dir/$ac_word$ac_exec_ext" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + + ;; +esac +fi +vi_cv_path_tcl=$ac_cv_path_vi_cv_path_tcl + +if test -n "$vi_cv_path_tcl"; then + echo "$as_me:$LINENO: result: $vi_cv_path_tcl" >&5 +echo "${ECHO_T}$vi_cv_path_tcl" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + fi + if test "X$vi_cv_path_tcl" != "X"; then + echo "$as_me:$LINENO: checking Tcl version" >&5 +echo $ECHO_N "checking Tcl version... $ECHO_C" >&6 + if echo 'exit [expr [info tclversion] < 8.0]' | $vi_cv_path_tcl - ; then + tclver=`echo 'puts [info tclversion]' | $vi_cv_path_tcl -` + echo "$as_me:$LINENO: result: $tclver - OK" >&5 +echo "${ECHO_T}$tclver - OK" >&6; + tclloc=`echo 'set l [info library];set i [string last lib $l];incr i -2;puts [string range $l 0 $i]' | $vi_cv_path_tcl -` + + echo "$as_me:$LINENO: checking for location of Tcl include" >&5 +echo $ECHO_N "checking for location of Tcl include... $ECHO_C" >&6 + if test "x$MACOSX" != "xyes"; then + tclinc="$tclloc/include $tclloc/include/tcl $tclloc/include/tcl$tclver /usr/local/include /usr/include" + else + tclinc="/System/Library/Frameworks/Tcl.framework/Headers" + fi + for try in $tclinc; do + if test -f "$try/tcl.h"; then + echo "$as_me:$LINENO: result: $try/tcl.h" >&5 +echo "${ECHO_T}$try/tcl.h" >&6 + TCL_INC=$try + break + fi + done + if test -z "$TCL_INC"; then + echo "$as_me:$LINENO: result: " >&5 +echo "${ECHO_T}" >&6 + SKIP_TCL=YES + fi + if test -z "$SKIP_TCL"; then + echo "$as_me:$LINENO: checking for location of tclConfig.sh script" >&5 +echo $ECHO_N "checking for location of tclConfig.sh script... $ECHO_C" >&6 + if test "x$MACOSX" != "xyes"; then + tclcnf=`echo $tclinc | sed s/include/lib/g` + else + tclcnf="/System/Library/Frameworks/Tcl.framework" + fi + for try in $tclcnf; do + if test -f $try/tclConfig.sh; then + echo "$as_me:$LINENO: result: $try/tclConfig.sh" >&5 +echo "${ECHO_T}$try/tclConfig.sh" >&6 + . $try/tclConfig.sh + TCL_LIBS=`eval echo "$TCL_LIB_SPEC $TCL_LIBS"` + TCL_DEFS=`echo $TCL_DEFS | sed -e 's/\\\\ /\\\\X/g' | tr ' ' '\012' | sed -e '/^-[^D]/d' -e '/-D[^_]/d' -e 's/-D_/ -D_/' | tr '\012' ' ' | sed -e 's/\\\\X/\\\\ /g'` + break + fi + done + if test -z "$TCL_LIBS"; then + echo "$as_me:$LINENO: result: " >&5 +echo "${ECHO_T}" >&6 + echo "$as_me:$LINENO: checking for Tcl library by myself" >&5 +echo $ECHO_N "checking for Tcl library by myself... $ECHO_C" >&6 + tcllib=`echo $tclinc | sed s/include/lib/g` + for ext in .so .a ; do + for ver in "" $tclver ; do + for try in $tcllib ; do + trylib=tcl$ver$ext + if test -f $try/lib$trylib ; then + echo "$as_me:$LINENO: result: $try/lib$trylib" >&5 +echo "${ECHO_T}$try/lib$trylib" >&6 + TCL_LIBS="-L$try -ltcl$ver -ldl -lm" + if test "`(uname) 2>/dev/null`" = SunOS && + uname -r | grep '^5' >/dev/null; then + TCL_LIBS="$TCL_LIBS -R $try" + fi + break 3 + fi + done + done + done + if test -z "$TCL_LIBS"; then + echo "$as_me:$LINENO: result: " >&5 +echo "${ECHO_T}" >&6 + SKIP_TCL=YES + fi + fi + if test -z "$SKIP_TCL"; then + cat >>confdefs.h <<\_ACEOF +#define FEAT_TCL 1 +_ACEOF + + TCL_SRC=if_tcl.c + TCL_OBJ=objects/if_tcl.o + TCL_PRO=if_tcl.pro + TCL_CFLAGS="-I$TCL_INC $TCL_DEFS" + fi + fi + else + echo "$as_me:$LINENO: result: too old; need Tcl version 8.0 or later" >&5 +echo "${ECHO_T}too old; need Tcl version 8.0 or later" >&6 + fi + fi +fi + + + + + + +echo "$as_me:$LINENO: checking --enable-rubyinterp argument" >&5 +echo $ECHO_N "checking --enable-rubyinterp argument... $ECHO_C" >&6 +# Check whether --enable-rubyinterp or --disable-rubyinterp was given. +if test "${enable_rubyinterp+set}" = set; then + enableval="$enable_rubyinterp" + +else + enable_rubyinterp="no" +fi; +echo "$as_me:$LINENO: result: $enable_rubyinterp" >&5 +echo "${ECHO_T}$enable_rubyinterp" >&6 +if test "$enable_rubyinterp" = "yes"; then + + # Extract the first word of "ruby", so it can be a program name with args. +set dummy ruby; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_path_vi_cv_path_ruby+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $vi_cv_path_ruby in + [\\/]* | ?:[\\/]*) + ac_cv_path_vi_cv_path_ruby="$vi_cv_path_ruby" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_vi_cv_path_ruby="$as_dir/$ac_word$ac_exec_ext" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + + ;; +esac +fi +vi_cv_path_ruby=$ac_cv_path_vi_cv_path_ruby + +if test -n "$vi_cv_path_ruby"; then + echo "$as_me:$LINENO: result: $vi_cv_path_ruby" >&5 +echo "${ECHO_T}$vi_cv_path_ruby" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + if test "X$vi_cv_path_ruby" != "X"; then + echo "$as_me:$LINENO: checking Ruby version" >&5 +echo $ECHO_N "checking Ruby version... $ECHO_C" >&6 + if $vi_cv_path_ruby -e '(VERSION rescue RUBY_VERSION) >= "1.6.0" or exit 1' >/dev/null 2>/dev/null; then + echo "$as_me:$LINENO: result: OK" >&5 +echo "${ECHO_T}OK" >&6 + echo "$as_me:$LINENO: checking Ruby header files" >&5 +echo $ECHO_N "checking Ruby header files... $ECHO_C" >&6 + rubyhdrdir=`$vi_cv_path_ruby -r mkmf -e 'print Config::CONFIG["archdir"] || $hdrdir' 2>/dev/null` + if test "X$rubyhdrdir" != "X"; then + echo "$as_me:$LINENO: result: $rubyhdrdir" >&5 +echo "${ECHO_T}$rubyhdrdir" >&6 + RUBY_CFLAGS="-I$rubyhdrdir" + rubylibs=`$vi_cv_path_ruby -r rbconfig -e 'print Config::CONFIG["LIBS"]'` + if test "X$rubylibs" != "X"; then + RUBY_LIBS="$rubylibs" + fi + librubyarg=`$vi_cv_path_ruby -r rbconfig -e 'print Config.expand(Config::CONFIG["LIBRUBYARG"])'` + if test -f "$rubyhdrdir/$librubyarg"; then + librubyarg="$rubyhdrdir/$librubyarg" + else + rubylibdir=`$vi_cv_path_ruby -r rbconfig -e 'print Config.expand(Config::CONFIG["libdir"])'` + if test -f "$rubylibdir/$librubyarg"; then + librubyarg="$rubylibdir/$librubyarg" + elif test "$librubyarg" = "libruby.a"; then + librubyarg="-lruby" + else + librubyarg=`$vi_cv_path_ruby -r rbconfig -e "print '$librubyarg'.gsub(/-L\./, %'-L#{Config.expand(Config::CONFIG[\"libdir\"])}')"` + fi + fi + + if test "X$librubyarg" != "X"; then + RUBY_LIBS="$librubyarg $RUBY_LIBS" + fi + rubyldflags=`$vi_cv_path_ruby -r rbconfig -e 'print Config::CONFIG["LDFLAGS"]'` + if test "X$rubyldflags" != "X"; then + LDFLAGS="$rubyldflags $LDFLAGS" + fi + RUBY_SRC="if_ruby.c" + RUBY_OBJ="objects/if_ruby.o" + RUBY_PRO="if_ruby.pro" + cat >>confdefs.h <<\_ACEOF +#define FEAT_RUBY 1 +_ACEOF + + else + echo "$as_me:$LINENO: result: not found" >&5 +echo "${ECHO_T}not found" >&6 + fi + else + echo "$as_me:$LINENO: result: too old; need Ruby version 1.6.0 or later" >&5 +echo "${ECHO_T}too old; need Ruby version 1.6.0 or later" >&6 + fi + fi +fi + + + + + + +echo "$as_me:$LINENO: checking --enable-cscope argument" >&5 +echo $ECHO_N "checking --enable-cscope argument... $ECHO_C" >&6 +# Check whether --enable-cscope or --disable-cscope was given. +if test "${enable_cscope+set}" = set; then + enableval="$enable_cscope" + +else + enable_cscope="no" +fi; +echo "$as_me:$LINENO: result: $enable_cscope" >&5 +echo "${ECHO_T}$enable_cscope" >&6 +if test "$enable_cscope" = "yes"; then + cat >>confdefs.h <<\_ACEOF +#define FEAT_CSCOPE 1 +_ACEOF + +fi + +echo "$as_me:$LINENO: checking --enable-workshop argument" >&5 +echo $ECHO_N "checking --enable-workshop argument... $ECHO_C" >&6 +# Check whether --enable-workshop or --disable-workshop was given. +if test "${enable_workshop+set}" = set; then + enableval="$enable_workshop" + +else + enable_workshop="no" +fi; +echo "$as_me:$LINENO: result: $enable_workshop" >&5 +echo "${ECHO_T}$enable_workshop" >&6 +if test "$enable_workshop" = "yes"; then + cat >>confdefs.h <<\_ACEOF +#define FEAT_SUN_WORKSHOP 1 +_ACEOF + + WORKSHOP_SRC="workshop.c integration.c" + + WORKSHOP_OBJ="objects/workshop.o objects/integration.o" + + if test "${enable_gui-xxx}" = xxx; then + enable_gui=motif + fi +fi + +echo "$as_me:$LINENO: checking --disable-netbeans argument" >&5 +echo $ECHO_N "checking --disable-netbeans argument... $ECHO_C" >&6 +# Check whether --enable-netbeans or --disable-netbeans was given. +if test "${enable_netbeans+set}" = set; then + enableval="$enable_netbeans" + +else + enable_netbeans="yes" +fi; +if test "$enable_netbeans" = "yes"; then + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + +echo "$as_me:$LINENO: checking for socket in -lsocket" >&5 +echo $ECHO_N "checking for socket in -lsocket... $ECHO_C" >&6 +if test "${ac_cv_lib_socket_socket+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsocket $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char socket (); +int +main () +{ +socket (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_socket_socket=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_socket_socket=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_socket_socket" >&5 +echo "${ECHO_T}$ac_cv_lib_socket_socket" >&6 +if test $ac_cv_lib_socket_socket = yes; then + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBSOCKET 1 +_ACEOF + + LIBS="-lsocket $LIBS" + +fi + + +echo "$as_me:$LINENO: checking for gethostbyname in -lnsl" >&5 +echo $ECHO_N "checking for gethostbyname in -lnsl... $ECHO_C" >&6 +if test "${ac_cv_lib_nsl_gethostbyname+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lnsl $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char gethostbyname (); +int +main () +{ +gethostbyname (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_nsl_gethostbyname=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_nsl_gethostbyname=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_nsl_gethostbyname" >&5 +echo "${ECHO_T}$ac_cv_lib_nsl_gethostbyname" >&6 +if test $ac_cv_lib_nsl_gethostbyname = yes; then + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBNSL 1 +_ACEOF + + LIBS="-lnsl $LIBS" + +fi + + echo "$as_me:$LINENO: checking whether compiling netbeans integration is possible" >&5 +echo $ECHO_N "checking whether compiling netbeans integration is possible... $ECHO_C" >&6 + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + /* Check bitfields */ + struct nbbuf { + unsigned int initDone:1; + ushort signmaplen; + }; + +int +main () +{ + + /* Check creating a socket. */ + struct sockaddr_in server; + (void)socket(AF_INET, SOCK_STREAM, 0); + (void)htons(100); + (void)gethostbyname("microsoft.com"); + if (errno == ECONNREFUSED) + (void)connect(1, (struct sockaddr *)&server, sizeof(server)); + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; enable_netbeans="no" +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +else + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +fi +if test "$enable_netbeans" = "yes"; then + cat >>confdefs.h <<\_ACEOF +#define FEAT_NETBEANS_INTG 1 +_ACEOF + + NETBEANS_SRC="netbeans.c" + + NETBEANS_OBJ="objects/netbeans.o" + +fi + +echo "$as_me:$LINENO: checking --enable-sniff argument" >&5 +echo $ECHO_N "checking --enable-sniff argument... $ECHO_C" >&6 +# Check whether --enable-sniff or --disable-sniff was given. +if test "${enable_sniff+set}" = set; then + enableval="$enable_sniff" + +else + enable_sniff="no" +fi; +echo "$as_me:$LINENO: result: $enable_sniff" >&5 +echo "${ECHO_T}$enable_sniff" >&6 +if test "$enable_sniff" = "yes"; then + cat >>confdefs.h <<\_ACEOF +#define FEAT_SNIFF 1 +_ACEOF + + SNIFF_SRC="if_sniff.c" + + SNIFF_OBJ="objects/if_sniff.o" + +fi + +echo "$as_me:$LINENO: checking --enable-multibyte argument" >&5 +echo $ECHO_N "checking --enable-multibyte argument... $ECHO_C" >&6 +# Check whether --enable-multibyte or --disable-multibyte was given. +if test "${enable_multibyte+set}" = set; then + enableval="$enable_multibyte" + +else + enable_multibyte="no" +fi; +echo "$as_me:$LINENO: result: $enable_multibyte" >&5 +echo "${ECHO_T}$enable_multibyte" >&6 +if test "$enable_multibyte" = "yes"; then + cat >>confdefs.h <<\_ACEOF +#define FEAT_MBYTE 1 +_ACEOF + +fi + +echo "$as_me:$LINENO: checking --enable-hangulinput argument" >&5 +echo $ECHO_N "checking --enable-hangulinput argument... $ECHO_C" >&6 +# Check whether --enable-hangulinput or --disable-hangulinput was given. +if test "${enable_hangulinput+set}" = set; then + enableval="$enable_hangulinput" + +else + enable_hangulinput="no" +fi; +echo "$as_me:$LINENO: result: $enable_hangulinput" >&5 +echo "${ECHO_T}$enable_hangulinput" >&6 + +echo "$as_me:$LINENO: checking --enable-xim argument" >&5 +echo $ECHO_N "checking --enable-xim argument... $ECHO_C" >&6 +# Check whether --enable-xim or --disable-xim was given. +if test "${enable_xim+set}" = set; then + enableval="$enable_xim" + echo "$as_me:$LINENO: result: $enable_xim" >&5 +echo "${ECHO_T}$enable_xim" >&6 +else + enable_xim="auto"; echo "$as_me:$LINENO: result: defaulting to auto" >&5 +echo "${ECHO_T}defaulting to auto" >&6 +fi; + +echo "$as_me:$LINENO: checking --enable-fontset argument" >&5 +echo $ECHO_N "checking --enable-fontset argument... $ECHO_C" >&6 +# Check whether --enable-fontset or --disable-fontset was given. +if test "${enable_fontset+set}" = set; then + enableval="$enable_fontset" + +else + enable_fontset="no" +fi; +echo "$as_me:$LINENO: result: $enable_fontset" >&5 +echo "${ECHO_T}$enable_fontset" >&6 + +test -z "$with_x" && with_x=yes +test "${enable_gui-yes}" != no -a "x$MACOSX" != "xyes" -a "x$QNX" != "xyes" && with_x=yes +if test "$with_x" = no; then + echo "$as_me:$LINENO: result: defaulting to: don't HAVE_X11" >&5 +echo "${ECHO_T}defaulting to: don't HAVE_X11" >&6 +else + + # Extract the first word of "xmkmf", so it can be a program name with args. +set dummy xmkmf; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_path_xmkmfpath+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $xmkmfpath in + [\\/]* | ?:[\\/]*) + ac_cv_path_xmkmfpath="$xmkmfpath" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_xmkmfpath="$as_dir/$ac_word$ac_exec_ext" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + + ;; +esac +fi +xmkmfpath=$ac_cv_path_xmkmfpath + +if test -n "$xmkmfpath"; then + echo "$as_me:$LINENO: result: $xmkmfpath" >&5 +echo "${ECHO_T}$xmkmfpath" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + + echo "$as_me:$LINENO: checking for X" >&5 +echo $ECHO_N "checking for X... $ECHO_C" >&6 + + +# Check whether --with-x or --without-x was given. +if test "${with_x+set}" = set; then + withval="$with_x" + +fi; +# $have_x is `yes', `no', `disabled', or empty when we do not yet know. +if test "x$with_x" = xno; then + # The user explicitly disabled X. + have_x=disabled +else + if test "x$x_includes" != xNONE && test "x$x_libraries" != xNONE; then + # Both variables are already set. + have_x=yes + else + if test "${ac_cv_have_x+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # One or both of the vars are not set, and there is no cached value. +ac_x_includes=no ac_x_libraries=no +rm -fr conftest.dir +if mkdir conftest.dir; then + cd conftest.dir + # Make sure to not put "make" in the Imakefile rules, since we grep it out. + cat >Imakefile <<'_ACEOF' +acfindx: + @echo 'ac_im_incroot="${INCROOT}"; ac_im_usrlibdir="${USRLIBDIR}"; ac_im_libdir="${LIBDIR}"' +_ACEOF + if (xmkmf) >/dev/null 2>/dev/null && test -f Makefile; then + # GNU make sometimes prints "make[1]: Entering...", which would confuse us. + eval `${MAKE-make} acfindx 2>/dev/null | grep -v make` + # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR. + for ac_extension in a so sl; do + if test ! -f $ac_im_usrlibdir/libX11.$ac_extension && + test -f $ac_im_libdir/libX11.$ac_extension; then + ac_im_usrlibdir=$ac_im_libdir; break + fi + done + # Screen out bogus values from the imake configuration. They are + # bogus both because they are the default anyway, and because + # using them would break gcc on systems where it needs fixed includes. + case $ac_im_incroot in + /usr/include) ;; + *) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes=$ac_im_incroot;; + esac + case $ac_im_usrlibdir in + /usr/lib | /lib) ;; + *) test -d "$ac_im_usrlibdir" && ac_x_libraries=$ac_im_usrlibdir ;; + esac + fi + cd .. + rm -fr conftest.dir +fi + +# Standard set of common directories for X headers. +# Check X11 before X11Rn because it is often a symlink to the current release. +ac_x_header_dirs=' +/usr/X11/include +/usr/X11R6/include +/usr/X11R5/include +/usr/X11R4/include + +/usr/include/X11 +/usr/include/X11R6 +/usr/include/X11R5 +/usr/include/X11R4 + +/usr/local/X11/include +/usr/local/X11R6/include +/usr/local/X11R5/include +/usr/local/X11R4/include + +/usr/local/include/X11 +/usr/local/include/X11R6 +/usr/local/include/X11R5 +/usr/local/include/X11R4 + +/usr/X386/include +/usr/x386/include +/usr/XFree86/include/X11 + +/usr/include +/usr/local/include +/usr/unsupported/include +/usr/athena/include +/usr/local/x11r5/include +/usr/lpp/Xamples/include + +/usr/openwin/include +/usr/openwin/share/include' + +if test "$ac_x_includes" = no; then + # Guess where to find include files, by looking for Intrinsic.h. + # First, try using that file with no special directory specified. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + # We can compile using X headers with no special include directory. +ac_x_includes= +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + for ac_dir in $ac_x_header_dirs; do + if test -r "$ac_dir/X11/Intrinsic.h"; then + ac_x_includes=$ac_dir + break + fi +done +fi +rm -f conftest.err conftest.$ac_ext +fi # $ac_x_includes = no + +if test "$ac_x_libraries" = no; then + # Check for the libraries. + # See if we find them without any special options. + # Don't add to $LIBS permanently. + ac_save_LIBS=$LIBS + LIBS="-lXt $LIBS" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +int +main () +{ +XtMalloc (0) + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + LIBS=$ac_save_LIBS +# We can link X programs with no special library path. +ac_x_libraries= +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +LIBS=$ac_save_LIBS +for ac_dir in `echo "$ac_x_includes $ac_x_header_dirs" | sed s/include/lib/g` +do + # Don't even attempt the hair of trying to link an X program! + for ac_extension in a so sl; do + if test -r $ac_dir/libXt.$ac_extension; then + ac_x_libraries=$ac_dir + break 2 + fi + done +done +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi # $ac_x_libraries = no + +if test "$ac_x_includes" = no || test "$ac_x_libraries" = no; then + # Didn't find X anywhere. Cache the known absence of X. + ac_cv_have_x="have_x=no" +else + # Record where we found X for the cache. + ac_cv_have_x="have_x=yes \ + ac_x_includes=$ac_x_includes ac_x_libraries=$ac_x_libraries" +fi +fi + + fi + eval "$ac_cv_have_x" +fi # $with_x != no + +if test "$have_x" != yes; then + echo "$as_me:$LINENO: result: $have_x" >&5 +echo "${ECHO_T}$have_x" >&6 + no_x=yes +else + # If each of the values was on the command line, it overrides each guess. + test "x$x_includes" = xNONE && x_includes=$ac_x_includes + test "x$x_libraries" = xNONE && x_libraries=$ac_x_libraries + # Update the cache value to reflect the command line values. + ac_cv_have_x="have_x=yes \ + ac_x_includes=$x_includes ac_x_libraries=$x_libraries" + echo "$as_me:$LINENO: result: libraries $x_libraries, headers $x_includes" >&5 +echo "${ECHO_T}libraries $x_libraries, headers $x_includes" >&6 +fi + +if test "$no_x" = yes; then + # Not all programs may use this symbol, but it does not hurt to define it. + +cat >>confdefs.h <<\_ACEOF +#define X_DISPLAY_MISSING 1 +_ACEOF + + X_CFLAGS= X_PRE_LIBS= X_LIBS= X_EXTRA_LIBS= +else + if test -n "$x_includes"; then + X_CFLAGS="$X_CFLAGS -I$x_includes" + fi + + # It would also be nice to do this for all -L options, not just this one. + if test -n "$x_libraries"; then + X_LIBS="$X_LIBS -L$x_libraries" + # For Solaris; some versions of Sun CC require a space after -R and + # others require no space. Words are not sufficient . . . . + case `(uname -sr) 2>/dev/null` in + "SunOS 5"*) + echo "$as_me:$LINENO: checking whether -R must be followed by a space" >&5 +echo $ECHO_N "checking whether -R must be followed by a space... $ECHO_C" >&6 + ac_xsave_LIBS=$LIBS; LIBS="$LIBS -R$x_libraries" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_R_nospace=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_R_nospace=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test $ac_R_nospace = yes; then + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + X_LIBS="$X_LIBS -R$x_libraries" + else + LIBS="$ac_xsave_LIBS -R $x_libraries" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_R_space=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_R_space=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test $ac_R_space = yes; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + X_LIBS="$X_LIBS -R $x_libraries" + else + echo "$as_me:$LINENO: result: neither works" >&5 +echo "${ECHO_T}neither works" >&6 + fi + fi + LIBS=$ac_xsave_LIBS + esac + fi + + # Check for system-dependent libraries X programs must link with. + # Do this before checking for the system-independent R6 libraries + # (-lICE), since we may need -lsocket or whatever for X linking. + + if test "$ISC" = yes; then + X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl_s -linet" + else + # Martyn Johnson says this is needed for Ultrix, if the X + # libraries were built with DECnet support. And Karl Berry says + # the Alpha needs dnet_stub (dnet does not exist). + ac_xsave_LIBS="$LIBS"; LIBS="$LIBS $X_LIBS -lX11" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char XOpenDisplay (); +int +main () +{ +XOpenDisplay (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +echo "$as_me:$LINENO: checking for dnet_ntoa in -ldnet" >&5 +echo $ECHO_N "checking for dnet_ntoa in -ldnet... $ECHO_C" >&6 +if test "${ac_cv_lib_dnet_dnet_ntoa+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldnet $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dnet_ntoa (); +int +main () +{ +dnet_ntoa (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_dnet_dnet_ntoa=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_dnet_dnet_ntoa=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_dnet_dnet_ntoa" >&5 +echo "${ECHO_T}$ac_cv_lib_dnet_dnet_ntoa" >&6 +if test $ac_cv_lib_dnet_dnet_ntoa = yes; then + X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet" +fi + + if test $ac_cv_lib_dnet_dnet_ntoa = no; then + echo "$as_me:$LINENO: checking for dnet_ntoa in -ldnet_stub" >&5 +echo $ECHO_N "checking for dnet_ntoa in -ldnet_stub... $ECHO_C" >&6 +if test "${ac_cv_lib_dnet_stub_dnet_ntoa+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldnet_stub $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dnet_ntoa (); +int +main () +{ +dnet_ntoa (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_dnet_stub_dnet_ntoa=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_dnet_stub_dnet_ntoa=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_dnet_stub_dnet_ntoa" >&5 +echo "${ECHO_T}$ac_cv_lib_dnet_stub_dnet_ntoa" >&6 +if test $ac_cv_lib_dnet_stub_dnet_ntoa = yes; then + X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet_stub" +fi + + fi +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LIBS="$ac_xsave_LIBS" + + # msh@cis.ufl.edu says -lnsl (and -lsocket) are needed for his 386/AT, + # to get the SysV transport functions. + # Chad R. Larson says the Pyramis MIS-ES running DC/OSx (SVR4) + # needs -lnsl. + # The nsl library prevents programs from opening the X display + # on Irix 5.2, according to T.E. Dickey. + # The functions gethostbyname, getservbyname, and inet_addr are + # in -lbsd on LynxOS 3.0.1/i386, according to Lars Hecking. + echo "$as_me:$LINENO: checking for gethostbyname" >&5 +echo $ECHO_N "checking for gethostbyname... $ECHO_C" >&6 +if test "${ac_cv_func_gethostbyname+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define gethostbyname to an innocuous variant, in case declares gethostbyname. + For example, HP-UX 11i declares gettimeofday. */ +#define gethostbyname innocuous_gethostbyname + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char gethostbyname (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef gethostbyname + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char gethostbyname (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_gethostbyname) || defined (__stub___gethostbyname) +choke me +#else +char (*f) () = gethostbyname; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != gethostbyname; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_gethostbyname=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_func_gethostbyname=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_func_gethostbyname" >&5 +echo "${ECHO_T}$ac_cv_func_gethostbyname" >&6 + + if test $ac_cv_func_gethostbyname = no; then + echo "$as_me:$LINENO: checking for gethostbyname in -lnsl" >&5 +echo $ECHO_N "checking for gethostbyname in -lnsl... $ECHO_C" >&6 +if test "${ac_cv_lib_nsl_gethostbyname+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lnsl $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char gethostbyname (); +int +main () +{ +gethostbyname (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_nsl_gethostbyname=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_nsl_gethostbyname=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_nsl_gethostbyname" >&5 +echo "${ECHO_T}$ac_cv_lib_nsl_gethostbyname" >&6 +if test $ac_cv_lib_nsl_gethostbyname = yes; then + X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl" +fi + + if test $ac_cv_lib_nsl_gethostbyname = no; then + echo "$as_me:$LINENO: checking for gethostbyname in -lbsd" >&5 +echo $ECHO_N "checking for gethostbyname in -lbsd... $ECHO_C" >&6 +if test "${ac_cv_lib_bsd_gethostbyname+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lbsd $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char gethostbyname (); +int +main () +{ +gethostbyname (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_bsd_gethostbyname=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_bsd_gethostbyname=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_bsd_gethostbyname" >&5 +echo "${ECHO_T}$ac_cv_lib_bsd_gethostbyname" >&6 +if test $ac_cv_lib_bsd_gethostbyname = yes; then + X_EXTRA_LIBS="$X_EXTRA_LIBS -lbsd" +fi + + fi + fi + + # lieder@skyler.mavd.honeywell.com says without -lsocket, + # socket/setsockopt and other routines are undefined under SCO ODT + # 2.0. But -lsocket is broken on IRIX 5.2 (and is not necessary + # on later versions), says Simon Leinen: it contains gethostby* + # variants that don't use the name server (or something). -lsocket + # must be given before -lnsl if both are needed. We assume that + # if connect needs -lnsl, so does gethostbyname. + echo "$as_me:$LINENO: checking for connect" >&5 +echo $ECHO_N "checking for connect... $ECHO_C" >&6 +if test "${ac_cv_func_connect+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define connect to an innocuous variant, in case declares connect. + For example, HP-UX 11i declares gettimeofday. */ +#define connect innocuous_connect + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char connect (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef connect + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char connect (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_connect) || defined (__stub___connect) +choke me +#else +char (*f) () = connect; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != connect; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_connect=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_func_connect=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_func_connect" >&5 +echo "${ECHO_T}$ac_cv_func_connect" >&6 + + if test $ac_cv_func_connect = no; then + echo "$as_me:$LINENO: checking for connect in -lsocket" >&5 +echo $ECHO_N "checking for connect in -lsocket... $ECHO_C" >&6 +if test "${ac_cv_lib_socket_connect+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsocket $X_EXTRA_LIBS $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char connect (); +int +main () +{ +connect (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_socket_connect=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_socket_connect=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_socket_connect" >&5 +echo "${ECHO_T}$ac_cv_lib_socket_connect" >&6 +if test $ac_cv_lib_socket_connect = yes; then + X_EXTRA_LIBS="-lsocket $X_EXTRA_LIBS" +fi + + fi + + # Guillermo Gomez says -lposix is necessary on A/UX. + echo "$as_me:$LINENO: checking for remove" >&5 +echo $ECHO_N "checking for remove... $ECHO_C" >&6 +if test "${ac_cv_func_remove+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define remove to an innocuous variant, in case declares remove. + For example, HP-UX 11i declares gettimeofday. */ +#define remove innocuous_remove + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char remove (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef remove + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char remove (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_remove) || defined (__stub___remove) +choke me +#else +char (*f) () = remove; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != remove; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_remove=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_func_remove=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_func_remove" >&5 +echo "${ECHO_T}$ac_cv_func_remove" >&6 + + if test $ac_cv_func_remove = no; then + echo "$as_me:$LINENO: checking for remove in -lposix" >&5 +echo $ECHO_N "checking for remove in -lposix... $ECHO_C" >&6 +if test "${ac_cv_lib_posix_remove+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lposix $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char remove (); +int +main () +{ +remove (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_posix_remove=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_posix_remove=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_posix_remove" >&5 +echo "${ECHO_T}$ac_cv_lib_posix_remove" >&6 +if test $ac_cv_lib_posix_remove = yes; then + X_EXTRA_LIBS="$X_EXTRA_LIBS -lposix" +fi + + fi + + # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay. + echo "$as_me:$LINENO: checking for shmat" >&5 +echo $ECHO_N "checking for shmat... $ECHO_C" >&6 +if test "${ac_cv_func_shmat+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define shmat to an innocuous variant, in case declares shmat. + For example, HP-UX 11i declares gettimeofday. */ +#define shmat innocuous_shmat + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char shmat (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef shmat + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char shmat (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_shmat) || defined (__stub___shmat) +choke me +#else +char (*f) () = shmat; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != shmat; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_shmat=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_func_shmat=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_func_shmat" >&5 +echo "${ECHO_T}$ac_cv_func_shmat" >&6 + + if test $ac_cv_func_shmat = no; then + echo "$as_me:$LINENO: checking for shmat in -lipc" >&5 +echo $ECHO_N "checking for shmat in -lipc... $ECHO_C" >&6 +if test "${ac_cv_lib_ipc_shmat+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lipc $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char shmat (); +int +main () +{ +shmat (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_ipc_shmat=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_ipc_shmat=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_ipc_shmat" >&5 +echo "${ECHO_T}$ac_cv_lib_ipc_shmat" >&6 +if test $ac_cv_lib_ipc_shmat = yes; then + X_EXTRA_LIBS="$X_EXTRA_LIBS -lipc" +fi + + fi + fi + + # Check for libraries that X11R6 Xt/Xaw programs need. + ac_save_LDFLAGS=$LDFLAGS + test -n "$x_libraries" && LDFLAGS="$LDFLAGS -L$x_libraries" + # SM needs ICE to (dynamically) link under SunOS 4.x (so we have to + # check for ICE first), but we must link in the order -lSM -lICE or + # we get undefined symbols. So assume we have SM if we have ICE. + # These have to be linked with before -lX11, unlike the other + # libraries we check for below, so use a different variable. + # John Interrante, Karl Berry + echo "$as_me:$LINENO: checking for IceConnectionNumber in -lICE" >&5 +echo $ECHO_N "checking for IceConnectionNumber in -lICE... $ECHO_C" >&6 +if test "${ac_cv_lib_ICE_IceConnectionNumber+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lICE $X_EXTRA_LIBS $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char IceConnectionNumber (); +int +main () +{ +IceConnectionNumber (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_ICE_IceConnectionNumber=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_ICE_IceConnectionNumber=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_ICE_IceConnectionNumber" >&5 +echo "${ECHO_T}$ac_cv_lib_ICE_IceConnectionNumber" >&6 +if test $ac_cv_lib_ICE_IceConnectionNumber = yes; then + X_PRE_LIBS="$X_PRE_LIBS -lSM -lICE" +fi + + LDFLAGS=$ac_save_LDFLAGS + +fi + + + if test "$OS390Unix" = "yes"; then + CFLAGS="$CFLAGS -W c,dll" + LDFLAGS="$LDFLAGS -W l,dll" + X_EXTRA_LIBS="$X_EXTRA_LIBS -lSM -lICE -lXmu" + fi + + + if test -d "$x_includes" && test ! -d "$x_libraries"; then + x_libraries=`echo "$x_includes" | sed s/include/lib/` + echo "$as_me:$LINENO: result: Corrected X libraries to $x_libraries" >&5 +echo "${ECHO_T}Corrected X libraries to $x_libraries" >&6 + X_LIBS="$X_LIBS -L$x_libraries" + if test "`(uname) 2>/dev/null`" = SunOS && + uname -r | grep '^5' >/dev/null; then + X_LIBS="$X_LIBS -R $x_libraries" + fi + fi + + if test -d "$x_libraries" && test ! -d "$x_includes"; then + x_includes=`echo "$x_libraries" | sed s/lib/include/` + echo "$as_me:$LINENO: result: Corrected X includes to $x_includes" >&5 +echo "${ECHO_T}Corrected X includes to $x_includes" >&6 + X_CFLAGS="$X_CFLAGS -I$x_includes" + fi + + X_CFLAGS="`echo $X_CFLAGS\ | sed 's%-I/usr/include %%'`" + X_LIBS="`echo $X_LIBS\ | sed 's%-L/usr/lib %%'`" + X_LIBS="`echo $X_LIBS\ | sed -e 's%-R/usr/lib %%' -e 's%-R /usr/lib %%'`" + + + echo "$as_me:$LINENO: checking if X11 header files can be found" >&5 +echo $ECHO_N "checking if X11 header files can be found... $ECHO_C" >&6 + cflags_save=$CFLAGS + CFLAGS="$CFLAGS $X_CFLAGS" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; no_x=yes +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS=$cflags_save + + if test "${no_x-no}" = yes; then + with_x=no + else + cat >>confdefs.h <<\_ACEOF +#define HAVE_X11 1 +_ACEOF + + X_LIB="-lXt -lX11"; + + + ac_save_LDFLAGS="$LDFLAGS" + LDFLAGS="-L$x_libraries $LDFLAGS" + + echo "$as_me:$LINENO: checking for _XdmcpAuthDoIt in -lXdmcp" >&5 +echo $ECHO_N "checking for _XdmcpAuthDoIt in -lXdmcp... $ECHO_C" >&6 +if test "${ac_cv_lib_Xdmcp__XdmcpAuthDoIt+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lXdmcp -lXt $X_PRE_LIBS -lX11 $X_EXTRA_LIBS -lXdmcp $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char _XdmcpAuthDoIt (); +int +main () +{ +_XdmcpAuthDoIt (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_Xdmcp__XdmcpAuthDoIt=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_Xdmcp__XdmcpAuthDoIt=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_Xdmcp__XdmcpAuthDoIt" >&5 +echo "${ECHO_T}$ac_cv_lib_Xdmcp__XdmcpAuthDoIt" >&6 +if test $ac_cv_lib_Xdmcp__XdmcpAuthDoIt = yes; then + X_EXTRA_LIBS="$X_EXTRA_LIBS -lXdmcp" +fi + + + echo "$as_me:$LINENO: checking for IceOpenConnection in -lICE" >&5 +echo $ECHO_N "checking for IceOpenConnection in -lICE... $ECHO_C" >&6 +if test "${ac_cv_lib_ICE_IceOpenConnection+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lICE $X_EXTRA_LIBS $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char IceOpenConnection (); +int +main () +{ +IceOpenConnection (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_ICE_IceOpenConnection=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_ICE_IceOpenConnection=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_ICE_IceOpenConnection" >&5 +echo "${ECHO_T}$ac_cv_lib_ICE_IceOpenConnection" >&6 +if test $ac_cv_lib_ICE_IceOpenConnection = yes; then + X_EXTRA_LIBS="$X_EXTRA_LIBS -lSM -lICE" +fi + + + LDFLAGS="$X_LIBS $ac_save_LDFLAGS" + echo "$as_me:$LINENO: checking for XpmCreatePixmapFromData in -lXpm" >&5 +echo $ECHO_N "checking for XpmCreatePixmapFromData in -lXpm... $ECHO_C" >&6 +if test "${ac_cv_lib_Xpm_XpmCreatePixmapFromData+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lXpm -lXt $X_PRE_LIBS -lXpm -lX11 $X_EXTRA_LIBS $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char XpmCreatePixmapFromData (); +int +main () +{ +XpmCreatePixmapFromData (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_Xpm_XpmCreatePixmapFromData=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_Xpm_XpmCreatePixmapFromData=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_Xpm_XpmCreatePixmapFromData" >&5 +echo "${ECHO_T}$ac_cv_lib_Xpm_XpmCreatePixmapFromData" >&6 +if test $ac_cv_lib_Xpm_XpmCreatePixmapFromData = yes; then + X_PRE_LIBS="$X_PRE_LIBS -lXpm" +fi + + + echo "$as_me:$LINENO: checking if X11 header files implicitly declare return values" >&5 +echo $ECHO_N "checking if X11 header files implicitly declare return values... $ECHO_C" >&6 + cflags_save=$CFLAGS + CFLAGS="$CFLAGS $X_CFLAGS -Werror" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +CFLAGS="$CFLAGS -Wno-implicit-int" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; cflags_save="$cflags_save -Wno-implicit-int" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +echo "$as_me:$LINENO: result: test failed" >&5 +echo "${ECHO_T}test failed" >&6 + +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS=$cflags_save + + LDFLAGS="$ac_save_LDFLAGS" + + fi +fi + +test "x$with_x" = xno -a "x$MACOSX" != "xyes" -a "x$QNX" != "xyes" && enable_gui=no + +echo "$as_me:$LINENO: checking --enable-gui argument" >&5 +echo $ECHO_N "checking --enable-gui argument... $ECHO_C" >&6 +# Check whether --enable-gui or --disable-gui was given. +if test "${enable_gui+set}" = set; then + enableval="$enable_gui" + +else + enable_gui="auto" +fi; + +enable_gui_canon=`echo "_$enable_gui" | \ + sed 's/[ _+-]//g;y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'` + +SKIP_GTK=YES +SKIP_GTK2=YES +SKIP_GNOME=YES +SKIP_MOTIF=YES +SKIP_ATHENA=YES +SKIP_NEXTAW=YES +SKIP_PHOTON=YES +SKIP_CARBON=YES +SKIP_MACVIM=YES +GUITYPE=NONE + +if test "x$QNX" = "xyes" -a "x$with_x" = "xno" ; then + SKIP_PHOTON= + case "$enable_gui_canon" in + no) echo "$as_me:$LINENO: result: no GUI support" >&5 +echo "${ECHO_T}no GUI support" >&6 + SKIP_PHOTON=YES ;; + yes|"") echo "$as_me:$LINENO: result: yes - automatic GUI support" >&5 +echo "${ECHO_T}yes - automatic GUI support" >&6 ;; + auto) echo "$as_me:$LINENO: result: auto - automatic GUI support" >&5 +echo "${ECHO_T}auto - automatic GUI support" >&6 ;; + photon) echo "$as_me:$LINENO: result: Photon GUI support" >&5 +echo "${ECHO_T}Photon GUI support" >&6 ;; + *) echo "$as_me:$LINENO: result: Sorry, $enable_gui GUI is not supported" >&5 +echo "${ECHO_T}Sorry, $enable_gui GUI is not supported" >&6 + SKIP_PHOTON=YES ;; + esac + +elif test "x$MACOSX" = "xyes" -a "x$with_x" = "xno" ; then + SKIP_CARBON= + SKIP_MACVIM= + case "$enable_gui_canon" in + no) echo "$as_me:$LINENO: result: no GUI support" >&5 +echo "${ECHO_T}no GUI support" >&6 + SKIP_CARBON=YES + SKIP_MACVIM=YES ;; + yes|"") echo "$as_me:$LINENO: result: yes - automatic GUI support" >&5 +echo "${ECHO_T}yes - automatic GUI support" >&6 ;; + auto) echo "$as_me:$LINENO: result: auto - automatic GUI support" >&5 +echo "${ECHO_T}auto - automatic GUI support" >&6 ;; + carbon) echo "$as_me:$LINENO: result: Carbon GUI support" >&5 +echo "${ECHO_T}Carbon GUI support" >&6 + SKIP_MACVIM=YES ;; + macvim) echo "$as_me:$LINENO: result: MacVim GUI support" >&5 +echo "${ECHO_T}MacVim GUI support" >&6 + SKIP_CARBON=YES ;; + *) echo "$as_me:$LINENO: result: Sorry, $enable_gui GUI is not supported" >&5 +echo "${ECHO_T}Sorry, $enable_gui GUI is not supported" >&6 + SKIP_CARBON=YES + SKIP_MACVIM=YES ;; + esac + +else + + case "$enable_gui_canon" in + no|none) echo "$as_me:$LINENO: result: no GUI support" >&5 +echo "${ECHO_T}no GUI support" >&6 ;; + yes|""|auto) echo "$as_me:$LINENO: result: yes/auto - automatic GUI support" >&5 +echo "${ECHO_T}yes/auto - automatic GUI support" >&6 + SKIP_GTK= + SKIP_GTK2= + SKIP_GNOME= + SKIP_MOTIF= + SKIP_ATHENA= + SKIP_NEXTAW= + SKIP_MACVIM= + SKIP_CARBON=;; + gtk) echo "$as_me:$LINENO: result: GTK+ 1.x GUI support" >&5 +echo "${ECHO_T}GTK+ 1.x GUI support" >&6 + SKIP_GTK=;; + gtk2) echo "$as_me:$LINENO: result: GTK+ 2.x GUI support" >&5 +echo "${ECHO_T}GTK+ 2.x GUI support" >&6 + SKIP_GTK= + SKIP_GTK2=;; + gnome) echo "$as_me:$LINENO: result: GNOME 1.x GUI support" >&5 +echo "${ECHO_T}GNOME 1.x GUI support" >&6 + SKIP_GNOME= + SKIP_GTK=;; + gnome2) echo "$as_me:$LINENO: result: GNOME 2.x GUI support" >&5 +echo "${ECHO_T}GNOME 2.x GUI support" >&6 + SKIP_GNOME= + SKIP_GTK= + SKIP_GTK2=;; + motif) echo "$as_me:$LINENO: result: Motif GUI support" >&5 +echo "${ECHO_T}Motif GUI support" >&6 + SKIP_MOTIF=;; + athena) echo "$as_me:$LINENO: result: Athena GUI support" >&5 +echo "${ECHO_T}Athena GUI support" >&6 + SKIP_ATHENA=;; + nextaw) echo "$as_me:$LINENO: result: neXtaw GUI support" >&5 +echo "${ECHO_T}neXtaw GUI support" >&6 + SKIP_NEXTAW=;; + *) echo "$as_me:$LINENO: result: Sorry, $enable_gui GUI is not supported" >&5 +echo "${ECHO_T}Sorry, $enable_gui GUI is not supported" >&6 ;; + esac + +fi + +if test "x$SKIP_GTK" != "xYES" -a "$enable_gui_canon" != "gtk" -a "$enable_gui_canon" != "gtk2"; then + echo "$as_me:$LINENO: checking whether or not to look for GTK" >&5 +echo $ECHO_N "checking whether or not to look for GTK... $ECHO_C" >&6 + # Check whether --enable-gtk-check or --disable-gtk-check was given. +if test "${enable_gtk_check+set}" = set; then + enableval="$enable_gtk_check" + +else + enable_gtk_check="yes" +fi; + echo "$as_me:$LINENO: result: $enable_gtk_check" >&5 +echo "${ECHO_T}$enable_gtk_check" >&6 + if test "x$enable_gtk_check" = "xno"; then + SKIP_GTK=YES + SKIP_GNOME=YES + fi +fi + +if test "x$SKIP_GTK2" != "xYES" -a "$enable_gui_canon" != "gtk2" \ + -a "$enable_gui_canon" != "gnome2"; then + echo "$as_me:$LINENO: checking whether or not to look for GTK+ 2" >&5 +echo $ECHO_N "checking whether or not to look for GTK+ 2... $ECHO_C" >&6 + # Check whether --enable-gtk2-check or --disable-gtk2-check was given. +if test "${enable_gtk2_check+set}" = set; then + enableval="$enable_gtk2_check" + +else + enable_gtk2_check="yes" +fi; + echo "$as_me:$LINENO: result: $enable_gtk2_check" >&5 +echo "${ECHO_T}$enable_gtk2_check" >&6 + if test "x$enable_gtk2_check" = "xno"; then + SKIP_GTK2=YES + fi +fi + +if test "x$SKIP_GNOME" != "xYES" -a "$enable_gui_canon" != "gnome" \ + -a "$enable_gui_canon" != "gnome2"; then + echo "$as_me:$LINENO: checking whether or not to look for GNOME" >&5 +echo $ECHO_N "checking whether or not to look for GNOME... $ECHO_C" >&6 + # Check whether --enable-gnome-check or --disable-gnome-check was given. +if test "${enable_gnome_check+set}" = set; then + enableval="$enable_gnome_check" + +else + enable_gnome_check="no" +fi; + echo "$as_me:$LINENO: result: $enable_gnome_check" >&5 +echo "${ECHO_T}$enable_gnome_check" >&6 + if test "x$enable_gnome_check" = "xno"; then + SKIP_GNOME=YES + fi +fi + +if test "x$SKIP_MOTIF" != "xYES" -a "$enable_gui_canon" != "motif"; then + echo "$as_me:$LINENO: checking whether or not to look for Motif" >&5 +echo $ECHO_N "checking whether or not to look for Motif... $ECHO_C" >&6 + # Check whether --enable-motif-check or --disable-motif-check was given. +if test "${enable_motif_check+set}" = set; then + enableval="$enable_motif_check" + +else + enable_motif_check="yes" +fi; + echo "$as_me:$LINENO: result: $enable_motif_check" >&5 +echo "${ECHO_T}$enable_motif_check" >&6 + if test "x$enable_motif_check" = "xno"; then + SKIP_MOTIF=YES + fi +fi + +if test "x$SKIP_ATHENA" != "xYES" -a "$enable_gui_canon" != "athena"; then + echo "$as_me:$LINENO: checking whether or not to look for Athena" >&5 +echo $ECHO_N "checking whether or not to look for Athena... $ECHO_C" >&6 + # Check whether --enable-athena-check or --disable-athena-check was given. +if test "${enable_athena_check+set}" = set; then + enableval="$enable_athena_check" + +else + enable_athena_check="yes" +fi; + echo "$as_me:$LINENO: result: $enable_athena_check" >&5 +echo "${ECHO_T}$enable_athena_check" >&6 + if test "x$enable_athena_check" = "xno"; then + SKIP_ATHENA=YES + fi +fi + +if test "x$SKIP_NEXTAW" != "xYES" -a "$enable_gui_canon" != "nextaw"; then + echo "$as_me:$LINENO: checking whether or not to look for neXtaw" >&5 +echo $ECHO_N "checking whether or not to look for neXtaw... $ECHO_C" >&6 + # Check whether --enable-nextaw-check or --disable-nextaw-check was given. +if test "${enable_nextaw_check+set}" = set; then + enableval="$enable_nextaw_check" + +else + enable_nextaw_check="yes" +fi; + echo "$as_me:$LINENO: result: $enable_nextaw_check" >&5 +echo "${ECHO_T}$enable_nextaw_check" >&6; + if test "x$enable_nextaw_check" = "xno"; then + SKIP_NEXTAW=YES + fi +fi + +if test "x$SKIP_CARBON" != "xYES" -a "$enable_gui_canon" != "carbon"; then + echo "$as_me:$LINENO: checking whether or not to look for Carbon" >&5 +echo $ECHO_N "checking whether or not to look for Carbon... $ECHO_C" >&6 + # Check whether --enable-carbon-check or --disable-carbon-check was given. +if test "${enable_carbon_check+set}" = set; then + enableval="$enable_carbon_check" + +else + enable_carbon_check="yes" +fi; + echo "$as_me:$LINENO: result: $enable_carbon_check" >&5 +echo "${ECHO_T}$enable_carbon_check" >&6; + if test "x$enable_carbon_check" = "xno"; then + SKIP_CARBON=YES + fi +fi + +if test "x$SKIP_MACVIM" != "xYES" -a "$enable_gui_canon" != "macvim"; then + echo "$as_me:$LINENO: checking whether or not to look for MacVim" >&5 +echo $ECHO_N "checking whether or not to look for MacVim... $ECHO_C" >&6 + # Check whether --enable-macvim-check or --disable-macvim-check was given. +if test "${enable_macvim_check+set}" = set; then + enableval="$enable_macvim_check" + +else + enable_macvim_check="yes" +fi; + echo "$as_me:$LINENO: result: $enable_macvim_check" >&5 +echo "${ECHO_T}$enable_macvim_check" >&6; + if test "x$enable_macvim_check" = "xno"; then + SKIP_MACVIM=YES + fi +fi + +if test "x$MACOSX" = "xyes"; then + if test -z "$SKIP_CARBON" -a "x$CARBON" = "xyes"; then + echo "$as_me:$LINENO: checking for Carbon GUI" >&5 +echo $ECHO_N "checking for Carbon GUI... $ECHO_C" >&6 + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; + GUITYPE=CARBONGUI + elif test -z "$SKIP_MACVIM" -a "x$COCOA" = "xyes"; then + echo "$as_me:$LINENO: checking for MacVim GUI" >&5 +echo $ECHO_N "checking for MacVim GUI... $ECHO_C" >&6 + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; + GUITYPE=MACVIMGUI + fi + + if test "$VIMNAME" = "vim"; then + VIMNAME=Vim + fi + + if test x$prefix = xNONE; then + prefix=/Applications + fi + + datadir='${prefix}/Vim.app/Contents/Resources' + + SKIP_GTK=YES; + SKIP_GTK2=YES; + SKIP_GNOME=YES; + SKIP_MOTIF=YES; + SKIP_ATHENA=YES; + SKIP_NEXTAW=YES; + SKIP_PHOTON=YES; + SKIP_MACVIM=YES; + SKIP_CARBON=YES +fi + + + + + + + + + +if test -z "$SKIP_GTK"; then + + echo "$as_me:$LINENO: checking --with-gtk-prefix argument" >&5 +echo $ECHO_N "checking --with-gtk-prefix argument... $ECHO_C" >&6 + +# Check whether --with-gtk-prefix or --without-gtk-prefix was given. +if test "${with_gtk_prefix+set}" = set; then + withval="$with_gtk_prefix" + gtk_config_prefix="$withval"; echo "$as_me:$LINENO: result: $gtk_config_prefix" >&5 +echo "${ECHO_T}$gtk_config_prefix" >&6 +else + gtk_config_prefix=""; echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi; + + echo "$as_me:$LINENO: checking --with-gtk-exec-prefix argument" >&5 +echo $ECHO_N "checking --with-gtk-exec-prefix argument... $ECHO_C" >&6 + +# Check whether --with-gtk-exec-prefix or --without-gtk-exec-prefix was given. +if test "${with_gtk_exec_prefix+set}" = set; then + withval="$with_gtk_exec_prefix" + gtk_config_exec_prefix="$withval"; echo "$as_me:$LINENO: result: $gtk_config_prefix" >&5 +echo "${ECHO_T}$gtk_config_prefix" >&6 +else + gtk_config_exec_prefix=""; echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi; + + echo "$as_me:$LINENO: checking --disable-gtktest argument" >&5 +echo $ECHO_N "checking --disable-gtktest argument... $ECHO_C" >&6 + # Check whether --enable-gtktest or --disable-gtktest was given. +if test "${enable_gtktest+set}" = set; then + enableval="$enable_gtktest" + +else + enable_gtktest=yes +fi; + if test "x$enable_gtktest" = "xyes" ; then + echo "$as_me:$LINENO: result: gtk test enabled" >&5 +echo "${ECHO_T}gtk test enabled" >&6 + else + echo "$as_me:$LINENO: result: gtk test disabled" >&5 +echo "${ECHO_T}gtk test disabled" >&6 + fi + + if test "x$gtk_config_prefix" != "x" ; then + gtk_config_args="$gtk_config_args --prefix=$gtk_config_prefix" + GTK_CONFIG=$gtk_config_prefix/bin/gtk-config + fi + if test "x$gtk_config_exec_prefix" != "x" ; then + gtk_config_args="$gtk_config_args --exec-prefix=$gtk_config_exec_prefix" + GTK_CONFIG=$gtk_config_exec_prefix/bin/gtk-config + fi + if test "X$GTK_CONFIG" = "X"; then + # Extract the first word of "gtk-config", so it can be a program name with args. +set dummy gtk-config; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_path_GTK_CONFIG+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $GTK_CONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_GTK_CONFIG="$GTK_CONFIG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_GTK_CONFIG="$as_dir/$ac_word$ac_exec_ext" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + + test -z "$ac_cv_path_GTK_CONFIG" && ac_cv_path_GTK_CONFIG="no" + ;; +esac +fi +GTK_CONFIG=$ac_cv_path_GTK_CONFIG + +if test -n "$GTK_CONFIG"; then + echo "$as_me:$LINENO: result: $GTK_CONFIG" >&5 +echo "${ECHO_T}$GTK_CONFIG" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + if test "X$GTK_CONFIG" = "Xno"; then + # Extract the first word of "gtk12-config", so it can be a program name with args. +set dummy gtk12-config; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_path_GTK12_CONFIG+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $GTK12_CONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_GTK12_CONFIG="$GTK12_CONFIG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_GTK12_CONFIG="$as_dir/$ac_word$ac_exec_ext" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + + test -z "$ac_cv_path_GTK12_CONFIG" && ac_cv_path_GTK12_CONFIG="no" + ;; +esac +fi +GTK12_CONFIG=$ac_cv_path_GTK12_CONFIG + +if test -n "$GTK12_CONFIG"; then + echo "$as_me:$LINENO: result: $GTK12_CONFIG" >&5 +echo "${ECHO_T}$GTK12_CONFIG" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + GTK_CONFIG="$GTK12_CONFIG" + fi + else + echo "$as_me:$LINENO: result: Using GTK configuration program $GTK_CONFIG" >&5 +echo "${ECHO_T}Using GTK configuration program $GTK_CONFIG" >&6 + fi + if test "X$PKG_CONFIG" = "X"; then + # Extract the first word of "pkg-config", so it can be a program name with args. +set dummy pkg-config; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_path_PKG_CONFIG+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $PKG_CONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + + test -z "$ac_cv_path_PKG_CONFIG" && ac_cv_path_PKG_CONFIG="no" + ;; +esac +fi +PKG_CONFIG=$ac_cv_path_PKG_CONFIG + +if test -n "$PKG_CONFIG"; then + echo "$as_me:$LINENO: result: $PKG_CONFIG" >&5 +echo "${ECHO_T}$PKG_CONFIG" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + fi + + if test "x$GTK_CONFIG:$PKG_CONFIG" != "xno:no"; then + if test "X$SKIP_GTK2" != "XYES"; then + + if test "X$GTK_CONFIG" != "Xno" -o "X$PKG_CONFIG" != "Xno"; then + { + min_gtk_version=2.2.0 + echo "$as_me:$LINENO: checking for GTK - version >= $min_gtk_version" >&5 +echo $ECHO_N "checking for GTK - version >= $min_gtk_version... $ECHO_C" >&6 + no_gtk="" + if (test "X$SKIP_GTK2" != "XYES" -a "X$PKG_CONFIG" != "Xno") \ + && $PKG_CONFIG --exists gtk+-2.0; then + { + GTK_CFLAGS=`$PKG_CONFIG --cflags gtk+-2.0` + GTK_LIBDIR=`$PKG_CONFIG --libs-only-L gtk+-2.0` + GTK_LIBS=`$PKG_CONFIG --libs gtk+-2.0` + gtk_major_version=`$PKG_CONFIG --modversion gtk+-2.0 | \ + sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\1/'` + gtk_minor_version=`$PKG_CONFIG --modversion gtk+-2.0 | \ + sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\2/'` + gtk_micro_version=`$PKG_CONFIG --modversion gtk+-2.0 | \ + sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\3/'` + } + elif test "X$GTK_CONFIG" != "Xno"; then + { + GTK_CFLAGS=`$GTK_CONFIG $gtk_config_args --cflags` + GTK_LIBDIR= + GTK_LIBS=`$GTK_CONFIG $gtk_config_args --libs` + gtk_major_version=`$GTK_CONFIG $gtk_config_args --version | \ + sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\1/'` + gtk_minor_version=`$GTK_CONFIG $gtk_config_args --version | \ + sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\2/'` + gtk_micro_version=`$GTK_CONFIG $gtk_config_args --version | \ + sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\3/'` + } + else + no_gtk=yes + fi + + if test "x$enable_gtktest" = "xyes" -a "x$no_gtk" = "x"; then + { + ac_save_CFLAGS="$CFLAGS" + ac_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $GTK_CFLAGS" + LIBS="$LIBS $GTK_LIBS" + + rm -f conf.gtktest + if test "$cross_compiling" = yes; then + echo $ac_n "cross compiling; assumed OK... $ac_c" +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include +#include + +int +main () +{ +int major, minor, micro; +char *tmp_version; + +system ("touch conf.gtktest"); + +/* HP/UX 9 (%@#!) writes to sscanf strings */ +tmp_version = g_strdup("$min_gtk_version"); +if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { + printf("%s, bad version string\n", "$min_gtk_version"); + exit(1); + } + +if ((gtk_major_version > major) || + ((gtk_major_version == major) && (gtk_minor_version > minor)) || + ((gtk_major_version == major) && (gtk_minor_version == minor) && + (gtk_micro_version >= micro))) +{ + return 0; +} +return 1; +} + +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +no_gtk=yes +fi +rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + } + fi + if test "x$no_gtk" = x ; then + if test "x$enable_gtktest" = "xyes"; then + echo "$as_me:$LINENO: result: yes; found version $gtk_major_version.$gtk_minor_version.$gtk_micro_version" >&5 +echo "${ECHO_T}yes; found version $gtk_major_version.$gtk_minor_version.$gtk_micro_version" >&6 + else + echo "$as_me:$LINENO: result: found version $gtk_major_version.$gtk_minor_version.$gtk_micro_version" >&5 +echo "${ECHO_T}found version $gtk_major_version.$gtk_minor_version.$gtk_micro_version" >&6 + fi + GUI_LIB_LOC="$GTK_LIBDIR" + GTK_LIBNAME="$GTK_LIBS" + GUI_INC_LOC="$GTK_CFLAGS" + else + { + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + GTK_CFLAGS="" + GTK_LIBS="" + : + } + fi + } + else + GTK_CFLAGS="" + GTK_LIBS="" + : + fi + + + rm -f conf.gtktest + + if test "x$GTK_CFLAGS" != "x"; then + SKIP_ATHENA=YES + SKIP_NEXTAW=YES + SKIP_MOTIF=YES + GUITYPE=GTK + + fi + fi + + if test "x$GUITYPE" != "xGTK"; then + SKIP_GTK2=YES + + if test "X$GTK_CONFIG" != "Xno" -o "X$PKG_CONFIG" != "Xno"; then + { + min_gtk_version=1.1.16 + echo "$as_me:$LINENO: checking for GTK - version >= $min_gtk_version" >&5 +echo $ECHO_N "checking for GTK - version >= $min_gtk_version... $ECHO_C" >&6 + no_gtk="" + if (test "X$SKIP_GTK2" != "XYES" -a "X$PKG_CONFIG" != "Xno") \ + && $PKG_CONFIG --exists gtk+-2.0; then + { + GTK_CFLAGS=`$PKG_CONFIG --cflags gtk+-2.0` + GTK_LIBDIR=`$PKG_CONFIG --libs-only-L gtk+-2.0` + GTK_LIBS=`$PKG_CONFIG --libs gtk+-2.0` + gtk_major_version=`$PKG_CONFIG --modversion gtk+-2.0 | \ + sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\1/'` + gtk_minor_version=`$PKG_CONFIG --modversion gtk+-2.0 | \ + sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\2/'` + gtk_micro_version=`$PKG_CONFIG --modversion gtk+-2.0 | \ + sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\3/'` + } + elif test "X$GTK_CONFIG" != "Xno"; then + { + GTK_CFLAGS=`$GTK_CONFIG $gtk_config_args --cflags` + GTK_LIBDIR= + GTK_LIBS=`$GTK_CONFIG $gtk_config_args --libs` + gtk_major_version=`$GTK_CONFIG $gtk_config_args --version | \ + sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\1/'` + gtk_minor_version=`$GTK_CONFIG $gtk_config_args --version | \ + sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\2/'` + gtk_micro_version=`$GTK_CONFIG $gtk_config_args --version | \ + sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\3/'` + } + else + no_gtk=yes + fi + + if test "x$enable_gtktest" = "xyes" -a "x$no_gtk" = "x"; then + { + ac_save_CFLAGS="$CFLAGS" + ac_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $GTK_CFLAGS" + LIBS="$LIBS $GTK_LIBS" + + rm -f conf.gtktest + if test "$cross_compiling" = yes; then + echo $ac_n "cross compiling; assumed OK... $ac_c" +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include +#include + +int +main () +{ +int major, minor, micro; +char *tmp_version; + +system ("touch conf.gtktest"); + +/* HP/UX 9 (%@#!) writes to sscanf strings */ +tmp_version = g_strdup("$min_gtk_version"); +if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { + printf("%s, bad version string\n", "$min_gtk_version"); + exit(1); + } + +if ((gtk_major_version > major) || + ((gtk_major_version == major) && (gtk_minor_version > minor)) || + ((gtk_major_version == major) && (gtk_minor_version == minor) && + (gtk_micro_version >= micro))) +{ + return 0; +} +return 1; +} + +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +no_gtk=yes +fi +rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + } + fi + if test "x$no_gtk" = x ; then + if test "x$enable_gtktest" = "xyes"; then + echo "$as_me:$LINENO: result: yes; found version $gtk_major_version.$gtk_minor_version.$gtk_micro_version" >&5 +echo "${ECHO_T}yes; found version $gtk_major_version.$gtk_minor_version.$gtk_micro_version" >&6 + else + echo "$as_me:$LINENO: result: found version $gtk_major_version.$gtk_minor_version.$gtk_micro_version" >&5 +echo "${ECHO_T}found version $gtk_major_version.$gtk_minor_version.$gtk_micro_version" >&6 + fi + GTK_LIBNAME="$GTK_LIBS" + GUI_INC_LOC="$GTK_CFLAGS" + else + { + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + GTK_CFLAGS="" + GTK_LIBS="" + : + } + fi + } + else + GTK_CFLAGS="" + GTK_LIBS="" + : + fi + + + rm -f conf.gtktest + + if test "x$GTK_CFLAGS" != "x"; then + SKIP_ATHENA=YES + SKIP_NEXTAW=YES + SKIP_MOTIF=YES + GUITYPE=GTK + + fi + fi + fi + if test "x$GUITYPE" = "xGTK"; then + if test "$gtk_major_version" = 1 -a "0$gtk_minor_version" -lt 2 \ + -o "$gtk_major_version" = 1 -a "$gtk_minor_version" = 2 -a "0$gtk_micro_version" -lt 3; then + echo "$as_me:$LINENO: result: this GTK version is old; version 1.2.3 or later is recommended" >&5 +echo "${ECHO_T}this GTK version is old; version 1.2.3 or later is recommended" >&6 + else + { + if test "0$gtk_major_version" -ge 2; then + cat >>confdefs.h <<\_ACEOF +#define HAVE_GTK2 1 +_ACEOF + + if test "$gtk_minor_version" = 1 -a "0$gtk_micro_version" -ge 1 \ + || test "0$gtk_minor_version" -ge 2 \ + || test "0$gtk_major_version" -gt 2; then + cat >>confdefs.h <<\_ACEOF +#define HAVE_GTK_MULTIHEAD 1 +_ACEOF + + fi + fi + if test -z "$SKIP_GNOME"; then + { + + + + + + +# Check whether --with-gnome-includes or --without-gnome-includes was given. +if test "${with_gnome_includes+set}" = set; then + withval="$with_gnome_includes" + CFLAGS="$CFLAGS -I$withval" + +fi; + + +# Check whether --with-gnome-libs or --without-gnome-libs was given. +if test "${with_gnome_libs+set}" = set; then + withval="$with_gnome_libs" + LDFLAGS="$LDFLAGS -L$withval" gnome_prefix=$withval + +fi; + + +# Check whether --with-gnome or --without-gnome was given. +if test "${with_gnome+set}" = set; then + withval="$with_gnome" + if test x$withval = xyes; then + want_gnome=yes + have_gnome=yes + else + if test "x$withval" = xno; then + want_gnome=no + else + want_gnome=yes + LDFLAGS="$LDFLAGS -L$withval/lib" + CFLAGS="$CFLAGS -I$withval/include" + gnome_prefix=$withval/lib + fi + fi +else + want_gnome=yes +fi; + + if test "x$want_gnome" = xyes -a "0$gtk_major_version" -ge 2; then + { + echo "$as_me:$LINENO: checking for libgnomeui-2.0" >&5 +echo $ECHO_N "checking for libgnomeui-2.0... $ECHO_C" >&6 + if $PKG_CONFIG --exists libgnomeui-2.0; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + GNOME_LIBS=`$PKG_CONFIG --libs-only-l libgnomeui-2.0` + GNOME_LIBDIR=`$PKG_CONFIG --libs-only-L libgnomeui-2.0` + GNOME_INCLUDEDIR=`$PKG_CONFIG --cflags libgnomeui-2.0` + + echo "$as_me:$LINENO: checking for FreeBSD" >&5 +echo $ECHO_N "checking for FreeBSD... $ECHO_C" >&6 + if test "`(uname) 2>/dev/null`" = FreeBSD; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + GNOME_INCLUDEDIR="$GNOME_INCLUDEDIR -D_THREAD_SAFE" + GNOME_LIBS="$GNOME_LIBS -pthread" + else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + fi + have_gnome=yes + else + echo "$as_me:$LINENO: result: not found" >&5 +echo "${ECHO_T}not found" >&6 + if test "x" = xfail; then + { { echo "$as_me:$LINENO: error: Could not find libgnomeui-2.0 via pkg-config" >&5 +echo "$as_me: error: Could not find libgnomeui-2.0 via pkg-config" >&2;} + { (exit 1); exit 1; }; } + fi + fi + } + elif test "x$want_gnome" = xyes; then + { + # Extract the first word of "gnome-config", so it can be a program name with args. +set dummy gnome-config; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_path_GNOME_CONFIG+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $GNOME_CONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_GNOME_CONFIG="$GNOME_CONFIG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_GNOME_CONFIG="$as_dir/$ac_word$ac_exec_ext" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + + test -z "$ac_cv_path_GNOME_CONFIG" && ac_cv_path_GNOME_CONFIG="no" + ;; +esac +fi +GNOME_CONFIG=$ac_cv_path_GNOME_CONFIG + +if test -n "$GNOME_CONFIG"; then + echo "$as_me:$LINENO: result: $GNOME_CONFIG" >&5 +echo "${ECHO_T}$GNOME_CONFIG" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + if test "$GNOME_CONFIG" = "no"; then + no_gnome_config="yes" + else + echo "$as_me:$LINENO: checking if $GNOME_CONFIG works" >&5 +echo $ECHO_N "checking if $GNOME_CONFIG works... $ECHO_C" >&6 + if $GNOME_CONFIG --libs-only-l gnome >/dev/null 2>&1; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + GNOME_LIBS="`$GNOME_CONFIG --libs-only-l gnome gnomeui`" + GNOME_LIBDIR="`$GNOME_CONFIG --libs-only-L gnorba gnomeui`" + GNOME_INCLUDEDIR="`$GNOME_CONFIG --cflags gnorba gnomeui`" + have_gnome=yes + else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + no_gnome_config="yes" + fi + fi + + if test x$exec_prefix = xNONE; then + if test x$prefix = xNONE; then + gnome_prefix=$ac_default_prefix/lib + else + gnome_prefix=$prefix/lib + fi + else + gnome_prefix=`eval echo \`echo $libdir\`` + fi + + if test "$no_gnome_config" = "yes"; then + echo "$as_me:$LINENO: checking for gnomeConf.sh file in $gnome_prefix" >&5 +echo $ECHO_N "checking for gnomeConf.sh file in $gnome_prefix... $ECHO_C" >&6 + if test -f $gnome_prefix/gnomeConf.sh; then + echo "$as_me:$LINENO: result: found" >&5 +echo "${ECHO_T}found" >&6 + echo "loading gnome configuration from" \ + "$gnome_prefix/gnomeConf.sh" + . $gnome_prefix/gnomeConf.sh + have_gnome=yes + else + echo "$as_me:$LINENO: result: not found" >&5 +echo "${ECHO_T}not found" >&6 + if test x = xfail; then + { { echo "$as_me:$LINENO: error: Could not find the gnomeConf.sh file that is generated by gnome-libs install" >&5 +echo "$as_me: error: Could not find the gnomeConf.sh file that is generated by gnome-libs install" >&2;} + { (exit 1); exit 1; }; } + fi + fi + fi + } + fi + + if test x$have_gnome = xyes ; then + cat >>confdefs.h <<\_ACEOF +#define FEAT_GUI_GNOME 1 +_ACEOF + + GUI_INC_LOC="$GUI_INC_LOC $GNOME_INCLUDEDIR" + GTK_LIBNAME="$GTK_LIBNAME $GNOME_LIBDIR $GNOME_LIBS" + fi + } + fi + } + fi + fi +fi + + +if test -z "$SKIP_MOTIF"; then + gui_XXX="/usr/XXX/Motif* /usr/Motif*/XXX /usr/XXX /usr/shlib /usr/X11*/XXX /usr/XXX/X11* /usr/dt/XXX /local/Motif*/XXX /local/XXX/Motif* /usr/local/Motif*/XXX /usr/local/XXX/Motif* /usr/local/XXX /usr/local/X11*/XXX /usr/local/LessTif/Motif*/XXX $MOTIFHOME/XXX" + GUI_INC_LOC="`echo $GUI_INC_LOC|sed 's%-I%%g'`" + + echo "$as_me:$LINENO: checking for location of Motif GUI includes" >&5 +echo $ECHO_N "checking for location of Motif GUI includes... $ECHO_C" >&6 + gui_includes="`echo $x_includes|sed 's%/^/^/*$%%'` `echo "$gui_XXX" | sed s/XXX/include/g` $GUI_INC_LOC" + GUI_INC_LOC= + for try in $gui_includes; do + if test -f "$try/Xm/Xm.h"; then + GUI_INC_LOC=$try + fi + done + if test -n "$GUI_INC_LOC"; then + if test "$GUI_INC_LOC" = /usr/include; then + GUI_INC_LOC= + echo "$as_me:$LINENO: result: in default path" >&5 +echo "${ECHO_T}in default path" >&6 + else + echo "$as_me:$LINENO: result: $GUI_INC_LOC" >&5 +echo "${ECHO_T}$GUI_INC_LOC" >&6 + fi + else + echo "$as_me:$LINENO: result: " >&5 +echo "${ECHO_T}" >&6 + SKIP_MOTIF=YES + fi +fi + + +if test -z "$SKIP_MOTIF"; then + echo "$as_me:$LINENO: checking --with-motif-lib argument" >&5 +echo $ECHO_N "checking --with-motif-lib argument... $ECHO_C" >&6 + +# Check whether --with-motif-lib or --without-motif-lib was given. +if test "${with_motif_lib+set}" = set; then + withval="$with_motif_lib" + MOTIF_LIBNAME="${withval}" +fi; + + if test -n "$MOTIF_LIBNAME"; then + echo "$as_me:$LINENO: result: $MOTIF_LIBNAME" >&5 +echo "${ECHO_T}$MOTIF_LIBNAME" >&6 + GUI_LIB_LOC= + else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + + GUI_LIB_LOC="`echo $GUI_LIB_LOC|sed 's%-L%%g'`" + + echo "$as_me:$LINENO: checking for location of Motif GUI libs" >&5 +echo $ECHO_N "checking for location of Motif GUI libs... $ECHO_C" >&6 + gui_libs="`echo $x_libraries|sed 's%/^/^/*$%%'` `echo "$gui_XXX" | sed s/XXX/lib/g` `echo "$GUI_INC_LOC" | sed s/include/lib/` $GUI_LIB_LOC" + GUI_LIB_LOC= + for try in $gui_libs; do + for libtry in "$try"/libXm.a "$try"/libXm.so* "$try"/libXm.sl "$try"/libXm.dylib; do + if test -f "$libtry"; then + GUI_LIB_LOC=$try + fi + done + done + if test -n "$GUI_LIB_LOC"; then + if test "$GUI_LIB_LOC" = /usr/lib; then + GUI_LIB_LOC= + echo "$as_me:$LINENO: result: in default path" >&5 +echo "${ECHO_T}in default path" >&6 + else + if test -n "$GUI_LIB_LOC"; then + echo "$as_me:$LINENO: result: $GUI_LIB_LOC" >&5 +echo "${ECHO_T}$GUI_LIB_LOC" >&6 + if test "`(uname) 2>/dev/null`" = SunOS && + uname -r | grep '^5' >/dev/null; then + GUI_LIB_LOC="$GUI_LIB_LOC -R $GUI_LIB_LOC" + fi + fi + fi + MOTIF_LIBNAME=-lXm + else + echo "$as_me:$LINENO: result: " >&5 +echo "${ECHO_T}" >&6 + SKIP_MOTIF=YES + fi + fi +fi + +if test -z "$SKIP_MOTIF"; then + SKIP_ATHENA=YES + SKIP_NEXTAW=YES + GUITYPE=MOTIF + +fi + + +GUI_X_LIBS= + +if test -z "$SKIP_ATHENA"; then + echo "$as_me:$LINENO: checking if Athena header files can be found" >&5 +echo $ECHO_N "checking if Athena header files can be found... $ECHO_C" >&6 + cflags_save=$CFLAGS + CFLAGS="$CFLAGS $X_CFLAGS" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include +#include +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; SKIP_ATHENA=YES +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS=$cflags_save +fi + +if test -z "$SKIP_ATHENA"; then + GUITYPE=ATHENA +fi + +if test -z "$SKIP_NEXTAW"; then + echo "$as_me:$LINENO: checking if neXtaw header files can be found" >&5 +echo $ECHO_N "checking if neXtaw header files can be found... $ECHO_C" >&6 + cflags_save=$CFLAGS + CFLAGS="$CFLAGS $X_CFLAGS" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include +#include +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; SKIP_NEXTAW=YES +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS=$cflags_save +fi + +if test -z "$SKIP_NEXTAW"; then + GUITYPE=NEXTAW +fi + +if test -z "$SKIP_ATHENA" -o -z "$SKIP_NEXTAW" -o -z "$SKIP_MOTIF"; then + if test -n "$GUI_INC_LOC"; then + GUI_INC_LOC=-I"`echo $GUI_INC_LOC|sed 's%-I%%'`" + fi + if test -n "$GUI_LIB_LOC"; then + GUI_LIB_LOC=-L"`echo $GUI_LIB_LOC|sed 's%-L%%'`" + fi + + ldflags_save=$LDFLAGS + LDFLAGS="$X_LIBS $LDFLAGS" + echo "$as_me:$LINENO: checking for XShapeQueryExtension in -lXext" >&5 +echo $ECHO_N "checking for XShapeQueryExtension in -lXext... $ECHO_C" >&6 +if test "${ac_cv_lib_Xext_XShapeQueryExtension+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lXext -lXt $X_PRE_LIBS -lX11 $X_EXTRA_LIBS $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char XShapeQueryExtension (); +int +main () +{ +XShapeQueryExtension (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_Xext_XShapeQueryExtension=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_Xext_XShapeQueryExtension=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_Xext_XShapeQueryExtension" >&5 +echo "${ECHO_T}$ac_cv_lib_Xext_XShapeQueryExtension" >&6 +if test $ac_cv_lib_Xext_XShapeQueryExtension = yes; then + GUI_X_LIBS="-lXext" +fi + + echo "$as_me:$LINENO: checking for wslen in -lw" >&5 +echo $ECHO_N "checking for wslen in -lw... $ECHO_C" >&6 +if test "${ac_cv_lib_w_wslen+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lw $GUI_X_LIBS -lXt $X_PRE_LIBS -lX11 $X_EXTRA_LIBS $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char wslen (); +int +main () +{ +wslen (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_w_wslen=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_w_wslen=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_w_wslen" >&5 +echo "${ECHO_T}$ac_cv_lib_w_wslen" >&6 +if test $ac_cv_lib_w_wslen = yes; then + X_EXTRA_LIBS="$X_EXTRA_LIBS -lw" +fi + + echo "$as_me:$LINENO: checking for dlsym in -ldl" >&5 +echo $ECHO_N "checking for dlsym in -ldl... $ECHO_C" >&6 +if test "${ac_cv_lib_dl_dlsym+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $GUI_X_LIBS -lXt $X_PRE_LIBS -lX11 $X_EXTRA_LIBS $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dlsym (); +int +main () +{ +dlsym (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_dl_dlsym=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_dl_dlsym=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlsym" >&5 +echo "${ECHO_T}$ac_cv_lib_dl_dlsym" >&6 +if test $ac_cv_lib_dl_dlsym = yes; then + X_EXTRA_LIBS="$X_EXTRA_LIBS -ldl" +fi + + echo "$as_me:$LINENO: checking for XmuCreateStippledPixmap in -lXmu" >&5 +echo $ECHO_N "checking for XmuCreateStippledPixmap in -lXmu... $ECHO_C" >&6 +if test "${ac_cv_lib_Xmu_XmuCreateStippledPixmap+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lXmu $GUI_X_LIBS -lXt $X_PRE_LIBS -lX11 $X_EXTRA_LIBS $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char XmuCreateStippledPixmap (); +int +main () +{ +XmuCreateStippledPixmap (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_Xmu_XmuCreateStippledPixmap=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_Xmu_XmuCreateStippledPixmap=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_Xmu_XmuCreateStippledPixmap" >&5 +echo "${ECHO_T}$ac_cv_lib_Xmu_XmuCreateStippledPixmap" >&6 +if test $ac_cv_lib_Xmu_XmuCreateStippledPixmap = yes; then + GUI_X_LIBS="-lXmu $GUI_X_LIBS" +fi + + if test -z "$SKIP_MOTIF"; then + echo "$as_me:$LINENO: checking for XpEndJob in -lXp" >&5 +echo $ECHO_N "checking for XpEndJob in -lXp... $ECHO_C" >&6 +if test "${ac_cv_lib_Xp_XpEndJob+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lXp $GUI_X_LIBS -lXm -lXt $X_PRE_LIBS -lX11 $X_EXTRA_LIBS $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char XpEndJob (); +int +main () +{ +XpEndJob (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_Xp_XpEndJob=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_Xp_XpEndJob=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_Xp_XpEndJob" >&5 +echo "${ECHO_T}$ac_cv_lib_Xp_XpEndJob" >&6 +if test $ac_cv_lib_Xp_XpEndJob = yes; then + GUI_X_LIBS="-lXp $GUI_X_LIBS" +fi + + fi + LDFLAGS=$ldflags_save + + echo "$as_me:$LINENO: checking for extra X11 defines" >&5 +echo $ECHO_N "checking for extra X11 defines... $ECHO_C" >&6 + NARROW_PROTO= + rm -fr conftestdir + if mkdir conftestdir; then + cd conftestdir + cat > Imakefile <<'EOF' +acfindx: + @echo 'NARROW_PROTO="${PROTO_DEFINES}"' +EOF + if (xmkmf) >/dev/null 2>/dev/null && test -f Makefile; then + eval `${MAKE-make} acfindx 2>/dev/null | grep -v make` + fi + cd .. + rm -fr conftestdir + fi + if test -z "$NARROW_PROTO"; then + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + else + echo "$as_me:$LINENO: result: $NARROW_PROTO" >&5 +echo "${ECHO_T}$NARROW_PROTO" >&6 + fi + +fi + +if test "$enable_xsmp" = "yes"; then + cppflags_save=$CPPFLAGS + CPPFLAGS="$CPPFLAGS $X_CFLAGS" + +for ac_header in X11/SM/SMlib.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +else + # Is the header compilable? +echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_header_compiler=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_header_compiler=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6 + +# Is the header present? +echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_header_preproc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi +rm -f conftest.err conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6 + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------------ ## +## Report this to the AC_PACKAGE_NAME lists. ## +## ------------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 + +fi +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + CPPFLAGS=$cppflags_save +fi + + +if test -z "$SKIP_ATHENA" -o -z "$SKIP_NEXTAW" -o -z "$SKIP_MOTIF" -o -z "$SKIP_GTK"; then + cppflags_save=$CPPFLAGS + CPPFLAGS="$CPPFLAGS $X_CFLAGS" + + +for ac_header in X11/xpm.h X11/Sunkeysym.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +else + # Is the header compilable? +echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_header_compiler=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_header_compiler=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6 + +# Is the header present? +echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_header_preproc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi +rm -f conftest.err conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6 + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------------ ## +## Report this to the AC_PACKAGE_NAME lists. ## +## ------------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 + +fi +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + + if test ! "$enable_xim" = "no"; then + echo "$as_me:$LINENO: checking for XIMText in X11/Xlib.h" >&5 +echo $ECHO_N "checking for XIMText in X11/Xlib.h... $ECHO_C" >&6 + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "XIMText" >/dev/null 2>&1; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +else + echo "$as_me:$LINENO: result: no; xim has been disabled" >&5 +echo "${ECHO_T}no; xim has been disabled" >&6; enable_xim = "no" +fi +rm -f conftest* + + fi + CPPFLAGS=$cppflags_save + + if test "$enable_xim" = "auto" -a "$enable_hangulinput" != "yes" \ + -a "x$GUITYPE" != "xNONE" ; then + echo "$as_me:$LINENO: result: X GUI selected; xim has been enabled" >&5 +echo "${ECHO_T}X GUI selected; xim has been enabled" >&6 + enable_xim="yes" + fi +fi + +if test -z "$SKIP_ATHENA" -o -z "$SKIP_NEXTAW" -o -z "$SKIP_MOTIF"; then + cppflags_save=$CPPFLAGS + CPPFLAGS="$CPPFLAGS $X_CFLAGS" + echo "$as_me:$LINENO: checking for X11/Xmu/Editres.h" >&5 +echo $ECHO_N "checking for X11/Xmu/Editres.h... $ECHO_C" >&6 + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include +#include +int +main () +{ +int i; i = 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + cat >>confdefs.h <<\_ACEOF +#define HAVE_X11_XMU_EDITRES_H 1 +_ACEOF + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + CPPFLAGS=$cppflags_save +fi + +if test -z "$SKIP_MOTIF"; then + cppflags_save=$CPPFLAGS + CPPFLAGS="$CPPFLAGS $X_CFLAGS" + + + + + + + +for ac_header in Xm/Xm.h Xm/XpmP.h Xm/JoinSideT.h Xm/TraitP.h Xm/Manager.h \ + Xm/UnhighlightT.h Xm/Notebook.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +else + # Is the header compilable? +echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_header_compiler=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_header_compiler=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6 + +# Is the header present? +echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_header_preproc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi +rm -f conftest.err conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6 + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------------ ## +## Report this to the AC_PACKAGE_NAME lists. ## +## ------------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 + +fi +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + + if test $ac_cv_header_Xm_XpmP_h = yes; then + echo "$as_me:$LINENO: checking for XpmAttributes_21 in Xm/XpmP.h" >&5 +echo $ECHO_N "checking for XpmAttributes_21 in Xm/XpmP.h... $ECHO_C" >&6 + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +int +main () +{ +XpmAttributes_21 attr; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; cat >>confdefs.h <<\_ACEOF +#define XPMATTRIBUTES_TYPE XpmAttributes_21 +_ACEOF + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; cat >>confdefs.h <<\_ACEOF +#define XPMATTRIBUTES_TYPE XpmAttributes +_ACEOF + + +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + else + cat >>confdefs.h <<\_ACEOF +#define XPMATTRIBUTES_TYPE XpmAttributes +_ACEOF + + fi + CPPFLAGS=$cppflags_save +fi + +if test "x$GUITYPE" = "xNONE" -a "$enable_xim" = "yes"; then + echo "$as_me:$LINENO: result: no GUI selected; xim has been disabled" >&5 +echo "${ECHO_T}no GUI selected; xim has been disabled" >&6 + enable_xim="no" +fi +if test "x$GUITYPE" = "xNONE" -a "$enable_fontset" = "yes"; then + echo "$as_me:$LINENO: result: no GUI selected; fontset has been disabled" >&5 +echo "${ECHO_T}no GUI selected; fontset has been disabled" >&6 + enable_fontset="no" +fi +if test "x$GUITYPE:$enable_fontset" = "xGTK:yes" -a "0$gtk_major_version" -ge 2; then + echo "$as_me:$LINENO: result: GTK+ 2 GUI selected; fontset has been disabled" >&5 +echo "${ECHO_T}GTK+ 2 GUI selected; fontset has been disabled" >&6 + enable_fontset="no" +fi + +if test -z "$SKIP_PHOTON"; then + GUITYPE=PHOTONGUI +fi + + + + + + +if test "$enable_workshop" = "yes" -a -n "$SKIP_MOTIF"; then + { { echo "$as_me:$LINENO: error: cannot use workshop without Motif" >&5 +echo "$as_me: error: cannot use workshop without Motif" >&2;} + { (exit 1); exit 1; }; } +fi + +if test "$enable_xim" = "yes"; then + cat >>confdefs.h <<\_ACEOF +#define FEAT_XIM 1 +_ACEOF + +fi +if test "$enable_fontset" = "yes"; then + cat >>confdefs.h <<\_ACEOF +#define FEAT_XFONTSET 1 +_ACEOF + +fi + + + + +if test "$enable_hangulinput" = "yes"; then + if test "x$GUITYPE" = "xNONE"; then + echo "$as_me:$LINENO: result: no GUI selected; hangul input has been disabled" >&5 +echo "${ECHO_T}no GUI selected; hangul input has been disabled" >&6 + enable_hangulinput=no + else + cat >>confdefs.h <<\_ACEOF +#define FEAT_HANGULIN 1 +_ACEOF + + HANGULIN_SRC=hangulin.c + + HANGULIN_OBJ=objects/hangulin.o + + fi +fi + + +echo "$as_me:$LINENO: checking quality of toupper" >&5 +echo $ECHO_N "checking quality of toupper... $ECHO_C" >&6 +if test "$cross_compiling" = yes; then + { { echo "$as_me:$LINENO: error: failed to compile test program" >&5 +echo "$as_me: error: failed to compile test program" >&2;} + { (exit 1); exit 1; }; } +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +main() { exit(toupper('A') == 'A' && tolower('z') == 'z'); } +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cat >>confdefs.h <<\_ACEOF +#define BROKEN_TOUPPER 1 +_ACEOF + echo "$as_me:$LINENO: result: bad" >&5 +echo "${ECHO_T}bad" >&6 +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +echo "$as_me:$LINENO: result: good" >&5 +echo "${ECHO_T}good" >&6 +fi +rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + +echo "$as_me:$LINENO: checking whether __DATE__ and __TIME__ work" >&5 +echo $ECHO_N "checking whether __DATE__ and __TIME__ work... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +printf("(" __DATE__ " " __TIME__ ")"); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; cat >>confdefs.h <<\_ACEOF +#define HAVE_DATE_TIME 1 +_ACEOF + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +if test "${ac_cv_header_elf_h+set}" = set; then + echo "$as_me:$LINENO: checking for elf.h" >&5 +echo $ECHO_N "checking for elf.h... $ECHO_C" >&6 +if test "${ac_cv_header_elf_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +echo "$as_me:$LINENO: result: $ac_cv_header_elf_h" >&5 +echo "${ECHO_T}$ac_cv_header_elf_h" >&6 +else + # Is the header compilable? +echo "$as_me:$LINENO: checking elf.h usability" >&5 +echo $ECHO_N "checking elf.h usability... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_header_compiler=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_header_compiler=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6 + +# Is the header present? +echo "$as_me:$LINENO: checking elf.h presence" >&5 +echo $ECHO_N "checking elf.h presence... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_header_preproc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi +rm -f conftest.err conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6 + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { echo "$as_me:$LINENO: WARNING: elf.h: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: elf.h: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: elf.h: proceeding with the compiler's result" >&5 +echo "$as_me: WARNING: elf.h: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { echo "$as_me:$LINENO: WARNING: elf.h: present but cannot be compiled" >&5 +echo "$as_me: WARNING: elf.h: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: elf.h: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: elf.h: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: elf.h: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: elf.h: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: elf.h: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: elf.h: section \"Present But Cannot Be Compiled\"" >&2;} + { echo "$as_me:$LINENO: WARNING: elf.h: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: elf.h: proceeding with the preprocessor's result" >&2;} + { echo "$as_me:$LINENO: WARNING: elf.h: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: elf.h: in the future, the compiler will take precedence" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------------ ## +## Report this to the AC_PACKAGE_NAME lists. ## +## ------------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +echo "$as_me:$LINENO: checking for elf.h" >&5 +echo $ECHO_N "checking for elf.h... $ECHO_C" >&6 +if test "${ac_cv_header_elf_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_header_elf_h=$ac_header_preproc +fi +echo "$as_me:$LINENO: result: $ac_cv_header_elf_h" >&5 +echo "${ECHO_T}$ac_cv_header_elf_h" >&6 + +fi +if test $ac_cv_header_elf_h = yes; then + HAS_ELF=1 +fi + + +if test "$HAS_ELF" = 1; then + +echo "$as_me:$LINENO: checking for main in -lelf" >&5 +echo $ECHO_N "checking for main in -lelf... $ECHO_C" >&6 +if test "${ac_cv_lib_elf_main+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lelf $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + + +int +main () +{ +main (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_elf_main=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_elf_main=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_elf_main" >&5 +echo "${ECHO_T}$ac_cv_lib_elf_main" >&6 +if test $ac_cv_lib_elf_main = yes; then + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBELF 1 +_ACEOF + + LIBS="-lelf $LIBS" + +fi + +fi + + + + + + +ac_header_dirent=no +for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h; do + as_ac_Header=`echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh` +echo "$as_me:$LINENO: checking for $ac_hdr that defines DIR" >&5 +echo $ECHO_N "checking for $ac_hdr that defines DIR... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include <$ac_hdr> + +int +main () +{ +if ((DIR *) 0) +return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_Header=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +eval "$as_ac_Header=no" +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_hdr" | $as_tr_cpp` 1 +_ACEOF + +ac_header_dirent=$ac_hdr; break +fi + +done +# Two versions of opendir et al. are in -ldir and -lx on SCO Xenix. +if test $ac_header_dirent = dirent.h; then + echo "$as_me:$LINENO: checking for library containing opendir" >&5 +echo $ECHO_N "checking for library containing opendir... $ECHO_C" >&6 +if test "${ac_cv_search_opendir+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_func_search_save_LIBS=$LIBS +ac_cv_search_opendir=no +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char opendir (); +int +main () +{ +opendir (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_search_opendir="none required" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +if test "$ac_cv_search_opendir" = no; then + for ac_lib in dir; do + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char opendir (); +int +main () +{ +opendir (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_search_opendir="-l$ac_lib" +break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + done +fi +LIBS=$ac_func_search_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_search_opendir" >&5 +echo "${ECHO_T}$ac_cv_search_opendir" >&6 +if test "$ac_cv_search_opendir" != no; then + test "$ac_cv_search_opendir" = "none required" || LIBS="$ac_cv_search_opendir $LIBS" + +fi + +else + echo "$as_me:$LINENO: checking for library containing opendir" >&5 +echo $ECHO_N "checking for library containing opendir... $ECHO_C" >&6 +if test "${ac_cv_search_opendir+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_func_search_save_LIBS=$LIBS +ac_cv_search_opendir=no +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char opendir (); +int +main () +{ +opendir (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_search_opendir="none required" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +if test "$ac_cv_search_opendir" = no; then + for ac_lib in x; do + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char opendir (); +int +main () +{ +opendir (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_search_opendir="-l$ac_lib" +break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + done +fi +LIBS=$ac_func_search_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_search_opendir" >&5 +echo "${ECHO_T}$ac_cv_search_opendir" >&6 +if test "$ac_cv_search_opendir" != no; then + test "$ac_cv_search_opendir" = "none required" || LIBS="$ac_cv_search_opendir $LIBS" + +fi + +fi + + +echo "$as_me:$LINENO: checking for ANSI C header files" >&5 +echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6 +if test "${ac_cv_header_stdc+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_header_stdc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_header_stdc=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then + : +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then + : +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then + : +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + exit(2); + exit (0); +} +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_header_stdc=no +fi +rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +fi +fi +echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 +echo "${ECHO_T}$ac_cv_header_stdc" >&6 +if test $ac_cv_header_stdc = yes; then + +cat >>confdefs.h <<\_ACEOF +#define STDC_HEADERS 1 +_ACEOF + +fi + +echo "$as_me:$LINENO: checking for sys/wait.h that is POSIX.1 compatible" >&5 +echo $ECHO_N "checking for sys/wait.h that is POSIX.1 compatible... $ECHO_C" >&6 +if test "${ac_cv_header_sys_wait_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#ifndef WEXITSTATUS +# define WEXITSTATUS(stat_val) ((unsigned)(stat_val) >> 8) +#endif +#ifndef WIFEXITED +# define WIFEXITED(stat_val) (((stat_val) & 255) == 0) +#endif + +int +main () +{ + int s; + wait (&s); + s = WIFEXITED (s) ? WEXITSTATUS (s) : 1; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_header_sys_wait_h=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_header_sys_wait_h=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_header_sys_wait_h" >&5 +echo "${ECHO_T}$ac_cv_header_sys_wait_h" >&6 +if test $ac_cv_header_sys_wait_h = yes; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_SYS_WAIT_H 1 +_ACEOF + +fi + + +if test $ac_cv_header_sys_wait_h = no; then + echo "$as_me:$LINENO: checking for sys/wait.h that defines union wait" >&5 +echo $ECHO_N "checking for sys/wait.h that defines union wait... $ECHO_C" >&6 + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +int +main () +{ +union wait xx, yy; xx = yy + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + cat >>confdefs.h <<\_ACEOF +#define HAVE_SYS_WAIT_H 1 +_ACEOF + + cat >>confdefs.h <<\_ACEOF +#define HAVE_UNION_WAIT 1 +_ACEOF + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +for ac_header in stdarg.h stdlib.h string.h sys/select.h sys/utsname.h \ + termcap.h fcntl.h sgtty.h sys/ioctl.h sys/time.h termio.h \ + iconv.h langinfo.h unistd.h stropts.h errno.h \ + sys/resource.h sys/systeminfo.h locale.h \ + sys/stream.h sys/ptem.h termios.h libc.h sys/statfs.h \ + poll.h sys/poll.h pwd.h utime.h sys/param.h libintl.h \ + libgen.h util/debug.h util/msg18n.h frame.h \ + sys/acl.h sys/access.h sys/sysctl.h sys/sysinfo.h wchar.h wctype.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +else + # Is the header compilable? +echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_header_compiler=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_header_compiler=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6 + +# Is the header present? +echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_header_preproc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi +rm -f conftest.err conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6 + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------------ ## +## Report this to the AC_PACKAGE_NAME lists. ## +## ------------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 + +fi +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + +echo "$as_me:$LINENO: checking for pthread_np.h" >&5 +echo $ECHO_N "checking for pthread_np.h... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include +#include +int +main () +{ +int i; i = 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + cat >>confdefs.h <<\_ACEOF +#define HAVE_PTHREAD_NP_H 1 +_ACEOF + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + + +for ac_header in strings.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +else + # Is the header compilable? +echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_header_compiler=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_header_compiler=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6 + +# Is the header present? +echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_header_preproc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi +rm -f conftest.err conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6 + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------------ ## +## Report this to the AC_PACKAGE_NAME lists. ## +## ------------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 + +fi +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + +if test "x$MACOSX" = "xyes"; then + cat >>confdefs.h <<\_ACEOF +#define NO_STRINGS_WITH_STRING_H 1 +_ACEOF + +else + +echo "$as_me:$LINENO: checking if strings.h can be included after string.h" >&5 +echo $ECHO_N "checking if strings.h can be included after string.h... $ECHO_C" >&6 +cppflags_save=$CPPFLAGS +CPPFLAGS="$CPPFLAGS $X_CFLAGS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#if defined(_AIX) && !defined(_AIX51) && !defined(_NO_PROTO) +# define _NO_PROTO /* like in os_unix.h, causes conflict for AIX (Winn) */ + /* but don't do it on AIX 5.1 (Uribarri) */ +#endif +#ifdef HAVE_XM_XM_H +# include /* This breaks it for HP-UX 11 (Squassabia) */ +#endif +#ifdef HAVE_STRING_H +# include +#endif +#if defined(HAVE_STRINGS_H) +# include +#endif + +int +main () +{ +int i; i = 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +cat >>confdefs.h <<\_ACEOF +#define NO_STRINGS_WITH_STRING_H 1 +_ACEOF + + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +CPPFLAGS=$cppflags_save +fi + +if test $ac_cv_c_compiler_gnu = yes; then + echo "$as_me:$LINENO: checking whether $CC needs -traditional" >&5 +echo $ECHO_N "checking whether $CC needs -traditional... $ECHO_C" >&6 +if test "${ac_cv_prog_gcc_traditional+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_pattern="Autoconf.*'x'" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +Autoconf TIOCGETP +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "$ac_pattern" >/dev/null 2>&1; then + ac_cv_prog_gcc_traditional=yes +else + ac_cv_prog_gcc_traditional=no +fi +rm -f conftest* + + + if test $ac_cv_prog_gcc_traditional = no; then + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +Autoconf TCGETA +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "$ac_pattern" >/dev/null 2>&1; then + ac_cv_prog_gcc_traditional=yes +fi +rm -f conftest* + + fi +fi +echo "$as_me:$LINENO: result: $ac_cv_prog_gcc_traditional" >&5 +echo "${ECHO_T}$ac_cv_prog_gcc_traditional" >&6 + if test $ac_cv_prog_gcc_traditional = yes; then + CC="$CC -traditional" + fi +fi + +echo "$as_me:$LINENO: checking for an ANSI C-conforming const" >&5 +echo $ECHO_N "checking for an ANSI C-conforming const... $ECHO_C" >&6 +if test "${ac_cv_c_const+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +/* FIXME: Include the comments suggested by Paul. */ +#ifndef __cplusplus + /* Ultrix mips cc rejects this. */ + typedef int charset[2]; + const charset x; + /* SunOS 4.1.1 cc rejects this. */ + char const *const *ccp; + char **p; + /* NEC SVR4.0.2 mips cc rejects this. */ + struct point {int x, y;}; + static struct point const zero = {0,0}; + /* AIX XL C 1.02.0.0 rejects this. + It does not let you subtract one const X* pointer from another in + an arm of an if-expression whose if-part is not a constant + expression */ + const char *g = "string"; + ccp = &g + (g ? g-g : 0); + /* HPUX 7.0 cc rejects these. */ + ++ccp; + p = (char**) ccp; + ccp = (char const *const *) p; + { /* SCO 3.2v4 cc rejects this. */ + char *t; + char const *s = 0 ? (char *) 0 : (char const *) 0; + + *t++ = 0; + } + { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ + int x[] = {25, 17}; + const int *foo = &x[0]; + ++foo; + } + { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ + typedef const int *iptr; + iptr p = 0; + ++p; + } + { /* AIX XL C 1.02.0.0 rejects this saying + "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ + struct s { int j; const int *ap[3]; }; + struct s *b; b->j = 5; + } + { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ + const int foo = 10; + } +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_c_const=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_c_const=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_c_const" >&5 +echo "${ECHO_T}$ac_cv_c_const" >&6 +if test $ac_cv_c_const = no; then + +cat >>confdefs.h <<\_ACEOF +#define const +_ACEOF + +fi + +echo "$as_me:$LINENO: checking for mode_t" >&5 +echo $ECHO_N "checking for mode_t... $ECHO_C" >&6 +if test "${ac_cv_type_mode_t+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +if ((mode_t *) 0) + return 0; +if (sizeof (mode_t)) + return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_type_mode_t=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_type_mode_t=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_type_mode_t" >&5 +echo "${ECHO_T}$ac_cv_type_mode_t" >&6 +if test $ac_cv_type_mode_t = yes; then + : +else + +cat >>confdefs.h <<_ACEOF +#define mode_t int +_ACEOF + +fi + +echo "$as_me:$LINENO: checking for off_t" >&5 +echo $ECHO_N "checking for off_t... $ECHO_C" >&6 +if test "${ac_cv_type_off_t+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +if ((off_t *) 0) + return 0; +if (sizeof (off_t)) + return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_type_off_t=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_type_off_t=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_type_off_t" >&5 +echo "${ECHO_T}$ac_cv_type_off_t" >&6 +if test $ac_cv_type_off_t = yes; then + : +else + +cat >>confdefs.h <<_ACEOF +#define off_t long +_ACEOF + +fi + +echo "$as_me:$LINENO: checking for pid_t" >&5 +echo $ECHO_N "checking for pid_t... $ECHO_C" >&6 +if test "${ac_cv_type_pid_t+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +if ((pid_t *) 0) + return 0; +if (sizeof (pid_t)) + return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_type_pid_t=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_type_pid_t=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_type_pid_t" >&5 +echo "${ECHO_T}$ac_cv_type_pid_t" >&6 +if test $ac_cv_type_pid_t = yes; then + : +else + +cat >>confdefs.h <<_ACEOF +#define pid_t int +_ACEOF + +fi + +echo "$as_me:$LINENO: checking for size_t" >&5 +echo $ECHO_N "checking for size_t... $ECHO_C" >&6 +if test "${ac_cv_type_size_t+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +if ((size_t *) 0) + return 0; +if (sizeof (size_t)) + return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_type_size_t=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_type_size_t=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_type_size_t" >&5 +echo "${ECHO_T}$ac_cv_type_size_t" >&6 +if test $ac_cv_type_size_t = yes; then + : +else + +cat >>confdefs.h <<_ACEOF +#define size_t unsigned +_ACEOF + +fi + +echo "$as_me:$LINENO: checking for uid_t in sys/types.h" >&5 +echo $ECHO_N "checking for uid_t in sys/types.h... $ECHO_C" >&6 +if test "${ac_cv_type_uid_t+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "uid_t" >/dev/null 2>&1; then + ac_cv_type_uid_t=yes +else + ac_cv_type_uid_t=no +fi +rm -f conftest* + +fi +echo "$as_me:$LINENO: result: $ac_cv_type_uid_t" >&5 +echo "${ECHO_T}$ac_cv_type_uid_t" >&6 +if test $ac_cv_type_uid_t = no; then + +cat >>confdefs.h <<\_ACEOF +#define uid_t int +_ACEOF + + +cat >>confdefs.h <<\_ACEOF +#define gid_t int +_ACEOF + +fi + +echo "$as_me:$LINENO: checking whether time.h and sys/time.h may both be included" >&5 +echo $ECHO_N "checking whether time.h and sys/time.h may both be included... $ECHO_C" >&6 +if test "${ac_cv_header_time+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#include + +int +main () +{ +if ((struct tm *) 0) +return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_header_time=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_header_time=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_header_time" >&5 +echo "${ECHO_T}$ac_cv_header_time" >&6 +if test $ac_cv_header_time = yes; then + +cat >>confdefs.h <<\_ACEOF +#define TIME_WITH_SYS_TIME 1 +_ACEOF + +fi + +echo "$as_me:$LINENO: checking for ino_t" >&5 +echo $ECHO_N "checking for ino_t... $ECHO_C" >&6 +if test "${ac_cv_type_ino_t+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +if ((ino_t *) 0) + return 0; +if (sizeof (ino_t)) + return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_type_ino_t=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_type_ino_t=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_type_ino_t" >&5 +echo "${ECHO_T}$ac_cv_type_ino_t" >&6 +if test $ac_cv_type_ino_t = yes; then + : +else + +cat >>confdefs.h <<_ACEOF +#define ino_t long +_ACEOF + +fi + +echo "$as_me:$LINENO: checking for dev_t" >&5 +echo $ECHO_N "checking for dev_t... $ECHO_C" >&6 +if test "${ac_cv_type_dev_t+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +if ((dev_t *) 0) + return 0; +if (sizeof (dev_t)) + return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_type_dev_t=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_type_dev_t=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_type_dev_t" >&5 +echo "${ECHO_T}$ac_cv_type_dev_t" >&6 +if test $ac_cv_type_dev_t = yes; then + : +else + +cat >>confdefs.h <<_ACEOF +#define dev_t unsigned +_ACEOF + +fi + + +echo "$as_me:$LINENO: checking for rlim_t" >&5 +echo $ECHO_N "checking for rlim_t... $ECHO_C" >&6 +if eval "test \"`echo '$''{'ac_cv_type_rlim_t'+set}'`\" = set"; then + echo "$as_me:$LINENO: result: (cached) $ac_cv_type_rlim_t" >&5 +echo "${ECHO_T}(cached) $ac_cv_type_rlim_t" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include +#if STDC_HEADERS +#include +#include +#endif +#ifdef HAVE_SYS_RESOURCE_H +#include +#endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "(^|[^a-zA-Z_0-9])rlim_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then + ac_cv_type_rlim_t=yes +else + ac_cv_type_rlim_t=no +fi +rm -f conftest* + + echo "$as_me:$LINENO: result: $ac_cv_type_rlim_t" >&5 +echo "${ECHO_T}$ac_cv_type_rlim_t" >&6 +fi +if test $ac_cv_type_rlim_t = no; then + cat >> confdefs.h <<\EOF +#define rlim_t unsigned long +EOF +fi + +echo "$as_me:$LINENO: checking for stack_t" >&5 +echo $ECHO_N "checking for stack_t... $ECHO_C" >&6 +if eval "test \"`echo '$''{'ac_cv_type_stack_t'+set}'`\" = set"; then + echo "$as_me:$LINENO: result: (cached) $ac_cv_type_stack_t" >&5 +echo "${ECHO_T}(cached) $ac_cv_type_stack_t" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include +#if STDC_HEADERS +#include +#include +#endif +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "stack_t" >/dev/null 2>&1; then + ac_cv_type_stack_t=yes +else + ac_cv_type_stack_t=no +fi +rm -f conftest* + + echo "$as_me:$LINENO: result: $ac_cv_type_stack_t" >&5 +echo "${ECHO_T}$ac_cv_type_stack_t" >&6 +fi +if test $ac_cv_type_stack_t = no; then + cat >> confdefs.h <<\EOF +#define stack_t struct sigaltstack +EOF +fi + +echo "$as_me:$LINENO: checking whether stack_t has an ss_base field" >&5 +echo $ECHO_N "checking whether stack_t has an ss_base field... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include +#if STDC_HEADERS +#include +#include +#endif +#include +#include "confdefs.h" + +int +main () +{ +stack_t sigstk; sigstk.ss_base = 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; cat >>confdefs.h <<\_ACEOF +#define HAVE_SS_BASE 1 +_ACEOF + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +olibs="$LIBS" +echo "$as_me:$LINENO: checking --with-tlib argument" >&5 +echo $ECHO_N "checking --with-tlib argument... $ECHO_C" >&6 + +# Check whether --with-tlib or --without-tlib was given. +if test "${with_tlib+set}" = set; then + withval="$with_tlib" + +fi; +if test -n "$with_tlib"; then + echo "$as_me:$LINENO: result: $with_tlib" >&5 +echo "${ECHO_T}$with_tlib" >&6 + LIBS="$LIBS -l$with_tlib" + echo "$as_me:$LINENO: checking for linking with $with_tlib library" >&5 +echo $ECHO_N "checking for linking with $with_tlib library... $ECHO_C" >&6 + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + echo "$as_me:$LINENO: result: OK" >&5 +echo "${ECHO_T}OK" >&6 +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { echo "$as_me:$LINENO: error: FAILED" >&5 +echo "$as_me: error: FAILED" >&2;} + { (exit 1); exit 1; }; } +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + olibs="$LIBS" +else + echo "$as_me:$LINENO: result: empty: automatic terminal library selection" >&5 +echo "${ECHO_T}empty: automatic terminal library selection" >&6 + case "`uname -s 2>/dev/null`" in + OSF1|SCO_SV) tlibs="ncurses curses termlib termcap";; + *) tlibs="ncurses termlib termcap curses";; + esac + for libname in $tlibs; do + +as_ac_Lib=`echo "ac_cv_lib_${libname}''_tgetent" | $as_tr_sh` +echo "$as_me:$LINENO: checking for tgetent in -l${libname}" >&5 +echo $ECHO_N "checking for tgetent in -l${libname}... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Lib+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-l${libname} $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char tgetent (); +int +main () +{ +tgetent (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_Lib=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +eval "$as_ac_Lib=no" +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Lib'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Lib'}'`" >&6 +if test `eval echo '${'$as_ac_Lib'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_LIB${libname}" | $as_tr_cpp` 1 +_ACEOF + + LIBS="-l${libname} $LIBS" + +fi + + if test "x$olibs" != "x$LIBS"; then + if test "$cross_compiling" = yes; then + res="FAIL" +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#ifdef HAVE_TERMCAP_H +# include +#endif +main() {char *s; s=(char *)tgoto("%p1%d", 0, 1); exit(0); } +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + res="OK" +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +res="FAIL" +fi +rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + if test "$res" = "OK"; then + break + fi + echo "$as_me:$LINENO: result: $libname library is not usable" >&5 +echo "${ECHO_T}$libname library is not usable" >&6 + LIBS="$olibs" + fi + done + if test "x$olibs" = "x$LIBS"; then + echo "$as_me:$LINENO: result: no terminal library found" >&5 +echo "${ECHO_T}no terminal library found" >&6 + fi +fi + +if test "x$olibs" = "x$LIBS"; then + echo "$as_me:$LINENO: checking for tgetent()" >&5 +echo $ECHO_N "checking for tgetent()... $ECHO_C" >&6 + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +char s[10000]; int res = tgetent(s, "thisterminaldoesnotexist"); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { echo "$as_me:$LINENO: error: NOT FOUND! + You need to install a terminal library; for example ncurses. + Or specify the name of the library with --with-tlib." >&5 +echo "$as_me: error: NOT FOUND! + You need to install a terminal library; for example ncurses. + Or specify the name of the library with --with-tlib." >&2;} + { (exit 1); exit 1; }; } +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi + +echo "$as_me:$LINENO: checking whether we talk terminfo" >&5 +echo $ECHO_N "checking whether we talk terminfo... $ECHO_C" >&6 +if test "$cross_compiling" = yes; then + { { echo "$as_me:$LINENO: error: failed to compile test program." >&5 +echo "$as_me: error: failed to compile test program." >&2;} + { (exit 1); exit 1; }; } +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#ifdef HAVE_TERMCAP_H +# include +#endif +main() +{char *s; s=(char *)tgoto("%p1%d", 0, 1); exit(!strcmp(s==0 ? "" : s, "1")); } +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + echo "$as_me:$LINENO: result: no -- we are in termcap land" >&5 +echo "${ECHO_T}no -- we are in termcap land" >&6 +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +echo "$as_me:$LINENO: result: yes -- terminfo spoken here" >&5 +echo "${ECHO_T}yes -- terminfo spoken here" >&6; cat >>confdefs.h <<\_ACEOF +#define TERMINFO 1 +_ACEOF + +fi +rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + +if test "x$olibs" != "x$LIBS"; then + echo "$as_me:$LINENO: checking what tgetent() returns for an unknown terminal" >&5 +echo $ECHO_N "checking what tgetent() returns for an unknown terminal... $ECHO_C" >&6 + if test "$cross_compiling" = yes; then + { { echo "$as_me:$LINENO: error: failed to compile test program." >&5 +echo "$as_me: error: failed to compile test program." >&2;} + { (exit 1); exit 1; }; } +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#ifdef HAVE_TERMCAP_H +# include +#endif +main() +{char s[10000]; int res = tgetent(s, "thisterminaldoesnotexist"); exit(res != 0); } +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + echo "$as_me:$LINENO: result: zero" >&5 +echo "${ECHO_T}zero" >&6; cat >>confdefs.h <<\_ACEOF +#define TGETENT_ZERO_ERR 0 +_ACEOF + +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +echo "$as_me:$LINENO: result: non-zero" >&5 +echo "${ECHO_T}non-zero" >&6 +fi +rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +fi + +echo "$as_me:$LINENO: checking whether termcap.h contains ospeed" >&5 +echo $ECHO_N "checking whether termcap.h contains ospeed... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#ifdef HAVE_TERMCAP_H +# include +#endif + +int +main () +{ +ospeed = 20000 + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; cat >>confdefs.h <<\_ACEOF +#define HAVE_OSPEED 1 +_ACEOF + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + echo "$as_me:$LINENO: checking whether ospeed can be extern" >&5 +echo $ECHO_N "checking whether ospeed can be extern... $ECHO_C" >&6 + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#ifdef HAVE_TERMCAP_H +# include +#endif +extern short ospeed; + +int +main () +{ +ospeed = 20000 + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; cat >>confdefs.h <<\_ACEOF +#define OSPEED_EXTERN 1 +_ACEOF + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + +echo "$as_me:$LINENO: checking whether termcap.h contains UP, BC and PC" >&5 +echo $ECHO_N "checking whether termcap.h contains UP, BC and PC... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#ifdef HAVE_TERMCAP_H +# include +#endif + +int +main () +{ +if (UP == 0 && BC == 0) PC = 1 + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; cat >>confdefs.h <<\_ACEOF +#define HAVE_UP_BC_PC 1 +_ACEOF + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + echo "$as_me:$LINENO: checking whether UP, BC and PC can be extern" >&5 +echo $ECHO_N "checking whether UP, BC and PC can be extern... $ECHO_C" >&6 + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#ifdef HAVE_TERMCAP_H +# include +#endif +extern char *UP, *BC, PC; + +int +main () +{ +if (UP == 0 && BC == 0) PC = 1 + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; cat >>confdefs.h <<\_ACEOF +#define UP_BC_PC_EXTERN 1 +_ACEOF + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + +echo "$as_me:$LINENO: checking whether tputs() uses outfuntype" >&5 +echo $ECHO_N "checking whether tputs() uses outfuntype... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#ifdef HAVE_TERMCAP_H +# include +#endif + +int +main () +{ +extern int xx(); tputs("test", 1, (outfuntype)xx) + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; cat >>confdefs.h <<\_ACEOF +#define HAVE_OUTFUNTYPE 1 +_ACEOF + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +echo "$as_me:$LINENO: checking whether sys/select.h and sys/time.h may both be included" >&5 +echo $ECHO_N "checking whether sys/select.h and sys/time.h may both be included... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include +#include +#include +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + cat >>confdefs.h <<\_ACEOF +#define SYS_SELECT_WITH_SYS_TIME 1 +_ACEOF + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + + +echo "$as_me:$LINENO: checking for /dev/ptc" >&5 +echo $ECHO_N "checking for /dev/ptc... $ECHO_C" >&6 +if test -r /dev/ptc; then + cat >>confdefs.h <<\_ACEOF +#define HAVE_DEV_PTC 1 +_ACEOF + + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +echo "$as_me:$LINENO: checking for SVR4 ptys" >&5 +echo $ECHO_N "checking for SVR4 ptys... $ECHO_C" >&6 +if test -c /dev/ptmx ; then + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +ptsname(0);grantpt(0);unlockpt(0); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; cat >>confdefs.h <<\_ACEOF +#define HAVE_SVR4_PTYS 1 +_ACEOF + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +echo "$as_me:$LINENO: checking for ptyranges" >&5 +echo $ECHO_N "checking for ptyranges... $ECHO_C" >&6 +if test -d /dev/ptym ; then + pdir='/dev/ptym' +else + pdir='/dev' +fi +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef M_UNIX + yes; +#endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "yes" >/dev/null 2>&1; then + ptys=`echo /dev/ptyp??` +else + ptys=`echo $pdir/pty??` +fi +rm -f conftest* + +if test "$ptys" != "$pdir/pty??" ; then + p0=`echo $ptys | tr ' ' '\012' | sed -e 's/^.*\(.\).$/\1/g' | sort -u | tr -d '\012'` + p1=`echo $ptys | tr ' ' '\012' | sed -e 's/^.*\(.\)$/\1/g' | sort -u | tr -d '\012'` + cat >>confdefs.h <<_ACEOF +#define PTYRANGE0 "$p0" +_ACEOF + + cat >>confdefs.h <<_ACEOF +#define PTYRANGE1 "$p1" +_ACEOF + + echo "$as_me:$LINENO: result: $p0 / $p1" >&5 +echo "${ECHO_T}$p0 / $p1" >&6 +else + echo "$as_me:$LINENO: result: don't know" >&5 +echo "${ECHO_T}don't know" >&6 +fi + +echo "$as_me:$LINENO: checking default tty permissions/group" >&5 +echo $ECHO_N "checking default tty permissions/group... $ECHO_C" >&6 +rm -f conftest_grp +if test "$cross_compiling" = yes; then + { { echo "$as_me:$LINENO: error: failed to compile test program" >&5 +echo "$as_me: error: failed to compile test program" >&2;} + { (exit 1); exit 1; }; } +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include +#include +#include +main() +{ + struct stat sb; + char *x,*ttyname(); + int om, m; + FILE *fp; + + if (!(x = ttyname(0))) exit(1); + if (stat(x, &sb)) exit(1); + om = sb.st_mode; + if (om & 002) exit(0); + m = system("mesg y"); + if (m == -1 || m == 127) exit(1); + if (stat(x, &sb)) exit(1); + m = sb.st_mode; + if (chmod(x, om)) exit(1); + if (m & 002) exit(0); + if (sb.st_gid == getgid()) exit(1); + if (!(fp=fopen("conftest_grp", "w"))) + exit(1); + fprintf(fp, "%d\n", sb.st_gid); + fclose(fp); + exit(0); +} + +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + + if test -f conftest_grp; then + ptygrp=`cat conftest_grp` + echo "$as_me:$LINENO: result: pty mode: 0620, group: $ptygrp" >&5 +echo "${ECHO_T}pty mode: 0620, group: $ptygrp" >&6 + cat >>confdefs.h <<\_ACEOF +#define PTYMODE 0620 +_ACEOF + + cat >>confdefs.h <<_ACEOF +#define PTYGROUP $ptygrp +_ACEOF + + else + echo "$as_me:$LINENO: result: ptys are world accessable" >&5 +echo "${ECHO_T}ptys are world accessable" >&6 + fi + +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +echo "$as_me:$LINENO: result: can't determine - assume ptys are world accessable" >&5 +echo "${ECHO_T}can't determine - assume ptys are world accessable" >&6 +fi +rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +rm -f conftest_grp + + +echo "$as_me:$LINENO: checking return type of signal handlers" >&5 +echo $ECHO_N "checking return type of signal handlers... $ECHO_C" >&6 +if test "${ac_cv_type_signal+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#ifdef signal +# undef signal +#endif +#ifdef __cplusplus +extern "C" void (*signal (int, void (*)(int)))(int); +#else +void (*signal ()) (); +#endif + +int +main () +{ +int i; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_type_signal=void +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_type_signal=int +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_type_signal" >&5 +echo "${ECHO_T}$ac_cv_type_signal" >&6 + +cat >>confdefs.h <<_ACEOF +#define RETSIGTYPE $ac_cv_type_signal +_ACEOF + + + +if test $ac_cv_type_signal = void; then + cat >>confdefs.h <<\_ACEOF +#define SIGRETURN return +_ACEOF + +else + cat >>confdefs.h <<\_ACEOF +#define SIGRETURN return 0 +_ACEOF + +fi + +echo "$as_me:$LINENO: checking for struct sigcontext" >&5 +echo $ECHO_N "checking for struct sigcontext... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include +test_sig() +{ + struct sigcontext *scont; + scont = (struct sigcontext *)0; + return 1; +} +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + cat >>confdefs.h <<\_ACEOF +#define HAVE_SIGCONTEXT 1 +_ACEOF + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +echo "$as_me:$LINENO: checking getcwd implementation" >&5 +echo $ECHO_N "checking getcwd implementation... $ECHO_C" >&6 +if test "$cross_compiling" = yes; then + { { echo "$as_me:$LINENO: error: failed to compile test program" >&5 +echo "$as_me: error: failed to compile test program" >&2;} + { (exit 1); exit 1; }; } +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +char *dagger[] = { "IFS=pwd", 0 }; +main() +{ + char buffer[500]; + extern char **environ; + environ = dagger; + return getcwd(buffer, 500) ? 0 : 1; +} +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + echo "$as_me:$LINENO: result: it is usable" >&5 +echo "${ECHO_T}it is usable" >&6 +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +echo "$as_me:$LINENO: result: it stinks" >&5 +echo "${ECHO_T}it stinks" >&6 + cat >>confdefs.h <<\_ACEOF +#define BAD_GETCWD 1 +_ACEOF + +fi +rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +for ac_func in bcmp fchdir fchown fseeko fsync ftello getcwd getpseudotty \ + getpwnam getpwuid getrlimit gettimeofday getwd lstat memcmp \ + memset nanosleep opendir putenv qsort readlink select setenv \ + setpgid setsid sigaltstack sigstack sigset sigsetjmp sigaction \ + sigvec strcasecmp strerror strftime stricmp strncasecmp \ + strnicmp strpbrk strtol tgetent towlower towupper iswupper \ + usleep utime utimes +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 +if eval "test \"\${$as_ac_var+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +char (*f) () = $ac_func; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != $ac_func; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +eval "$as_ac_var=no" +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + +echo "$as_me:$LINENO: checking for st_blksize" >&5 +echo $ECHO_N "checking for st_blksize... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +int +main () +{ + struct stat st; + int n; + + stat("/", &st); + n = (int)st.st_blksize; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; cat >>confdefs.h <<\_ACEOF +#define HAVE_ST_BLKSIZE 1 +_ACEOF + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +echo "$as_me:$LINENO: checking whether stat() ignores a trailing slash" >&5 +echo $ECHO_N "checking whether stat() ignores a trailing slash... $ECHO_C" >&6 +if test "$cross_compiling" = yes; then + { { echo "$as_me:$LINENO: error: failed to compile test program" >&5 +echo "$as_me: error: failed to compile test program" >&2;} + { (exit 1); exit 1; }; } +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +main() {struct stat st; exit(stat("configure/", &st) != 0); } +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; cat >>confdefs.h <<\_ACEOF +#define STAT_IGNORES_SLASH 1 +_ACEOF + +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi +rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + +echo "$as_me:$LINENO: checking for iconv_open()" >&5 +echo $ECHO_N "checking for iconv_open()... $ECHO_C" >&6 +save_LIBS="$LIBS" +LIBS="$LIBS -liconv" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#ifdef HAVE_ICONV_H +# include +#endif + +int +main () +{ +iconv_open("fr", "to"); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + echo "$as_me:$LINENO: result: yes; with -liconv" >&5 +echo "${ECHO_T}yes; with -liconv" >&6; cat >>confdefs.h <<\_ACEOF +#define HAVE_ICONV 1 +_ACEOF + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +LIBS="$save_LIBS" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#ifdef HAVE_ICONV_H +# include +#endif + +int +main () +{ +iconv_open("fr", "to"); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; cat >>confdefs.h <<\_ACEOF +#define HAVE_ICONV 1 +_ACEOF + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + + +echo "$as_me:$LINENO: checking for nl_langinfo(CODESET)" >&5 +echo $ECHO_N "checking for nl_langinfo(CODESET)... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#ifdef HAVE_LANGINFO_H +# include +#endif + +int +main () +{ +char *cs = nl_langinfo(CODESET); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; cat >>confdefs.h <<\_ACEOF +#define HAVE_NL_LANGINFO_CODESET 1 +_ACEOF + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + +echo "$as_me:$LINENO: checking --disable-acl argument" >&5 +echo $ECHO_N "checking --disable-acl argument... $ECHO_C" >&6 +# Check whether --enable-acl or --disable-acl was given. +if test "${enable_acl+set}" = set; then + enableval="$enable_acl" + +else + enable_acl="yes" +fi; +if test "$enable_acl" = "yes"; then +echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +echo "$as_me:$LINENO: checking for acl_get_file in -lposix1e" >&5 +echo $ECHO_N "checking for acl_get_file in -lposix1e... $ECHO_C" >&6 +if test "${ac_cv_lib_posix1e_acl_get_file+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lposix1e $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char acl_get_file (); +int +main () +{ +acl_get_file (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_posix1e_acl_get_file=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_posix1e_acl_get_file=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_posix1e_acl_get_file" >&5 +echo "${ECHO_T}$ac_cv_lib_posix1e_acl_get_file" >&6 +if test $ac_cv_lib_posix1e_acl_get_file = yes; then + LIBS="$LIBS -lposix1e" +else + echo "$as_me:$LINENO: checking for acl_get_file in -lacl" >&5 +echo $ECHO_N "checking for acl_get_file in -lacl... $ECHO_C" >&6 +if test "${ac_cv_lib_acl_acl_get_file+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lacl $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char acl_get_file (); +int +main () +{ +acl_get_file (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_acl_acl_get_file=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_acl_acl_get_file=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_acl_acl_get_file" >&5 +echo "${ECHO_T}$ac_cv_lib_acl_acl_get_file" >&6 +if test $ac_cv_lib_acl_acl_get_file = yes; then + LIBS="$LIBS -lacl" + echo "$as_me:$LINENO: checking for fgetxattr in -lattr" >&5 +echo $ECHO_N "checking for fgetxattr in -lattr... $ECHO_C" >&6 +if test "${ac_cv_lib_attr_fgetxattr+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lattr $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char fgetxattr (); +int +main () +{ +fgetxattr (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_attr_fgetxattr=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_attr_fgetxattr=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_attr_fgetxattr" >&5 +echo "${ECHO_T}$ac_cv_lib_attr_fgetxattr" >&6 +if test $ac_cv_lib_attr_fgetxattr = yes; then + LIBS="$LIBS -lattr" +fi + +fi + +fi + + +echo "$as_me:$LINENO: checking for POSIX ACL support" >&5 +echo $ECHO_N "checking for POSIX ACL support... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include +#ifdef HAVE_SYS_ACL_H +# include +#endif +acl_t acl; +int +main () +{ +acl = acl_get_file("foo", ACL_TYPE_ACCESS); + acl_set_file("foo", ACL_TYPE_ACCESS, acl); + acl_free(acl); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; cat >>confdefs.h <<\_ACEOF +#define HAVE_POSIX_ACL 1 +_ACEOF + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + +echo "$as_me:$LINENO: checking for Solaris ACL support" >&5 +echo $ECHO_N "checking for Solaris ACL support... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#ifdef HAVE_SYS_ACL_H +# include +#endif +int +main () +{ +acl("foo", GETACLCNT, 0, NULL); + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; cat >>confdefs.h <<\_ACEOF +#define HAVE_SOLARIS_ACL 1 +_ACEOF + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + +echo "$as_me:$LINENO: checking for AIX ACL support" >&5 +echo $ECHO_N "checking for AIX ACL support... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#ifdef HAVE_SYS_ACL_H +# include +#endif +#ifdef HAVE_SYS_ACCESS_H +# include +#endif +#define _ALL_SOURCE + +#include + +int aclsize; +struct acl *aclent; +int +main () +{ +aclsize = sizeof(struct acl); + aclent = (void *)malloc(aclsize); + statacl("foo", STX_NORMAL, aclent, aclsize); + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; cat >>confdefs.h <<\_ACEOF +#define HAVE_AIX_ACL 1 +_ACEOF + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +else + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +fi + +echo "$as_me:$LINENO: checking --disable-gpm argument" >&5 +echo $ECHO_N "checking --disable-gpm argument... $ECHO_C" >&6 +# Check whether --enable-gpm or --disable-gpm was given. +if test "${enable_gpm+set}" = set; then + enableval="$enable_gpm" + +else + enable_gpm="yes" +fi; + +if test "$enable_gpm" = "yes"; then + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + echo "$as_me:$LINENO: checking for gpm" >&5 +echo $ECHO_N "checking for gpm... $ECHO_C" >&6 +if test "${vi_cv_have_gpm+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + olibs="$LIBS" ; LIBS="-lgpm" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + #include +int +main () +{ +Gpm_GetLibVersion(NULL); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + vi_cv_have_gpm=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +vi_cv_have_gpm=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LIBS="$olibs" + +fi +echo "$as_me:$LINENO: result: $vi_cv_have_gpm" >&5 +echo "${ECHO_T}$vi_cv_have_gpm" >&6 + if test $vi_cv_have_gpm = yes; then + LIBS="$LIBS -lgpm" + cat >>confdefs.h <<\_ACEOF +#define HAVE_GPM 1 +_ACEOF + + fi +else + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +fi + +echo "$as_me:$LINENO: checking for rename" >&5 +echo $ECHO_N "checking for rename... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +int +main () +{ +rename("this", "that") + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; cat >>confdefs.h <<\_ACEOF +#define HAVE_RENAME 1 +_ACEOF + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + +echo "$as_me:$LINENO: checking for sysctl" >&5 +echo $ECHO_N "checking for sysctl... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +int +main () +{ + int mib[2], r; + size_t len; + + mib[0] = CTL_HW; + mib[1] = HW_USERMEM; + len = sizeof(r); + (void)sysctl(mib, 2, &r, &len, (void *)0, (size_t)0); + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; cat >>confdefs.h <<\_ACEOF +#define HAVE_SYSCTL 1 +_ACEOF + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +echo "$as_me:$LINENO: result: not usable" >&5 +echo "${ECHO_T}not usable" >&6 +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +echo "$as_me:$LINENO: checking for sysinfo" >&5 +echo $ECHO_N "checking for sysinfo... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +int +main () +{ + struct sysinfo sinfo; + int t; + + (void)sysinfo(&sinfo); + t = sinfo.totalram; + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; cat >>confdefs.h <<\_ACEOF +#define HAVE_SYSINFO 1 +_ACEOF + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +echo "$as_me:$LINENO: result: not usable" >&5 +echo "${ECHO_T}not usable" >&6 +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +echo "$as_me:$LINENO: checking for sysinfo.mem_unit" >&5 +echo $ECHO_N "checking for sysinfo.mem_unit... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +int +main () +{ + struct sysinfo sinfo; + sinfo.mem_unit = 1; + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; cat >>confdefs.h <<\_ACEOF +#define HAVE_SYSINFO_MEM_UNIT 1 +_ACEOF + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +echo "$as_me:$LINENO: checking for sysconf" >&5 +echo $ECHO_N "checking for sysconf... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +int +main () +{ + (void)sysconf(_SC_PAGESIZE); + (void)sysconf(_SC_PHYS_PAGES); + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; cat >>confdefs.h <<\_ACEOF +#define HAVE_SYSCONF 1 +_ACEOF + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +echo "$as_me:$LINENO: result: not usable" >&5 +echo "${ECHO_T}not usable" >&6 +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + + +echo "$as_me:$LINENO: checking size of int" >&5 +echo $ECHO_N "checking size of int... $ECHO_C" >&6 +if test "${ac_cv_sizeof_int+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test "$cross_compiling" = yes; then + { { echo "$as_me:$LINENO: error: failed to compile test program" >&5 +echo "$as_me: error: failed to compile test program" >&2;} + { (exit 1); exit 1; }; } +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + main() + { + FILE *f=fopen("conftestval", "w"); + if (!f) exit(1); + fprintf(f, "%d\n", (int)sizeof(int)); + exit(0); + } +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_sizeof_int=`cat conftestval` +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_sizeof_int=0 +fi +rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +fi + +echo "$as_me:$LINENO: result: $ac_cv_sizeof_int" >&5 +echo "${ECHO_T}$ac_cv_sizeof_int" >&6 +cat >>confdefs.h <<_ACEOF +#define SIZEOF_INT $ac_cv_sizeof_int +_ACEOF + + +echo "$as_me:$LINENO: checking whether memmove/bcopy/memcpy handle overlaps" >&5 +echo $ECHO_N "checking whether memmove/bcopy/memcpy handle overlaps... $ECHO_C" >&6 +bcopy_test_prog=' +main() { + char buf[10]; + strcpy(buf, "abcdefghi"); + mch_memmove(buf, buf + 2, 3); + if (strncmp(buf, "ababcf", 6)) + exit(1); + strcpy(buf, "abcdefghi"); + mch_memmove(buf + 2, buf, 3); + if (strncmp(buf, "cdedef", 6)) + exit(1); + exit(0); /* libc version works properly. */ +}' + + +if test "$cross_compiling" = yes; then + { { echo "$as_me:$LINENO: error: failed to compile test program" >&5 +echo "$as_me: error: failed to compile test program" >&2;} + { (exit 1); exit 1; }; } +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#define mch_memmove(s,d,l) memmove(d,s,l) $bcopy_test_prog +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cat >>confdefs.h <<\_ACEOF +#define USEMEMMOVE 1 +_ACEOF + echo "$as_me:$LINENO: result: memmove does" >&5 +echo "${ECHO_T}memmove does" >&6 +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +if test "$cross_compiling" = yes; then + { { echo "$as_me:$LINENO: error: failed to compile test program" >&5 +echo "$as_me: error: failed to compile test program" >&2;} + { (exit 1); exit 1; }; } +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#define mch_memmove(s,d,l) bcopy(d,s,l) $bcopy_test_prog +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cat >>confdefs.h <<\_ACEOF +#define USEBCOPY 1 +_ACEOF + echo "$as_me:$LINENO: result: bcopy does" >&5 +echo "${ECHO_T}bcopy does" >&6 +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +if test "$cross_compiling" = yes; then + { { echo "$as_me:$LINENO: error: failed to compile test program" >&5 +echo "$as_me: error: failed to compile test program" >&2;} + { (exit 1); exit 1; }; } +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#define mch_memmove(s,d,l) memcpy(d,s,l) $bcopy_test_prog +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cat >>confdefs.h <<\_ACEOF +#define USEMEMCPY 1 +_ACEOF + echo "$as_me:$LINENO: result: memcpy does" >&5 +echo "${ECHO_T}memcpy does" >&6 +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi +rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +fi +rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +fi +rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + + +if test "$enable_multibyte" = "yes"; then + cflags_save=$CFLAGS + ldflags_save=$LDFLAGS + if test -n "$x_includes" ; then + CFLAGS="$CFLAGS -I$x_includes" + LDFLAGS="$X_LIBS $LDFLAGS -lX11" + echo "$as_me:$LINENO: checking whether X_LOCALE needed" >&5 +echo $ECHO_N "checking whether X_LOCALE needed... $ECHO_C" >&6 + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char _Xsetlocale (); +int +main () +{ +_Xsetlocale (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + cat >>confdefs.h <<\_ACEOF +#define X_LOCALE 1 +_ACEOF + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + fi + CFLAGS=$cflags_save + LDFLAGS=$ldflags_save +fi + +echo "$as_me:$LINENO: checking for _xpg4_setrunelocale in -lxpg4" >&5 +echo $ECHO_N "checking for _xpg4_setrunelocale in -lxpg4... $ECHO_C" >&6 +if test "${ac_cv_lib_xpg4__xpg4_setrunelocale+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lxpg4 $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char _xpg4_setrunelocale (); +int +main () +{ +_xpg4_setrunelocale (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_xpg4__xpg4_setrunelocale=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_xpg4__xpg4_setrunelocale=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_xpg4__xpg4_setrunelocale" >&5 +echo "${ECHO_T}$ac_cv_lib_xpg4__xpg4_setrunelocale" >&6 +if test $ac_cv_lib_xpg4__xpg4_setrunelocale = yes; then + LIBS="$LIBS -lxpg4" +fi + + +echo "$as_me:$LINENO: checking how to create tags" >&5 +echo $ECHO_N "checking how to create tags... $ECHO_C" >&6 +test -f tags && mv tags tags.save +if (eval ctags --version /dev/null | grep Exuberant) < /dev/null 1>&5 2>&1; then + TAGPRG="ctags -I INIT+ --fields=+S" +else + (eval etags /dev/null) < /dev/null 1>&5 2>&1 && TAGPRG="etags" + (eval etags -c /dev/null) < /dev/null 1>&5 2>&1 && TAGPRG="etags -c" + (eval ctags /dev/null) < /dev/null 1>&5 2>&1 && TAGPRG="ctags" + (eval ctags -t /dev/null) < /dev/null 1>&5 2>&1 && TAGPRG="ctags -t" + (eval ctags -ts /dev/null) < /dev/null 1>&5 2>&1 && TAGPRG="ctags -ts" + (eval ctags -tvs /dev/null) < /dev/null 1>&5 2>&1 && TAGPRG="ctags -tvs" + (eval ctags -i+m /dev/null) < /dev/null 1>&5 2>&1 && TAGPRG="ctags -i+m" +fi +test -f tags.save && mv tags.save tags +echo "$as_me:$LINENO: result: $TAGPRG" >&5 +echo "${ECHO_T}$TAGPRG" >&6 + +echo "$as_me:$LINENO: checking how to run man with a section nr" >&5 +echo $ECHO_N "checking how to run man with a section nr... $ECHO_C" >&6 +MANDEF="man" +(eval man -s 2 read) < /dev/null > /dev/null 2>&5 && MANDEF="man -s" +echo "$as_me:$LINENO: result: $MANDEF" >&5 +echo "${ECHO_T}$MANDEF" >&6 +if test "$MANDEF" = "man -s"; then + cat >>confdefs.h <<\_ACEOF +#define USEMAN_S 1 +_ACEOF + +fi + +echo "$as_me:$LINENO: checking --disable-nls argument" >&5 +echo $ECHO_N "checking --disable-nls argument... $ECHO_C" >&6 +# Check whether --enable-nls or --disable-nls was given. +if test "${enable_nls+set}" = set; then + enableval="$enable_nls" + +else + enable_nls="yes" +fi; + +if test "$enable_nls" = "yes"; then + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + + INSTALL_LANGS=install-languages + + INSTALL_TOOL_LANGS=install-tool-languages + + + # Extract the first word of "msgfmt", so it can be a program name with args. +set dummy msgfmt; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_MSGFMT+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$MSGFMT"; then + ac_cv_prog_MSGFMT="$MSGFMT" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_MSGFMT="msgfmt" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +MSGFMT=$ac_cv_prog_MSGFMT +if test -n "$MSGFMT"; then + echo "$as_me:$LINENO: result: $MSGFMT" >&5 +echo "${ECHO_T}$MSGFMT" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + echo "$as_me:$LINENO: checking for NLS" >&5 +echo $ECHO_N "checking for NLS... $ECHO_C" >&6 + if test -f po/Makefile; then + have_gettext="no" + if test -n "$MSGFMT"; then + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +int +main () +{ +gettext("Test"); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + echo "$as_me:$LINENO: result: gettext() works" >&5 +echo "${ECHO_T}gettext() works" >&6; have_gettext="yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +olibs=$LIBS + LIBS="$LIBS -lintl" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +int +main () +{ +gettext("Test"); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + echo "$as_me:$LINENO: result: gettext() works with -lintl" >&5 +echo "${ECHO_T}gettext() works with -lintl" >&6; have_gettext="yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +echo "$as_me:$LINENO: result: gettext() doesn't work" >&5 +echo "${ECHO_T}gettext() doesn't work" >&6; + LIBS=$olibs +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + else + echo "$as_me:$LINENO: result: msgfmt not found - disabled" >&5 +echo "${ECHO_T}msgfmt not found - disabled" >&6; + fi + if test $have_gettext = "yes"; then + cat >>confdefs.h <<\_ACEOF +#define HAVE_GETTEXT 1 +_ACEOF + + MAKEMO=yes + + +for ac_func in bind_textdomain_codeset +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 +if eval "test \"\${$as_ac_var+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +char (*f) () = $ac_func; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != $ac_func; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +eval "$as_ac_var=no" +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + echo "$as_me:$LINENO: checking for _nl_msg_cat_cntr" >&5 +echo $ECHO_N "checking for _nl_msg_cat_cntr... $ECHO_C" >&6 + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + extern int _nl_msg_cat_cntr; +int +main () +{ +++_nl_msg_cat_cntr; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; cat >>confdefs.h <<\_ACEOF +#define HAVE_NL_MSG_CAT_CNTR 1 +_ACEOF + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + fi + else + echo "$as_me:$LINENO: result: no \"po/Makefile\" - disabled" >&5 +echo "${ECHO_T}no \"po/Makefile\" - disabled" >&6; + fi +else + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +fi + +if test "${ac_cv_header_dlfcn_h+set}" = set; then + echo "$as_me:$LINENO: checking for dlfcn.h" >&5 +echo $ECHO_N "checking for dlfcn.h... $ECHO_C" >&6 +if test "${ac_cv_header_dlfcn_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +echo "$as_me:$LINENO: result: $ac_cv_header_dlfcn_h" >&5 +echo "${ECHO_T}$ac_cv_header_dlfcn_h" >&6 +else + # Is the header compilable? +echo "$as_me:$LINENO: checking dlfcn.h usability" >&5 +echo $ECHO_N "checking dlfcn.h usability... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_header_compiler=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_header_compiler=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6 + +# Is the header present? +echo "$as_me:$LINENO: checking dlfcn.h presence" >&5 +echo $ECHO_N "checking dlfcn.h presence... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_header_preproc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi +rm -f conftest.err conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6 + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { echo "$as_me:$LINENO: WARNING: dlfcn.h: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: dlfcn.h: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: dlfcn.h: proceeding with the compiler's result" >&5 +echo "$as_me: WARNING: dlfcn.h: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { echo "$as_me:$LINENO: WARNING: dlfcn.h: present but cannot be compiled" >&5 +echo "$as_me: WARNING: dlfcn.h: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: dlfcn.h: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: dlfcn.h: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: dlfcn.h: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: dlfcn.h: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: dlfcn.h: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: dlfcn.h: section \"Present But Cannot Be Compiled\"" >&2;} + { echo "$as_me:$LINENO: WARNING: dlfcn.h: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: dlfcn.h: proceeding with the preprocessor's result" >&2;} + { echo "$as_me:$LINENO: WARNING: dlfcn.h: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: dlfcn.h: in the future, the compiler will take precedence" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------------ ## +## Report this to the AC_PACKAGE_NAME lists. ## +## ------------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +echo "$as_me:$LINENO: checking for dlfcn.h" >&5 +echo $ECHO_N "checking for dlfcn.h... $ECHO_C" >&6 +if test "${ac_cv_header_dlfcn_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_header_dlfcn_h=$ac_header_preproc +fi +echo "$as_me:$LINENO: result: $ac_cv_header_dlfcn_h" >&5 +echo "${ECHO_T}$ac_cv_header_dlfcn_h" >&6 + +fi +if test $ac_cv_header_dlfcn_h = yes; then + DLL=dlfcn.h +else + if test "${ac_cv_header_dl_h+set}" = set; then + echo "$as_me:$LINENO: checking for dl.h" >&5 +echo $ECHO_N "checking for dl.h... $ECHO_C" >&6 +if test "${ac_cv_header_dl_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +echo "$as_me:$LINENO: result: $ac_cv_header_dl_h" >&5 +echo "${ECHO_T}$ac_cv_header_dl_h" >&6 +else + # Is the header compilable? +echo "$as_me:$LINENO: checking dl.h usability" >&5 +echo $ECHO_N "checking dl.h usability... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_header_compiler=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_header_compiler=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6 + +# Is the header present? +echo "$as_me:$LINENO: checking dl.h presence" >&5 +echo $ECHO_N "checking dl.h presence... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_header_preproc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi +rm -f conftest.err conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6 + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { echo "$as_me:$LINENO: WARNING: dl.h: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: dl.h: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: dl.h: proceeding with the compiler's result" >&5 +echo "$as_me: WARNING: dl.h: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { echo "$as_me:$LINENO: WARNING: dl.h: present but cannot be compiled" >&5 +echo "$as_me: WARNING: dl.h: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: dl.h: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: dl.h: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: dl.h: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: dl.h: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: dl.h: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: dl.h: section \"Present But Cannot Be Compiled\"" >&2;} + { echo "$as_me:$LINENO: WARNING: dl.h: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: dl.h: proceeding with the preprocessor's result" >&2;} + { echo "$as_me:$LINENO: WARNING: dl.h: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: dl.h: in the future, the compiler will take precedence" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------------ ## +## Report this to the AC_PACKAGE_NAME lists. ## +## ------------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +echo "$as_me:$LINENO: checking for dl.h" >&5 +echo $ECHO_N "checking for dl.h... $ECHO_C" >&6 +if test "${ac_cv_header_dl_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_header_dl_h=$ac_header_preproc +fi +echo "$as_me:$LINENO: result: $ac_cv_header_dl_h" >&5 +echo "${ECHO_T}$ac_cv_header_dl_h" >&6 + +fi +if test $ac_cv_header_dl_h = yes; then + DLL=dl.h +fi + + +fi + + +if test x${DLL} = xdlfcn.h; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_DLFCN_H 1 +_ACEOF + + echo "$as_me:$LINENO: checking for dlopen()" >&5 +echo $ECHO_N "checking for dlopen()... $ECHO_C" >&6 + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + extern void* dlopen(); + dlopen(); + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; + +cat >>confdefs.h <<\_ACEOF +#define HAVE_DLOPEN 1 +_ACEOF + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; + echo "$as_me:$LINENO: checking for dlopen() in -ldl" >&5 +echo $ECHO_N "checking for dlopen() in -ldl... $ECHO_C" >&6 + olibs=$LIBS + LIBS="$LIBS -ldl" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + extern void* dlopen(); + dlopen(); + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; + +cat >>confdefs.h <<\_ACEOF +#define HAVE_DLOPEN 1 +_ACEOF + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; + LIBS=$olibs +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + echo "$as_me:$LINENO: checking for dlsym()" >&5 +echo $ECHO_N "checking for dlsym()... $ECHO_C" >&6 + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + extern void* dlsym(); + dlsym(); + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; + +cat >>confdefs.h <<\_ACEOF +#define HAVE_DLSYM 1 +_ACEOF + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; + echo "$as_me:$LINENO: checking for dlsym() in -ldl" >&5 +echo $ECHO_N "checking for dlsym() in -ldl... $ECHO_C" >&6 + olibs=$LIBS + LIBS="$LIBS -ldl" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + extern void* dlsym(); + dlsym(); + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; + +cat >>confdefs.h <<\_ACEOF +#define HAVE_DLSYM 1 +_ACEOF + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; + LIBS=$olibs +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +elif test x${DLL} = xdl.h; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_DL_H 1 +_ACEOF + + echo "$as_me:$LINENO: checking for shl_load()" >&5 +echo $ECHO_N "checking for shl_load()... $ECHO_C" >&6 + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + extern void* shl_load(); + shl_load(); + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; + +cat >>confdefs.h <<\_ACEOF +#define HAVE_SHL_LOAD 1 +_ACEOF + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; + echo "$as_me:$LINENO: checking for shl_load() in -ldld" >&5 +echo $ECHO_N "checking for shl_load() in -ldld... $ECHO_C" >&6 + olibs=$LIBS + LIBS="$LIBS -ldld" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + extern void* shl_load(); + shl_load(); + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6; + +cat >>confdefs.h <<\_ACEOF +#define HAVE_SHL_LOAD 1 +_ACEOF + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6; + LIBS=$olibs +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi + +for ac_header in setjmp.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +else + # Is the header compilable? +echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_header_compiler=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_header_compiler=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6 + +# Is the header present? +echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_header_preproc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi +rm -f conftest.err conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6 + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------------ ## +## Report this to the AC_PACKAGE_NAME lists. ## +## ------------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 + +fi +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + +if test "x$MACOSX" = "xyes" -a -n "$PERL"; then + if echo $LIBS | grep -e '-ldl' >/dev/null; then + LIBS=`echo $LIBS | sed s/-ldl//` + PERL_LIBS="$PERL_LIBS -ldl" + fi +fi + +if test "x$MACOSX" = "xyes" && test "x$CARBON" = "xyes" \ + && test "x$GUITYPE" != "xCARBONGUI" && test "x$GUITYPE" != "xMACVIMGUI"; then + echo "$as_me:$LINENO: checking whether we need -framework Carbon" >&5 +echo $ECHO_N "checking whether we need -framework Carbon... $ECHO_C" >&6 + if test "x$enable_multibyte" = "xyes" || test "x$features" = "xbig" \ + || test "x$features" = "xhuge"; then + LIBS="$LIBS -framework Carbon" + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + fi +fi +if test "x$MACARCH" = "xboth"; then + LDFLAGS="$LDFLAGS -isysroot /Developer/SDKs/MacOSX10.4u.sdk -arch i386 -arch ppc" +fi + +echo "$as_me:$LINENO: checking for GCC 3 or later" >&5 +echo $ECHO_N "checking for GCC 3 or later... $ECHO_C" >&6 +DEPEND_CFLAGS_FILTER= +if test "$GCC" = yes; then + gccmajor=`echo "$gccversion" | sed -e 's/^\([1-9]\)\..*$/\1/g'` + if test "$gccmajor" -gt "2"; then + DEPEND_CFLAGS_FILTER="| sed 's+-I */+-isystem /+g'" + fi +fi +if test "$DEPEND_CFLAGS_FILTER" = ""; then + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +else + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +fi + + + ac_config_files="$ac_config_files auto/config.mk:config.mk.in" +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, don't put newlines in cache variables' values. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +{ + (set) 2>&1 | + case `(ac_space=' '; set | grep ac_space) 2>&1` in + *ac_space=\ *) + # `set' does not quote correctly, so add quotes (double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \). + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n \ + "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + ;; + esac; +} | + sed ' + t clear + : clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + : end' >>confcache +if diff $cache_file confcache >/dev/null 2>&1; then :; else + if test -w $cache_file; then + test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file" + cat confcache >$cache_file + else + echo "not updating unwritable cache $cache_file" + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +# VPATH may cause trouble with some makes, so we remove $(srcdir), +# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=/{ +s/:*\$(srcdir):*/:/; +s/:*\${srcdir}:*/:/; +s/:*@srcdir@:*/:/; +s/^\([^=]*=[ ]*\):*/\1/; +s/:*$//; +s/^[^=]*=[ ]*$//; +}' +fi + +DEFS=-DHAVE_CONFIG_H + +ac_libobjs= +ac_ltlibobjs= +for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_i=`echo "$ac_i" | + sed 's/\$U\././;s/\.o$//;s/\.obj$//'` + # 2. Add them. + ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext" + ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo' +done +LIBOBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + + +: ${CONFIG_STATUS=./config.status} +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 +echo "$as_me: creating $CONFIG_STATUS" >&6;} +cat >$CONFIG_STATUS <<_ACEOF +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false +SHELL=\${CONFIG_SHELL-$SHELL} +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF +## --------------------- ## +## M4sh Initialization. ## +## --------------------- ## + +# Be Bourne compatible +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' +elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then + set -o posix +fi +DUALCASE=1; export DUALCASE # for MKS sh + +# Support unset when possible. +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + + +# Work around bugs in pre-3.0 UWIN ksh. +$as_unset ENV MAIL MAILPATH +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +for as_var in \ + LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ + LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ + LC_TELEPHONE LC_TIME +do + if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then + eval $as_var=C; export $as_var + else + $as_unset $as_var + fi +done + +# Required to use basename. +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr +else + as_expr=false +fi + +if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + + +# Name of the executable. +as_me=`$as_basename "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)$' \| \ + . : '\(.\)' 2>/dev/null || +echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } + /^X\/\(\/\/\)$/{ s//\1/; q; } + /^X\/\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + + +# PATH needs CR, and LINENO needs CR and PATH. +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" || { + # Find who we are. Look in the path if we contain no path at all + # relative or not. + case $0 in + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break +done + + ;; + esac + # We did not find ourselves, most probably we were run as `sh COMMAND' + # in which case we are not to be found in the path. + if test "x$as_myself" = x; then + as_myself=$0 + fi + if test ! -f "$as_myself"; then + { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5 +echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;} + { (exit 1); exit 1; }; } + fi + case $CONFIG_SHELL in + '') + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for as_base in sh bash ksh sh5; do + case $as_dir in + /*) + if ("$as_dir/$as_base" -c ' + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then + $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } + $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } + CONFIG_SHELL=$as_dir/$as_base + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$0" ${1+"$@"} + fi;; + esac + done +done +;; + esac + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line before each line; the second 'sed' does the real + # work. The second script uses 'N' to pair each line-number line + # with the numbered line, and appends trailing '-' during + # substitution so that $LINENO is not a special case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) + sed '=' <$as_myself | + sed ' + N + s,$,-, + : loop + s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, + t loop + s,-$,, + s,^['$as_cr_digits']*\n,, + ' >$as_me.lineno && + chmod +x $as_me.lineno || + { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5 +echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;} + { (exit 1); exit 1; }; } + + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensible to this). + . ./$as_me.lineno + # Exit status is that of the last command. + exit +} + + +case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in + *c*,-n*) ECHO_N= ECHO_C=' +' ECHO_T=' ' ;; + *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; + *) ECHO_N= ECHO_C='\c' ECHO_T= ;; +esac + +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr +else + as_expr=false +fi + +rm -f conf$$ conf$$.exe conf$$.file +echo >conf$$.file +if ln -s conf$$.file conf$$ 2>/dev/null; then + # We could just check for DJGPP; but this test a) works b) is more generic + # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). + if test -f conf$$.exe; then + # Don't use ln at all; we don't have any links + as_ln_s='cp -p' + else + as_ln_s='ln -s' + fi +elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.file + +if mkdir -p . 2>/dev/null; then + as_mkdir_p=: +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +as_executable_p="test -f" + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +# IFS +# We need space, tab and new line, in precisely that order. +as_nl=' +' +IFS=" $as_nl" + +# CDPATH. +$as_unset CDPATH + +exec 6>&1 + +# Open the log real soon, to keep \$[0] and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. Logging --version etc. is OK. +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX +} >&5 +cat >&5 <<_CSEOF + +This file was extended by $as_me, which was +generated by GNU Autoconf 2.59. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +_CSEOF +echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5 +echo >&5 +_ACEOF + +# Files that config.status was made for. +if test -n "$ac_config_files"; then + echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS +fi + +if test -n "$ac_config_headers"; then + echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS +fi + +if test -n "$ac_config_links"; then + echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS +fi + +if test -n "$ac_config_commands"; then + echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS +fi + +cat >>$CONFIG_STATUS <<\_ACEOF + +ac_cs_usage="\ +\`$as_me' instantiates files from templates according to the +current configuration. + +Usage: $0 [OPTIONS] [FILE]... + + -h, --help print this help, then exit + -V, --version print version number, then exit + -q, --quiet do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + --header=FILE[:TEMPLATE] + instantiate the configuration header FILE + +Configuration files: +$config_files + +Configuration headers: +$config_headers + +Report bugs to ." +_ACEOF + +cat >>$CONFIG_STATUS <<_ACEOF +ac_cs_version="\\ +config.status +configured by $0, generated by GNU Autoconf 2.59, + with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\" + +Copyright (C) 2003 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." +srcdir=$srcdir +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF +# If no file are specified by the user, then we need to provide default +# value. By we need to know if files were specified by the user. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=*) + ac_option=`expr "x$1" : 'x\([^=]*\)='` + ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'` + ac_shift=: + ;; + -*) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + *) # This is not an option, so the user has probably given explicit + # arguments. + ac_option=$1 + ac_need_defaults=false;; + esac + + case $ac_option in + # Handling of the options. +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --vers* | -V ) + echo "$ac_cs_version"; exit 0 ;; + --he | --h) + # Conflict between --help and --header + { { echo "$as_me:$LINENO: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&5 +echo "$as_me: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&2;} + { (exit 1); exit 1; }; };; + --help | --hel | -h ) + echo "$ac_cs_usage"; exit 0 ;; + --debug | --d* | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + CONFIG_FILES="$CONFIG_FILES $ac_optarg" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg" + ac_need_defaults=false;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&5 +echo "$as_me: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&2;} + { (exit 1); exit 1; }; } ;; + + *) ac_config_targets="$ac_config_targets $1" ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF +if \$ac_cs_recheck; then + echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6 + exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion +fi + +_ACEOF + + + + + +cat >>$CONFIG_STATUS <<\_ACEOF +for ac_config_target in $ac_config_targets +do + case "$ac_config_target" in + # Handling of arguments. + "auto/config.mk" ) CONFIG_FILES="$CONFIG_FILES auto/config.mk:config.mk.in" ;; + "auto/config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS auto/config.h:config.h.in" ;; + *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 +echo "$as_me: error: invalid argument: $ac_config_target" >&2;} + { (exit 1); exit 1; }; };; + esac +done + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason to put it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Create a temporary directory, and hook for its removal unless debugging. +$debug || +{ + trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0 + trap '{ (exit 1); exit 1; }' 1 2 13 15 +} + +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` && + test -n "$tmp" && test -d "$tmp" +} || +{ + tmp=./confstat$$-$RANDOM + (umask 077 && mkdir $tmp) +} || +{ + echo "$me: cannot create a temporary directory in ." >&2 + { (exit 1); exit 1; } +} + +_ACEOF + +cat >>$CONFIG_STATUS <<_ACEOF + +# +# CONFIG_FILES section. +# + +# No need to generate the scripts if there are no CONFIG_FILES. +# This happens for instance when ./config.status config.h +if test -n "\$CONFIG_FILES"; then + # Protect against being on the right side of a sed subst in config.status. + sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g; + s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF +s,@SHELL@,$SHELL,;t t +s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t +s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t +s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t +s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t +s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t +s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t +s,@exec_prefix@,$exec_prefix,;t t +s,@prefix@,$prefix,;t t +s,@program_transform_name@,$program_transform_name,;t t +s,@bindir@,$bindir,;t t +s,@sbindir@,$sbindir,;t t +s,@libexecdir@,$libexecdir,;t t +s,@datadir@,$datadir,;t t +s,@sysconfdir@,$sysconfdir,;t t +s,@sharedstatedir@,$sharedstatedir,;t t +s,@localstatedir@,$localstatedir,;t t +s,@libdir@,$libdir,;t t +s,@includedir@,$includedir,;t t +s,@oldincludedir@,$oldincludedir,;t t +s,@infodir@,$infodir,;t t +s,@mandir@,$mandir,;t t +s,@build_alias@,$build_alias,;t t +s,@host_alias@,$host_alias,;t t +s,@target_alias@,$target_alias,;t t +s,@DEFS@,$DEFS,;t t +s,@ECHO_C@,$ECHO_C,;t t +s,@ECHO_N@,$ECHO_N,;t t +s,@ECHO_T@,$ECHO_T,;t t +s,@LIBS@,$LIBS,;t t +s,@SET_MAKE@,$SET_MAKE,;t t +s,@CC@,$CC,;t t +s,@CFLAGS@,$CFLAGS,;t t +s,@LDFLAGS@,$LDFLAGS,;t t +s,@CPPFLAGS@,$CPPFLAGS,;t t +s,@ac_ct_CC@,$ac_ct_CC,;t t +s,@EXEEXT@,$EXEEXT,;t t +s,@OBJEXT@,$OBJEXT,;t t +s,@CPP@,$CPP,;t t +s,@EGREP@,$EGREP,;t t +s,@AWK@,$AWK,;t t +s,@STRIP@,$STRIP,;t t +s,@CPP_MM@,$CPP_MM,;t t +s,@OS_EXTRA_SRC@,$OS_EXTRA_SRC,;t t +s,@OS_EXTRA_OBJ@,$OS_EXTRA_OBJ,;t t +s,@VIMNAME@,$VIMNAME,;t t +s,@EXNAME@,$EXNAME,;t t +s,@VIEWNAME@,$VIEWNAME,;t t +s,@line_break@,$line_break,;t t +s,@dovimdiff@,$dovimdiff,;t t +s,@dogvimdiff@,$dogvimdiff,;t t +s,@compiledby@,$compiledby,;t t +s,@vi_cv_path_mzscheme@,$vi_cv_path_mzscheme,;t t +s,@MZSCHEME_SRC@,$MZSCHEME_SRC,;t t +s,@MZSCHEME_OBJ@,$MZSCHEME_OBJ,;t t +s,@MZSCHEME_PRO@,$MZSCHEME_PRO,;t t +s,@MZSCHEME_LIBS@,$MZSCHEME_LIBS,;t t +s,@MZSCHEME_CFLAGS@,$MZSCHEME_CFLAGS,;t t +s,@vi_cv_path_perl@,$vi_cv_path_perl,;t t +s,@vi_cv_perllib@,$vi_cv_perllib,;t t +s,@shrpenv@,$shrpenv,;t t +s,@PERL_SRC@,$PERL_SRC,;t t +s,@PERL_OBJ@,$PERL_OBJ,;t t +s,@PERL_PRO@,$PERL_PRO,;t t +s,@PERL_CFLAGS@,$PERL_CFLAGS,;t t +s,@PERL_LIBS@,$PERL_LIBS,;t t +s,@vi_cv_path_python@,$vi_cv_path_python,;t t +s,@PYTHON_CONFDIR@,$PYTHON_CONFDIR,;t t +s,@PYTHON_LIBS@,$PYTHON_LIBS,;t t +s,@PYTHON_GETPATH_CFLAGS@,$PYTHON_GETPATH_CFLAGS,;t t +s,@PYTHON_CFLAGS@,$PYTHON_CFLAGS,;t t +s,@PYTHON_SRC@,$PYTHON_SRC,;t t +s,@PYTHON_OBJ@,$PYTHON_OBJ,;t t +s,@vi_cv_path_tcl@,$vi_cv_path_tcl,;t t +s,@TCL_SRC@,$TCL_SRC,;t t +s,@TCL_OBJ@,$TCL_OBJ,;t t +s,@TCL_PRO@,$TCL_PRO,;t t +s,@TCL_CFLAGS@,$TCL_CFLAGS,;t t +s,@TCL_LIBS@,$TCL_LIBS,;t t +s,@vi_cv_path_ruby@,$vi_cv_path_ruby,;t t +s,@RUBY_SRC@,$RUBY_SRC,;t t +s,@RUBY_OBJ@,$RUBY_OBJ,;t t +s,@RUBY_PRO@,$RUBY_PRO,;t t +s,@RUBY_CFLAGS@,$RUBY_CFLAGS,;t t +s,@RUBY_LIBS@,$RUBY_LIBS,;t t +s,@WORKSHOP_SRC@,$WORKSHOP_SRC,;t t +s,@WORKSHOP_OBJ@,$WORKSHOP_OBJ,;t t +s,@NETBEANS_SRC@,$NETBEANS_SRC,;t t +s,@NETBEANS_OBJ@,$NETBEANS_OBJ,;t t +s,@SNIFF_SRC@,$SNIFF_SRC,;t t +s,@SNIFF_OBJ@,$SNIFF_OBJ,;t t +s,@xmkmfpath@,$xmkmfpath,;t t +s,@X_CFLAGS@,$X_CFLAGS,;t t +s,@X_PRE_LIBS@,$X_PRE_LIBS,;t t +s,@X_LIBS@,$X_LIBS,;t t +s,@X_EXTRA_LIBS@,$X_EXTRA_LIBS,;t t +s,@X_LIB@,$X_LIB,;t t +s,@GTK_CONFIG@,$GTK_CONFIG,;t t +s,@GTK12_CONFIG@,$GTK12_CONFIG,;t t +s,@PKG_CONFIG@,$PKG_CONFIG,;t t +s,@GTK_CFLAGS@,$GTK_CFLAGS,;t t +s,@GTK_LIBS@,$GTK_LIBS,;t t +s,@GTK_LIBNAME@,$GTK_LIBNAME,;t t +s,@GNOME_LIBS@,$GNOME_LIBS,;t t +s,@GNOME_LIBDIR@,$GNOME_LIBDIR,;t t +s,@GNOME_INCLUDEDIR@,$GNOME_INCLUDEDIR,;t t +s,@GNOME_CONFIG@,$GNOME_CONFIG,;t t +s,@MOTIF_LIBNAME@,$MOTIF_LIBNAME,;t t +s,@NARROW_PROTO@,$NARROW_PROTO,;t t +s,@GUI_INC_LOC@,$GUI_INC_LOC,;t t +s,@GUI_LIB_LOC@,$GUI_LIB_LOC,;t t +s,@GUITYPE@,$GUITYPE,;t t +s,@GUI_X_LIBS@,$GUI_X_LIBS,;t t +s,@HANGULIN_SRC@,$HANGULIN_SRC,;t t +s,@HANGULIN_OBJ@,$HANGULIN_OBJ,;t t +s,@TAGPRG@,$TAGPRG,;t t +s,@INSTALL_LANGS@,$INSTALL_LANGS,;t t +s,@INSTALL_TOOL_LANGS@,$INSTALL_TOOL_LANGS,;t t +s,@MSGFMT@,$MSGFMT,;t t +s,@MAKEMO@,$MAKEMO,;t t +s,@DEPEND_CFLAGS_FILTER@,$DEPEND_CFLAGS_FILTER,;t t +s,@LIBOBJS@,$LIBOBJS,;t t +s,@LTLIBOBJS@,$LTLIBOBJS,;t t +CEOF + +_ACEOF + + cat >>$CONFIG_STATUS <<\_ACEOF + # Split the substitutions into bite-sized pieces for seds with + # small command number limits, like on Digital OSF/1 and HP-UX. + ac_max_sed_lines=48 + ac_sed_frag=1 # Number of current file. + ac_beg=1 # First line for current file. + ac_end=$ac_max_sed_lines # Line after last line for current file. + ac_more_lines=: + ac_sed_cmds= + while $ac_more_lines; do + if test $ac_beg -gt 1; then + sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag + else + sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag + fi + if test ! -s $tmp/subs.frag; then + ac_more_lines=false + else + # The purpose of the label and of the branching condition is to + # speed up the sed processing (if there are no `@' at all, there + # is no need to browse any of the substitutions). + # These are the two extra sed commands mentioned above. + (echo ':t + /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed + if test -z "$ac_sed_cmds"; then + ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed" + else + ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed" + fi + ac_sed_frag=`expr $ac_sed_frag + 1` + ac_beg=$ac_end + ac_end=`expr $ac_end + $ac_max_sed_lines` + fi + done + if test -z "$ac_sed_cmds"; then + ac_sed_cmds=cat + fi +fi # test -n "$CONFIG_FILES" + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF +for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case $ac_file in + - | *:- | *:-:* ) # input from stdin + cat >$tmp/stdin + ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + * ) ac_file_in=$ac_file.in ;; + esac + + # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories. + ac_dir=`(dirname "$ac_file") 2>/dev/null || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + { if $as_mkdir_p; then + mkdir -p "$ac_dir" + else + as_dir="$ac_dir" + as_dirs= + while test ! -d "$as_dir"; do + as_dirs="$as_dir $as_dirs" + as_dir=`(dirname "$as_dir") 2>/dev/null || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + done + test ! -n "$as_dirs" || mkdir $as_dirs + fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 +echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} + { (exit 1); exit 1; }; }; } + + ac_builddir=. + +if test "$ac_dir" != .; then + ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` + # A "../" for each directory in $ac_dir_suffix. + ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` +else + ac_dir_suffix= ac_top_builddir= +fi + +case $srcdir in + .) # No --srcdir option. We are building in place. + ac_srcdir=. + if test -z "$ac_top_builddir"; then + ac_top_srcdir=. + else + ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` + fi ;; + [\\/]* | ?:[\\/]* ) # Absolute path. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir ;; + *) # Relative path. + ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_builddir$srcdir ;; +esac + +# Do not use `cd foo && pwd` to compute absolute paths, because +# the directories may not exist. +case `pwd` in +.) ac_abs_builddir="$ac_dir";; +*) + case "$ac_dir" in + .) ac_abs_builddir=`pwd`;; + [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; + *) ac_abs_builddir=`pwd`/"$ac_dir";; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_top_builddir=${ac_top_builddir}.;; +*) + case ${ac_top_builddir}. in + .) ac_abs_top_builddir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; + *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_srcdir=$ac_srcdir;; +*) + case $ac_srcdir in + .) ac_abs_srcdir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; + *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_top_srcdir=$ac_top_srcdir;; +*) + case $ac_top_srcdir in + .) ac_abs_top_srcdir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; + *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; + esac;; +esac + + + + if test x"$ac_file" != x-; then + { echo "$as_me:$LINENO: creating $ac_file" >&5 +echo "$as_me: creating $ac_file" >&6;} + rm -f "$ac_file" + fi + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + if test x"$ac_file" = x-; then + configure_input= + else + configure_input="$ac_file. " + fi + configure_input=$configure_input"Generated from `echo $ac_file_in | + sed 's,.*/,,'` by configure." + + # First look for the input files in the build tree, otherwise in the + # src tree. + ac_file_inputs=`IFS=: + for f in $ac_file_in; do + case $f in + -) echo $tmp/stdin ;; + [\\/$]*) + # Absolute (can't be DOS-style, as IFS=:) + test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + echo "$f";; + *) # Relative + if test -f "$f"; then + # Build tree + echo "$f" + elif test -f "$srcdir/$f"; then + # Source tree + echo "$srcdir/$f" + else + # /dev/null tree + { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + fi;; + esac + done` || { (exit 1); exit 1; } +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF + sed "$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s,@configure_input@,$configure_input,;t t +s,@srcdir@,$ac_srcdir,;t t +s,@abs_srcdir@,$ac_abs_srcdir,;t t +s,@top_srcdir@,$ac_top_srcdir,;t t +s,@abs_top_srcdir@,$ac_abs_top_srcdir,;t t +s,@builddir@,$ac_builddir,;t t +s,@abs_builddir@,$ac_abs_builddir,;t t +s,@top_builddir@,$ac_top_builddir,;t t +s,@abs_top_builddir@,$ac_abs_top_builddir,;t t +" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out + rm -f $tmp/stdin + if test x"$ac_file" != x-; then + mv $tmp/out $ac_file + else + cat $tmp/out + rm -f $tmp/out + fi + +done +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF + +# +# CONFIG_HEADER section. +# + +# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where +# NAME is the cpp macro being defined and VALUE is the value it is being given. +# +# ac_d sets the value in "#define NAME VALUE" lines. +ac_dA='s,^\([ ]*\)#\([ ]*define[ ][ ]*\)' +ac_dB='[ ].*$,\1#\2' +ac_dC=' ' +ac_dD=',;t' +# ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE". +ac_uA='s,^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' +ac_uB='$,\1#\2define\3' +ac_uC=' ' +ac_uD=',;t' + +for ac_file in : $CONFIG_HEADERS; do test "x$ac_file" = x: && continue + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case $ac_file in + - | *:- | *:-:* ) # input from stdin + cat >$tmp/stdin + ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + * ) ac_file_in=$ac_file.in ;; + esac + + test x"$ac_file" != x- && { echo "$as_me:$LINENO: creating $ac_file" >&5 +echo "$as_me: creating $ac_file" >&6;} + + # First look for the input files in the build tree, otherwise in the + # src tree. + ac_file_inputs=`IFS=: + for f in $ac_file_in; do + case $f in + -) echo $tmp/stdin ;; + [\\/$]*) + # Absolute (can't be DOS-style, as IFS=:) + test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + # Do quote $f, to prevent DOS paths from being IFS'd. + echo "$f";; + *) # Relative + if test -f "$f"; then + # Build tree + echo "$f" + elif test -f "$srcdir/$f"; then + # Source tree + echo "$srcdir/$f" + else + # /dev/null tree + { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + fi;; + esac + done` || { (exit 1); exit 1; } + # Remove the trailing spaces. + sed 's/[ ]*$//' $ac_file_inputs >$tmp/in + +_ACEOF + +# Transform confdefs.h into two sed scripts, `conftest.defines' and +# `conftest.undefs', that substitutes the proper values into +# config.h.in to produce config.h. The first handles `#define' +# templates, and the second `#undef' templates. +# And first: Protect against being on the right side of a sed subst in +# config.status. Protect against being in an unquoted here document +# in config.status. +rm -f conftest.defines conftest.undefs +# Using a here document instead of a string reduces the quoting nightmare. +# Putting comments in sed scripts is not portable. +# +# `end' is used to avoid that the second main sed command (meant for +# 0-ary CPP macros) applies to n-ary macro definitions. +# See the Autoconf documentation for `clear'. +cat >confdef2sed.sed <<\_ACEOF +s/[\\&,]/\\&/g +s,[\\$`],\\&,g +t clear +: clear +s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*\)\(([^)]*)\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1\2${ac_dC}\3${ac_dD},gp +t end +s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD},gp +: end +_ACEOF +# If some macros were called several times there might be several times +# the same #defines, which is useless. Nevertheless, we may not want to +# sort them, since we want the *last* AC-DEFINE to be honored. +uniq confdefs.h | sed -n -f confdef2sed.sed >conftest.defines +sed 's/ac_d/ac_u/g' conftest.defines >conftest.undefs +rm -f confdef2sed.sed + +# This sed command replaces #undef with comments. This is necessary, for +# example, in the case of _POSIX_SOURCE, which is predefined and required +# on some systems where configure will not decide to define it. +cat >>conftest.undefs <<\_ACEOF +s,^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*,/* & */, +_ACEOF + +# Break up conftest.defines because some shells have a limit on the size +# of here documents, and old seds have small limits too (100 cmds). +echo ' # Handle all the #define templates only if necessary.' >>$CONFIG_STATUS +echo ' if grep "^[ ]*#[ ]*define" $tmp/in >/dev/null; then' >>$CONFIG_STATUS +echo ' # If there are no defines, we may have an empty if/fi' >>$CONFIG_STATUS +echo ' :' >>$CONFIG_STATUS +rm -f conftest.tail +while grep . conftest.defines >/dev/null +do + # Write a limited-size here document to $tmp/defines.sed. + echo ' cat >$tmp/defines.sed <>$CONFIG_STATUS + # Speed up: don't consider the non `#define' lines. + echo '/^[ ]*#[ ]*define/!b' >>$CONFIG_STATUS + # Work around the forget-to-reset-the-flag bug. + echo 't clr' >>$CONFIG_STATUS + echo ': clr' >>$CONFIG_STATUS + sed ${ac_max_here_lines}q conftest.defines >>$CONFIG_STATUS + echo 'CEOF + sed -f $tmp/defines.sed $tmp/in >$tmp/out + rm -f $tmp/in + mv $tmp/out $tmp/in +' >>$CONFIG_STATUS + sed 1,${ac_max_here_lines}d conftest.defines >conftest.tail + rm -f conftest.defines + mv conftest.tail conftest.defines +done +rm -f conftest.defines +echo ' fi # grep' >>$CONFIG_STATUS +echo >>$CONFIG_STATUS + +# Break up conftest.undefs because some shells have a limit on the size +# of here documents, and old seds have small limits too (100 cmds). +echo ' # Handle all the #undef templates' >>$CONFIG_STATUS +rm -f conftest.tail +while grep . conftest.undefs >/dev/null +do + # Write a limited-size here document to $tmp/undefs.sed. + echo ' cat >$tmp/undefs.sed <>$CONFIG_STATUS + # Speed up: don't consider the non `#undef' + echo '/^[ ]*#[ ]*undef/!b' >>$CONFIG_STATUS + # Work around the forget-to-reset-the-flag bug. + echo 't clr' >>$CONFIG_STATUS + echo ': clr' >>$CONFIG_STATUS + sed ${ac_max_here_lines}q conftest.undefs >>$CONFIG_STATUS + echo 'CEOF + sed -f $tmp/undefs.sed $tmp/in >$tmp/out + rm -f $tmp/in + mv $tmp/out $tmp/in +' >>$CONFIG_STATUS + sed 1,${ac_max_here_lines}d conftest.undefs >conftest.tail + rm -f conftest.undefs + mv conftest.tail conftest.undefs +done +rm -f conftest.undefs + +cat >>$CONFIG_STATUS <<\_ACEOF + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + if test x"$ac_file" = x-; then + echo "/* Generated by configure. */" >$tmp/config.h + else + echo "/* $ac_file. Generated by configure. */" >$tmp/config.h + fi + cat $tmp/in >>$tmp/config.h + rm -f $tmp/in + if test x"$ac_file" != x-; then + if diff $ac_file $tmp/config.h >/dev/null 2>&1; then + { echo "$as_me:$LINENO: $ac_file is unchanged" >&5 +echo "$as_me: $ac_file is unchanged" >&6;} + else + ac_dir=`(dirname "$ac_file") 2>/dev/null || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + { if $as_mkdir_p; then + mkdir -p "$ac_dir" + else + as_dir="$ac_dir" + as_dirs= + while test ! -d "$as_dir"; do + as_dirs="$as_dir $as_dirs" + as_dir=`(dirname "$as_dir") 2>/dev/null || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + done + test ! -n "$as_dirs" || mkdir $as_dirs + fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 +echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} + { (exit 1); exit 1; }; }; } + + rm -f $ac_file + mv $tmp/config.h $ac_file + fi + else + cat $tmp/config.h + rm -f $tmp/config.h + fi +done +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF + +{ (exit 0); exit 0; } +_ACEOF +chmod +x $CONFIG_STATUS +ac_clean_files=$ac_clean_files_save + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || { (exit 1); exit 1; } +fi -# Stupid autoconf 2.5x causes this file to be left behind. -if test -f configure.lineno; then rm -f configure.lineno; fi -exit $result From 7115fb8a7819ff3e1ee9b71be318abf1944c81b6 Mon Sep 17 00:00:00 2001 From: Tim Allen Date: Fri, 19 Oct 2007 17:49:49 +0200 Subject: [PATCH 0293/1156] Teach git to ignore generated files. Adds entries to .gitignore for all the stuff that gets generated during an ordinary build of MacVim. Also, some automatically-generated files seem to have crept into the upstream repository, so let's remove them. Signed-off-by: Tim Allen --- .gitignore | 17 +++++++++++++++++ src/auto/config.h | 0 src/auto/config.mk | 5 ----- 3 files changed, 17 insertions(+), 5 deletions(-) delete mode 100644 src/auto/config.h delete mode 100644 src/auto/config.mk diff --git a/.gitignore b/.gitignore index e69de29bb2..29dff95b1f 100644 --- a/.gitignore +++ b/.gitignore @@ -0,0 +1,17 @@ +src/MacVim/MacVim.xcodeproj/*.mode1 +src/MacVim/MacVim.xcodeproj/*.pbxuser +src/MacVim/PSMTabBarControl/PSMTabBarControl.xcodeproj/*.mode1 +src/MacVim/PSMTabBarControl/PSMTabBarControl.xcodeproj/*.pbxuser +src/MacVim/PSMTabBarControl/build +src/MacVim/build +src/Vim +src/auto/link.log +src/auto/link.sed +src/auto/osdef.h +src/auto/pathdef.c +src/config.log +src/config.status +src/objects +src/xxd/xxd +src/auto/config.h +src/auto/config.mk diff --git a/src/auto/config.h b/src/auto/config.h deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/src/auto/config.mk b/src/auto/config.mk deleted file mode 100644 index fa7c108505..0000000000 --- a/src/auto/config.mk +++ /dev/null @@ -1,5 +0,0 @@ -the first targets to make vim are: scratch config myself -srcdir = . -VIMNAME = vim -EXNAME = ex -VIEWNAME = view From 9aefa535e7bd769bd05b542ac02581f28bf68d76 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Fri, 19 Oct 2007 19:33:55 +0200 Subject: [PATCH 0294/1156] Remove MacVim.xcodeproj/winckler.* from repo and ignore src/TAGS --- .gitignore | 1 + src/MacVim/MacVim.xcodeproj/winckler.mode1 | 1353 ------------------ src/MacVim/MacVim.xcodeproj/winckler.pbxuser | 470 ------ 3 files changed, 1 insertion(+), 1823 deletions(-) delete mode 100644 src/MacVim/MacVim.xcodeproj/winckler.mode1 delete mode 100644 src/MacVim/MacVim.xcodeproj/winckler.pbxuser diff --git a/.gitignore b/.gitignore index 29dff95b1f..699beffcf4 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,4 @@ src/objects src/xxd/xxd src/auto/config.h src/auto/config.mk +src/TAGS diff --git a/src/MacVim/MacVim.xcodeproj/winckler.mode1 b/src/MacVim/MacVim.xcodeproj/winckler.mode1 deleted file mode 100644 index c5c59484aa..0000000000 --- a/src/MacVim/MacVim.xcodeproj/winckler.mode1 +++ /dev/null @@ -1,1353 +0,0 @@ - - - - - ActivePerspectiveName - Project - AllowedModules - - - BundleLoadPath - - MaxInstances - n - Module - PBXSmartGroupTreeModule - Name - Groups and Files Outline View - - - BundleLoadPath - - MaxInstances - n - Module - PBXNavigatorGroup - Name - Editor - - - BundleLoadPath - - MaxInstances - n - Module - XCTaskListModule - Name - Task List - - - BundleLoadPath - - MaxInstances - n - Module - XCDetailModule - Name - File and Smart Group Detail Viewer - - - BundleLoadPath - - MaxInstances - 1 - Module - PBXBuildResultsModule - Name - Detailed Build Results Viewer - - - BundleLoadPath - - MaxInstances - 1 - Module - PBXProjectFindModule - Name - Project Batch Find Tool - - - BundleLoadPath - - MaxInstances - n - Module - PBXRunSessionModule - Name - Run Log - - - BundleLoadPath - - MaxInstances - n - Module - PBXBookmarksModule - Name - Bookmarks Tool - - - BundleLoadPath - - MaxInstances - n - Module - PBXClassBrowserModule - Name - Class Browser - - - BundleLoadPath - - MaxInstances - n - Module - PBXCVSModule - Name - Source Code Control Tool - - - BundleLoadPath - - MaxInstances - n - Module - PBXDebugBreakpointsModule - Name - Debug Breakpoints Tool - - - BundleLoadPath - - MaxInstances - n - Module - XCDockableInspector - Name - Inspector - - - BundleLoadPath - - MaxInstances - n - Module - PBXOpenQuicklyModule - Name - Open Quickly Tool - - - BundleLoadPath - - MaxInstances - 1 - Module - PBXDebugSessionModule - Name - Debugger - - - BundleLoadPath - - MaxInstances - 1 - Module - PBXDebugCLIModule - Name - Debug Console - - - Description - DefaultDescriptionKey - DockingSystemVisible - - Extension - mode1 - FavBarConfig - - PBXProjectModuleGUID - 1D16B9DC0BA33BB000A69B33 - XCBarModuleItemNames - - XCBarModuleItems - - - FirstTimeWindowDisplayed - - Identifier - com.apple.perspectives.project.mode1 - MajorVersion - 31 - MinorVersion - 1 - Name - Default - Notifications - - OpenEditors - - PerspectiveWidths - - -1 - -1 - - Perspectives - - - ChosenToolbarItems - - active-target-popup - active-buildstyle-popup - action - NSToolbarFlexibleSpaceItem - buildOrClean - build-and-runOrDebug - com.apple.ide.PBXToolbarStopButton - get-info - toggle-editor - NSToolbarFlexibleSpaceItem - com.apple.pbx.toolbar.searchfield - - ControllerClassBaseName - - IconName - WindowOfProjectWithEditor - Identifier - perspective.project - IsVertical - - Layout - - - BecomeActive - - ContentConfiguration - - PBXBottomSmartGroupGIDs - - 1C37FBAC04509CD000000102 - 1C37FAAC04509CD000000102 - 1C08E77C0454961000C914BD - 1C37FABC05509CD000000102 - 1C37FABC05539CD112110102 - E2644B35053B69B200211256 - 1C37FABC04509CD000100104 - 1CC0EA4004350EF90044410B - 1CC0EA4004350EF90041110B - - PBXProjectModuleGUID - 1CE0B1FE06471DED0097A5F4 - PBXProjectModuleLabel - Files - PBXProjectStructureProvided - yes - PBXSmartGroupTreeModuleColumnData - - PBXSmartGroupTreeModuleColumnWidthsKey - - 186 - - PBXSmartGroupTreeModuleColumnsKey_v4 - - MainColumn - - - PBXSmartGroupTreeModuleOutlineStateKey_v7 - - PBXSmartGroupTreeModuleOutlineStateExpansionKey - - 29B97314FDCFA39411CA2CEA - 1C37FBAC04509CD000000102 - 1C37FAAC04509CD000000102 - 1C37FABC05509CD000000102 - - PBXSmartGroupTreeModuleOutlineStateSelectionKey - - - 0 - - - PBXSmartGroupTreeModuleOutlineStateVisibleRectKey - {{0, 0}, {186, 338}} - - PBXTopSmartGroupGIDs - - XCIncludePerspectivesSwitch - - XCSharingToken - com.apple.Xcode.GFSharingToken - - GeometryConfiguration - - Frame - {{0, 0}, {203, 356}} - GroupTreeTableConfiguration - - MainColumn - 186 - - RubberWindowFrame - 165 349 690 397 0 0 1024 746 - - Module - PBXSmartGroupTreeModule - Proportion - 203pt - - - Dock - - - ContentConfiguration - - PBXProjectModuleGUID - 1CE0B20306471E060097A5F4 - PBXProjectModuleLabel - MyNewFile14.java - PBXSplitModuleInNavigatorKey - - Split0 - - PBXProjectModuleGUID - 1CE0B20406471E060097A5F4 - PBXProjectModuleLabel - MyNewFile14.java - - SplitCount - 1 - - StatusBarVisibility - - - GeometryConfiguration - - Frame - {{0, 0}, {482, 0}} - RubberWindowFrame - 165 349 690 397 0 0 1024 746 - - Module - PBXNavigatorGroup - Proportion - 0pt - - - ContentConfiguration - - PBXProjectModuleGUID - 1CE0B20506471E060097A5F4 - PBXProjectModuleLabel - Detail - - GeometryConfiguration - - Frame - {{0, 5}, {482, 351}} - RubberWindowFrame - 165 349 690 397 0 0 1024 746 - - Module - XCDetailModule - Proportion - 351pt - - - Proportion - 482pt - - - Name - Project - ServiceClasses - - XCModuleDock - PBXSmartGroupTreeModule - XCModuleDock - PBXNavigatorGroup - XCDetailModule - - TableOfContents - - 1DE3752F0CBE67DA00CE48DB - 1CE0B1FE06471DED0097A5F4 - 1DE375300CBE67DA00CE48DB - 1CE0B20306471E060097A5F4 - 1CE0B20506471E060097A5F4 - - ToolbarConfiguration - xcode.toolbar.config.default - - - ControllerClassBaseName - - IconName - WindowOfProject - Identifier - perspective.morph - IsVertical - 0 - Layout - - - BecomeActive - 1 - ContentConfiguration - - PBXBottomSmartGroupGIDs - - 1C37FBAC04509CD000000102 - 1C37FAAC04509CD000000102 - 1C08E77C0454961000C914BD - 1C37FABC05509CD000000102 - 1C37FABC05539CD112110102 - E2644B35053B69B200211256 - 1C37FABC04509CD000100104 - 1CC0EA4004350EF90044410B - 1CC0EA4004350EF90041110B - - PBXProjectModuleGUID - 11E0B1FE06471DED0097A5F4 - PBXProjectModuleLabel - Files - PBXProjectStructureProvided - yes - PBXSmartGroupTreeModuleColumnData - - PBXSmartGroupTreeModuleColumnWidthsKey - - 186 - - PBXSmartGroupTreeModuleColumnsKey_v4 - - MainColumn - - - PBXSmartGroupTreeModuleOutlineStateKey_v7 - - PBXSmartGroupTreeModuleOutlineStateExpansionKey - - 29B97314FDCFA39411CA2CEA - 1C37FABC05509CD000000102 - - PBXSmartGroupTreeModuleOutlineStateSelectionKey - - - 0 - - - PBXSmartGroupTreeModuleOutlineStateVisibleRectKey - {{0, 0}, {186, 337}} - - PBXTopSmartGroupGIDs - - XCIncludePerspectivesSwitch - 1 - XCSharingToken - com.apple.Xcode.GFSharingToken - - GeometryConfiguration - - Frame - {{0, 0}, {203, 355}} - GroupTreeTableConfiguration - - MainColumn - 186 - - RubberWindowFrame - 373 269 690 397 0 0 1440 878 - - Module - PBXSmartGroupTreeModule - Proportion - 100% - - - Name - Morph - PreferredWidth - 300 - ServiceClasses - - XCModuleDock - PBXSmartGroupTreeModule - - TableOfContents - - 11E0B1FE06471DED0097A5F4 - - ToolbarConfiguration - xcode.toolbar.config.default.short - - - PerspectivesBarVisible - - ShelfIsVisible - - SourceDescription - file at '/System/Library/PrivateFrameworks/DevToolsInterface.framework/Versions/A/Resources/XCPerspectivesSpecificationMode1.xcperspec' - StatusbarIsVisible - - TimeStamp - 0.0 - ToolbarDisplayMode - 1 - ToolbarIsVisible - - ToolbarSizeMode - 1 - Type - Perspectives - UpdateMessage - The Default Workspace in this version of Xcode now includes support to hide and show the detail view (what has been referred to as the "Metro-Morph" feature). You must discard your current Default Workspace settings and update to the latest Default Workspace in order to gain this feature. Do you wish to update to the latest Workspace defaults for project '%@'? - WindowJustification - 5 - WindowOrderList - - 1C0AD2B3069F1EA900FABCE6 - 1D16B9EF0BA33E3800A69B33 - /Users/winckler/Projects/vim7/src/MacVim/MacVim.xcodeproj - - WindowString - 165 349 690 397 0 0 1024 746 - WindowTools - - - FirstTimeWindowDisplayed - - Identifier - windowTool.build - IsVertical - - Layout - - - Dock - - - ContentConfiguration - - PBXProjectModuleGUID - 1CD0528F0623707200166675 - PBXProjectModuleLabel - - StatusBarVisibility - - - GeometryConfiguration - - Frame - {{0, 0}, {836, 194}} - RubberWindowFrame - 149 236 836 476 0 0 1024 746 - - Module - PBXNavigatorGroup - Proportion - 194pt - - - BecomeActive - - ContentConfiguration - - PBXProjectModuleGUID - XCMainBuildResultsModuleGUID - PBXProjectModuleLabel - Build - XCBuildResultsTrigger_Collapse - 1021 - XCBuildResultsTrigger_Open - 1011 - - GeometryConfiguration - - Frame - {{0, 199}, {836, 236}} - RubberWindowFrame - 149 236 836 476 0 0 1024 746 - - Module - PBXBuildResultsModule - Proportion - 236pt - - - Proportion - 435pt - - - Name - Build Results - ServiceClasses - - PBXBuildResultsModule - - StatusbarIsVisible - - TableOfContents - - 1D16B9EF0BA33E3800A69B33 - 1DE375310CBE67DA00CE48DB - 1CD0528F0623707200166675 - XCMainBuildResultsModuleGUID - - ToolbarConfiguration - xcode.toolbar.config.build - WindowString - 149 236 836 476 0 0 1024 746 - WindowToolGUID - 1D16B9EF0BA33E3800A69B33 - WindowToolIsVisible - - - - FirstTimeWindowDisplayed - - Identifier - windowTool.debugger - IsVertical - - Layout - - - Dock - - - ContentConfiguration - - Debugger - - HorizontalSplitView - - _collapsingFrameDimension - 0.0 - _indexOfCollapsedView - 0 - _percentageOfCollapsedView - 0.0 - isCollapsed - yes - sizes - - {{0, 0}, {376, 339}} - {{376, 0}, {648, 339}} - - - VerticalSplitView - - _collapsingFrameDimension - 0.0 - _indexOfCollapsedView - 0 - _percentageOfCollapsedView - 0.0 - isCollapsed - yes - sizes - - {{0, 0}, {1024, 339}} - {{0, 339}, {1024, 306}} - - - - LauncherConfigVersion - 8 - PBXProjectModuleGUID - 1C162984064C10D400B95A72 - PBXProjectModuleLabel - Debug - GLUTExamples (Underwater) - - GeometryConfiguration - - DebugConsoleDrawerSize - {100, 120} - DebugConsoleVisible - None - DebugConsoleWindowFrame - {{200, 200}, {500, 300}} - DebugSTDIOWindowFrame - {{200, 200}, {500, 300}} - Frame - {{0, 0}, {1024, 645}} - RubberWindowFrame - 1 60 1024 686 0 0 1024 746 - - Module - PBXDebugSessionModule - Proportion - 645pt - - - Proportion - 645pt - - - Name - Debugger - ServiceClasses - - PBXDebugSessionModule - - StatusbarIsVisible - - TableOfContents - - 1CD10A99069EF8BA00B06720 - 1DDA37E50C9F02BF00CE9A67 - 1C162984064C10D400B95A72 - 1DDA37E60C9F02BF00CE9A67 - 1DDA37E70C9F02BF00CE9A67 - 1DDA37E80C9F02BF00CE9A67 - 1DDA37E90C9F02BF00CE9A67 - 1DDA37EA0C9F02BF00CE9A67 - 1DDA37EB0C9F02BF00CE9A67 - - ToolbarConfiguration - xcode.toolbar.config.debug - WindowString - 1 60 1024 686 0 0 1024 746 - WindowToolGUID - 1CD10A99069EF8BA00B06720 - WindowToolIsVisible - - - - Identifier - windowTool.find - Layout - - - Dock - - - Dock - - - ContentConfiguration - - PBXProjectModuleGUID - 1CDD528C0622207200134675 - PBXProjectModuleLabel - <No Editor> - PBXSplitModuleInNavigatorKey - - Split0 - - PBXProjectModuleGUID - 1CD0528D0623707200166675 - - SplitCount - 1 - - StatusBarVisibility - 1 - - GeometryConfiguration - - Frame - {{0, 0}, {781, 167}} - RubberWindowFrame - 62 385 781 470 0 0 1440 878 - - Module - PBXNavigatorGroup - Proportion - 781pt - - - Proportion - 50% - - - BecomeActive - 1 - ContentConfiguration - - PBXProjectModuleGUID - 1CD0528E0623707200166675 - PBXProjectModuleLabel - Project Find - - GeometryConfiguration - - Frame - {{8, 0}, {773, 254}} - RubberWindowFrame - 62 385 781 470 0 0 1440 878 - - Module - PBXProjectFindModule - Proportion - 50% - - - Proportion - 428pt - - - Name - Project Find - ServiceClasses - - PBXProjectFindModule - - StatusbarIsVisible - 1 - TableOfContents - - 1C530D57069F1CE1000CFCEE - 1C530D58069F1CE1000CFCEE - 1C530D59069F1CE1000CFCEE - 1CDD528C0622207200134675 - 1C530D5A069F1CE1000CFCEE - 1CE0B1FE06471DED0097A5F4 - 1CD0528E0623707200166675 - - WindowString - 62 385 781 470 0 0 1440 878 - WindowToolGUID - 1C530D57069F1CE1000CFCEE - WindowToolIsVisible - 0 - - - Identifier - MENUSEPARATOR - - - FirstTimeWindowDisplayed - - Identifier - windowTool.debuggerConsole - IsVertical - - Layout - - - Dock - - - BecomeActive - - ContentConfiguration - - PBXProjectModuleGUID - 1C78EAAC065D492600B07095 - PBXProjectModuleLabel - Debugger Console - - GeometryConfiguration - - Frame - {{0, 0}, {836, 380}} - RubberWindowFrame - 201 95 836 421 0 0 1024 746 - - Module - PBXDebugCLIModule - Proportion - 380pt - - - Proportion - 380pt - - - Name - Debugger Console - ServiceClasses - - PBXDebugCLIModule - - StatusbarIsVisible - - TableOfContents - - 1DE444730BA4445100C4C77A - 1DDA37EC0C9F02BF00CE9A67 - 1C78EAAC065D492600B07095 - - WindowString - 201 95 836 421 0 0 1024 746 - WindowToolGUID - 1DE444730BA4445100C4C77A - WindowToolIsVisible - - - - FirstTimeWindowDisplayed - - Identifier - windowTool.run - IsVertical - - Layout - - - Dock - - - ContentConfiguration - - LauncherConfigVersion - 3 - PBXProjectModuleGUID - 1CD0528B0623707200166675 - PBXProjectModuleLabel - Run - Runner - - HorizontalSplitView - - _collapsingFrameDimension - 0.0 - _indexOfCollapsedView - 0 - _percentageOfCollapsedView - 0.0 - isCollapsed - yes - sizes - - {{0, 0}, {493, 167}} - {{0, 176}, {493, 267}} - - - VerticalSplitView - - _collapsingFrameDimension - 0.0 - _indexOfCollapsedView - 0 - _percentageOfCollapsedView - 0.0 - isCollapsed - yes - sizes - - {{0, 0}, {405, 443}} - {{414, 0}, {514, 443}} - - - - - GeometryConfiguration - - Frame - {{0, 0}, {897, 256}} - RubberWindowFrame - 1 65 897 297 0 0 1024 746 - - Module - PBXRunSessionModule - Proportion - 256pt - - - Proportion - 256pt - - - Name - Run Log - ServiceClasses - - PBXRunSessionModule - - StatusbarIsVisible - - TableOfContents - - 1C0AD2B3069F1EA900FABCE6 - 1DE375380CBE697B00CE48DB - 1CD0528B0623707200166675 - 1DE375390CBE697B00CE48DB - - ToolbarConfiguration - xcode.toolbar.config.run - WindowString - 1 65 897 297 0 0 1024 746 - WindowToolGUID - 1C0AD2B3069F1EA900FABCE6 - WindowToolIsVisible - - - - Identifier - windowTool.scm - Layout - - - Dock - - - ContentConfiguration - - PBXProjectModuleGUID - 1C78EAB2065D492600B07095 - PBXProjectModuleLabel - <No Editor> - PBXSplitModuleInNavigatorKey - - Split0 - - PBXProjectModuleGUID - 1C78EAB3065D492600B07095 - - SplitCount - 1 - - StatusBarVisibility - 1 - - GeometryConfiguration - - Frame - {{0, 0}, {452, 0}} - RubberWindowFrame - 743 379 452 308 0 0 1280 1002 - - Module - PBXNavigatorGroup - Proportion - 0pt - - - BecomeActive - 1 - ContentConfiguration - - PBXProjectModuleGUID - 1CD052920623707200166675 - PBXProjectModuleLabel - SCM - - GeometryConfiguration - - ConsoleFrame - {{0, 259}, {452, 0}} - Frame - {{0, 7}, {452, 259}} - RubberWindowFrame - 743 379 452 308 0 0 1280 1002 - TableConfiguration - - Status - 30 - FileName - 199 - Path - 197.09500122070312 - - TableFrame - {{0, 0}, {452, 250}} - - Module - PBXCVSModule - Proportion - 262pt - - - Proportion - 266pt - - - Name - SCM - ServiceClasses - - PBXCVSModule - - StatusbarIsVisible - 1 - TableOfContents - - 1C78EAB4065D492600B07095 - 1C78EAB5065D492600B07095 - 1C78EAB2065D492600B07095 - 1CD052920623707200166675 - - ToolbarConfiguration - xcode.toolbar.config.scm - WindowString - 743 379 452 308 0 0 1280 1002 - - - FirstTimeWindowDisplayed - - Identifier - windowTool.breakpoints - IsVertical - - Layout - - - Dock - - - BecomeActive - - ContentConfiguration - - PBXBottomSmartGroupGIDs - - 1C77FABC04509CD000000102 - - PBXProjectModuleGUID - 1CE0B1FE06471DED0097A5F4 - PBXProjectModuleLabel - Files - PBXProjectStructureProvided - no - PBXSmartGroupTreeModuleColumnData - - PBXSmartGroupTreeModuleColumnWidthsKey - - 168 - - PBXSmartGroupTreeModuleColumnsKey_v4 - - MainColumn - - - PBXSmartGroupTreeModuleOutlineStateKey_v7 - - PBXSmartGroupTreeModuleOutlineStateExpansionKey - - 1C77FABC04509CD000000102 - - PBXSmartGroupTreeModuleOutlineStateSelectionKey - - - 0 - - - PBXSmartGroupTreeModuleOutlineStateVisibleRectKey - {{0, 0}, {168, 350}} - - PBXTopSmartGroupGIDs - - XCIncludePerspectivesSwitch - - - GeometryConfiguration - - Frame - {{0, 0}, {185, 368}} - GroupTreeTableConfiguration - - MainColumn - 168 - - RubberWindowFrame - 135 179 744 409 0 0 1024 746 - - Module - PBXSmartGroupTreeModule - Proportion - 185pt - - - ContentConfiguration - - PBXProjectModuleGUID - 1CA1AED706398EBD00589147 - PBXProjectModuleLabel - Detail - - GeometryConfiguration - - Frame - {{190, 0}, {554, 368}} - RubberWindowFrame - 135 179 744 409 0 0 1024 746 - - Module - XCDetailModule - Proportion - 554pt - - - Proportion - 368pt - - - MajorVersion - 2 - MinorVersion - 0 - Name - Breakpoints - ServiceClasses - - PBXSmartGroupTreeModule - XCDetailModule - - StatusbarIsVisible - - TableOfContents - - 1DD66EC50C80374400EBDAB3 - 1DD66EC60C80374400EBDAB3 - 1CE0B1FE06471DED0097A5F4 - 1CA1AED706398EBD00589147 - - ToolbarConfiguration - xcode.toolbar.config.breakpoints - WindowString - 135 179 744 409 0 0 1024 746 - WindowToolGUID - 1DD66EC50C80374400EBDAB3 - WindowToolIsVisible - - - - Identifier - windowTool.debugAnimator - Layout - - - Dock - - - Module - PBXNavigatorGroup - Proportion - 100% - - - Proportion - 100% - - - Name - Debug Visualizer - ServiceClasses - - PBXNavigatorGroup - - StatusbarIsVisible - 1 - ToolbarConfiguration - xcode.toolbar.config.debugAnimator - WindowString - 100 100 700 500 0 0 1280 1002 - - - Identifier - windowTool.bookmarks - Layout - - - Dock - - - Module - PBXBookmarksModule - Proportion - 100% - - - Proportion - 100% - - - Name - Bookmarks - ServiceClasses - - PBXBookmarksModule - - StatusbarIsVisible - 0 - WindowString - 538 42 401 187 0 0 1280 1002 - - - Identifier - windowTool.classBrowser - Layout - - - Dock - - - BecomeActive - 1 - ContentConfiguration - - OptionsSetName - Hierarchy, all classes - PBXProjectModuleGUID - 1CA6456E063B45B4001379D8 - PBXProjectModuleLabel - Class Browser - NSObject - - GeometryConfiguration - - ClassesFrame - {{0, 0}, {374, 96}} - ClassesTreeTableConfiguration - - PBXClassNameColumnIdentifier - 208 - PBXClassBookColumnIdentifier - 22 - - Frame - {{0, 0}, {630, 331}} - MembersFrame - {{0, 105}, {374, 395}} - MembersTreeTableConfiguration - - PBXMemberTypeIconColumnIdentifier - 22 - PBXMemberNameColumnIdentifier - 216 - PBXMemberTypeColumnIdentifier - 97 - PBXMemberBookColumnIdentifier - 22 - - PBXModuleWindowStatusBarHidden2 - 1 - RubberWindowFrame - 385 179 630 352 0 0 1440 878 - - Module - PBXClassBrowserModule - Proportion - 332pt - - - Proportion - 332pt - - - Name - Class Browser - ServiceClasses - - PBXClassBrowserModule - - StatusbarIsVisible - 0 - TableOfContents - - 1C0AD2AF069F1E9B00FABCE6 - 1C0AD2B0069F1E9B00FABCE6 - 1CA6456E063B45B4001379D8 - - ToolbarConfiguration - xcode.toolbar.config.classbrowser - WindowString - 385 179 630 352 0 0 1440 878 - WindowToolGUID - 1C0AD2AF069F1E9B00FABCE6 - WindowToolIsVisible - 0 - - - - diff --git a/src/MacVim/MacVim.xcodeproj/winckler.pbxuser b/src/MacVim/MacVim.xcodeproj/winckler.pbxuser deleted file mode 100644 index e29ad723a8..0000000000 --- a/src/MacVim/MacVim.xcodeproj/winckler.pbxuser +++ /dev/null @@ -1,470 +0,0 @@ -// !$*UTF8*$! -{ - 089C165DFE840E0CC02AAC07 /* English */ = { - uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {784, 608}}"; - sepNavSelRange = "{88, 0}"; - sepNavVisRect = "{{0, 0}, {784, 608}}"; - sepNavWindowFrame = "{{15, 4}, {823, 737}}"; - }; - }; - 1D09AB400C6A4D520045497E /* MMTypesetter.m */ = { - uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {795, 2224}}"; - sepNavSelRange = "{0, 0}"; - sepNavVisRect = "{{0, 0}, {795, 162}}"; - sepNavWindowFrame = "{{15, 4}, {820, 737}}"; - }; - }; - 1D14749D0C5673AE0038FA2B /* MMAppController.h */ = { - uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {795, 464}}"; - sepNavSelRange = "{686, 0}"; - sepNavVisRect = "{{0, 302}, {795, 162}}"; - }; - }; - 1D14749E0C5673AE0038FA2B /* MMAppController.m */ = { - uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {795, 8864}}"; - sepNavSelRange = "{17491, 0}"; - sepNavVisRect = "{{0, 5415}, {795, 162}}"; - sepNavWindowFrame = "{{15, 4}, {820, 737}}"; - }; - }; - 1D1474A80C5677450038FA2B /* MMTextStorage.m */ = { - uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {795, 9248}}"; - sepNavSelRange = "{18454, 0}"; - sepNavVisRect = "{{0, 6007}, {795, 162}}"; - sepNavWindowFrame = "{{15, 4}, {820, 737}}"; - }; - }; - 1D1474AD0C5678370038FA2B /* MMTextView.h */ = { - uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {781, 608}}"; - sepNavSelRange = "{0, 0}"; - sepNavVisRect = "{{0, 0}, {781, 608}}"; - sepNavWindowFrame = "{{15, 4}, {820, 737}}"; - }; - }; - 1D1474AE0C5678370038FA2B /* MMTextView.m */ = { - uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {795, 15040}}"; - sepNavSelRange = "{31183, 0}"; - sepNavVisRect = "{{0, 343}, {795, 162}}"; - sepNavWindowFrame = "{{15, 4}, {820, 737}}"; - }; - }; - 1D1474B40C56796D0038FA2B /* MMVimController.m */ = { - uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {1637, 20752}}"; - sepNavSelRange = "{7708, 0}"; - sepNavVisRect = "{{0, 4063}, {983, 274}}"; - sepNavWindowFrame = "{{15, 4}, {820, 737}}"; - }; - }; - 1D1474B90C567A910038FA2B /* MMWindowController.h */ = { - uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {781, 1168}}"; - sepNavSelRange = "{0, 0}"; - sepNavVisRect = "{{0, 0}, {781, 608}}"; - sepNavWindowFrame = "{{15, 4}, {820, 737}}"; - }; - }; - 1D1474BA0C567A910038FA2B /* MMWindowController.m */ = { - uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {1147, 19040}}"; - sepNavSelRange = "{38061, 0}"; - sepNavVisRect = "{{0, 15143}, {795, 162}}"; - sepNavWindowFrame = "{{15, 4}, {820, 737}}"; - }; - }; - 1D16B9CF0BA33BAE00A69B33 /* MacVim */ = { - isa = PBXExecutable; - activeArgIndex = 2147483647; - activeArgIndices = ( - NO, - NO, - NO, - NO, - NO, - NO, - NO, - NO, - NO, - NO, - NO, - NO, - NO, - NO, - ); - argumentStrings = ( - "-MMTextInsetLeft 10", - "-MMTextInsetRight 5", - "-MMTextInsetTop 10", - "-MMTextInsetBottom 5", - "-MMTabMaxWidth 384", - "-MMTabOptimumWidth 132", - "-MMOpenFilesInTabs 1", - "-MMNoWindow 1", - "-MMTabMinWidth 32", - "-MMCellWidthMultiplier 1.414", - "-MMBaselineOffset 2", - "-MMTypesetter \"NSTypesetter\"", - "-MMTerminateAfterLastWindowClosed 0", - "-MMTranslateCtrlClick 0", - ); - autoAttachOnCrash = 1; - configStateDict = { - "PBXLSLaunchAction-0" = { - PBXLSLaunchAction = 0; - PBXLSLaunchStartAction = 1; - PBXLSLaunchStdioStyle = 2; - PBXLSLaunchStyle = 0; - class = PBXLSRunLaunchConfig; - displayName = "Executable Runner"; - identifier = com.apple.Xcode.launch.runConfig; - remoteHostInfo = ""; - startActionInfo = ""; - }; - }; - customDataFormattersEnabled = 1; - debuggerPlugin = GDBDebugging; - disassemblyDisplayState = 0; - dylibVariantSuffix = ""; - enableDebugStr = 1; - environmentEntries = ( - { - active = NO; - name = DYLD_INSERT_LIBRARIES; - value = /usr/lib/libgmalloc.dylib; - }, - { - active = NO; - name = NSZombieEnabled; - value = YES; - }, - { - active = NO; - name = NSObjCMessageLoggingEnabled; - value = YES; - }, - ); - executableSystemSymbolLevel = 0; - executableUserSymbolLevel = 0; - libgmallocEnabled = 0; - name = MacVim; - savedGlobals = { - }; - sourceDirectories = ( - ); - variableFormatDictionary = { - $cr = 1; - $ctr = 1; - $lr = 1; - $mq = 1; - $pc = 1; - $ps = 1; - $r0 = 1; - $r1 = 1; - $r10 = 1; - $r11 = 1; - $r12 = 1; - $r13 = 1; - $r14 = 1; - $r15 = 1; - $r16 = 1; - $r17 = 1; - $r18 = 1; - $r19 = 1; - $r2 = 1; - $r20 = 1; - $r21 = 1; - $r22 = 1; - $r23 = 1; - $r24 = 1; - $r25 = 1; - $r26 = 1; - $r27 = 1; - $r28 = 1; - $r29 = 1; - $r3 = 1; - $r30 = 1; - $r31 = 1; - $r4 = 1; - $r5 = 1; - $r6 = 1; - $r7 = 1; - $r8 = 1; - $r9 = 1; - $xer = 1; - "type-FourCharCode-SendOFAStrikeMessage" = 5; - }; - }; - 1D16B9DD0BA33BB000A69B33 /* Source Control */ = { - isa = PBXSourceControlManager; - fallbackIsa = XCSourceControlManager; - isSCMEnabled = 0; - scmConfiguration = { - }; - scmType = ""; - }; - 1D16B9DE0BA33BB000A69B33 /* Code sense */ = { - isa = PBXCodeSenseManager; - indexTemplatePath = ""; - }; - 1D6F54990C7358B600D9BDC8 /* [NSView performKeyEquivalent:] */ = { - isa = PBXSymbolicBreakpoint; - actions = ( - ); - breakpointStyle = 1; - continueAfterActions = 0; - delayBeforeContinue = 0; - hitCount = 1; - location = AppKit; - modificationTime = 211747499.23789; - state = 2; - symbolName = "[NSView performKeyEquivalent:]"; - }; - 1D6F54CB0C7371E000D9BDC8 /* -[_NSZombie methodSignatureForSelector:] */ = { - isa = PBXSymbolicBreakpoint; - actions = ( - ); - breakpointStyle = 1; - continueAfterActions = 0; - delayBeforeContinue = 0; - hitCount = 1; - location = Foundation; - modificationTime = 211747504.632111; - state = 1; - symbolName = "-[_NSZombie methodSignatureForSelector:]"; - }; - 1D9B9FEF0BB34E7700F878F2 /* [NSException raise] */ = { - isa = PBXSymbolicBreakpoint; - actions = ( - ); - breakpointStyle = 1; - continueAfterActions = 0; - delayBeforeContinue = 0; - hitCount = 1; - location = Foundation; - modificationTime = 211747504.576004; - state = 1; - symbolName = "[NSException raise]"; - }; - 1DD66EA30C802F2D00EBDAB3 /* MMTextView.m:594 */ = { - isa = PBXFileBreakpoint; - actions = ( - ); - breakpointStyle = 0; - continueAfterActions = 0; - delayBeforeContinue = 0; - fileReference = 1D1474AE0C5678370038FA2B /* MMTextView.m */; - functionName = "-keyDown:"; - hitCount = 1; - lineNumber = 594; - location = MacVim; - modificationTime = 211747499.23754; - state = 2; - }; - 1DD66EB70C80301100EBDAB3 /* MMTextView.m:172 */ = { - isa = PBXFileBreakpoint; - actions = ( - ); - breakpointStyle = 0; - continueAfterActions = 0; - delayBeforeContinue = 0; - fileReference = 1D1474AE0C5678370038FA2B /* MMTextView.m */; - functionName = "-performKeyEquivalent:"; - hitCount = 1; - lineNumber = 172; - location = MacVim; - modificationTime = 211747499.237583; - state = 2; - }; - 1DD66ECC0C803D3600EBDAB3 /* MMApplication.m */ = { - uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {795, 736}}"; - sepNavSelRange = "{1597, 0}"; - sepNavVisRect = "{{0, 247}, {795, 162}}"; - }; - }; - 1DD704300BA9F9C2008679E9 /* SpecialKeys.plist */ = { - uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {797, 1008}}"; - sepNavSelRange = "{0, 0}"; - sepNavVisRect = "{{0, 192}, {567, 595}}"; - sepNavWindowFrame = "{{15, 17}, {606, 724}}"; - }; - }; - 1DE445650BA493EC00C4C77A /* XCBreakpointsBucket */ = { - isa = XCBreakpointsBucket; - name = "Project Breakpoints"; - objects = ( - 1D9B9FEF0BB34E7700F878F2 /* [NSException raise] */, - 1D6F54990C7358B600D9BDC8 /* [NSView performKeyEquivalent:] */, - 1D6F54CB0C7371E000D9BDC8 /* -[_NSZombie methodSignatureForSelector:] */, - 1DD66EA30C802F2D00EBDAB3 /* MMTextView.m:594 */, - 1DD66EB70C80301100EBDAB3 /* MMTextView.m:172 */, - ); - }; - 29B97313FDCFA39411CA2CEA /* Project object */ = { - activeBuildConfigurationName = Debug; - activeExecutable = 1D16B9CF0BA33BAE00A69B33 /* MacVim */; - activeTarget = 8D1107260486CEB800E47090 /* MacVim */; - addToTargets = ( - 8D1107260486CEB800E47090 /* MacVim */, - ); - breakpoints = ( - 1D9B9FEF0BB34E7700F878F2 /* [NSException raise] */, - 1D6F54990C7358B600D9BDC8 /* [NSView performKeyEquivalent:] */, - 1D6F54CB0C7371E000D9BDC8 /* -[_NSZombie methodSignatureForSelector:] */, - 1DD66EA30C802F2D00EBDAB3 /* MMTextView.m:594 */, - 1DD66EB70C80301100EBDAB3 /* MMTextView.m:172 */, - ); - breakpointsGroup = 1DE445650BA493EC00C4C77A /* XCBreakpointsBucket */; - codeSenseManager = 1D16B9DE0BA33BB000A69B33 /* Code sense */; - executables = ( - 1D16B9CF0BA33BAE00A69B33 /* MacVim */, - ); - perUserDictionary = { - "PBXConfiguration.PBXBreakpointsDataSource.v1:1CA1AED706398EBD00589147" = { - PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; - PBXFileTableDataSourceColumnSortingKey = PBXBreakpointsDataSource_BreakpointID; - PBXFileTableDataSourceColumnWidthsKey = ( - 20, - 20, - 210, - 20, - 110, - 109, - 20, - ); - PBXFileTableDataSourceColumnsKey = ( - PBXBreakpointsDataSource_ActionID, - PBXBreakpointsDataSource_TypeID, - PBXBreakpointsDataSource_BreakpointID, - PBXBreakpointsDataSource_UseID, - PBXBreakpointsDataSource_LocationID, - PBXBreakpointsDataSource_ConditionID, - PBXBreakpointsDataSource_ContinueID, - ); - }; - PBXConfiguration.PBXFileTableDataSource3.PBXErrorsWarningsDataSource = { - PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; - PBXFileTableDataSourceColumnSortingKey = PBXErrorsWarningsDataSource_LocationID; - PBXFileTableDataSourceColumnWidthsKey = ( - 20, - 300, - 133, - ); - PBXFileTableDataSourceColumnsKey = ( - PBXErrorsWarningsDataSource_TypeID, - PBXErrorsWarningsDataSource_MessageID, - PBXErrorsWarningsDataSource_LocationID, - ); - }; - PBXConfiguration.PBXFileTableDataSource3.PBXExecutablesDataSource = { - PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; - PBXFileTableDataSourceColumnSortingKey = PBXExecutablesDataSource_NameID; - PBXFileTableDataSourceColumnWidthsKey = ( - 22, - 300, - 130, - ); - PBXFileTableDataSourceColumnsKey = ( - PBXExecutablesDataSource_ActiveFlagID, - PBXExecutablesDataSource_NameID, - PBXExecutablesDataSource_CommentsID, - ); - }; - PBXConfiguration.PBXFileTableDataSource3.PBXFileTableDataSource = { - PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; - PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID; - PBXFileTableDataSourceColumnWidthsKey = ( - 20, - 243, - 20, - 48, - 43, - 43, - 20, - ); - PBXFileTableDataSourceColumnsKey = ( - PBXFileDataSource_FiletypeID, - PBXFileDataSource_Filename_ColumnID, - PBXFileDataSource_Built_ColumnID, - PBXFileDataSource_ObjectSize_ColumnID, - PBXFileDataSource_Errors_ColumnID, - PBXFileDataSource_Warnings_ColumnID, - PBXFileDataSource_Target_ColumnID, - ); - }; - PBXConfiguration.PBXFileTableDataSource3.PBXSymbolsDataSource = { - PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; - PBXFileTableDataSourceColumnSortingKey = PBXSymbolsDataSource_SymbolNameID; - PBXFileTableDataSourceColumnWidthsKey = ( - 16, - 200, - 50, - 183, - ); - PBXFileTableDataSourceColumnsKey = ( - PBXSymbolsDataSource_SymbolTypeIconID, - PBXSymbolsDataSource_SymbolNameID, - PBXSymbolsDataSource_SymbolTypeID, - PBXSymbolsDataSource_ReferenceNameID, - ); - }; - PBXConfiguration.PBXTargetDataSource.PBXTargetDataSource = { - PBXFileTableDataSourceColumnSortingDirectionKey = "-1"; - PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID; - PBXFileTableDataSourceColumnWidthsKey = ( - 20, - 200, - 63, - 20, - 48, - 43, - 43, - ); - PBXFileTableDataSourceColumnsKey = ( - PBXFileDataSource_FiletypeID, - PBXFileDataSource_Filename_ColumnID, - PBXTargetDataSource_PrimaryAttribute, - PBXFileDataSource_Built_ColumnID, - PBXFileDataSource_ObjectSize_ColumnID, - PBXFileDataSource_Errors_ColumnID, - PBXFileDataSource_Warnings_ColumnID, - ); - }; - PBXPerProjectTemplateStateSaveDate = 213804902; - PBXWorkspaceStateSaveDate = 213804902; - }; - sourceControlManager = 1D16B9DD0BA33BB000A69B33 /* Source Control */; - userBuildSettings = { - }; - }; - 29B97316FDCFA39411CA2CEA /* main.m */ = { - uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {784, 608}}"; - sepNavSelRange = "{0, 0}"; - sepNavVisRect = "{{0, 0}, {784, 608}}"; - sepNavWindowFrame = "{{15, 4}, {823, 737}}"; - }; - }; - 8D1107260486CEB800E47090 /* MacVim */ = { - activeExec = 0; - executables = ( - 1D16B9CF0BA33BAE00A69B33 /* MacVim */, - ); - }; - 8D1107310486CEB800E47090 /* Info.plist */ = { - uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {797, 8816}}"; - sepNavSelRange = "{0, 0}"; - sepNavVisRect = "{{0, 174}, {784, 608}}"; - sepNavWindowFrame = "{{15, 4}, {823, 737}}"; - }; - }; -} From d7906883906e015d349a7ac21b33f0fa521944c3 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Fri, 19 Oct 2007 22:13:42 +0200 Subject: [PATCH 0295/1156] Only update menu state on actual state change. Problem: Menu updates caused noticable delays because every menu item got updated on state changes. Solution: Remember old state and only pass update event on to MacVim if the new state differs from the old one. Also add .*.swp to .gitignore to ignore Vim swapfiles. --- .gitignore | 1 + src/MacVim/MMVimController.m | 7 +------ src/MacVim/gui_macvim.m | 14 ++++++++++---- src/structs.h | 5 +++-- 4 files changed, 15 insertions(+), 12 deletions(-) diff --git a/.gitignore b/.gitignore index 699beffcf4..47aa82d66f 100644 --- a/.gitignore +++ b/.gitignore @@ -16,3 +16,4 @@ src/xxd/xxd src/auto/config.h src/auto/config.mk src/TAGS +.*.swp diff --git a/src/MacVim/MMVimController.m b/src/MacVim/MMVimController.m index 8e4b2022a8..f46c4425b0 100644 --- a/src/MacVim/MMVimController.m +++ b/src/MacVim/MMVimController.m @@ -413,12 +413,7 @@ - (oneway void)processCommandQueue:(in bycopy NSArray *)queue NSData *data = [queue objectAtIndex:i+1]; int msgid = *((int*)[value bytes]); -#if 0 - if (msgid != EnableMenuItemMsgID && msgid != AddMenuItemMsgID - && msgid != AddMenuMsgID) { - NSLog(@"%s%s", _cmd, MessageStrings[msgid]); - } -#endif + //NSLog(@"%s%s", _cmd, MessageStrings[msgid]); [self handleMessage:msgid data:data]; } diff --git a/src/MacVim/gui_macvim.m b/src/MacVim/gui_macvim.m index c5171f090b..4ce6b7002f 100644 --- a/src/MacVim/gui_macvim.m +++ b/src/MacVim/gui_macvim.m @@ -681,8 +681,15 @@ void gui_mch_menu_grey(vimmenu_T *menu, int grey) { - [[MMBackend sharedInstance] - enableMenuItemWithTag:(int)menu state:!grey]; + /* Only update menu if the 'grey' state has changed to avoid having to pass + * lots of unnecessary data to MacVim. (Skipping this test makes MacVim + * pause noticably on mode changes. */ + if (menu->was_grey != grey) + { + menu->was_grey = grey; + [[MMBackend sharedInstance] + enableMenuItemWithTag:(int)menu state:!grey]; + } } @@ -694,8 +701,7 @@ { // HACK! There is no (obvious) way to hide a menu item, so simply // enable/disable it instead. - [[MMBackend sharedInstance] - enableMenuItemWithTag:(int)menu state:!hidden]; + gui_mch_menu_grey(menu, hidden); } diff --git a/src/structs.h b/src/structs.h index 2a6487f8c9..f7ce6fbfd6 100644 --- a/src/structs.h +++ b/src/structs.h @@ -2246,8 +2246,9 @@ struct VimMenu PtWidget_t *submenu_id; #endif #ifdef FEAT_GUI_MACVIM - int mac_key; - int mac_mods; + int mac_key; /* Key equivalent */ + int mac_mods; /* Modifier flags for the above */ + int was_grey; /* Remember last 'grey' state */ #endif }; #else From aec04a78a5d48f130817cd9a4cd1821a39af89e2 Mon Sep 17 00:00:00 2001 From: Jjgod Jiang Date: Sat, 20 Oct 2007 04:59:46 +0800 Subject: [PATCH 0296/1156] Fix a text rending problem caused by MMTypesetter class in Leopard In Leopard, Cocoa Text System seems need a concrete instance of NSTypesetter for NSLayoutManager, like NSATSTypesetter, otherwise, the call to -layoutParagraphAtPoint: simply fails. I guess that method in NSTypesetter has become "virtual" in Leopard. --- src/MacVim/MMTypesetter.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/MacVim/MMTypesetter.h b/src/MacVim/MMTypesetter.h index 9557c8a0b4..c2d149a16a 100644 --- a/src/MacVim/MMTypesetter.h +++ b/src/MacVim/MMTypesetter.h @@ -11,7 +11,7 @@ #import -@interface MMTypesetter : NSTypesetter { +@interface MMTypesetter : NSATSTypesetter { } - (void)layoutGlyphsInLayoutManager:(NSLayoutManager *)lm From 592d5b8af16bce2f9894afd7af7f6ee017dcbf52 Mon Sep 17 00:00:00 2001 From: Nicolas Weber Date: Fri, 19 Oct 2007 17:19:50 +0200 Subject: [PATCH 0297/1156] Disable useless scrollbars --- src/MacVim/MMVimView.m | 1 + 1 file changed, 1 insertion(+) diff --git a/src/MacVim/MMVimView.m b/src/MacVim/MMVimView.m index f5e8f68ba8..a175f897a7 100644 --- a/src/MacVim/MMVimView.m +++ b/src/MacVim/MMVimView.m @@ -393,6 +393,7 @@ - (void)setScrollbarThumbValue:(float)val proportion:(float)prop //NSLog(@"Set thumb value %.2f proportion %.2f for scroller %d", // val, prop, ident); [scroller setFloatValue:val knobProportion:prop]; + [scroller setEnabled:prop != 1.f]; } From 552088f0b9718a8714c82b43936a46be21f31ea9 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sat, 20 Oct 2007 13:51:21 +0200 Subject: [PATCH 0298/1156] Fix cursor blinking in insert mode. Calls to draw text with the DRAW_TRANSP flag were ignored. By not ignoring these calls the background of the cursor is erased also in insert mode so that blinking works. --- src/MacVim/MMTextStorage.m | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/MacVim/MMTextStorage.m b/src/MacVim/MMTextStorage.m index af82156e72..c3deef9ee9 100644 --- a/src/MacVim/MMTextStorage.m +++ b/src/MacVim/MMTextStorage.m @@ -199,10 +199,6 @@ - (void)replaceString:(NSString *)string atRow:(int)row column:(int)col // row, col, flags, fg, bg, sp); [self lazyResize:NO]; - // TODO: support DRAW_TRANSP - if (flags & DRAW_TRANSP) - return; - if (row < 0 || row >= maxRows || col < 0 || col >= maxColumns || col+[string length] > maxColumns) { //NSLog(@"[%s] WARNING : out of range, row=%d (%d) col=%d (%d) " @@ -242,6 +238,16 @@ - (void)replaceString:(NSString *)string atRow:(int)row column:(int)col sp, NSUnderlineColorAttributeName, [NSNumber numberWithFloat:2],NSBaselineOffsetAttributeName, nil]; + } else if (flags & DRAW_TRANSP) { + // Don't include background color when DRAW_TRANSP is set. + // + // NOTE: I'm not sure what the point of this is, but if DRAW_TRANSP + // calls are ignored, then cursor blinking in insert mode doesn't work. + attributes = [NSDictionary dictionaryWithObjectsAndKeys: + theFont, NSFontAttributeName, + fg, NSForegroundColorAttributeName, + sp, NSUnderlineColorAttributeName, + nil]; } else { attributes = [NSDictionary dictionaryWithObjectsAndKeys: theFont, NSFontAttributeName, From 1e7199d3e5c70dc5a25c2e55b2041316fbb2c9bd Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sat, 20 Oct 2007 15:26:15 +0200 Subject: [PATCH 0299/1156] Replace underscores with spaces when parsing font names. Now possible to use either :set gfn=Courier\ New:h10 or :set gfn=Courier_New:h10 to set the font. --- src/MacVim/MMBackend.m | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/MacVim/MMBackend.m b/src/MacVim/MMBackend.m index 615a3c6dba..c6321b54de 100644 --- a/src/MacVim/MMBackend.m +++ b/src/MacVim/MMBackend.m @@ -835,6 +835,12 @@ - (BOOL)setFontWithName:(char *)name } else if ([components count] > 2) { parseFailed = YES; } + + if (!parseFailed) { + // Replace underscores with spaces. + fontName = [[fontName componentsSeparatedByString:@"_"] + componentsJoinedByString:@" "]; + } } if (!parseFailed && [fontName length] > 0) { From 8124b25f2bd9e19a4e90a879c53d301463103900 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sat, 20 Oct 2007 19:33:16 +0200 Subject: [PATCH 0300/1156] Fix ":set go+=c" and menu autoenabling bugs. Bug: With 'go+=c' Vim could enter a key wait loop while processInput==TRUE which caused all keyboard input to be dropped. Fix: Don't drop keyboard input when processInput==TRUE Bug: With 'go+c' Vim disabled all menu items before quitting which caused autoenabling not to work so the "New Window" was sometimes grey when no windows were open. Fix: Enable all menu items in recurseSetAutoenablesItems. --- src/MacVim/MMAppController.m | 12 ++-- src/MacVim/MMBackend.h | 9 --- src/MacVim/MMBackend.m | 111 ++++++++++------------------------- 3 files changed, 39 insertions(+), 93 deletions(-) diff --git a/src/MacVim/MMAppController.m b/src/MacVim/MMAppController.m index 26475a0107..bfbc8c7da1 100644 --- a/src/MacVim/MMAppController.m +++ b/src/MacVim/MMAppController.m @@ -315,12 +315,14 @@ - (void)removeVimController:(id)controller if (![vimControllers count]) { // Turn on autoenabling of menus (because no Vim is open to handle it), - // but do not touch the MacVim menu. + // but do not touch the MacVim menu. Note that the menus must be + // enabled first otherwise autoenabling does not work. NSMenu *mainMenu = [NSApp mainMenu]; int i, count = [mainMenu numberOfItems]; for (i = 1; i < count; ++i) { - NSMenu *submenu = [[mainMenu itemAtIndex:i] submenu]; - [submenu recurseSetAutoenablesItems:YES]; + NSMenuItem *item = [mainMenu itemAtIndex:i]; + [item setEnabled:YES]; + [[item submenu] recurseSetAutoenablesItems:YES]; } } } @@ -590,7 +592,9 @@ - (void)recurseSetAutoenablesItems:(BOOL)on int i, count = [self numberOfItems]; for (i = 0; i < count; ++i) { - NSMenu *submenu = [[self itemAtIndex:i] submenu]; + NSMenuItem *item = [self itemAtIndex:i]; + [item setEnabled:YES]; + NSMenu *submenu = [item submenu]; if (submenu) { [submenu recurseSetAutoenablesItems:on]; } diff --git a/src/MacVim/MMBackend.h b/src/MacVim/MMBackend.h index a432225c1e..86a55db16a 100644 --- a/src/MacVim/MMBackend.h +++ b/src/MacVim/MMBackend.h @@ -13,12 +13,6 @@ #import "vim.h" -// If disabled, all input is dropped if input is already being processed. (If -// enabled, same thing happens at the moment actually. So this is pretty -// useless.) -#define MM_USE_INPUT_QUEUE 0 - - @interface MMBackend : NSObject 0) { - // TODO: Dispatch these messages? Maybe not; usually when the - // 'inputQueue' is non-empty it means that a LOT of messages has been - // sent simultaneously. The only way this happens is when Vim is being - // tormented, e.g. if the user holds down to rapidly switch - // windows. - unsigned i; - for (i = 0; i < count; i+=2) { - int msgid = [[inputQueue objectAtIndex:i] intValue]; - NSLog(@"%s: Dropping message %s", _cmd, MessageStrings[msgid]); - } - - [inputQueue removeAllObjects]; - } -#endif - - inputReceived = YES; - inProcessInput = NO; -} - - (void)handleToggleToolbar { // If 'go' contains 'T', then remove it, else add it. From 1091b43561883e4e8fbdf7ab782d41f635851649 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Tue, 23 Oct 2007 17:19:54 +0200 Subject: [PATCH 0301/1156] Reduce update delay when resizing with mouse. By forcing an update of the text view at the end of batch processing of draw commands the update delay when dragging to resize is reduced. --- src/MacVim/MMVimController.m | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/MacVim/MMVimController.m b/src/MacVim/MMVimController.m index f46c4425b0..0f0a3c60ee 100644 --- a/src/MacVim/MMVimController.m +++ b/src/MacVim/MMVimController.m @@ -905,6 +905,11 @@ - (void)performBatchDrawWithData:(NSData *)data } [textStorage endEditing]; + + // NOTE: During resizing, Cocoa only sends draw messages before Vim's rows + // and columns are changed (due to ipc delays). Force a redraw here. + [[windowController vimView] displayIfNeeded]; + #if MM_DEBUG_DRAWING NSLog(@"<==== END %s", _cmd); #endif From d669e9d2a57c52899118cb5d2cb05eb81c47769f Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Thu, 25 Oct 2007 16:08:43 +0200 Subject: [PATCH 0302/1156] Changed DiffText and Constant highlight groups --- runtime/colors/macvim.vim | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/runtime/colors/macvim.vim b/runtime/colors/macvim.vim index b748b6a99a..320f035515 100644 --- a/runtime/colors/macvim.vim +++ b/runtime/colors/macvim.vim @@ -1,7 +1,7 @@ " MacVim colorscheme " " Maintainer: Bjorn Winckler -" Last Change: 2007 Oct 11 +" Last Change: 2007 Oct 25 " @@ -24,7 +24,7 @@ hi NonText gui=bold guifg=Blue hi StatusLine gui=NONE guifg=White guibg=DarkSlateGray hi StatusLineNC gui=NONE guifg=SlateGray guibg=Gray90 hi VertSplit gui=NONE guifg=DarkSlateGray guibg=Gray90 -hi DiffText gui=NONE guibg=VioletRed +hi DiffText gui=NONE guibg=Gold hi PmenuThumb gui=reverse hi PmenuSbar guibg=Grey hi TabLineSel gui=bold @@ -67,7 +67,7 @@ hi Normal gui=NONE guifg=MacTextColor guibg=MacTextBackgroundColor " the top level syntax items for now). hi Comment gui=italic guifg=Blue2 guibg=NONE -hi Constant gui=NONE guifg=Magenta1 guibg=NONE +hi Constant gui=NONE guifg=DarkOrange guibg=NONE hi String gui=NONE guifg=SkyBlue4 guibg=NONE hi Boolean gui=NONE guifg=Red3 guibg=NONE hi Identifier gui=NONE guifg=Aquamarine4 guibg=NONE From 1e44f7160555dd1c5c2f088ac7d97416db148708 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Thu, 25 Oct 2007 19:29:44 +0200 Subject: [PATCH 0303/1156] Add input queue to backend, fixing process leak problem. Mouse and keyboard input is handled immediately, all other input is put on a queue which is processed whenever gui_mch_update() is called. This avoids DO calls to be sent from the backend during processing of another DO call. (See comments in MMBackend processInput:data: and processInputQueue.) One problem this caused was that connectionDidDie notification was not received when processInput:data: got called recursively (and thus processes could "leak"). Also did some code cleanup to MMBackend. --- src/MacVim/MMAppController.m | 10 +- src/MacVim/MMBackend.h | 43 +++--- src/MacVim/MMBackend.m | 252 +++++++++++++++++++++-------------- src/MacVim/gui_macvim.m | 4 +- 4 files changed, 176 insertions(+), 133 deletions(-) diff --git a/src/MacVim/MMAppController.m b/src/MacVim/MMAppController.m index bfbc8c7da1..5e8f9bfeb7 100644 --- a/src/MacVim/MMAppController.m +++ b/src/MacVim/MMAppController.m @@ -277,6 +277,10 @@ - (NSApplicationTerminateReply)applicationShouldTerminate: - (void)applicationWillTerminate:(NSNotification *)aNotification { + // This will invalidate all connections (since they were spawned from the + // default connection). + [[NSConnection defaultConnection] invalidate]; + // Send a SIGINT to all running Vim processes, so that they are sure to // receive the connectionDidDie: notification (a process has to checking // the run-loop for this to happen). @@ -286,12 +290,6 @@ - (void)applicationWillTerminate:(NSNotification *)aNotification int pid = [controller pid]; if (pid > 0) kill(pid, SIGINT); - - id proxy = [controller backendProxy]; - NSConnection *connection = [proxy connectionForProxy]; - if (connection) { - [connection invalidate]; - } } if (fontContainerRef) { diff --git a/src/MacVim/MMBackend.h b/src/MacVim/MMBackend.h index 86a55db16a..f28c64dbf7 100644 --- a/src/MacVim/MMBackend.h +++ b/src/MacVim/MMBackend.h @@ -17,27 +17,27 @@ @interface MMBackend : NSObject { - NSMutableArray *queue; - NSMutableData *drawData; - NSConnection *connection; - id frontendProxy; - NSDictionary *colorDict; - NSDictionary *sysColorDict; - BOOL inputReceived; - BOOL tabBarVisible; - unsigned backgroundColor; - unsigned foregroundColor; - unsigned specialColor; - unsigned defaultBackgroundColor; - unsigned defaultForegroundColor; - NSDate *lastFlushDate; - id dialogReturn; - NSTimer *blinkTimer; - int blinkState; - NSTimeInterval blinkWaitInterval; - NSTimeInterval blinkOnInterval; - NSTimeInterval blinkOffInterval; - BOOL inProcessInput; + NSMutableArray *outputQueue; + NSMutableArray *inputQueue; + NSMutableData *drawData; + NSConnection *connection; + id frontendProxy; + NSDictionary *colorDict; + NSDictionary *sysColorDict; + BOOL inputReceived; + BOOL tabBarVisible; + unsigned backgroundColor; + unsigned foregroundColor; + unsigned specialColor; + unsigned defaultBackgroundColor; + unsigned defaultForegroundColor; + NSDate *lastFlushDate; + id dialogReturn; + NSTimer *blinkTimer; + int blinkState; + NSTimeInterval blinkWaitInterval; + NSTimeInterval blinkOnInterval; + NSTimeInterval blinkOffInterval; NSMutableDictionary *connectionNameDict; NSMutableDictionary *clientProxyDict; NSMutableDictionary *serverReplyDict; @@ -66,6 +66,7 @@ scrollBottom:(int)bottom left:(int)left right:(int)right; - (void)drawCursorAtRow:(int)row column:(int)col shape:(int)shape fraction:(int)percent color:(int)color; +- (void)update; - (void)flushQueue:(BOOL)force; - (BOOL)waitForInput:(int)milliseconds; - (void)exit; diff --git a/src/MacVim/MMBackend.m b/src/MacVim/MMBackend.m index 93c1e32c9f..edc1c7738e 100644 --- a/src/MacVim/MMBackend.m +++ b/src/MacVim/MMBackend.m @@ -56,7 +56,8 @@ - (NSComparisonResult)serverNameCompare:(NSString *)string; @interface MMBackend (Private) -- (void)handleMessage:(int)msgid data:(NSData *)data; +- (void)processInputQueue; +- (void)handleInputEvent:(int)msgid data:(NSData *)data; + (NSDictionary *)specialKeys; - (void)handleInsertText:(NSData *)data; - (void)handleKeyDown:(NSString *)key modifiers:(int)mods; @@ -97,7 +98,8 @@ - (id)init if ((self = [super init])) { fontContainerRef = loadFonts(); - queue = [[NSMutableArray alloc] init]; + outputQueue = [[NSMutableArray alloc] init]; + inputQueue = [[NSMutableArray alloc] init]; drawData = [[NSMutableData alloc] initWithCapacity:1024]; connectionNameDict = [[NSMutableDictionary alloc] init]; clientProxyDict = [[NSMutableDictionary alloc] init]; @@ -128,7 +130,6 @@ - (id)init - (void)dealloc { //NSLog(@"%@ %s", [self className], _cmd); - [[NSNotificationCenter defaultCenter] removeObserver:self]; [blinkTimer release]; blinkTimer = nil; @@ -136,7 +137,8 @@ - (void)dealloc [serverReplyDict release]; serverReplyDict = nil; [clientProxyDict release]; clientProxyDict = nil; [connectionNameDict release]; connectionNameDict = nil; - [queue release]; queue = nil; + [inputQueue release]; inputQueue = nil; + [outputQueue release]; outputQueue = nil; [drawData release]; drawData = nil; [frontendProxy release]; frontendProxy = nil; [connection release]; connection = nil; @@ -364,10 +366,23 @@ - (void)drawCursorAtRow:(int)row column:(int)col shape:(int)shape [drawData appendBytes:&percent length:sizeof(int)]; } +- (void)update +{ + // Tend to the run loop, returning immediately if there are no events + // waiting. + [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode + beforeDate:[NSDate distantPast]]; + + // Keyboard and mouse input is handled directly, other input is queued and + // processed here. This call may enter a blocking loop. + if ([inputQueue count] > 0) + [self processInputQueue]; +} + - (void)flushQueue:(BOOL)force { // NOTE! This method gets called a lot; if we were to flush every time it - // was called MacVim would feel unresponsive. So there is a time out which + // got called MacVim would feel unresponsive. So there is a time out which // ensures that the queue isn't flushed too often. if (!force && lastFlushDate && -[lastFlushDate timeIntervalSinceNow] < MMFlushTimeoutInterval @@ -379,15 +394,15 @@ - (void)flushQueue:(BOOL)force [drawData setLength:0]; } - if ([queue count] > 0) { + if ([outputQueue count] > 0) { @try { - [frontendProxy processCommandQueue:queue]; + [frontendProxy processCommandQueue:outputQueue]; } @catch (NSException *e) { NSLog(@"Exception caught when processing command queue: \"%@\"", e); } - [queue removeAllObjects]; + [outputQueue removeAllObjects]; [lastFlushDate release]; lastFlushDate = [[NSDate date] retain]; @@ -396,6 +411,7 @@ - (void)flushQueue:(BOOL)force - (BOOL)waitForInput:(int)milliseconds { + //NSLog(@"|ENTER| %s%d", _cmd, milliseconds); NSDate *date = milliseconds > 0 ? [NSDate dateWithTimeIntervalSinceNow:.001*milliseconds] : [NSDate distantFuture]; @@ -409,6 +425,7 @@ - (BOOL)waitForInput:(int)milliseconds BOOL yn = inputReceived; inputReceived = NO; + //NSLog(@"|LEAVE| %s input=%d", _cmd, yn); return yn; } @@ -1029,36 +1046,109 @@ - (void)updateModifiedFlag - (oneway void)processInput:(int)msgid data:(in bycopy NSData *)data { // NOTE: This method might get called whenever the run loop is tended to. - // Thus it might get called whilst input is being processed. Normally this - // is not a problem, but if it gets called often then it might become - // dangerous. E.g. say a message causes the screen to be redrawn and then - // another message is received causing another simultaneous screen redraw; - // this is not good. To deal with this problem at the moment, we simply - // drop messages that are received while other input is being processed, - // unless the message represents keyboard input. + // Normal keyboard and mouse input is added to input buffers, so there is + // no risk in handling these events directly (they return immediately, and + // do not call any other Vim functions). However, other events such + // as 'VimShouldCloseMsgID' may enter blocking loops that wait for key + // events which would cause this method to be called recursively. This + // in turn leads to various difficulties that we do not want to have to + // deal with. To avoid recursive calls here we add all events except + // keyboard and mouse events to an input queue which is processed whenever + // gui_mch_update() is called (see processInputQueue). //NSLog(@"%s%s", _cmd, MessageStrings[msgid]); - if (inProcessInput && !(InsertTextMsgID == msgid || KeyDownMsgID == msgid - || CmdKeyMsgID == msgid)) { - // Just drop the input - //NSLog(@"WARNING: Dropping input in %s", _cmd); - } else { - // Don't flush too soon or update speed will suffer. - [lastFlushDate release]; - lastFlushDate = [[NSDate date] retain]; + // Don't flush too soon after receiving input or update speed will suffer. + [lastFlushDate release]; + lastFlushDate = [[NSDate date] retain]; - inProcessInput = YES; - [self handleMessage:msgid data:data]; - inProcessInput = NO; + // Handle keyboard and mouse input now. All other events are queued. + if (InsertTextMsgID == msgid) { + [self handleInsertText:data]; + } else if (KeyDownMsgID == msgid || CmdKeyMsgID == msgid) { + if (!data) return; + const void *bytes = [data bytes]; + int mods = *((int*)bytes); bytes += sizeof(int); + int len = *((int*)bytes); bytes += sizeof(int); + NSString *key = [[NSString alloc] initWithBytes:bytes length:len + encoding:NSUTF8StringEncoding]; + mods = eventModifierFlagsToVimModMask(mods); - inputReceived = YES; + [self handleKeyDown:key modifiers:mods]; + + [key release]; + } else if (ScrollWheelMsgID == msgid) { + if (!data) return; + const void *bytes = [data bytes]; + + int row = *((int*)bytes); bytes += sizeof(int); + int col = *((int*)bytes); bytes += sizeof(int); + int flags = *((int*)bytes); bytes += sizeof(int); + float dy = *((float*)bytes); bytes += sizeof(float); + + int button = MOUSE_5; + if (dy > 0) button = MOUSE_4; + + flags = eventModifierFlagsToVimMouseModMask(flags); + + gui_send_mouse_event(button, col, row, NO, flags); + } else if (MouseDownMsgID == msgid) { + if (!data) return; + const void *bytes = [data bytes]; + + int row = *((int*)bytes); bytes += sizeof(int); + int col = *((int*)bytes); bytes += sizeof(int); + int button = *((int*)bytes); bytes += sizeof(int); + int flags = *((int*)bytes); bytes += sizeof(int); + int count = *((int*)bytes); bytes += sizeof(int); + + button = eventButtonNumberToVimMouseButton(button); + flags = eventModifierFlagsToVimMouseModMask(flags); + + gui_send_mouse_event(button, col, row, count>1, flags); + } else if (MouseUpMsgID == msgid) { + if (!data) return; + const void *bytes = [data bytes]; + + int row = *((int*)bytes); bytes += sizeof(int); + int col = *((int*)bytes); bytes += sizeof(int); + int flags = *((int*)bytes); bytes += sizeof(int); + + flags = eventModifierFlagsToVimMouseModMask(flags); + + gui_send_mouse_event(MOUSE_RELEASE, col, row, NO, flags); + } else if (MouseDraggedMsgID == msgid) { + if (!data) return; + const void *bytes = [data bytes]; + + int row = *((int*)bytes); bytes += sizeof(int); + int col = *((int*)bytes); bytes += sizeof(int); + int flags = *((int*)bytes); bytes += sizeof(int); + + flags = eventModifierFlagsToVimMouseModMask(flags); + + gui_send_mouse_event(MOUSE_DRAG, col, row, NO, flags); + } else if (MouseMovedMsgID == msgid) { + const void *bytes = [data bytes]; + int row = *((int*)bytes); bytes += sizeof(int); + int col = *((int*)bytes); bytes += sizeof(int); + + gui_mouse_moved(col, row); + } else { + // Not keyboard or mouse event, queue it and handle later. + //NSLog(@"Add event %s to input event queue", MessageStrings[msgid]); + [inputQueue addObject:[NSNumber numberWithInt:msgid]]; + [inputQueue addObject:(data ? (id)data : (id)[NSNull null])]; } + + // See waitForInput: for an explanation of this flag. + inputReceived = YES; } - (oneway void)processInputAndData:(in bycopy NSArray *)messages { // TODO: Get rid of this method? + //NSLog(@"%s%@", _cmd, messages); unsigned i, count = [messages count]; for (i = 0; i < count; i += 2) { @@ -1410,7 +1500,32 @@ - (BOOL)sendReply:(NSString *)reply toPort:(int)port @implementation MMBackend (Private) -- (void)handleMessage:(int)msgid data:(NSData *)data +- (void)processInputQueue +{ + // NOTE: One of the input events may cause this method to be called + // recursively, so copy the input queue to a local variable and clear it + // before starting to process input events (otherwise we could get stuck in + // an endless loop). + NSArray *q = [inputQueue copy]; + unsigned i, count = [q count]; + + [inputQueue removeAllObjects]; + + for (i = 0; i < count-1; i += 2) { + int msgid = [[q objectAtIndex:i] intValue]; + id data = [q objectAtIndex:i+1]; + if ([data isEqual:[NSNull null]]) + data = nil; + + //NSLog(@"(%d) %s:%s", i, _cmd, MessageStrings[msgid]); + [self handleInputEvent:msgid data:data]; + } + + [q release]; + //NSLog(@"Clear input event queue"); +} + +- (void)handleInputEvent:(int)msgid data:(NSData *)data { // NOTE: Be careful with what you do in this method. Ideally, a message // should be handled by adding something to the input buffer and returning @@ -1420,21 +1535,9 @@ - (void)handleMessage:(int)msgid data:(NSData *)data // so if another message is received while processing, then the new message // is dropped. See also the comment in processInput:data:. - if (InsertTextMsgID == msgid) { - [self handleInsertText:data]; - } else if (KeyDownMsgID == msgid || CmdKeyMsgID == msgid) { - if (!data) return; - const void *bytes = [data bytes]; - int mods = *((int*)bytes); bytes += sizeof(int); - int len = *((int*)bytes); bytes += sizeof(int); - NSString *key = [[NSString alloc] initWithBytes:bytes length:len - encoding:NSUTF8StringEncoding]; - mods = eventModifierFlagsToVimModMask(mods); - - [self handleKeyDown:key modifiers:mods]; + //NSLog(@"%s%s", _cmd, MessageStrings[msgid]); - [key release]; - } else if (SelectTabMsgID == msgid) { + if (SelectTabMsgID == msgid) { if (!data) return; const void *bytes = [data bytes]; int idx = *((int*)bytes) + 1; @@ -1457,57 +1560,6 @@ - (void)handleMessage:(int)msgid data:(NSData *)data int idx = *((int*)bytes); tabpage_move(idx); - } else if (ScrollWheelMsgID == msgid) { - if (!data) return; - const void *bytes = [data bytes]; - - int row = *((int*)bytes); bytes += sizeof(int); - int col = *((int*)bytes); bytes += sizeof(int); - int flags = *((int*)bytes); bytes += sizeof(int); - float dy = *((float*)bytes); bytes += sizeof(float); - - int button = MOUSE_5; - if (dy > 0) button = MOUSE_4; - - flags = eventModifierFlagsToVimMouseModMask(flags); - - gui_send_mouse_event(button, col, row, NO, flags); - } else if (MouseDownMsgID == msgid) { - if (!data) return; - const void *bytes = [data bytes]; - - int row = *((int*)bytes); bytes += sizeof(int); - int col = *((int*)bytes); bytes += sizeof(int); - int button = *((int*)bytes); bytes += sizeof(int); - int flags = *((int*)bytes); bytes += sizeof(int); - int count = *((int*)bytes); bytes += sizeof(int); - - button = eventButtonNumberToVimMouseButton(button); - flags = eventModifierFlagsToVimMouseModMask(flags); - - gui_send_mouse_event(button, col, row, count>1, flags); - } else if (MouseUpMsgID == msgid) { - if (!data) return; - const void *bytes = [data bytes]; - - int row = *((int*)bytes); bytes += sizeof(int); - int col = *((int*)bytes); bytes += sizeof(int); - int flags = *((int*)bytes); bytes += sizeof(int); - - flags = eventModifierFlagsToVimMouseModMask(flags); - - gui_send_mouse_event(MOUSE_RELEASE, col, row, NO, flags); - } else if (MouseDraggedMsgID == msgid) { - if (!data) return; - const void *bytes = [data bytes]; - - int row = *((int*)bytes); bytes += sizeof(int); - int col = *((int*)bytes); bytes += sizeof(int); - int flags = *((int*)bytes); bytes += sizeof(int); - - flags = eventModifierFlagsToVimMouseModMask(flags); - - gui_send_mouse_event(MOUSE_DRAG, col, row, NO, flags); } else if (SetTextDimensionsMsgID == msgid) { if (!data) return; const void *bytes = [data bytes]; @@ -1550,12 +1602,6 @@ - (void)handleMessage:(int)msgid data:(NSData *)data } else if (LostFocusMsgID == msgid) { if (gui.in_focus) [self focusChange:NO]; - } else if (MouseMovedMsgID == msgid) { - const void *bytes = [data bytes]; - int row = *((int*)bytes); bytes += sizeof(int); - int col = *((int*)bytes); bytes += sizeof(int); - - gui_mouse_moved(col, row); } else if (SetMouseShapeMsgID == msgid) { const void *bytes = [data bytes]; int shape = *((int*)bytes); bytes += sizeof(int); @@ -1738,11 +1784,11 @@ - (void)handleKeyDown:(NSString *)key modifiers:(int)mods - (void)queueMessage:(int)msgid data:(NSData *)data { - [queue addObject:[NSData dataWithBytes:&msgid length:sizeof(int)]]; + [outputQueue addObject:[NSData dataWithBytes:&msgid length:sizeof(int)]]; if (data) - [queue addObject:data]; + [outputQueue addObject:data]; else - [queue addObject:[NSData data]]; + [outputQueue addObject:[NSData data]]; } - (void)connectionDidDie:(NSNotification *)notification @@ -1752,7 +1798,7 @@ - (void)connectionDidDie:(NSNotification *)notification // crashed. In either case our only option is to quit now. // TODO: Write backup file? - //NSLog(@"A Vim process lots its connection to MacVim; quitting."); + //NSLog(@"A Vim process lost its connection to MacVim; quitting."); getout(0); } diff --git a/src/MacVim/gui_macvim.m b/src/MacVim/gui_macvim.m index 4ce6b7002f..454e4855e7 100644 --- a/src/MacVim/gui_macvim.m +++ b/src/MacVim/gui_macvim.m @@ -131,9 +131,7 @@ void gui_mch_update(void) { - // TODO: Ensure that this causes no problems. - [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode - beforeDate:[NSDate distantPast]]; + [[MMBackend sharedInstance] update]; } From 9a5185ea2f359d58e38b34e9c016afee96fa304b Mon Sep 17 00:00:00 2001 From: Adam Mercer Date: Thu, 25 Oct 2007 08:54:11 -0400 Subject: [PATCH 0304/1156] Sort .gitignore in alphabetical order for consistency Signed-off-by: Adam Mercer --- .gitignore | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index 47aa82d66f..0940edc596 100644 --- a/.gitignore +++ b/.gitignore @@ -1,10 +1,14 @@ +.*.swp src/MacVim/MacVim.xcodeproj/*.mode1 src/MacVim/MacVim.xcodeproj/*.pbxuser src/MacVim/PSMTabBarControl/PSMTabBarControl.xcodeproj/*.mode1 src/MacVim/PSMTabBarControl/PSMTabBarControl.xcodeproj/*.pbxuser src/MacVim/PSMTabBarControl/build src/MacVim/build +src/TAGS src/Vim +src/auto/config.h +src/auto/config.mk src/auto/link.log src/auto/link.sed src/auto/osdef.h @@ -13,7 +17,3 @@ src/config.log src/config.status src/objects src/xxd/xxd -src/auto/config.h -src/auto/config.mk -src/TAGS -.*.swp From 7635d2201f4bf16c8be4702f4299b3a69f34c3f9 Mon Sep 17 00:00:00 2001 From: Adam Mercer Date: Thu, 25 Oct 2007 08:55:45 -0400 Subject: [PATCH 0305/1156] Ignore the auto generated file src/auto/if_perl.c Signed-off-by: Adam Mercer --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 0940edc596..f47e1f1b35 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,7 @@ src/TAGS src/Vim src/auto/config.h src/auto/config.mk +src/auto/if_perl.c src/auto/link.log src/auto/link.sed src/auto/osdef.h From 552d2c24a2a2b04984ae1b2a148c82a05dc42f3f Mon Sep 17 00:00:00 2001 From: Adam Mercer Date: Thu, 25 Oct 2007 10:51:41 -0400 Subject: [PATCH 0306/1156] Ignore .DS_Store Signed-off-by: Adam Mercer --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index f47e1f1b35..afe1c2a0ae 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ .*.swp +.DS_Store src/MacVim/MacVim.xcodeproj/*.mode1 src/MacVim/MacVim.xcodeproj/*.pbxuser src/MacVim/PSMTabBarControl/PSMTabBarControl.xcodeproj/*.mode1 From 85313038f66afeccd6e4a38eb99ff274ff8ea8e6 Mon Sep 17 00:00:00 2001 From: Tim Allen Date: Fri, 26 Oct 2007 14:14:41 +1000 Subject: [PATCH 0307/1156] Draw the current text view size in the titlebar during resize operations. It seems that NSWindows get notfied of each step of the live-resize, but NSViews get notified of the start and end events. So, we make MMTextView forward these notifications to the window controller, and let the window controller figure out when to change the title. Signed-off-by: Tim Allen --- src/MacVim/MMTextView.m | 10 ++++++++++ src/MacVim/MMWindowController.h | 2 ++ src/MacVim/MMWindowController.m | 31 ++++++++++++++++++++++++++----- 3 files changed, 38 insertions(+), 5 deletions(-) diff --git a/src/MacVim/MMTextView.m b/src/MacVim/MMTextView.m index ff661b160e..e48bb6659b 100644 --- a/src/MacVim/MMTextView.m +++ b/src/MacVim/MMTextView.m @@ -766,10 +766,20 @@ - (void)updateFontPanel // The font panel is updated whenever the font is set. } +- (void)viewWillStartLiveResize +{ + id windowController = [[self window] windowController]; + [windowController liveResizeWillStart]; + + [super viewWillStartLiveResize]; +} + - (void)viewDidEndLiveResize { id windowController = [[self window] windowController]; [windowController liveResizeDidEnd]; + + [super viewDidEndLiveResize]; } @end // MMTextView diff --git a/src/MacVim/MMWindowController.h b/src/MacVim/MMWindowController.h index 9977bbe1f4..ff1bcd8d50 100644 --- a/src/MacVim/MMWindowController.h +++ b/src/MacVim/MMWindowController.h @@ -27,6 +27,7 @@ BOOL shouldUpdateWindowSize; NSString *windowAutosaveKey; MMFullscreenWindow *fullscreenWindow; + NSString *lastSetTitle; } - (id)initWithVimController:(MMVimController *)controller; @@ -55,6 +56,7 @@ - (void)showToolbar:(BOOL)on size:(int)size mode:(int)mode; - (void)setMouseShape:(int)shape; - (void)adjustLinespace:(int)linespace; +- (void)liveResizeWillStart; - (void)liveResizeDidEnd; - (void)placeViews; diff --git a/src/MacVim/MMWindowController.m b/src/MacVim/MMWindowController.m index d3efe1f6fb..16ef1a109d 100644 --- a/src/MacVim/MMWindowController.m +++ b/src/MacVim/MMWindowController.m @@ -72,7 +72,6 @@ @implementation MMWindowController - (id)initWithVimController:(MMVimController *)controller { if ((self = [super initWithWindowNibName:@"EmptyWindow"])) { - fullscreenWindow = nil; vimController = controller; // Window cascading is handled by MMAppController. @@ -365,6 +364,14 @@ - (void)adjustLinespace:(int)linespace } } +- (void)liveResizeWillStart +{ + // Save the original title, if we haven't already. + if (lastSetTitle == nil) { + lastSetTitle = [[[self window] title] retain]; + } +} + - (void)liveResizeDidEnd { // TODO: Don't duplicate code from placeViews. @@ -407,6 +414,13 @@ - (void)liveResizeDidEnd // MacVim will have inconsistent states. [self resizeWindowToFit:self]; } + + // If we saved the original title while resizing, restore it. + if (lastSetTitle != nil) { + [[self window] setTitle:lastSetTitle]; + [lastSetTitle release]; + lastSetTitle = nil; + } } - (void)placeViews @@ -421,16 +435,25 @@ - (void)placeViews NSRect textViewRect = [self textViewRectForContentSize:contentRect.size]; NSSize tsSize = [self textStorageSizeForTextViewSize:textViewRect.size]; + // If our optimal (rows,cols) do not match our current (rows,cols), resize + // ourselves and tell the Vim process to sync up. int dim[2], rows, cols; [[vimView textStorage] getMaxRows:&rows columns:&cols]; [[vimView textStorage] fitToSize:tsSize rows:&dim[0] columns:&dim[1]]; if (dim[0] != rows || dim[1] != cols) { - //NSLog(@"Notify Vim that text storage dimensions changed to %dx%d", - // dim[0], dim[1]); + //NSLog(@"Notify Vim that text storage dimensions changed " + // @"from %dx%d to %dx%d", cols, rows, dim[1], dim[0]); NSData *data = [NSData dataWithBytes:dim length:2*sizeof(int)]; [vimController sendMessage:SetTextDimensionsMsgID data:data]; + + // We only want to set the window title if this resize came from + // a live-resize, not (for example) setting 'columns' or 'lines'. + if ([[self textView] inLiveResize]) { + [win setTitle:[NSString stringWithFormat:@"%dx%d", + dim[1], dim[0]]]; + } } // XXX: put vimView resizing logic in vimView @@ -447,8 +470,6 @@ - (void)placeViews if ([vimView rightScrollbarVisible]) vimViewRect.size.width += [NSScroller scrollerWidth]; - - [vimView setFrame:vimViewRect]; [vimView placeScrollbars]; From 4de2a14060c2a779f7a6edeacfb9a62b56aac845 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Fri, 26 Oct 2007 19:51:47 +0200 Subject: [PATCH 0308/1156] Ignore DRAW_TRANSP flag. This flag is supposed to indicate that the background should be "transparent". However, not setting the background color leads to a rendering artifact where the character after the cursor sometimes is not drawn. Simply ignoring the DRAW_TRANSP flag takes care of this bug. --- src/MacVim/MMTextStorage.m | 14 +++----------- src/MacVim/MMWindowController.m | 2 +- 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/src/MacVim/MMTextStorage.m b/src/MacVim/MMTextStorage.m index c3deef9ee9..f8c717bf52 100644 --- a/src/MacVim/MMTextStorage.m +++ b/src/MacVim/MMTextStorage.m @@ -14,7 +14,9 @@ -// TODO: support DRAW_TRANSP flag +// TODO: What does DRAW_TRANSP flag do? If the background isn't drawn when +// this flag is set, then sometimes the character after the cursor becomes +// blank. Everything seems to work fine by just ignoring this flag. #define DRAW_TRANSP 0x01 /* draw with transparant bg */ #define DRAW_BOLD 0x02 /* draw bold text */ #define DRAW_UNDERL 0x04 /* draw underline text */ @@ -238,16 +240,6 @@ - (void)replaceString:(NSString *)string atRow:(int)row column:(int)col sp, NSUnderlineColorAttributeName, [NSNumber numberWithFloat:2],NSBaselineOffsetAttributeName, nil]; - } else if (flags & DRAW_TRANSP) { - // Don't include background color when DRAW_TRANSP is set. - // - // NOTE: I'm not sure what the point of this is, but if DRAW_TRANSP - // calls are ignored, then cursor blinking in insert mode doesn't work. - attributes = [NSDictionary dictionaryWithObjectsAndKeys: - theFont, NSFontAttributeName, - fg, NSForegroundColorAttributeName, - sp, NSUnderlineColorAttributeName, - nil]; } else { attributes = [NSDictionary dictionaryWithObjectsAndKeys: theFont, NSFontAttributeName, diff --git a/src/MacVim/MMWindowController.m b/src/MacVim/MMWindowController.m index 16ef1a109d..96f2090404 100644 --- a/src/MacVim/MMWindowController.m +++ b/src/MacVim/MMWindowController.m @@ -451,7 +451,7 @@ - (void)placeViews // We only want to set the window title if this resize came from // a live-resize, not (for example) setting 'columns' or 'lines'. if ([[self textView] inLiveResize]) { - [win setTitle:[NSString stringWithFormat:@"%dx%d", + [win setTitle:[NSString stringWithFormat:@"%dx%d", dim[1], dim[0]]]; } } From 3d98b6f1f50d1157e53639d81723e6511fab8439 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sat, 27 Oct 2007 16:05:15 +0200 Subject: [PATCH 0309/1156] Use "macvim" color scheme as default. The color scheme is set in $VIM/gvimrc, but only if the color scheme hasn't already been set (in .vimrc). --- src/MacVim/gvimrc | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/MacVim/gvimrc b/src/MacVim/gvimrc index f443bfb5a4..61f0e67160 100644 --- a/src/MacVim/gvimrc +++ b/src/MacVim/gvimrc @@ -1,7 +1,7 @@ " System gvimrc file for MacVim " " Maintainer: Bjorn Winckler -" Last Change: Mon Sep 30 2007 +" Last Change: Mon Oct 27 2007 " " This is a work in progress. If you feel so inclined, please help me improve " this file. @@ -21,6 +21,11 @@ if !exists("syntax_on") syntax on endif +if !exists("colors_name") + " Use the macvim color scheme by default + colorscheme macvim +endif + " From 75b61c87cf306049b24d106c3bf44fec05ec4e62 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sun, 28 Oct 2007 13:51:01 +0100 Subject: [PATCH 0310/1156] Optimize speed when 'matchparen' is enabled. When matchparen is used gui_mch_update() gets called a lot. This function checks the run loop for new input which takes a long time. To speed things up make sure that the run loop is only checked every 100 ms or so (controlled by MMUpdateTimeoutInterval in gui_macvim.m). --- src/MacVim/MMBackend.m | 3 +++ src/MacVim/gui_macvim.m | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/src/MacVim/MMBackend.m b/src/MacVim/MMBackend.m index edc1c7738e..d443764993 100644 --- a/src/MacVim/MMBackend.m +++ b/src/MacVim/MMBackend.m @@ -425,6 +425,9 @@ - (BOOL)waitForInput:(int)milliseconds BOOL yn = inputReceived; inputReceived = NO; + if ([inputQueue count] > 0) + [self processInputQueue]; + //NSLog(@"|LEAVE| %s input=%d", _cmd, yn); return yn; } diff --git a/src/MacVim/gui_macvim.m b/src/MacVim/gui_macvim.m index 454e4855e7..b43f7850be 100644 --- a/src/MacVim/gui_macvim.m +++ b/src/MacVim/gui_macvim.m @@ -14,9 +14,16 @@ #import "vim.h" + +// This constant controls how often [MMBackend update] may get called (see +// gui_mch_update()). +static NSTimeInterval MMUpdateTimeoutInterval = 0.1f; + + static BOOL gui_macvim_is_valid_action(NSString *action); + // -- Initialization -------------------------------------------------------- /* @@ -128,10 +135,39 @@ * nothing in the X event queue (& no timers pending), then we return * immediately. */ +#define MM_LOG_UPDATE_STATS 0 void gui_mch_update(void) { + // NOTE: This function can get called A LOT (~1 call/ms) and unfortunately + // checking the run loop takes a long time, resulting in noticable slow + // downs if it is done every time this function is called. Therefore we + // make sure that it is not done too often. + static NSDate *lastUpdateDate = nil; +#if MM_LOG_UPDATE_STATS + static int skipCount = 0; +#endif + + if (lastUpdateDate && -[lastUpdateDate timeIntervalSinceNow] < + MMUpdateTimeoutInterval) { +#if MM_LOG_UPDATE_STATS + ++skipCount; +#endif + return; + } + +#if MM_LOG_UPDATE_STATS + NSTimeInterval dt = -[lastUpdateDate timeIntervalSinceNow]; + NSLog(@"Updating (last update %.2f seconds ago, skipped %d updates, " + "approx %.1f calls per second)", + dt, skipCount, dt > 0 ? skipCount/dt : 0); + skipCount = 0; +#endif + [[MMBackend sharedInstance] update]; + + [lastUpdateDate release]; + lastUpdateDate = [[NSDate date] retain]; } From 25bf887cede96ca9c523f1b34fe28bc6458bc4d9 Mon Sep 17 00:00:00 2001 From: Chris Willmore Date: Mon, 29 Oct 2007 19:19:18 +0100 Subject: [PATCH 0311/1156] Fix for Leopard Ctl-key bug. In Leopard Ctrl-key events are sent to performKeyEquivalent: instead of keyDown:, so we have to deal with them there as well. --- src/MacVim/MMTextView.m | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/MacVim/MMTextView.m b/src/MacVim/MMTextView.m index e48bb6659b..2c690e70f5 100644 --- a/src/MacVim/MMTextView.m +++ b/src/MacVim/MMTextView.m @@ -302,6 +302,13 @@ - (BOOL)performKeyEquivalent:(NSEvent *)event if ([event keyCode] == 50) return NO; + // HACK! On Leopard Ctrl-key events end up here instead of keyDown:. + if (flags & NSControlKeyMask) { + NSLog(@"pass on control key"); + [self dispatchKeyEvent:event]; + return YES; + } + //NSLog(@"%s%@", _cmd, event); NSString *chars = [event characters]; From 36b97011cf74e8eb0b450614f7d5573d4c7ef72d Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Tue, 30 Oct 2007 18:09:06 +0100 Subject: [PATCH 0312/1156] Removed stray debug log message. --- src/MacVim/MMTextView.m | 1 - 1 file changed, 1 deletion(-) diff --git a/src/MacVim/MMTextView.m b/src/MacVim/MMTextView.m index 2c690e70f5..0e2399d72e 100644 --- a/src/MacVim/MMTextView.m +++ b/src/MacVim/MMTextView.m @@ -304,7 +304,6 @@ - (BOOL)performKeyEquivalent:(NSEvent *)event // HACK! On Leopard Ctrl-key events end up here instead of keyDown:. if (flags & NSControlKeyMask) { - NSLog(@"pass on control key"); [self dispatchKeyEvent:event]; return YES; } From 9b639cbbe203c385a8ca79bf27faf99202e2f99c Mon Sep 17 00:00:00 2001 From: Nico Weber Date: Tue, 30 Oct 2007 21:44:23 +0100 Subject: [PATCH 0313/1156] Vim view refactoring. This fixes the ':set lines=1000000' problem in fu mode. Furthermore, this fixes a regression that the tab sizes weren't adjusted when changing the window size. --- src/MacVim/MMFullscreenWindow.m | 35 +++-- src/MacVim/MMTextStorage.m | 1 + src/MacVim/MMVimView.h | 31 +---- src/MacVim/MMVimView.m | 115 ++++++++++++++-- src/MacVim/MMWindowController.h | 3 - src/MacVim/MMWindowController.m | 229 ++++++++++++++++---------------- 6 files changed, 242 insertions(+), 172 deletions(-) diff --git a/src/MacVim/MMFullscreenWindow.m b/src/MacVim/MMFullscreenWindow.m index ed0dab9085..9ebc2d5965 100644 --- a/src/MacVim/MMFullscreenWindow.m +++ b/src/MacVim/MMFullscreenWindow.m @@ -103,21 +103,19 @@ - (void)enterFullscreen [self setTitle:[target title]]; [self setOpaque:[target isOpaque]]; - // make us visible and target invisible - [target orderOut:self]; - [self makeKeyAndOrderFront:self]; - // don't set this sooner, so we don't get an additional // focus gained message [self setDelegate:delegate]; // update bottom right corner scrollbar (no resize handle in fu mode) - [[self windowController] placeViews]; - - // the call above moves the text view in the lower left corner, fix that - // XXX: still required? + [view placeViews]; + + // move vim view to the window's center [self centerView]; - [self display]; + + // make us visible and target invisible + [target orderOut:self]; + [self makeKeyAndOrderFront:self]; // fade back in if (didBlend) { @@ -142,7 +140,6 @@ - (void)leaveFullscreen [self retain]; // NSWindowController releases us once [[self windowController] setWindow:target]; - [[view tabBarControl] setStyleNamed:oldTabBarStyle]; // fix delegate @@ -163,12 +160,8 @@ - (void)leaveFullscreen // sooner [target setDelegate:delegate]; - // update bottom right corner scrollbar (resize handle reappears) - // XXX: Doesn't work? - [[self windowController] placeViews]; - [view placeScrollbars]; - + [view placeViews]; // fade back in if (didBlend) { @@ -243,10 +236,14 @@ - (NSRect)contentRectForFrameRect:(NSRect)rect { //return [target contentRectForFrameRect:rect]; - // EVIL HACK: this is always called with [[self window] frame] as argument - // from MMWindowController. We can't let frame return the frame of target, - // so "fix" this here. - return [target contentRectForFrameRect:[target frame]]; + // EVIL HACK: if this is always called with [[self window] frame] as + // argument from MMWindowController, we can't let frame return the frame + // of target so "fix" this here. + if (NSEqualRects([self frame], rect)) { + return [target contentRectForFrameRect:[target frame]]; + } else { + return [target contentRectForFrameRect:rect]; + } } - (NSRect)frameRectForContentRect:(NSRect)contentRect diff --git a/src/MacVim/MMTextStorage.m b/src/MacVim/MMTextStorage.m index f8c717bf52..21bb518179 100644 --- a/src/MacVim/MMTextStorage.m +++ b/src/MacVim/MMTextStorage.m @@ -603,6 +603,7 @@ - (unsigned)characterIndexForRow:(int)row column:(int)col return (unsigned)(col + row*(maxColumns+1)); } +// XXX: unused at the moment - (BOOL)resizeToFitSize:(NSSize)size { int rows = maxRows, cols = maxColumns; diff --git a/src/MacVim/MMVimView.h b/src/MacVim/MMVimView.h index be00667192..8f2e3d9024 100644 --- a/src/MacVim/MMVimView.h +++ b/src/MacVim/MMVimView.h @@ -29,7 +29,7 @@ MMTextStorage *textStorage; NSMutableArray *scrollbars; - // This is temporary to make the refactoring easier + // This is temporary to make the refactoring easier (XXX) BOOL shouldUpdateWindowSize; } @@ -41,25 +41,23 @@ - (BOOL)inLiveResize; - (void)cleanup; +- (NSSize)desiredSizeForActualRowsAndColumns; +- (NSSize)getDesiredRows:(int *)r columns:(int *)c forSize:(NSSize)size; +- (void)getActualRows:(int *)r columns:(int *)c; +- (void)setActualRows:(int)r columns:(int)c; - (PSMTabBarControl *)tabBarControl; -- (NSTabView *)tabView; - (IBAction)addNewTab:(id)sender; - (void)updateTabsWithData:(NSData *)data; - (void)selectTabWithIndex:(int)idx; -- (int)representedIndexOfTabViewItem:(NSTabViewItem *)tvi; - (NSTabViewItem *)addNewTabViewItem; -- (BOOL)bottomScrollbarVisible; -- (BOOL)leftScrollbarVisible; -- (BOOL)rightScrollbarVisible; -- (void)placeScrollbars; - (void)createScrollbarWithIdentifier:(long)ident type:(int)type; - (void)destroyScrollbarWithIdentifier:(long)ident; - (void)showScrollbarWithIdentifier:(long)ident state:(BOOL)visible; - (void)setScrollbarThumbValue:(float)val proportion:(float)prop identifier:(long)ident; -- (MMScroller *)scrollbarForIdentifier:(long)ident index:(unsigned *)idx; +- (void)setScrollbarPosition:(int)pos length:(int)len identifier:(long)ident; - (void)setDefaultColorsBackground:(NSColor *)back foreground:(NSColor *)fore; @@ -67,21 +65,6 @@ - (NSRect)textViewRectForContentSize:(NSSize)contentSize; - (void)setShouldUpdateWindowSize:(BOOL)b; +- (void)placeViews; // XXX: this should probably not be public -- (NSSize)contentSizeForTextStorageSize:(NSSize)textViewSize; -- (NSSize)textStorageSizeForTextViewSize:(NSSize)textViewSize; @end - -// TODO: Move! -@interface MMScroller : NSScroller { - long identifier; - int type; - NSRange range; -} -- (id)initWithIdentifier:(long)ident type:(int)type; -- (long)identifier; -- (int)type; -- (NSRange)range; -- (void)setRange:(NSRange)newRange; -@end - diff --git a/src/MacVim/MMVimView.m b/src/MacVim/MMVimView.m index a175f897a7..d5a1fb1018 100644 --- a/src/MacVim/MMVimView.m +++ b/src/MacVim/MMVimView.m @@ -32,16 +32,44 @@ - (void)removeAllTabViewItems; @end +// TODO: Move! +@interface MMScroller : NSScroller { + long identifier; + int type; + NSRange range; +} +- (id)initWithIdentifier:(long)ident type:(int)type; +- (long)identifier; +- (int)type; +- (NSRange)range; +- (void)setRange:(NSRange)newRange; +@end + + @interface MMVimView (Private) - (BOOL)bottomScrollbarVisible; - (BOOL)leftScrollbarVisible; - (BOOL)rightScrollbarVisible; - (void)placeScrollbars; +- (int)representedIndexOfTabViewItem:(NSTabViewItem *)tvi; +- (MMScroller *)scrollbarForIdentifier:(long)ident index:(unsigned *)idx; +- (NSSize)contentSizeForTextStorageSize:(NSSize)textViewSize; +- (NSSize)textStorageSizeForTextViewSize:(NSSize)textViewSize; +- (NSTabView *)tabView; @end @implementation MMVimView +- (NSRect)tabBarFrameForFrame:(NSRect)frame +{ + NSRect tabFrame = { + { 0, frame.size.height - 22 }, + { frame.size.width, 22 } + }; + return tabFrame; +} + - (MMVimView *)initWithFrame:(NSRect)frame vimController:(MMVimController *)controller { if (![super initWithFrame:frame]) @@ -96,9 +124,7 @@ - (MMVimView *)initWithFrame:(NSRect)frame // Create the tab bar control (which is responsible for actually // drawing the tabline and tabs). - NSRect tabFrame = frame; - tabFrame.origin.y = NSMaxY(tabFrame) - 22; - tabFrame.size.height = 22; + NSRect tabFrame = [self tabBarFrameForFrame:frame]; tabBarControl = [[PSMTabBarControl alloc] initWithFrame:tabFrame]; [tabView setDelegate:tabBarControl]; @@ -106,7 +132,6 @@ - (MMVimView *)initWithFrame:(NSRect)frame [tabBarControl setTabView:tabView]; [tabBarControl setDelegate:self]; [tabBarControl setHidden:YES]; - [tabBarControl setAutoresizingMask:NSViewWidthSizable|NSViewMinYMargin]; [tabBarControl setCellMinWidth:[ud integerForKey:MMTabMinWidthKey]]; [tabBarControl setCellMaxWidth:[ud integerForKey:MMTabMaxWidthKey]]; [tabBarControl setCellOptimumWidth: @@ -118,8 +143,18 @@ - (MMVimView *)initWithFrame:(NSRect)frame [tabBarControl setPartnerView:[self textView]]; + // tab bar resizing only works if awakeFromNib is called (that's where + // the NSViewFrameDidChangeNotification callback is installed). Sounds like + // a PSMTabBarControl bug, let's live with it for now. + [tabBarControl awakeFromNib]; + [self addSubview:tabBarControl]; + [self setPostsFrameChangedNotifications:YES]; + [[NSNotificationCenter defaultCenter] + addObserver:self selector:@selector(placeViews) + name:NSViewFrameDidChangeNotification object:self]; + return self; } @@ -182,6 +217,8 @@ - (void)cleanup // removed as an observer, so remove it here (else lots of evil nasty bugs // will come and gnaw at your feet while you are sleeping). [[NSNotificationCenter defaultCenter] removeObserver:tabBarControl]; + + [[NSNotificationCenter defaultCenter] removeObserver:self]; [tabBarControl removeFromSuperviewWithoutNeedingDisplay]; [textView removeFromSuperviewWithoutNeedingDisplay]; @@ -195,6 +232,29 @@ - (void)cleanup [tabView removeAllTabViewItems]; } +- (NSSize)desiredSizeForActualRowsAndColumns +{ + return [self contentSizeForTextStorageSize:[[self textStorage] size]]; +} + +- (NSSize)getDesiredRows:(int *)r columns:(int *)c forSize:(NSSize)size +{ + NSSize textViewSize = [self textViewRectForContentSize:size].size; + NSSize textStorageSize = [self textStorageSizeForTextViewSize:textViewSize]; + NSSize newSize = [textStorage fitToSize:textStorageSize rows:r columns:c]; + return [self contentSizeForTextStorageSize:newSize]; +} + +- (void)getActualRows:(int *)r columns:(int *)c +{ + [textStorage getMaxRows:r columns:c]; +} + +- (void)setActualRows:(int)r columns:(int)c +{ + [textStorage setMaxRows:r columns:c]; +} + - (IBAction)addNewTab:(id)sender { // NOTE! This can get called a lot if the user holds down the key @@ -271,6 +331,9 @@ - (void)selectTabWithIndex:(int)idx vimTaskSelectedTab = YES; [[self tabView] selectTabViewItem:tvi]; vimTaskSelectedTab = NO; + + // we might need to change the scrollbars that are visible + [self placeScrollbars]; } } @@ -547,6 +610,36 @@ - (MMScroller *)scrollbarForIdentifier:(long)ident index:(unsigned *)idx return nil; } +- (void)setScrollbarPosition:(int)pos length:(int)len identifier:(long)ident +{ + MMScroller *scroller = [self scrollbarForIdentifier:ident index:NULL]; + NSRange range = NSMakeRange(pos, len); + if (!NSEqualRanges(range, [scroller range])) { + //NSLog(@"Set range %@ for scroller %d", + // NSStringFromRange(range), ident); + [scroller setRange:range]; + // TODO! Should only do this once per update. + + // This could be sent because a text window was created or closed, so + // we might need to update which scrollbars are visible. + [self placeScrollbars]; + } +} + +- (void)placeViews +{ + NSRect textViewRect = [self textViewRectForContentSize:[self frame].size]; + + // Give all superfluous space to the text view. It might be smaller or + // larger than it wants to be, but this is needed during life resizing + [[self textView] setFrame:textViewRect]; + + // for some reason, autoresizing doesn't work...set tab size manually + [tabBarControl setFrame:[self tabBarFrameForFrame:[self frame]]]; + + [self placeScrollbars]; +} + - (void)setDefaultColorsBackground:(NSColor *)back foreground:(NSColor *)fore { [textStorage setDefaultColorsBackground:back foreground:fore]; @@ -567,13 +660,6 @@ - (NSSize)contentSizeForTextStorageSize:(NSSize)textViewSize { NSSize size = textViewSize; - NSUserDefaults *ud = [NSUserDefaults standardUserDefaults]; - int right = [ud integerForKey:MMTextInsetRightKey]; - int bot = [ud integerForKey:MMTextInsetBottomKey]; - - size.width += [[self textView] textContainerOrigin].x + right; - size.height += [[self textView] textContainerOrigin].y + bot; - if (![[self tabBarControl] isHidden]) size.height += [[self tabBarControl] frame].size.height; @@ -584,6 +670,13 @@ - (NSSize)contentSizeForTextStorageSize:(NSSize)textViewSize if ([self rightScrollbarVisible]) size.width += [NSScroller scrollerWidth]; + NSUserDefaults *ud = [NSUserDefaults standardUserDefaults]; + int right = [ud integerForKey:MMTextInsetRightKey]; + int bot = [ud integerForKey:MMTextInsetBottomKey]; + + size.width += [[self textView] textContainerOrigin].x + right; + size.height += [[self textView] textContainerOrigin].y + bot; + return size; } diff --git a/src/MacVim/MMWindowController.h b/src/MacVim/MMWindowController.h index ff1bcd8d50..782bc5889d 100644 --- a/src/MacVim/MMWindowController.h +++ b/src/MacVim/MMWindowController.h @@ -20,7 +20,6 @@ @interface MMWindowController : NSWindowController { NSBox *tablineSeparator; - MMVimController *vimController; MMVimView *vimView; BOOL setupDone; @@ -67,5 +66,3 @@ - (IBAction)toggleToolbar:(id)sender; @end - -// vim: set ft=objc: diff --git a/src/MacVim/MMWindowController.m b/src/MacVim/MMWindowController.m index 96f2090404..5a5740fac3 100644 --- a/src/MacVim/MMWindowController.m +++ b/src/MacVim/MMWindowController.m @@ -22,18 +22,17 @@ @interface MMWindowController (Private) -- (NSSize)contentSizeForTextStorageSize:(NSSize)textViewSize; -- (NSRect)textViewRectForContentSize:(NSSize)contentSize; -- (NSSize)textStorageSizeForTextViewSize:(NSSize)textViewSize; +- (NSSize)contentSize; +- (NSRect)contentRectForFrameRect:(NSRect)frame; +- (NSRect)frameRectForContentRect:(NSRect)contentRect; - (void)resizeWindowToFit:(id)sender; - (NSRect)fitWindowToFrame:(NSRect)frame; - (void)updateResizeIncrements; - (NSTabViewItem *)addNewTabViewItem; -- (int)representedIndexOfTabViewItem:(NSTabViewItem *)tvi; - (IBAction)vimMenuItemAction:(id)sender; -- (MMScroller *)scrollbarForIdentifier:(long)ident index:(unsigned *)idx; - (BOOL)askBackendForStarRegister:(NSPasteboard *)pb; - (void)checkWindowNeedsResizing; +- (NSSize)resizeVimViewToFitSize:(NSSize)size; @end @@ -82,9 +81,9 @@ - (id)initWithVimController:(MMVimController *)controller vimView = [[MMVimView alloc] initWithFrame:[contentView frame] vimController:vimController]; [contentView addSubview:vimView]; - //[vimView translateOriginToPoint: - // NSMakePoint([contentView frame].size.width, 0)]; - //[vimView rotateByAngle:45.f]; + // [vimView translateOriginToPoint: + // NSMakePoint([contentView frame].size.width, 0)]; + // [vimView rotateByAngle:45.f]; // Create the tabline separator (which may be visible when the tabline // is hidden). @@ -125,7 +124,10 @@ - (void)dealloc - (NSString *)description { - return [NSString stringWithFormat:@"%@ : setupDone=%d windowAutosaveKey=%@ vimController=%@", [self className], setupDone, windowAutosaveKey, vimController]; + NSString *format = + @"%@ : setupDone=%d windowAutosaveKey=%@ vimController=%@"; + return [NSString stringWithFormat:format, + [self className], setupDone, windowAutosaveKey, vimController]; } - (MMVimController *)vimController @@ -208,7 +210,7 @@ - (void)setTextDimensionsWithRows:(int)rows columns:(int)cols { //NSLog(@"setTextDimensionsWithRows:%d columns:%d", rows, cols); - [[vimView textStorage] setMaxRows:rows columns:cols]; + [vimView setActualRows:rows columns:cols]; if (setupDone && ![vimView inLiveResize]) shouldUpdateWindowSize = YES; @@ -233,17 +235,7 @@ - (void)showScrollbarWithIdentifier:(long)ident state:(BOOL)visible - (void)setScrollbarPosition:(int)pos length:(int)len identifier:(long)ident { - MMScroller *scroller = [self scrollbarForIdentifier:ident index:NULL]; - NSRange range = NSMakeRange(pos, len); - if (!NSEqualRanges(range, [scroller range])) { - //NSLog(@"Set range %@ for scroller %d", - // NSStringFromRange(range), ident); - [scroller setRange:range]; - // TODO! Should only do this once per update. - - if (setupDone) // TODO: probably not necessary - [vimView placeScrollbars]; - } + [vimView setScrollbarPosition:pos length:len identifier:ident]; } - (void)setScrollbarThumbValue:(float)val proportion:(float)prop @@ -271,6 +263,8 @@ - (void)setFont:(NSFont *)font - (void)processCommandQueueDidFinish { + // XXX: If not in live resize and vimview's desired size differs from actual + // size, resize ourselves if (shouldUpdateWindowSize) { shouldUpdateWindowSize = NO; [vimView setShouldUpdateWindowSize:NO]; @@ -374,25 +368,30 @@ - (void)liveResizeWillStart - (void)liveResizeDidEnd { - // TODO: Don't duplicate code from placeViews. - if (!setupDone) return; + // At the end of an resize, check if vim view size and number of + // columns / rows agree (the first is set while resizing, the second by + // messages sent from vim). If not, send a synchronous (!) message to vim + // to set columns / rows to the value belonging to the view size. If the + // message couldn't be sent, change the view size to fit columns / rows. + // NOTE! It is assumed that the window has been resized so that it will // exactly fit the text storage (possibly after resizing it). If this is // not the case the display might be messed up. BOOL resizeFailed = NO; - NSWindow *win = [self window]; - NSRect contentRect = [win contentRectForFrameRect:[win frame]]; - NSRect textViewRect = [self textViewRectForContentSize:contentRect.size]; - NSSize tsSize = [self textStorageSizeForTextViewSize:textViewRect.size]; + NSSize contentSize = [self contentSize]; + + int desiredSize[2]; + [vimView getDesiredRows:&desiredSize[0] columns:&desiredSize[1] + forSize:contentSize]; + + int rows, columns; + [vimView getActualRows:&rows columns:&columns]; - int dim[2], rows, cols; - [[vimView textStorage] getMaxRows:&rows columns:&cols]; - [[vimView textStorage] fitToSize:tsSize rows:&dim[0] columns:&dim[1]]; + if (desiredSize[0] != rows || desiredSize[1] != columns) { - if (dim[0] != rows || dim[1] != cols) { - NSData *data = [NSData dataWithBytes:dim length:2*sizeof(int)]; + NSData *data = [NSData dataWithBytes:desiredSize length:2*sizeof(int)]; // NOTE: Since we're at the end of a live resize we want to make sure // that the SetTextDimensionsMsgID message reaches Vim, else Vim and @@ -405,10 +404,6 @@ - (void)liveResizeDidEnd timeout:.5]; } - [[vimView textView] setFrame:textViewRect]; - - [vimView placeScrollbars]; - if (resizeFailed) { // Force the window size to match the text view size otherwise Vim and // MacVim will have inconsistent states. @@ -427,52 +422,20 @@ - (void)placeViews { if (!setupDone) return; - // NOTE! It is assumed that the window has been resized so that it will - // exactly fit the text storage (possibly after resizing it). If this is - // not the case the display might be messed up. - NSWindow *win = [self window]; - NSRect contentRect = [win contentRectForFrameRect:[win frame]]; - NSRect textViewRect = [self textViewRectForContentSize:contentRect.size]; - NSSize tsSize = [self textStorageSizeForTextViewSize:textViewRect.size]; - - // If our optimal (rows,cols) do not match our current (rows,cols), resize - // ourselves and tell the Vim process to sync up. - int dim[2], rows, cols; - [[vimView textStorage] getMaxRows:&rows columns:&cols]; - [[vimView textStorage] fitToSize:tsSize rows:&dim[0] columns:&dim[1]]; - - if (dim[0] != rows || dim[1] != cols) { - //NSLog(@"Notify Vim that text storage dimensions changed " - // @"from %dx%d to %dx%d", cols, rows, dim[1], dim[0]); - NSData *data = [NSData dataWithBytes:dim length:2*sizeof(int)]; - - [vimController sendMessage:SetTextDimensionsMsgID data:data]; - - // We only want to set the window title if this resize came from - // a live-resize, not (for example) setting 'columns' or 'lines'. - if ([[self textView] inLiveResize]) { - [win setTitle:[NSString stringWithFormat:@"%dx%d", - dim[1], dim[0]]]; - } - } - - // XXX: put vimView resizing logic in vimView - [[vimView textView] setFrame:textViewRect]; - - NSRect vimViewRect = textViewRect; + NSRect vimViewRect; vimViewRect.origin = NSMakePoint(0, 0); - if (![[vimView tabBarControl] isHidden]) - vimViewRect.size.height += [[vimView tabBarControl] frame].size.height; - if ([vimView bottomScrollbarVisible]) - vimViewRect.size.height += [NSScroller scrollerWidth]; - if ([vimView leftScrollbarVisible]) - vimViewRect.size.width += [NSScroller scrollerWidth]; - if ([vimView rightScrollbarVisible]) - vimViewRect.size.width += [NSScroller scrollerWidth]; - - [vimView setFrame:vimViewRect]; + vimViewRect.size = [vimView getDesiredRows:NULL columns:NULL + forSize:[self contentSize]]; - [vimView placeScrollbars]; + // HACK! If the window does resize, then windowDidResize is called which in + // turn calls placeViews. In case the computed new size of the window is + // no different from the current size, then we need to call placeViews + // manually. + if (NSEqualRects(vimViewRect, [vimView frame])) { + [vimView placeViews]; + } else { + [vimView setFrame:vimViewRect]; + } } - (void)enterFullscreen @@ -546,7 +509,23 @@ - (void)windowDidMove:(NSNotification *)notification - (void)windowDidResize:(id)sender { if (!setupDone) return; - [self placeViews]; + + // Live resizing works as follows: + // VimView's size is changed immediatly, and a resize message to the + // remote vim instance is sent. The remote vim instance sends a + // "vim content size changed" right back, but in live resize mode this + // doesn't change the VimView (because we assume that it already has the + // correct size because we set the resize increments correctly). Afterward, + // the remote vim view sends a batch draw for the text visible in the + // resized text area. + + NSSize contentSize = [self contentSize]; + [self resizeVimViewToFitSize:contentSize]; + + NSRect frame; + frame.origin = NSMakePoint(0, 0); + frame.size = contentSize; + [vimView setFrame:frame]; } - (NSRect)windowWillUseStandardFrame:(NSWindow *)win @@ -570,7 +549,7 @@ - (NSRect)windowWillUseStandardFrame:(NSWindow *)win frame = [self fitWindowToFrame:frame]; - // Keep old width and horizontal position unless user clicked with the + // Keep old width and horizontal position unless user clicked while the // Command key is held down. NSEvent *event = [NSApp currentEvent]; if (!([event type] == NSLeftMouseUp @@ -613,30 +592,32 @@ - (BOOL)writeSelectionToPasteboard:(NSPasteboard *)pboard @implementation MMWindowController (Private) -- (NSSize)contentSizeForTextStorageSize:(NSSize)textViewSize +- (NSRect)contentRectForFrameRect:(NSRect)frame { - NSSize size = [vimView contentSizeForTextStorageSize:textViewSize]; + NSRect result = [[self window] contentRectForFrameRect:frame]; if (![tablineSeparator isHidden]) - ++size.height; - return size; + --result.size.height; + return result; } -- (NSRect)textViewRectForContentSize:(NSSize)contentSize +- (NSRect)frameRectForContentRect:(NSRect)contentRect { - NSSize size = { contentSize.width, contentSize.height }; if (![tablineSeparator isHidden]) - --size.height; - - return [vimView textViewRectForContentSize:size]; + ++contentRect.size.height; + return [[self window] frameRectForContentRect:contentRect]; } -- (NSSize)textStorageSizeForTextViewSize:(NSSize)textViewSize +- (NSSize)contentSize { - return [vimView textStorageSizeForTextViewSize:textViewSize]; + return [self contentRectForFrameRect:[[self window] frame]].size; } - (void)resizeWindowToFit:(id)sender { + // Makes the window large enough to contain the vim view, called after the + // vim view's size was changed. If the window had to become to big, the + // vim view is made smaller. + // NOTE: Be very careful when you call this method! Do not call while // processing command queue, instead set 'shouldUpdateWindowSize' to YES. // The only other place it is currently called is when live resize ends. @@ -646,17 +627,17 @@ - (void)resizeWindowToFit:(id)sender if (!setupDone) return; + // Get size of text view, adapt window size to it NSWindow *win = [self window]; NSRect frame = [win frame]; - NSRect contentRect = [win contentRectForFrameRect:frame]; - NSSize textStorageSize = [[vimView textStorage] size]; - NSSize newSize = [self contentSizeForTextStorageSize:textStorageSize]; + NSRect contentRect = [self contentRectForFrameRect:frame]; + NSSize newSize = [vimView desiredSizeForActualRowsAndColumns]; // Keep top-left corner of the window fixed when resizing. contentRect.origin.y -= newSize.height - contentRect.size.height; contentRect.size = newSize; - frame = [win frameRectForContentRect:contentRect]; + frame = [self frameRectForContentRect:contentRect]; NSRect maxFrame = [win constrainFrameRect:frame toScreen:[win screen]]; // HACK! Assuming the window frame cannot already be placed too high, @@ -673,9 +654,10 @@ - (void)resizeWindowToFit:(id)sender // text storage to the biggest frame which will fit on the screen. //NSLog(@"Proposed window frame does not fit on the screen!"); frame = [self fitWindowToFrame:maxFrame]; + [self resizeVimViewToFitSize:[self contentRectForFrameRect:frame].size]; } - //NSLog(@"%s %@", _cmd, NSStringFromRect(frame)); + // NSLog(@"%s %@", _cmd, NSStringFromRect(frame)); // HACK! If the window does resize, then windowDidResize is called which in // turn calls placeViews. In case the computed new size of the window is @@ -692,18 +674,15 @@ - (NSRect)fitWindowToFrame:(NSRect)frame { if (!setupDone) return frame; - NSWindow *win = [self window]; - NSRect contentRect = [win contentRectForFrameRect:frame]; - NSSize size = [self textViewRectForContentSize:contentRect.size].size; - size = [self textStorageSizeForTextViewSize:size]; - size = [[vimView textStorage] fitToSize:size]; - size = [self contentSizeForTextStorageSize:size]; + NSRect contentRect = [self contentRectForFrameRect:frame]; + NSSize size = [vimView getDesiredRows:NULL columns:NULL + forSize:contentRect.size]; // Keep top-left corner of 'frame' fixed. contentRect.origin.y -= size.height - contentRect.size.height; contentRect.size = size; - return [win frameRectForContentRect:contentRect]; + return [self frameRectForContentRect:contentRect]; } - (void)updateResizeIncrements @@ -719,11 +698,6 @@ - (NSTabViewItem *)addNewTabViewItem return [vimView addNewTabViewItem]; } -- (int)representedIndexOfTabViewItem:(NSTabViewItem *)tvi -{ - return [vimView representedIndexOfTabViewItem:tvi]; -} - - (IBAction)vimMenuItemAction:(id)sender { int tag = [sender tag]; @@ -734,11 +708,6 @@ - (IBAction)vimMenuItemAction:(id)sender [vimController sendMessage:ExecuteMenuMsgID data:data]; } -- (MMScroller *)scrollbarForIdentifier:(long)ident index:(unsigned *)idx -{ - return [vimView scrollbarForIdentifier:ident index:idx]; -} - - (BOOL)askBackendForStarRegister:(NSPasteboard *)pb { BOOL reply = NO; @@ -762,4 +731,34 @@ - (void)checkWindowNeedsResizing shouldUpdateWindowSize || [vimView shouldUpdateWindowSize]; } +- (NSSize)resizeVimViewToFitSize:(NSSize)size +{ + // If our optimal (rows,cols) do not match our current (rows,cols), resize + // ourselves and tell the Vim process to sync up. + int desired[2]; + NSSize newSize = [vimView getDesiredRows:&desired[0] columns:&desired[1] + forSize:size]; + + int rows, columns; + [vimView getActualRows:&rows columns:&columns]; + + if (desired[0] != rows || desired[1] != columns) { + // NSLog(@"Notify Vim that text storage dimensions changed from %dx%d " + // @"to %dx%d", columns, rows, desired[0], desired[1]); + NSData *data = [NSData dataWithBytes:desired length:2*sizeof(int)]; + + [vimController sendMessage:SetTextDimensionsMsgID data:data]; + + // We only want to set the window title if this resize came from + // a live-resize, not (for example) setting 'columns' or 'lines'. + if ([[self textView] inLiveResize]) { + [[self window] setTitle:[NSString stringWithFormat:@"%dx%d", + desired[1], desired[0]]]; + } + } + + return newSize; +} + + @end // MMWindowController (Private) From 855ff922b86247e9b4b10ec4beea2cdfb589129d Mon Sep 17 00:00:00 2001 From: Dan Callahan Date: Thu, 1 Nov 2007 17:14:45 -0500 Subject: [PATCH 0314/1156] New icon set (Gnome/Matt Ball/Jonas Rask derived) --- src/MacVim/Credits.rtf | 23 +++++++++++------------ src/MacVim/Toolbar/Attention.png | Bin 1931 -> 1960 bytes src/MacVim/Toolbar/Copy.png | Bin 1075 -> 567 bytes src/MacVim/Toolbar/Cut.png | Bin 1379 -> 1532 bytes src/MacVim/Toolbar/FindHelp.png | Bin 1983 -> 1842 bytes src/MacVim/Toolbar/FindNext.png | Bin 1596 -> 1132 bytes src/MacVim/Toolbar/FindPrev.png | Bin 1595 -> 1157 bytes src/MacVim/Toolbar/Help.png | Bin 2461 -> 1815 bytes src/MacVim/Toolbar/LoadSesn.png | Bin 1757 -> 2996 bytes src/MacVim/Toolbar/Make.png | Bin 2113 -> 1822 bytes src/MacVim/Toolbar/Open.png | Bin 1365 -> 1644 bytes src/MacVim/Toolbar/Paste.png | Bin 1550 -> 1143 bytes src/MacVim/Toolbar/Print.png | Bin 1482 -> 4601 bytes src/MacVim/Toolbar/Redo.png | Bin 1236 -> 1957 bytes src/MacVim/Toolbar/Replace.png | Bin 1777 -> 2766 bytes src/MacVim/Toolbar/RunCtags.png | Bin 1225 -> 1587 bytes src/MacVim/Toolbar/RunScript.png | Bin 2166 -> 1775 bytes src/MacVim/Toolbar/Save.png | Bin 1440 -> 4829 bytes src/MacVim/Toolbar/SaveAll.png | Bin 2002 -> 4735 bytes src/MacVim/Toolbar/SaveSesn.png | Bin 2039 -> 2670 bytes src/MacVim/Toolbar/TagJump.png | Bin 1154 -> 1737 bytes src/MacVim/Toolbar/Undo.png | Bin 1178 -> 1859 bytes 22 files changed, 11 insertions(+), 12 deletions(-) diff --git a/src/MacVim/Credits.rtf b/src/MacVim/Credits.rtf index e9de262e2f..0423a49374 100644 --- a/src/MacVim/Credits.rtf +++ b/src/MacVim/Credits.rtf @@ -1,27 +1,26 @@ -{\rtf1\mac\ansicpg10000\cocoartf824\cocoasubrtf410 -{\fonttbl\f0\fswiss\fcharset77 Helvetica-Bold;\f1\fswiss\fcharset77 Helvetica;\f2\fswiss\fcharset77 Helvetica-Oblique; -} +{\rtf1\ansi\ansicpg1252\cocoartf949 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} {\colortbl;\red255\green255\blue255;} \paperw11900\paperh16840\margl1440\margr1440\vieww9360\viewh8400\viewkind0 \pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\ql\qnatural\pardirnatural \f0\b\fs24 \cf0 VIM - Vi IMproved -\f1\b0 \ +\b0 \ by: -\f2\i Bram Moolenaar -\f1\i0 \ +\i Bram Moolenaar +\i0 \ \ -\f0\b MacVim GUI\ +\b MacVim GUI\ -\f1\b0 by: -\f2\i Bj\'9arn Winckler -\f1\i0 \ +\b0 by: +\i Bj\'f6rn Winckler +\i0 \ \ Thank you to {\field{\*\fldinst{HYPERLINK "http://www.positivespinmedia.com"}}{\fldrslt Positive Spin Media}} for the PSMTabBarControl Framework.\ \ -Toolbar icons borrowed from the {\field{\*\fldinst{HYPERLINK "http://www.everaldo.com/crystal/"}}{\fldrslt Crystal Project}}.\ +Toolbar icons from from {\field{\*\fldinst{HYPERLINK "http://svn.gnome.org/viewvc/gnome-icon-theme/"}}{\fldrslt gnome-icon-theme}}, licensed under version 2 of the GNU General Public License. Supplemented with icons by {\field{\*\fldinst{HYPERLINK "http://www.mattballdesign.com/"}}{\fldrslt Matt Ball}} and {\field{\*\fldinst{HYPERLINK "http://jonas.seph.ws/"}}{\fldrslt Jonas Rask}}.\ \ Vim icons made by {\field{\*\fldinst{HYPERLINK "http://www.cs.princeton.edu/~mtwebb/vim_icon/vim_icons.html"}}{\fldrslt Matthew Webb}}.\ \ -The default font in MacVim, DejaVu Sans Mono, is based on the Bitstream Vera\'aa and Arev fonts. Bitstream Vera\'aa is \'a9 2003 by Bitstream, Inc. Arev is \'a9 2006 by Tavmjong Bah. The DejaVu changes to these fonts are in the public domain.} \ No newline at end of file +The default font in MacVim, DejaVu Sans Mono, is based on the Bitstream Vera\'99 and Arev fonts. Bitstream Vera\'99 is \'a9 2003 by Bitstream, Inc. Arev is \'a9 2006 by Tavmjong Bah. The DejaVu changes to these fonts are in the public domain.} \ No newline at end of file diff --git a/src/MacVim/Toolbar/Attention.png b/src/MacVim/Toolbar/Attention.png index 704cf4ba5ea90bbfcd9bd07528478840d2a475f4..f01bbcea0e56678d0b3feff1585c8497769361b7 100644 GIT binary patch delta 1947 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 Z#(#k4+4%v4qPzeA002ovPDHLkV1j(^{FMLz diff --git a/src/MacVim/Toolbar/Cut.png b/src/MacVim/Toolbar/Cut.png index 514bd97c273a2ab2f85222a0113d5aff45297b5b..b672b7360d330036f953992898d7ba366b96b8ca 100644 GIT binary patch delta 1515 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 delta 1968 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 DSq~Zy delta 1579 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 rRv0rY{;yrXHUoD=C#)ktfPVnZ*cLxk)O delta 2452 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 SNeyiP00004Tx0C=3`m1|6scNE5-_w601v`~vo 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 delta 1742 zcmV;<1~K`x7u^kzBYy^@NklA6O6~}+~zW2s6V|&J9Pn>|AIISH*sx~w! zp>3Kf6k14w$_}Ln7OyW0=l?(dbMCn_!dlCNJb(F|kjB8!j*cJJ>w4zp zU-*B^=Y$*^w`Nn0thEnpZ~feT$u9oN7BBpG=~RxLzZpet*2e<@kB{M;_!03>PCxfA zYm3(E3-;YpgQvo^O_7ifBLCR9)%{uLrQJ{d;49S6fnMS9L*GAkYD|35Y%-&pCXmkw z`T8p&{@8(MkAHi;BQA|;sNJM*UvWI@;TwW{)&k2ed6HpSkHho)x8<_$eu4BeVW=7s3zzJs0R2eU=;hF`hWI!PmYRR_p8FDQ?U2(1FvYb~#)VY?=^yo=jyqj+kb;6UQA`_3XJ(-M;q`JCxrPAq< zbWiU?>3>Xipex;%O?LNo$GiGEglK|V3AsBVaNB4Fcxg;yg?gn>uP)D*Dy8{_QgPu{ zskC^#Tq$2#snsTGO?|zgxhbr*oc?9zwS$Ka|18;^O~;d6aT!m7>wy$tH5ebX0@DIj z3&5i2S51NqM-c-r4KfZg7OvYswZ;mnRy2*3LVvwHd$HgGxKa%Fb$4$ST^*o{P?-Zv zXf`wvm@k75gSHpBPBc#9uTI$0&WJ?a4Fup z=%1Z9|HrASdMi2w3!Y2t;!Nd)wI7*7kG5V&^bg^>F=$MMpgPo&wy4`JBoak#Z797A z3bvyk-SR0;U-aLdxbVhoO}!a&n2ZS2fqyB_#a^6U`L!|U)!{wm7n6Niq!i${K*+ET z>;?oP6#&zg_b3H`@vAHqZnVzanEJz9UA^r&TnFY?k73w46Tm=AGrX%WG5WPfb{y^O z%?NZkki7kgI$Z?3N}z3wlpx8%(n|C1*KYl8p`rfdNp1jhfLbN65sBeU;??IL8Gk(5 z+3mSO3fjT#ItA9J;x?K2Wxw{$wVB^9Hq~Du@Ud~*f_1Gp{5e$zreY3PCl>3!{m+%T z4^RrUS!>D$m90%Uw!KGd#-f{=f8Lz?YoV$B9D*-I;CB#MPeMv2JSm!30;lb!EvSva z&6>FcTp`L5u7==^cDxNQqmV>PK!39@;cZ(Jm5LN-i&mN2V?-#N3k$t5Z@@qqXsyS( z>t$pCSCZ|Cxm!?SBiX11qWPLyh>l?JL9gcw5!BY2=ByZa*G=J@wyr1c1g8zK zos0p5CF3~TT*v|?K)2)Eoq)x3I?hN^iWthQJ$BJVh}(dKd0&k@Y{x*#aep!~DYpCA ztLt$#tbu$^NCQsVb#_Z=%d-i#h&U*Z%Ca&aeztt|lUwEKdKoYYa1udWO0U*Lrw|>T zQVyFnt@Pds#4?^c95fUIUIJn%tZykVmAO=0yndm&a%Rcsk0f+_TB<(#XfpNHojrY9 zlHFNkTtmGGejN`XQc~_NXn!s9IbqxXJ>89f5Rl3^&LG-CJOi?e>f$n&3v;(VtyRt} z7=2a>K8r~zfSlF-g}KV&*@0T=n~%j)hles-GV$(ypak`0dW5sf;=9~W4Ok!sgIU+v zhL=Ls1QYXD=0C11pPe=O3~Yr#!7hY!A8UyJAF#+w-O^$+(EtDd07*qoM6N<$g2)qaX8-^I diff --git a/src/MacVim/Toolbar/Make.png b/src/MacVim/Toolbar/Make.png index 7bb010aaadafaf6bee932bb9a09a3d26dab8241b..09b250439cb6cec9c6ebe96e38d9e3f31f2fa362 100644 GIT binary patch delta 1807 zcmV+q2k`j85S|W@B!3BTNLh0L01FcU01FcV0GgZ_000KiNkl@UCHNfB0xSm_3(ZlW3pg(nr*65QV?v<*YXDvE z^9`Y~wQj-2&4Kza;qk9T^Lz@Shg>*2i8B>pD*bm-qeroZ4!7+;MEm!5^Zb7V@XU8; zvBvq)*Ec_~aewu_+ceX62dES{W8fsg$+{i2YS2QUg+Tu!<*T9`W&w=Z~5M;J6C;EG%Tn>$WD+~z!?XX1*9vLb)VUTV2>~`xQLZ^ zeUYqO*l_sp$*=6#O6Q3)^xiPQBM-9fQa3Mcdg$4v4SyRp(9_$`#8@wj7i9tapK3gr z<-qTT$V;2GYu8fcTUvAQ&xJjlrtXNlbqK&Xbcwd;1?*4o<2#fuk-#bR6=l-z!c zq`FGZ%zO?V`GX`jEEyjkXL53qmX;PWx!RicvmdUya*dZi5nxLzFW6Q0ZQ8bNJ3T!; zM59rplz&X+CBq3x^NPymv0=%{ zc$Qy$ZSxaBfXkOJPrpn`Nn%toKP+jOKR3W{-ygoH;`}oi59c5PyRGhhX{5P+e7?xsG1=Tj$JgrDnE) zj*br2tXYFmy?Rl{xwB6JKbbQF3+j3Hw%a!>@%emocXyM|=gH^uNGYddDlN%oC3k+d zICC4v$+P!2l2J=e_bqB_YKl}UMKBlyAQrjc>5uTMIWv$LWBKQsniv=uAe~Mlgu6}T za(_82%VJ_;f>bKSd+%kqYe|lkx8?yjaKz;0SH1XrJ_3ONH8nNV)z#tkdT|^FfPsMl znwpw8dz$5?o@D@|qlAOOARQeYWHK2n%Oa6TU|AN~Y!*$^5JDh?VEdDT#swMx-TgM{ zbedEu#qjVjN-4ZvFX3>Q`ucjp;V{u?lz+y?Mn=a7R|Kf5MPGQ6hTn{kmN5)_gavgD z4PgyUGZ31Fzy;{LDu@od84CDd)k=j@1))&R6pj-^I74W19zJss4L99GT?joEuK=+3 z8FF9va-w?s`T?*lKm%d8u_&Pdf=!PJ+Ap{OcdvxEUQ$3o$^lBG;-KeI{y2>$xqtQB zDgZbR(Wz|zvMS{OdcjODxu4OaTLnWSg6lbWbSpFFI3S9~4q&?#M>$Mo2T%^tihqHl z=*p%d%c}gL!d_oA*9*ooAZwZhlNmuK3k&B1q6A>t*a0N~0a`8DR0LbmRqCmg{;+M% zC#^VW!4h-BAv_)rzua$fb;vC1H$6_PBauiDAFa>KMh5e?V&Cke+Q+Kl>j$~? z)%$XFy2d^8=GD7vZu)aH_~8o%!=nbeu45Q()O8&p1d&0(tv3rk-6-6ZFFZKHPwz+9 zxE4wL?168wd$yl8`vHJ0*?)7nXXwqozCj%22h9uUv|rG<&}m>82BvAw8J~Z}Ad}NU zRO8^IuP@5w?%11o$)35q<~)$RaR}?7jr7DvC+n4RRs;ey=(?Auck7H#md{+*^|CEG zdtF0evf?u~J-t`C)D=CT^89$qx9ObAtKyk(-@C-ut>v#1$rR~Ks(<#3gP$r(KL;8I!!W}#Ih{L#>Qxepv6Uo{oOCl73S!rVNCo{wG@UZrdSxXS>p?ZfI=adR=xlu xXV3nV0E+FR#7vYtpFLj95sOfBED%PDHLkV1iy0Y%c%+ delta 2100 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 FV1kgZndSfh diff --git a/src/MacVim/Toolbar/Paste.png b/src/MacVim/Toolbar/Paste.png index 8906e80f7e2c57bfca05f524105a861fb278f127..2822dbfc81d26d473ecdb3b41fe595ee73d9433e 100644 GIT binary patch delta 1123 zcmV-p1f2Vh4EG3-BYyw{b3#c}2nYxWdW zg)0*mDwNii0##5WBB8oyL`~BX?aaKHcaMwdv_pBnCdf%{X6D{=&-vW*z2{~`RY_ud z_wC8Iq|@*E)^>#acf!khK;;&D;AOHS;^sR4P4Esg_xz7TZagx1-R@YklHt)`sZ@Mi zBN#UY4S#aR0U)vfDn?kpM)`6mS@ODVS?3_sWQoWf44@e7oGj^-!?U>+JXN)XKUmk! z8xdO5E-Ba4_DEpmqW}c8wV(!A(&9o(RETge)mpr!06-#6yEtWh+cyoMvLHdc#rP@I z>eviGf(k4+--HTWBf+Bh^`BFvm0X@(i`9VBEq}@<(+;iqH#u_T$X`IoTKmR<0|)v; z0ThF^(I>lbwVmE)_Og2Q>PWvuwz5ztFfcIC2ZRG4CRT!q57}&%si`Td)hfmqj4_Bv z=y%t3X=`i4_x+`fv0}R*3PnUXedbgoY~3E;-V-=~LtP*uY`StAB83+*oU{I^E`9%Z~A-6FftG_YfZ$W?r(v$?FVZpx1px?^9k=g)nhMD ze0{W2BK}RL@`orEi)6FeaL53wR4Rx_73c(}MC5N5CZON?Ac6^6gMkDi&HmuH3{cCa1C5i$-ASb!Hi zy~2vbB5?!~!crozEFo-1EV2P10Y)s5OyaFq2nn%r5=Fcw1PhE5p(KdN3ZB@;cKlF0 z_B`F)_jc7ehsC|!Gd-T^9wUxa-KthqoxlEb&VQ<%nbFJ6zJLDe=*+zQ1Cvq1#NnKn zC25j8`OLwm-|BflH#4)I zEg;|i!bhHQrhDR;N(VqS=}TPy#Q6BcYVhIGxhIZ%dE%sth&wNZsq%-@f4loyF9O;C zhLZ4^<3IZOk$;fa`+ZhZ2{{@(s)G8aojZN}<`)mY^l){cpL!#+znp&I_ETT|$^mm} ztRkoxE{aiAl7X>-KmO^=R$$`*MmG&UHZU;x(Ye|4m zRMqYM+Odb63at!!J3a4L{MC7)qOkH1mFNQLxL1B7bVH>lGX3AZ|~y( zZK~<0+J9owxVK1JzlBLCK$xsv*n&40TBO718$neB;m| zR0`a21Yr%Lons`9cw%)HPEAeu(ys@ImP0_nfC!?-O&#Zaw1ao@kD-++*DE{trF)J% zcz?`$q}f1ygR>WEJpYSV2+amQUmne@L8IQFzG47mS>6FCS~+RO-$aN+xgkeePmupBRF%}bNHNcH!mpeS#xVxM+i(56~oN4GhF5kw~r5pw~^Qq zbMrOEhAKR|Wr*D;ud!!yKkw!#VYrH*8-K03?f}#bF+l}}ZIQ3n&u}Bz!j+M&^f{QH zt8v*W{c+5{W}x0LRHblk7-kQSA{MB%_0%hBX5g6hkp91gqOn5llM)EKBi<5EOD-NUV9! zpZ(`~W!JOVNR`AHttPAsbu0)d%M^Esx2?fIM-oyBk(K~rZE`Mrj^FHkf%ws3;wJbo zfCSJgcyXn3EqaBmKEBhmT(>R&ZGShKLYBQKA1pa`|MRz`?|8gH#wL<91yw`iuZYQnICyJWm;Lu-jK1Wqp%7kq9H~G%tBZT0KhVL9rF+wlzlohaQ zS*H-S+ilr;P4O0?Q3Viuqy(TLhDhrqTk+Z5T9vRafP#TCqs#W&$_d(uS$~$?25!9C zOnWd;+*+0yC?6in%t)zt_s4QW0M^*o0#Kx{(N4m48LlizRSYZiqWfcaO;gi#%Fy9N zCCjr6)d&;C)L|N-CFO`i#kJ-1|I2_8$Az^=-BwnI9GjO@9S6saO@?MQ^(yRPqGHqrO}Do+n3#`-aTAXW?3>Mo|KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000LhNklQKITJ)j|?ADApr*}ShX~^7Rsayv{a2H z_N{MCw6wlp-y~6@rfRK^YVe^^DNSlfOtEMTrXT|{#uWJ|RG3c+Bh1`;?#DTMFCWgC zVFu7}AL@Cyci)q9)>`|&|NsA5SE%#au;ImEa(>I_ypJ9huZz7#;+-4vvHrQOcI;Sx ze}7z0JgMj56A;p z7yeOs@Iy*W%R>azj8f&hO4wb@F;g#;rdEFYj74?LytAMB$7h3WSaVf0$ z+?>LkLUYiBSQA#Fs8;gKX>KsFj|%m~H1#|jN7cq`##ocFjmx_VT_24MFSV+GkKeBu)bDp_}CCojftJe+@_}1p)3Dt8N7Uc(8Z3{InB#DyOtE9*qPXQK0X9u zN6p8QZ)s?(mZP9nt-K#a(feUow7CYG(>OBf>QdoeEVR_#-UU(^MtwmLDLuRHxa{zb` z3h76>D-lElRVDUu_Vu5=whySUfO4ghwbn8?co|TfQxu;hRK z&%OEP+rPTYinndwwkg+``|X}RFK23T$i)kn`1HCS#>U1d7AKjUEKw{LDNdFM!xCW_ zQYw|x-yx-9nXptMER`sRMap5BQmI5krja9mIKrlf9%T2k&vEMXsjb~BmcM)cpXZ0B zRj_mCmIW%gb9?vhoi{Q%#JO{4sn#kOV^FVP1OXJq0E$6S5J51gB=<>)=hb5+NVuaO zRgX1>H4m(2;i7K#e{cUdzP#$-!Nb=B0Gr7jc;@M^w6@J}<8Nn9@%W=p5Cj2H6d|IB zSVTzGASvZ#7UR8lfFR;=PO&yfpI59+-amfwIP2DKWY;rKx4!k}!2>{V(7U6zr_efg z^CORJwqs*sl)?!*Iyxzr%c=V*A~H*2Grwo9z4xfl_t4)^E#V9zuErj z=+Vu6yZU;9tPP%j>Zu+1@$p+!qbk*E4QnmcxQev@OVUJ)_nkL zElo{LRI62-kC>R8q_1yh{ujUe`SXGEu6M=qRr2qfH>lPkTAG`=aOpgY7cL>6&(GT3 z%w4M{(B8XeXnHIOB9%&oiyxe0PIC*TQiUiUXIb|$QM5M@)wWDF%S3S!^~&O<-TZyv zG$&5{B_W+L>FxzF0;(urt-+(<5}Ov0)DaWuc~t}@p^YJz%aO}lPM$tSXZw6MefDu& z6tx9W?D8UpYORbI#aLl!_Yx4W#-J)mf+^S~?E^+rE?P**1_qIItt17i;(Wr3>!TmB zuJ8s!eh&tVD)~SJTpUxWR#23{B#cc|W|+z@Vy4M2_(X~dNDWkGwYRCAt161(HIeDO zc{$?jKIXd+7soj72)y?|qFp0~fq{Q8GBlDl9U-s*Vgzd}polREG6Gf%##oFs2w-gT zj^HsiK*UT@7f=?o73k>7AXvOl@&zJ7q%lSeB0{NH=IYg}e0kSbnJi6GsfD+LBxaBV zPDz&DN(edygo5G`AQLoDXldopp+junu^l4@RgX6g=RJX{fP)}N+H7Zg2bUW!v2xW) zuHP8t*3AhfCMMDZf=P9afOGzKPQBf(op&HmXlbQTXr-lPKDk_uu7!)J`4Ck>UBcG@ zRlK_C;i$8to%YUlKDBB!gCor(M|8IVX*vLiCPT>7`VKvU5f*)72@BfWXm6X(m5~rq zk5Kgls)~1x72T^4;GHAC=fMr@ao&+{Y+`U|kT`PF<}$MoMacw~uC7JX`k&67Dj{ti z^z`)b-d|7f=ocSDy~n#a@rx}_Jf>*kc2)w`^{nM<&+cYnN7r4J`#)#98B@@mrUWoJ zbd_KK<_!i022fR8>{5@JaXq=S_nTX{e(6;JBW8yD5*^fn@yJjUTkl?PTM|jnkZ%jX-+t!i=ssd$v{eGaA?wA|CIRlPCKb zzdrsdaPI;T^W7i6_LCQ)C~6gv={%BH%k4ju#!jEHS3eECh)ma{C^|(-O`ym&W^NfV jKb@8G&NKUeU;h~Zee||a2R~g000000NkvXXu0mjfZP~0D delta 1465 zcmV;q1xEV$BgzYqBYy>vNklewjJ6sGxv2~E~f9! zRB4TF{3YL=`jiPjpG(A(SFS5;M&7D9^kHh)4YKDG?T7;{}On4bP) zaCmsQyd$l3S?TNRBbP2+n$cQorSz83-Q9is^5rYEk{_cId(Jt0-}AHv9LHIVdSlq- z#+DEchtb~N-f;Bj`>N6$TFF2Nf!3u|6GAFFsubChWV3I6R*~Um1pY1jPoN?J&N*VS znB1;|SS+Ro2Y&}E`l)EBudipeZEvXmSA}VsICt)RMSDd89~?WD357!SoNt|jloEzv zL{6Oeki9a2P{^ZO~==}K$=H%ogGoz+%Y-k{f zcoI@daLz%1HT_qwx~>~sdAVUA@B@rLA160&-ilto_J0lP>gwgmlOK6YbI8(O@Wq*P zZEbBW*Q-)hyZylTrIZFGB-+~A2BlQ#-C6^rpwLUi}1V7%p2h%hIDLB&UjLPM5 zPappBsQc4TKAu=Zpr@y&XK?VVYq6M(mxThp9=ZtM_rWNG(j||C5KzWIX(UvakN*DShi}~Y_WLz|K{A<4QcB>u9t!z9cJFRL zYfBpe4+}+ zB9TmPSOazSyQ&GLP)dP-KyZ#nj~*hO&cL!P5PwP#2}fYtQG~-`M8Xkxz6T*BY}-an zZ5@OVP*S2;ETT}z!*N^`^Lfn7PNT805lU-NN>RUSSM>%0@p!D3Q3@p$KmZ{GT*tx8 z^fZJJi>WQG141bX2wcwv4>(NIgdYU(TnC=(!S{VQu7ki2;JGfWsExyKzXPC@fmke7 zyMKnjseu97+}zwuCWK=5*Y0h|YrNlzsm{d?|mA)uaNoc7cm4a3ZLP~h9 zgN20!7@-gtAuug#$H>SCUCw~x6xrO|i-hNSn3>Jt*|X>Hg@9p%07k(8Fav8k;eYzh zxN=LDj941-eGdyS^O&6c9Xm5sn45c%betkvCcrtz131ed7iOo4*Sp!Ndy(5#h48uTsYYX8eRDHe;7NF>sdPNzdsZtqM& zDaGW}q=?z}xCXfI`?^plj9Hc?fK_|J!Gi~h<2un$C`4SxwR?MeFZcKNcNPkTO^@E2 zMz1yE@i;DgdExfeD_7r3rBYtN10A)a&e-VKN(KO6Y-~&eC@!jnp`jtCrhldewry{V zKq8Sqwktb(_RQJYa&yXlm{3X+ckkY9sIIO?JRaYY^Cei8g?;<>H4#FhT5G2)%k|RK z)YOs7AX|&6sj0b|+M2!Pe3fm**=)8ol}g#$3VjvQ>2#{At7~sLTUi2~ot+(& z{&U+zI2=Z{E89`dwp<0PaWdrHBV8Ts9dAh~y)w_dG8ki#`#;?u9{z6l&U)LQ@Aaj* TB~WYA00000NkvXXu0mjfO-Z~) diff --git a/src/MacVim/Toolbar/Redo.png b/src/MacVim/Toolbar/Redo.png index 8a065ddae632b026c5d6c8876e0bc34a7eaf2c5c..7987273ca5a4aca727ceecb5f4e8f004d2dd47ae 100644 GIT binary patch delta 1943 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 Ef<3>6(*OVf diff --git a/src/MacVim/Toolbar/RunCtags.png b/src/MacVim/Toolbar/RunCtags.png index 08d186924b16be71ab62e9b48c7d649249493b9a..cd8fabd795ec17ed3370a1e341ff2a80150608f2 100644 GIT binary patch delta 1571 zcmV+;2Hg3{39}54BYyw{b3#c}2nYxWddt(O@Qlm79Ob8UJKukUvgPqDCyRZKawo6i+<51mce$Dxn=W^L zBGHI@`}S8i0*`$u0U?yOU~NzyJou6R!9c$Q;5*;Gopd(E;lux8?Ce=G=`=34hsMT* z+;II3tXRHs&VPg_PM%=bTWwwrqt%2&HYdPXz(P)EgB=VR&RXBP_n>3k0_9 zeP?&G+vDNJZ{Eml?R7YuPSWW#BO}A?*zpEC-`dHB@7_UGRaHr>R5FRjm0`phU&N({rOIxhj!G~J3K`N@y(XZ!1~ zvA(SxU$vKbe3GW{BD`K7LV#siq|<386EW7dt_1}9-r3884?I*7@23y`%x)`+#57I! z>~UF60Dlmc1>4_vjZmnb`CpqyKA&gFm0!p2uSQW6q%2q<5Fiw6z%&io+SV}{k25qp zgb>2EKfdq>+bpXP|EmaK7zQ9{X}N~eW2dN{A3{or5TZCsn5IEKucPZax@Mvqd2U*B z6YuxGM>HC>4WO&@DKQhb6mt?VO_O9Y$^7~An16^(;`Ms5EDLM8go01uw_%tlih^NS zELnUNr$$Dni!7LBS@iaGTjlQ;QK10{vhF_^{npl*)SNB;a;?$>%i?aQwt)ENmzqN`(rFl@zKfJf)Om zvwsD3YVcjuNg96Q7Ec%Vp6t z6;;(x)dCq!Q_1J^R99Ccgu*AEd`$Dz&3`D0V()@d4VV|Y1a9uR`$xR|=a*Qzv>Bh@ zgOCKMWf$ECO2q@D);9cd!$1gsjsj1g~JOO9Q=@2Ji(f8UC-a&{41L` zbs~ho@Au>P`@b~VTzKv`TkZB-=fDgB$yr@DuHHW|h^AYtYh6S4FMHfQy??(_L{& z$B0+q$|K|rc!4A+iF`wfBS1*RT=wJx2!So|uH%p0nc3;?%3)^Ovum$Oq(ofOQmbpa zXS)9NuaE8#RpoOw^I5h34**C2e*Wdx3TYpgvaPQtdCX-3!pCkcjS#oOCd2{o!s$z`c=;(;SV8D1h2B6bf!aGL< zV68=Jr!6lpbN~K*Uc7k0%aJ`p8I-L&AIquxK!<#p67z_qjYiC>maCmsg+qZAY^ZY`^5kRO?_e>1z z@9(p>w^tP&V<^iK=N$X{`<$Gd;JuHrAR>70+1=gclb5r1pk)9!7y(1w8sAOWfp>b;MF)9$@q zFDh2mrko-o^!xo8t5Ro2z1jl*7K&OH%goCoMSi~lIJsQw6 zt5#jPf})&%MO)aJpR2%y5Xg&yBG1_$4mmzP9$9O@uI_|s+E0>%(v=JEgh3Vkmw)br zB0{&@?f<^DB?-XRZ(HB5U0(YlvB{FErm7(gs$Es>sH#OVriE)U+9~uK)l507*qoM6N<$f*J2z1^@s6 diff --git a/src/MacVim/Toolbar/RunScript.png b/src/MacVim/Toolbar/RunScript.png index 85c6f85bc9a928eb1c971d096053f181efb916d7..a6c158bd3d9a39717d161edf92968f6d905f7813 100644 GIT binary patch delta 1760 zcmV<61|RwM5bq6;BYyx1a7bBm000XU000XU0RWnu7ytkUp-DtRR9J=WmP>40R~g5D z=gz~=@nh_yuE%*hiS6Pf;1U%nLZwLv5>*!vH9I6gED#X_sXKN^6hSK}2#{Ft*suts z1qmS~G@&e_0Bw>cC5gv4wn_X*>WLp?dpvXRd3-GHo$=Tii+}Kt*l?tyBYpSW^Z$SU z^F0pyfBcV!dhDHodg*5;j(SQR5hX(ceM%$)AWBUu$SP4+oyetEKYRWn3i+=Qcb37>CWz{TKep3+XEEQX0yqT_s z9keC3Fm^x7xj&pg>pAZmuYKvw>$PxVwTxf<(Xrhk?tkkqeBylFBmdgj=`VBa_Q?b^r8$^=?W=#2oVihmNXzjhhz8#;ShQK*W?&Im>ubjjeC zG=4F_FZe94F4L9T#=^pU|Mp)uUApndsY+JFs|h&6ksUj>k@x2)>SB1?DwI}mph7UC z9oOHQVD##JhCaTB%$_vX7_6~4_h|iDwJR*HKBQ+`4K>G%xBX6w(f!WC=&i(ub*Dg+=eOr^js=rKqLp?Tdebx4L3K(rO&I!H= zLdj(V1I13 zP+aaM<{@Iyet=&pArdC9i_j#hN&kNqF+X8+UO#Nu9*1#7#@ig}4Ri}^*2aoJ4? zI4xJ_=kw3Eb*Au(K7O&d-qR}8od{dEwQ}gWT{O4W0V?!b2_h=Yma3sVj|Wo^FGKUDz6f{jRkU->Syk*bPMoa_07*Cya3hVjk8C);gROY*Y`3f`81p$X@yG z*4dpERLny=L-xv~(SbX|TK+z&0KomR#aoGbuRYaX|B;rh4PhZNQL~G@EZ6>Wx`yo- zpsW^Q48|1H!Q^m`_byI+@7)W3|IS9dnh%mK-L0dOBe_glck@7FXEFpdRfkvFbC~O{ z{5YuuzCZ#L-Pr6=st84F z0#cd&^rw^c-Y54Absg>QZ>P1ZfkdN+N`za*fL^iWXN%0-US#~82XB>1=G@H4!f$~B zupF&=BZ+V0wspY3j{XZj6{;sOPRF!?>|59Tuld2hj0RI3L5hLvOTjs6+0000 delta 2154 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 Dn#(1l delta 1423 zcmV;A1#tS^C7=tCBYy>FNklZ&5vA16~%wI>b-7vkBtd2AWvc^4#*IYk?{&5 zF+q{SB7AHRk~c{FB`jcpvS0%v5yY1Nz!3@(5!ixkVSz{pIM|K?NZ^bCd-}asb?;?S z^?JI;v{tWahkT_jT^tXedqSgrvVxOcV{-6VIFXIy1r*NZSY4xfryY&!rjO@Ap)wpd|uNO zRE@=AfryaR=zsdeJMY}u8o)CjyFgaQy$l>psHnHcakb8WzO!N-5NkjnVd^vs*36+27kptMcxhcee&`?)*7&R?MwRplbzg-Go)EtVUAfqr1CX14vr4Hpf&kRrp^L*op*M zm7Mg^6{373fgO`}9e@_9hLi~+{O!HJZVlk<6T9S`mjJTrW)Em(K~)iHIs3%+vp@vY zeA#aZVSi16FrJJIsvS~Foc`d4s|*`vftn%&vSuVq zQ4?YeAOQ)1uo5Cts9a%h6~xhuGR%$GG^l3WL4Sg5UJJkw5!$u^5d`S_0e1*N>b=57 zNzT`;Bc&FFD@G-$VCDX!K46bV#8NndXcMFzrlPyL*Qtz5zIr)S#&)= z_~DPZapN~g5Hx4pjrqw_Bg#z-RLw)c%s6pk%JX}l$F%2_SANR1SFaI6;1kb&ns0sc zDt~9rJWkFT5Tv3LffLgymo7ca^QKVWBP z&TBt^4fU27TmJOtTfG1NJ*LwsDW#=R-5n93pY|LcE{YsxxCkLg9Ya{@s5(u@kloKf>%!*v4c2p2R8h-{%6)n^(X8@FiZvz7kW_Xpr%ov8AuJ0-! zN42;==gcq+j4_aMDpR^LV5W#b(>5EXp=!D94mBgKt5-@1)e680Q~fZ|_x+NAv55#dYkwhA z4VCi#nDl7cjUMn7LlqB{P*sMZY_DSsq?8zjVQJn~21ZY)W-uq-<^)C{Y#CCR0zP$W+)NVGL$^QO+d-3AMY11^b$z(EZnr7BCO@EwDr<0~> zW+8+VF~(^KVIm?e(2B^oD!IFxyJs^SQW~;5gQ|9_xz8ytQchjhb@%7<`Q1yGK4T){ zOA{^@3kL=u*GM&HHOmHwHNr~fD%PDHLkV1mj6t?~c> diff --git a/src/MacVim/Toolbar/SaveAll.png b/src/MacVim/Toolbar/SaveAll.png index f9b0c5222ca44b52c61eb2712d59b3cc075611ac..8af9c9f4a30085f22daeb8dea6f019d8453115dd 100644 GIT binary patch literal 4735 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 delta 2026 zcmV)7U^`df1RrRe%ph6%ZwM9ThBq)g+ zY%osj#P-@=uh-tQd(N4eKJ0PgfCHG7zMVNbbN=7=|K>k4=YI%mE$jUa6@)Yfwss}H z>HGTZfuDxY3>AbN7_?^H!K}5P2v0tw?zVHkw51c@oj+7y+i&`jpCrz@9~d0KdH6dd z|NGSE|7~r_T7AMke`w30_};oj$n`olFlcpW-no0nb>G;Fe+={z*Y5gD}R!o-gDD^Zd;F{b_S~BwD;WJcKMDi{r3%7GgJ`kin*@A1B2G&+te3( zuiJk;{uI~@%zs;9|c z)|c<;+0tKFrwbo@;J~2OZLR9g-p}531Jy~0>Y!^7)qfyd0u!<8`Y(O;V86J0Jua+k z3U*$*=l(>l)ulEIx(<=wfDWK~md@_o9ox5U`axmn&u=v7S%fWupn)J9dolf>- zGnvb?xqno3Ib);I?V>Qiq;h^=!-+$I}|GvJPf0Ay_=aT76QYO=&T#y2+ z1`~pgzyuIg8)PflpMwM&x55KA2QmrLi|^ZpYk##RqH4+1mS+9Mso~idUVr)9N=b29 zdvo&!kx76qL1h{+F>DOcfQU0+5g?rN#OIvwp;m5;x2wV!3r3@al9^Pt$?=++1fom5 zeWvu7`;Vu3_wC+uYpQc2Qbu5EF$poTi2FL$WE)^bV|?F=28=yNh|!?qzMI2@9;MU& zi+^4?`NrdOe)O7B4s&mvS$tUA*TjuGci)oQa4E`lAS%ZhnZ{bTL1W$95R7R|&x#Nm zXKN)7{IkegMZgjU_bz@R-JVBE0bu|_#&uxV5U}C`U<6i% zygd0Ynw%6~EkPJqdS$@;__5%~dy{{j_M^kD!x%6#Fld97mk1v?<0;-bSzI1`@qhTc zPy4e|mPj?$d1PYP^UxNwiQDtnBl8lKaR_oX%65TT=<{;9WS$+H_~W!69(E<~0W&~E zyr3Bvv}ULvd|=XZU}VleXx=)dZ@tpo)zs`NR`0Dg{=2||^Zo8?ZzPdTV4VoRX%XSW z+ZBJj*kb=0lTQx}+F&KzxvhAW6MvJQ!#g8${%>C$oqmldiZfk>H63X59nV9h9i%4+ zR6t$Sm^XGjCNHigKj*+|5i3qeiFT!^V`&gv-~inE;x@`biJJAnv*3bo1ySZWd(~bR zf<>y)68Wahw6%8adg$c*i?t}2{NX;iVC&G9Z4=k**mbv9>!oz4Aly*1;eU?p`RA_e zYV9R5aSfg?!ksT=x#iyL*xJ0E&TJ>SOpbTV2vUF_)ft-}Wp-kYO+gnsy01V-8X+Xo z3LL4>HO=pS|LEF>kp+|_-{PqbBE5zKmU=B9D2Due^g+72y4kj&o6hD=T%BOKyi94n zgg+DT?!pKYv+t42B=MAoM}LBpOtZ0N6ZKkfaRF&ZZp$i_B{ZutkC&nas|_}Q+OTG< zHb!x-NGg>?Y6qvPXfC&q^wW476<(V}r6sQ8Agv{`bqpG-%|!%QOq1jEq^0nP%(;1Q z2x(k+GC^}LLn@y_1Qx$ir(O?8rBXOyn(^V|v|rW2-b-(w)4K#DxPL-{7MKWkp zd{DqpK}Z8mPB}XyG%9|@0Y`ywA=GTyw3X+cc!dpSN8{L#pfPl`x03ElbGCDWsI^X2 zmU-rH$4QfA?9^B#a2KC8bx4||=L|CDB5n$*#ARxqjrQ#AJR zG7zoUIaCn7fJIkOtowD+#w8@AZfb;4Kz%tt2;4@cTFR2uL-*lW2PabG5;>H=MyeNaAQUib1g{`)RO5VD z1nM94`8_ab^|KFtnbAL-qEfFQ642b-L|4al@LyecfA#?X2Rv?uj7ON^DF6Tf07*qo IM6N<$f>UY+B>(^b diff --git a/src/MacVim/Toolbar/TagJump.png b/src/MacVim/Toolbar/TagJump.png index 10b7dfcab6f679e3f39778959d2b71229a3635ca..27acf2d689df7c3dde72dfe91044f850ac7cc51a 100644 GIT binary patch delta 1720 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 From cf69540941a74753344392ae6e31e9a0da4d25fd Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Fri, 2 Nov 2007 13:29:17 +0100 Subject: [PATCH 0315/1156] Fixed typo in the credits. --- src/MacVim/Credits.rtf | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/src/MacVim/Credits.rtf b/src/MacVim/Credits.rtf index 0423a49374..1eaff2f41b 100644 --- a/src/MacVim/Credits.rtf +++ b/src/MacVim/Credits.rtf @@ -1,26 +1,27 @@ -{\rtf1\ansi\ansicpg1252\cocoartf949 -{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\rtf1\mac\ansicpg10000\cocoartf824\cocoasubrtf410 +{\fonttbl\f0\fswiss\fcharset77 Helvetica-Bold;\f1\fswiss\fcharset77 Helvetica;\f2\fswiss\fcharset77 Helvetica-Oblique; +} {\colortbl;\red255\green255\blue255;} \paperw11900\paperh16840\margl1440\margr1440\vieww9360\viewh8400\viewkind0 \pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\ql\qnatural\pardirnatural \f0\b\fs24 \cf0 VIM - Vi IMproved -\b0 \ +\f1\b0 \ by: -\i Bram Moolenaar -\i0 \ +\f2\i Bram Moolenaar +\f1\i0 \ \ -\b MacVim GUI\ +\f0\b MacVim GUI\ -\b0 by: -\i Bj\'f6rn Winckler -\i0 \ +\f1\b0 by: +\f2\i Bj\'9arn Winckler +\f1\i0 \ \ Thank you to {\field{\*\fldinst{HYPERLINK "http://www.positivespinmedia.com"}}{\fldrslt Positive Spin Media}} for the PSMTabBarControl Framework.\ \ -Toolbar icons from from {\field{\*\fldinst{HYPERLINK "http://svn.gnome.org/viewvc/gnome-icon-theme/"}}{\fldrslt gnome-icon-theme}}, licensed under version 2 of the GNU General Public License. Supplemented with icons by {\field{\*\fldinst{HYPERLINK "http://www.mattballdesign.com/"}}{\fldrslt Matt Ball}} and {\field{\*\fldinst{HYPERLINK "http://jonas.seph.ws/"}}{\fldrslt Jonas Rask}}.\ +Toolbar icons from {\field{\*\fldinst{HYPERLINK "http://svn.gnome.org/viewvc/gnome-icon-theme/"}}{\fldrslt gnome-icon-theme}}, licensed under version 2 of the GNU General Public License. Supplemented with icons by {\field{\*\fldinst{HYPERLINK "http://www.mattballdesign.com/"}}{\fldrslt Matt Ball}} and {\field{\*\fldinst{HYPERLINK "http://jonas.seph.ws/"}}{\fldrslt Jonas Rask}}.\ \ Vim icons made by {\field{\*\fldinst{HYPERLINK "http://www.cs.princeton.edu/~mtwebb/vim_icon/vim_icons.html"}}{\fldrslt Matthew Webb}}.\ \ -The default font in MacVim, DejaVu Sans Mono, is based on the Bitstream Vera\'99 and Arev fonts. Bitstream Vera\'99 is \'a9 2003 by Bitstream, Inc. Arev is \'a9 2006 by Tavmjong Bah. The DejaVu changes to these fonts are in the public domain.} \ No newline at end of file +The default font in MacVim, DejaVu Sans Mono, is based on the Bitstream Vera\'aa and Arev fonts. Bitstream Vera\'aa is \'a9 2003 by Bitstream, Inc. Arev is \'a9 2006 by Tavmjong Bah. The DejaVu changes to these fonts are in the public domain.} \ No newline at end of file From 0b104808a2d4ed5a76291a179e42c5d37f0499c9 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Fri, 2 Nov 2007 18:18:17 +0100 Subject: [PATCH 0316/1156] Enable compilation without FEAT_MBYTE. --- src/MacVim/MMBackend.m | 69 ++++++++++++++++++----------------- src/MacVim/MacVim.h | 3 -- src/MacVim/gui_macvim.m | 80 ++++++++++++++++++++--------------------- src/gui.c | 2 +- src/option.c | 2 +- 5 files changed, 78 insertions(+), 78 deletions(-) diff --git a/src/MacVim/MMBackend.m b/src/MacVim/MMBackend.m index d443764993..54b38607ec 100644 --- a/src/MacVim/MMBackend.m +++ b/src/MacVim/MMBackend.m @@ -480,7 +480,7 @@ - (void)updateTabBar int len = STRLEN(s); if (len <= 0) continue; -#if MM_ENABLE_CONV +#ifdef FEAT_MBYTE s = CONVERT_TO_UTF8(s); #endif @@ -493,7 +493,7 @@ - (void)updateTabBar [data appendBytes:&len length:sizeof(int)]; [data appendBytes:s length:len]; -#if MM_ENABLE_CONV +#ifdef FEAT_MBYTE CONVERT_TO_UTF8_FREE(s); #endif } @@ -554,11 +554,11 @@ - (char *)browseForFileInDirectory:(char *)dir title:(char *)title if (dialogReturn && [dialogReturn isKindOfClass:[NSString class]]) { char_u *ret = (char_u*)[dialogReturn UTF8String]; -#if MM_ENABLE_CONV +#ifdef FEAT_MBYTE ret = CONVERT_FROM_UTF8(ret); #endif s = vim_strsave(ret); -#if MM_ENABLE_CONV +#ifdef FEAT_MBYTE CONVERT_FROM_UTF8_FREE(ret); #endif } @@ -637,11 +637,11 @@ - (int)presentDialogWithType:(int)type title:(char *)title message:(char *)msg if (txtfield && [dialogReturn count] > 1) { NSString *retString = [dialogReturn objectAtIndex:1]; char_u *ret = (char_u*)[retString UTF8String]; -#if MM_ENABLE_CONV +#ifdef FEAT_MBYTE ret = CONVERT_FROM_UTF8(ret); #endif vim_strncpy((char_u*)txtfield, ret, IOSIZE - 1); -#if MM_ENABLE_CONV +#ifdef FEAT_MBYTE CONVERT_FROM_UTF8_FREE(ret); #endif } @@ -1194,7 +1194,7 @@ - (BOOL)starRegisterToPasteboard:(byref NSPasteboard *)pboard // TODO: Avoid overflow. int len = (int)llen; -#if MM_ENABLE_CONV +#ifdef FEAT_MBYTE if (output_conv.vc_type != CONV_NONE) { char_u *conv_str = string_convert(&output_conv, str, &len); if (conv_str) { @@ -1249,13 +1249,13 @@ - (void)addInput:(in bycopy NSString *)input char_u *s = (char_u*)[input UTF8String]; -#if MM_ENABLE_CONV +#ifdef FEAT_MBYTE s = CONVERT_FROM_UTF8(s); #endif server_to_input_buf(s); -#if MM_ENABLE_CONV +#ifdef FEAT_MBYTE CONVERT_FROM_UTF8_FREE(s); #endif @@ -1272,23 +1272,23 @@ - (NSString *)evaluateExpression:(in bycopy NSString *)expr NSString *eval = nil; char_u *s = (char_u*)[expr UTF8String]; -#if MM_ENABLE_CONV +#ifdef FEAT_MBYTE s = CONVERT_FROM_UTF8(s); #endif char_u *res = eval_client_expr_to_string(s); -#if MM_ENABLE_CONV +#ifdef FEAT_MBYTE CONVERT_FROM_UTF8_FREE(s); #endif if (res != NULL) { s = res; -#if MM_ENABLE_CONV +#ifdef FEAT_MBYTE s = CONVERT_TO_UTF8(s); #endif eval = [NSString stringWithUTF8String:(char*)s]; -#if MM_ENABLE_CONV +#ifdef FEAT_MBYTE CONVERT_TO_UTF8_FREE(s); #endif vim_free(res); @@ -1320,12 +1320,12 @@ - (void)registerServerWithName:(NSString *)name [svrConn setRootObject:self]; char_u *s = (char_u*)[svrName UTF8String]; -#if MM_ENABLE_CONV +#ifdef FEAT_MBYTE s = CONVERT_FROM_UTF8(s); #endif // NOTE: 'serverName' is a global variable serverName = vim_strsave(s); -#if MM_ENABLE_CONV +#ifdef FEAT_MBYTE CONVERT_FROM_UTF8_FREE(s); #endif #ifdef FEAT_EVAL @@ -1355,11 +1355,11 @@ - (BOOL)sendToServer:(NSString *)name string:(NSString *)string if (!conn) { if (!silent) { char_u *s = (char_u*)[name UTF8String]; -#if MM_ENABLE_CONV +#ifdef FEAT_MBYTE s = CONVERT_FROM_UTF8(s); #endif EMSG2(_(e_noserver), s); -#if MM_ENABLE_CONV +#ifdef FEAT_MBYTE CONVERT_FROM_UTF8_FREE(s); #endif } @@ -1380,11 +1380,11 @@ - (BOOL)sendToServer:(NSString *)name string:(NSString *)string if (reply) { if (eval) { char_u *r = (char_u*)[eval UTF8String]; -#if MM_ENABLE_CONV +#ifdef FEAT_MBYTE r = CONVERT_FROM_UTF8(r); #endif *reply = vim_strsave(r); -#if MM_ENABLE_CONV +#ifdef FEAT_MBYTE CONVERT_FROM_UTF8_FREE(r); #endif } else { @@ -1637,7 +1637,7 @@ - (void)handleInsertText:(NSData *)data char_u *str = (char_u*)[key UTF8String]; int i, len = [key lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; -#if MM_ENABLE_CONV +#ifdef FEAT_MBYTE char_u *conv_str = NULL; if (input_conv.vc_type != CONV_NONE) { conv_str = string_convert(&input_conv, str, &len); @@ -1657,7 +1657,7 @@ - (void)handleInsertText:(NSData *)data } } -#if MM_ENABLE_CONV +#ifdef FEAT_MBYTE if (conv_str) vim_free(conv_str); #endif @@ -1669,7 +1669,7 @@ - (void)handleKeyDown:(NSString *)key modifiers:(int)mods char_u special[3]; char_u modChars[3]; char_u *chars = (char_u*)[key UTF8String]; -#if MM_ENABLE_CONV +#ifdef FEAT_MBYTE char_u *conv_str = NULL; #endif int length = [key lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; @@ -1714,12 +1714,15 @@ - (void)handleKeyDown:(NSString *)key modifiers:(int)mods length = 3; } else if (mods & MOD_MASK_ALT) { int mtab = 0x80 | TAB; +#ifdef FEAT_MBYTE if (enc_utf8) { // Convert to utf-8 special[0] = (mtab >> 6) + 0xc0; special[1] = mtab & 0xbf; length = 2; - } else { + } else +#endif + { special[0] = mtab; length = 1; } @@ -1756,7 +1759,7 @@ - (void)handleKeyDown:(NSString *)key modifiers:(int)mods mods &= ~MOD_MASK_ALT; } -#if MM_ENABLE_CONV +#ifdef FEAT_MBYTE if (input_conv.vc_type != CONV_NONE) { conv_str = string_convert(&input_conv, chars, &length); if (conv_str) @@ -1779,7 +1782,7 @@ - (void)handleKeyDown:(NSString *)key modifiers:(int)mods add_to_input_buf(chars, length); } -#if MM_ENABLE_CONV +#ifdef FEAT_MBYTE if (conv_str) vim_free(conv_str); #endif @@ -1949,13 +1952,13 @@ - (void)handleSetFont:(NSData *)data [name appendString:[NSString stringWithFormat:@":h%.2f", pointSize]]; char_u *s = (char_u*)[name UTF8String]; -#if MM_ENABLE_CONV +#ifdef FEAT_MBYTE s = CONVERT_FROM_UTF8(s); #endif set_option_value((char_u*)"guifont", 0, s, 0); -#if MM_ENABLE_CONV +#ifdef FEAT_MBYTE CONVERT_FROM_UTF8_FREE(s); #endif @@ -1987,11 +1990,11 @@ - (void)handleDropFiles:(NSData *)data while (bytes < end && i < n) { int len = *((int*)bytes); bytes += sizeof(int); char_u *s = (char_u*)bytes; -#if MM_ENABLE_CONV +#ifdef FEAT_MBYTE s = CONVERT_FROM_UTF8(s); #endif fnames[i++] = vim_strsave(s); -#if MM_ENABLE_CONV +#ifdef FEAT_MBYTE CONVERT_FROM_UTF8_FREE(s); #endif bytes += len; @@ -2027,11 +2030,11 @@ - (void)handleDropFiles:(NSData *)data goto_tabpage(9999); char_u *s = (char_u*)[cmd UTF8String]; -#if MM_ENABLE_CONV +#ifdef FEAT_MBYTE s = CONVERT_FROM_UTF8(s); #endif do_cmdline_cmd(s); -#if MM_ENABLE_CONV +#ifdef FEAT_MBYTE CONVERT_FROM_UTF8_FREE(s); #endif @@ -2069,12 +2072,12 @@ - (void)handleDropString:(NSData *)data len = [string lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; char_u *s = (char_u*)[string UTF8String]; -#if MM_ENABLE_CONV +#ifdef FEAT_MBYTE if (input_conv.vc_type != CONV_NONE) s = string_convert(&input_conv, s, &len); #endif dnd_yank_drag_data(s, len); -#if MM_ENABLE_CONV +#ifdef FEAT_MBYTE if (input_conv.vc_type != CONV_NONE) vim_free(s); #endif diff --git a/src/MacVim/MacVim.h b/src/MacVim/MacVim.h index 52c16924f9..e717c96031 100644 --- a/src/MacVim/MacVim.h +++ b/src/MacVim/MacVim.h @@ -11,9 +11,6 @@ #import -// Enable to use experimental 'enc' support. -#define MM_ENABLE_CONV 1 - // diff --git a/src/MacVim/gui_macvim.m b/src/MacVim/gui_macvim.m index b43f7850be..245730494e 100644 --- a/src/MacVim/gui_macvim.m +++ b/src/MacVim/gui_macvim.m @@ -250,7 +250,7 @@ void gui_mch_draw_string(int row, int col, char_u *s, int len, int flags) { -#if MM_ENABLE_CONV +#ifdef FEAT_MBYTE char_u *conv_str = NULL; if (output_conv.vc_type != CONV_NONE) { conv_str = string_convert(&output_conv, s, &len); @@ -262,7 +262,7 @@ [[MMBackend sharedInstance] replaceString:(char*)s length:len row:row column:col flags:flags]; -#if MM_ENABLE_CONV +#ifdef FEAT_MBYTE if (conv_str) vim_free(conv_str); #endif @@ -288,7 +288,7 @@ BOOL outPad = NO; MMBackend *backend = [MMBackend sharedInstance]; static char ZeroWidthSpace[] = { 0xe2, 0x80, 0x8b }; -#if MM_ENABLE_CONV +#ifdef FEAT_MBYTE char_u *conv_str = NULL; if (output_conv.vc_type != CONV_NONE) { @@ -367,7 +367,7 @@ row:row column:endcol-1 flags:flags]; } -#if MM_ENABLE_CONV +#ifdef FEAT_MBYTE if (conv_str) vim_free(conv_str); #endif @@ -540,7 +540,7 @@ char_u *str = (char_u*)[string UTF8String]; int len = [string lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; -#if MM_ENABLE_CONV +#ifdef FEAT_MBYTE if (input_conv.vc_type != CONV_NONE) str = string_convert(&input_conv, str, &len); #endif @@ -548,7 +548,7 @@ if (str) clip_yank_selection(type, str, len, cbd); -#if MM_ENABLE_CONV +#ifdef FEAT_MBYTE if (input_conv.vc_type != CONV_NONE) vim_free(str); #endif @@ -575,7 +575,7 @@ // TODO: Avoid overflow. int len = (int)llen; -#if MM_ENABLE_CONV +#ifdef FEAT_MBYTE if (output_conv.vc_type != CONV_NONE) { char_u *conv_str = string_convert(&output_conv, str, &len); if (conv_str) { @@ -622,7 +622,7 @@ } char_u *dname = menu->dname; -#if MM_ENABLE_CONV +#ifdef FEAT_MBYTE dname = CONVERT_TO_UTF8(dname); #endif @@ -630,7 +630,7 @@ addMenuWithTag:(int)menu parent:parent name:(char*)dname atIndex:idx]; -#if MM_ENABLE_CONV +#ifdef FEAT_MBYTE CONVERT_TO_UTF8_FREE(dname); #endif } @@ -653,7 +653,7 @@ ? menu->strings[MENU_INDEX_TIP] : menu->actext; char_u *map_str = menu->strings[MENU_INDEX_NORMAL]; -#if MM_ENABLE_CONV +#ifdef FEAT_MBYTE icon = CONVERT_TO_UTF8(icon); name = CONVERT_TO_UTF8(name); tip = CONVERT_TO_UTF8(tip); @@ -690,7 +690,7 @@ action:action atIndex:idx]; -#if MM_ENABLE_CONV +#ifdef FEAT_MBYTE CONVERT_TO_UTF8_FREE(icon); CONVERT_TO_UTF8_FREE(name); CONVERT_TO_UTF8_FREE(tip); @@ -746,14 +746,14 @@ gui_mch_show_popupmenu(vimmenu_T *menu) { char_u *name = menu->name; -#if MM_ENABLE_CONV +#ifdef FEAT_MBYTE name = CONVERT_TO_UTF8(name); #endif [[MMBackend sharedInstance] showPopupMenuWithName:(char*)name atMouseLocation:YES]; -#if MM_ENABLE_CONV +#ifdef FEAT_MBYTE CONVERT_TO_UTF8_FREE(name); #endif @@ -766,14 +766,14 @@ void gui_make_popup(char_u *path_name, int mouse_pos) { -#if MM_ENABLE_CONV +#ifdef FEAT_MBYTE path_name = CONVERT_TO_UTF8(path_name); #endif [[MMBackend sharedInstance] showPopupMenuWithName:(char*)path_name atMouseLocation:mouse_pos]; -#if MM_ENABLE_CONV +#ifdef FEAT_MBYTE CONVERT_TO_UTF8_FREE(path_name); #endif } @@ -871,13 +871,13 @@ // for now we set the font here. // TODO! Proper font handling, the way Vim expects it. -#if MM_ENABLE_CONV +#ifdef FEAT_MBYTE font_name = CONVERT_TO_UTF8(font_name); #endif BOOL ok = [[MMBackend sharedInstance] setFontWithName:(char*)font_name]; -#if MM_ENABLE_CONV +#ifdef FEAT_MBYTE CONVERT_TO_UTF8_FREE(font_name); #endif @@ -1073,7 +1073,7 @@ } char_u *arg = eap->arg; -#if MM_ENABLE_CONV +#ifdef FEAT_MBYTE arg = CONVERT_TO_UTF8(arg); #endif @@ -1085,7 +1085,7 @@ EMSG2(_("E???: \"%s\" is not a valid action"), eap->arg); } -#if MM_ENABLE_CONV +#ifdef FEAT_MBYTE arg = CONVERT_TO_UTF8(arg); #endif } @@ -1140,7 +1140,7 @@ //NSLog(@"gui_mch_browse(saving=%d, title=%s, dflt=%s, ext=%s, initdir=%s," // " filter=%s", saving, title, dflt, ext, initdir, filter); -#if MM_ENABLE_CONV +#ifdef FEAT_MBYTE title = CONVERT_TO_UTF8(title); initdir = CONVERT_TO_UTF8(initdir); #endif @@ -1149,7 +1149,7 @@ browseForFileInDirectory:(char*)initdir title:(char*)title saving:saving]; -#if MM_ENABLE_CONV +#ifdef FEAT_MBYTE CONVERT_TO_UTF8_FREE(title); CONVERT_TO_UTF8_FREE(initdir); #endif @@ -1173,7 +1173,7 @@ // "dfltbutton=%d textfield=%s)", type, title, message, buttons, // dfltbutton, textfield); -#if MM_ENABLE_CONV +#ifdef FEAT_MBYTE title = CONVERT_TO_UTF8(title); message = CONVERT_TO_UTF8(message); buttons = CONVERT_TO_UTF8(buttons); @@ -1187,7 +1187,7 @@ buttons:(char*)buttons textField:(char*)textfield]; -#if MM_ENABLE_CONV +#ifdef FEAT_MBYTE CONVERT_TO_UTF8_FREE(title); CONVERT_TO_UTF8_FREE(message); CONVERT_TO_UTF8_FREE(buttons); @@ -1213,14 +1213,14 @@ guicolor_T gui_mch_get_color(char_u *name) { -#if MM_ENABLE_CONV +#ifdef FEAT_MBYTE name = CONVERT_TO_UTF8(name); #endif NSString *key = [NSString stringWithUTF8String:(char*)name]; guicolor_T col = [[MMBackend sharedInstance] lookupColorWithKey:key]; -#if MM_ENABLE_CONV +#ifdef FEAT_MBYTE CONVERT_TO_UTF8_FREE(name); #endif @@ -1277,7 +1277,7 @@ { BOOL ok = NO; -#if MM_ENABLE_CONV +#ifdef FEAT_MBYTE name = CONVERT_TO_UTF8(name); #endif @@ -1285,7 +1285,7 @@ if (value) ok = [[MMBackend sharedInstance] hasSpecialKeyWithValue:value]; -#if MM_ENABLE_CONV +#ifdef FEAT_MBYTE CONVERT_TO_UTF8_FREE(name); #endif @@ -1367,13 +1367,13 @@ { //NSLog(@"gui_mch_settitle(title=%s, icon=%s)", title, icon); -#if MM_ENABLE_CONV +#ifdef FEAT_MBYTE title = CONVERT_TO_UTF8(title); #endif [[MMBackend sharedInstance] setWindowTitle:(char*)title]; -#if MM_ENABLE_CONV +#ifdef FEAT_MBYTE CONVERT_TO_UTF8_FREE(title); #endif } @@ -1453,14 +1453,14 @@ void serverRegisterName(char_u *name) { -#if MM_ENABLE_CONV +#ifdef FEAT_MBYTE name = CONVERT_TO_UTF8(name); #endif NSString *svrName = [NSString stringWithUTF8String:(char*)name]; [[MMBackend sharedInstance] registerServerWithName:svrName]; -#if MM_ENABLE_CONV +#ifdef FEAT_MBYTE CONVERT_TO_UTF8_FREE(name); #endif } @@ -1474,7 +1474,7 @@ serverSendToVim(char_u *name, char_u *cmd, char_u **result, int *port, int asExpr, int silent) { -#if MM_ENABLE_CONV +#ifdef FEAT_MBYTE name = CONVERT_TO_UTF8(name); cmd = CONVERT_TO_UTF8(cmd); #endif @@ -1487,7 +1487,7 @@ expression:asExpr silent:silent]; -#if MM_ENABLE_CONV +#ifdef FEAT_MBYTE CONVERT_TO_UTF8_FREE(name); CONVERT_TO_UTF8_FREE(cmd); #endif @@ -1508,11 +1508,11 @@ if (list) { NSString *string = [list componentsJoinedByString:@"\n"]; char_u *s = (char_u*)[string UTF8String]; -#if MM_ENABLE_CONV +#ifdef FEAT_MBYTE s = CONVERT_FROM_UTF8(s); #endif names = vim_strsave(s); -#if MM_ENABLE_CONV +#ifdef FEAT_MBYTE CONVERT_FROM_UTF8_FREE(s); #endif } @@ -1550,7 +1550,7 @@ if (str && len > 0) { *str = (char_u*)[reply UTF8String]; -#if MM_ENABLE_CONV +#ifdef FEAT_MBYTE if (input_conv.vc_type != CONV_NONE) { char_u *s = string_convert(&input_conv, *str, &len); @@ -1583,11 +1583,11 @@ NSString *reply = [[MMBackend sharedInstance] waitForReplyOnPort:port]; if (reply && str) { char_u *s = (char_u*)[reply UTF8String]; -#if MM_ENABLE_CONV +#ifdef FEAT_MBYTE s = CONVERT_FROM_UTF8(s); #endif *str = vim_strsave(s); -#if MM_ENABLE_CONV +#ifdef FEAT_MBYTE CONVERT_FROM_UTF8_FREE(s); #endif return 0; @@ -1607,14 +1607,14 @@ int retval = -1; int port = serverStrToPort(serverid); if (port > 0 && reply) { -#if MM_ENABLE_CONV +#ifdef FEAT_MBYTE reply = CONVERT_TO_UTF8(reply); #endif BOOL ok = [[MMBackend sharedInstance] sendReply:[NSString stringWithUTF8String:(char*)reply] toPort:port]; retval = ok ? 0 : -1; -#if MM_ENABLE_CONV +#ifdef FEAT_MBYTE CONVERT_TO_UTF8_FREE(reply); #endif } diff --git a/src/gui.c b/src/gui.c index 7e4f890d72..49cf9a09e0 100644 --- a/src/gui.c +++ b/src/gui.c @@ -2204,7 +2204,7 @@ gui_outstr_nowrap(s, len, flags, fg, bg, back) #ifdef HAVE_GTK2 /* The value returned is the length in display cells */ len = gui_gtk2_draw_string(gui.row, col, s, len, draw_flags); -#elif defined(FEAT_GUI_MACVIM) +#elif defined(FEAT_GUI_MACVIM) && defined(FEAT_MBYTE) /* The value returned is the length in display cells */ len = gui_macvim_draw_string(gui.row, col, s, len, draw_flags); #else diff --git a/src/option.c b/src/option.c index 021729f022..d2d2fa5fe8 100644 --- a/src/option.c +++ b/src/option.c @@ -2951,7 +2951,7 @@ set_init_1() char_u *p; int opt_idx; long_u n; -#ifdef FEAT_GUI_MACVIM +#if defined(FEAT_GUI_MACVIM) && defined(FEAT_MBYTE) int did_mb_init; #endif From 67576e0281a1394754462ce84e515e21ae7f33a7 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sun, 4 Nov 2007 18:46:03 +0100 Subject: [PATCH 0317/1156] Only respond to left, right and middle mouse clicks. This effectively ignores mouse clicks when [NSEvent buttonNumber] > 2. --- src/MacVim/MMBackend.m | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/MacVim/MMBackend.m b/src/MacVim/MMBackend.m index 54b38607ec..adef02920f 100644 --- a/src/MacVim/MMBackend.m +++ b/src/MacVim/MMBackend.m @@ -1106,9 +1106,10 @@ - (oneway void)processInput:(int)msgid data:(in bycopy NSData *)data int count = *((int*)bytes); bytes += sizeof(int); button = eventButtonNumberToVimMouseButton(button); - flags = eventModifierFlagsToVimMouseModMask(flags); - - gui_send_mouse_event(button, col, row, count>1, flags); + if (button >= 0) { + flags = eventModifierFlagsToVimMouseModMask(flags); + gui_send_mouse_event(button, col, row, count>1, flags); + } } else if (MouseUpMsgID == msgid) { if (!data) return; const void *bytes = [data bytes]; @@ -2297,10 +2298,10 @@ static int eventModifierFlagsToVimMouseModMask(int modifierFlags) static int eventButtonNumberToVimMouseButton(int buttonNumber) { - static int mouseButton[] = { MOUSE_LEFT, MOUSE_RIGHT, MOUSE_MIDDLE, - MOUSE_X1, MOUSE_X2 }; + static int mouseButton[] = { MOUSE_LEFT, MOUSE_RIGHT, MOUSE_MIDDLE }; - return mouseButton[buttonNumber < 5 ? buttonNumber : 0]; + return (buttonNumber >= 0 && buttonNumber < 3) + ? mouseButton[buttonNumber] : -1; } static int specialKeyToNSKey(int key) From f1236d0fd36bddc2a0b139607c84b42e1e2c3fac Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Mon, 5 Nov 2007 15:44:27 +0100 Subject: [PATCH 0318/1156] Disable baseline change for underlined text. This fixes a display bug on Leopard where lines with underlined text were higher than lines without underlined text. --- src/MacVim/MMTextStorage.m | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/src/MacVim/MMTextStorage.m b/src/MacVim/MMTextStorage.m index 21bb518179..5cd014d463 100644 --- a/src/MacVim/MMTextStorage.m +++ b/src/MacVim/MMTextStorage.m @@ -229,25 +229,13 @@ - (void)replaceString:(NSString *)string atRow:(int)row column:(int)col else if (flags & DRAW_ITALIC) theFont = italicFont; - NSDictionary *attributes; - - if (flags & DRAW_UNDERC) { - // move the undercurl down a bit so it is visible - attributes = [NSDictionary dictionaryWithObjectsAndKeys: - theFont, NSFontAttributeName, - bg, NSBackgroundColorAttributeName, - fg, NSForegroundColorAttributeName, - sp, NSUnderlineColorAttributeName, - [NSNumber numberWithFloat:2],NSBaselineOffsetAttributeName, - nil]; - } else { - attributes = [NSDictionary dictionaryWithObjectsAndKeys: + NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys: theFont, NSFontAttributeName, bg, NSBackgroundColorAttributeName, fg, NSForegroundColorAttributeName, sp, NSUnderlineColorAttributeName, nil]; - } + [attribString setAttributes:attributes range:range]; if (flags & DRAW_UNDERL) { From 5aaf05255c5dc98a04ce49489d8e8f35fee76b1c Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Wed, 7 Nov 2007 19:46:46 +0100 Subject: [PATCH 0319/1156] Always open a dropped file in new tab Always use ":tab drop" when dropping files. (Used to call ":drop" when only one file was dropped but this would not open the file in a new tab.) --- src/MacVim/MMBackend.m | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/MacVim/MMBackend.m b/src/MacVim/MMBackend.m index adef02920f..b440f2b070 100644 --- a/src/MacVim/MMBackend.m +++ b/src/MacVim/MMBackend.m @@ -2010,9 +2010,7 @@ - (void)handleDropFiles:(NSData *)data // HACK! I'm not sure how to get Vim to open a list of files in // tabs, so instead I create a ':tab drop' command with all the // files to open and execute it. - NSMutableString *cmd = (n > 1) - ? [NSMutableString stringWithString:@":tab drop"] - : [NSMutableString stringWithString:@":drop"]; + NSMutableString *cmd = [NSMutableString stringWithString:@":tab drop"]; int i; for (i = 0; i < n && bytes < end; ++i) { From 0a1ac7a24e0e58b5de8ff565adcacaaeda82b3fd Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Wed, 7 Nov 2007 21:25:05 +0100 Subject: [PATCH 0320/1156] Launch Vim process via login shell, handle spaces in file names The user environment is not always sourced when MacVim starts. To solve this each Vim process is launched via a login shell like this: $SHELL -l -c "exec /path/to/Vim -g " Also make sure that if an argument contains a space then enclose it in quotes. --- src/MacVim/MMAppController.m | 68 +++++++++++++++++++++++------------- 1 file changed, 43 insertions(+), 25 deletions(-) diff --git a/src/MacVim/MMAppController.m b/src/MacVim/MMAppController.m index 5e8f9bfeb7..b3896efa30 100644 --- a/src/MacVim/MMAppController.m +++ b/src/MacVim/MMAppController.m @@ -34,6 +34,7 @@ - (void)openFile:(NSPasteboard *)pboard userData:(NSString *)userData @interface MMAppController (Private) - (MMVimController *)keyVimController; - (MMVimController *)topmostVimController; +- (void)launchVimProcessWithArguments:(NSArray *)args; @end @interface NSMenu (MMExtras) @@ -138,6 +139,7 @@ - (BOOL)applicationOpenUntitledFile:(NSApplication *)sender - (void)application:(NSApplication *)sender openFiles:(NSArray *)filenames { + // Go trough 'filenames' array and make sure each file exists. NSString *firstMissingFile = nil; NSMutableArray *files = [NSMutableArray array]; int i, count = [filenames count]; @@ -183,20 +185,9 @@ - (void)application:(NSApplication *)sender openFiles:(NSArray *)filenames if (openInTabs && (vc = [self topmostVimController])) { [vc dropFiles:files]; } else { - NSMutableArray *args = [NSMutableArray arrayWithObjects: - @"-g", @"-p", nil]; + NSMutableArray *args = [NSMutableArray arrayWithObject:@"-p"]; [args addObjectsFromArray:files]; - - NSString *path = [[NSBundle mainBundle] - pathForAuxiliaryExecutable:@"Vim"]; - if (!path) { - NSLog(@"ERROR: Vim executable could not be found inside app " - "bundle!"); - [NSApp replyToOpenOrPrint:NSApplicationDelegateReplyFailure]; - return; - } - - [NSTask launchedTaskWithLaunchPath:path arguments:args]; + [self launchVimProcessWithArguments:args]; } [NSApp replyToOpenOrPrint:NSApplicationDelegateReplySuccess]; @@ -363,17 +354,7 @@ - (void)windowControllerWillOpen:(MMWindowController *)windowController - (IBAction)newWindow:(id)sender { - NSMutableArray *args = [NSMutableArray arrayWithObject:@"-g"]; - NSString *path = [[NSBundle mainBundle] - pathForAuxiliaryExecutable:@"Vim"]; - if (!path) { - NSLog(@"ERROR: Vim executable could not be found inside app bundle!"); - return; - } - - - //NSLog(@"Launching a new VimTask..."); - [NSTask launchedTaskWithLaunchPath:path arguments:args]; + [self launchVimProcessWithArguments:nil]; } - (IBAction)selectNextWindow:(id)sender @@ -577,7 +558,44 @@ - (MMVimController *)topmostVimController return nil; } -@end +- (void)launchVimProcessWithArguments:(NSArray *)args +{ + NSString *path = [[NSBundle mainBundle] pathForAuxiliaryExecutable:@"Vim"]; + if (!path) { + NSLog(@"ERROR: Vim executable could not be found inside app bundle!"); + return; + } + + NSMutableString *execArg = [NSMutableString + stringWithFormat:@"exec \"%@\" -g", path]; + if (args) { + // Append all arguments while making sure that arguments containing + // spaces are enclosed in quotes. + NSCharacterSet *space = [NSCharacterSet whitespaceCharacterSet]; + unsigned i, count = [args count]; + + for (i = 0; i < count; ++i) { + NSString *arg = [args objectAtIndex:i]; + if (NSNotFound != [arg rangeOfCharacterFromSet:space].location) + [execArg appendFormat:@" \"%@\"", arg]; + else + [execArg appendFormat:@" %@", arg]; + } + } + + // Launch the process with a login shell so that users environment settings + // get sourced. This does not always happen when MacVim is started. + NSArray *shellArgs = [NSArray arrayWithObjects:@"-l", @"-c", execArg, nil]; + NSString *shell = [[[NSProcessInfo processInfo] environment] + objectForKey:@"SHELL"]; + if (!shell) + shell = @"/bin/sh"; + + //NSLog(@"Launching: %@ args: %@", shell, shellArgs); + [NSTask launchedTaskWithLaunchPath:shell arguments:shellArgs]; +} + +@end // MMAppController (Private) From 4d517a0f74e914d6343d6fb12d427ce15975af57 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Wed, 7 Nov 2007 22:07:21 +0100 Subject: [PATCH 0321/1156] Changed application termination procedure On applicationShoulTerminate: check the 'documentEdited' flag of each window to decide whether any buffers were modified instead of making a DO call to each Vim process. --- src/MacVim/MMAppController.m | 63 ++++++++++-------------------------- src/MacVim/MMBackend.m | 25 +++++++------- src/MacVim/MacVim.h | 1 - 3 files changed, 30 insertions(+), 59 deletions(-) diff --git a/src/MacVim/MMAppController.m b/src/MacVim/MMAppController.m index b3896efa30..e4cbf48648 100644 --- a/src/MacVim/MMAppController.m +++ b/src/MacVim/MMAppController.m @@ -18,9 +18,6 @@ static NSTimeInterval MMRequestTimeout = 5; static NSTimeInterval MMReplyTimeout = 5; -// Timeout used when the app should terminate. -static NSTimeInterval MMTerminateTimeout = 3; - @interface MMAppController (MMServices) @@ -205,60 +202,34 @@ - (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)sender - (NSApplicationTerminateReply)applicationShouldTerminate: (NSApplication *)sender { + // TODO: Follow Apple's guidelines for 'Graceful Application Termination' + // (in particular, allow user to review changes and save). int reply = NSTerminateNow; BOOL modifiedBuffers = NO; - BOOL notResponding = NO; - // Go through vim controllers, checking for modified buffers. If a process - // is not responding then note this as well. - unsigned i, count = [vimControllers count]; - for (i = 0; i < count; ++i) { - MMVimController *controller = [vimControllers objectAtIndex:i]; - id proxy = [controller backendProxy]; - NSConnection *connection = [proxy connectionForProxy]; - if (connection) { - NSTimeInterval req = [connection requestTimeout]; - NSTimeInterval rep = [connection replyTimeout]; - [connection setRequestTimeout:MMTerminateTimeout]; - [connection setReplyTimeout:MMTerminateTimeout]; - - @try { - if ([proxy checkForModifiedBuffers]) - modifiedBuffers = YES; - } - @catch (NSException *e) { - NSLog(@"WARNING: Got exception while waiting for " - "checkForModifiedBuffers: \"%@\"", e); - notResponding = YES; - } - @finally { - [connection setRequestTimeout:req]; - [connection setReplyTimeout:rep]; - if (modifiedBuffers || notResponding) - break; - } + // Go through windows, checking for modified buffers. (Each Vim process + // tells MacVim when any buffer has been modified and MacVim sets the + // 'documentEdited' flag of the window correspondingly.) + NSEnumerator *e = [[NSApp windows] objectEnumerator]; + id window; + while (window = [e nextObject]) { + if ([window isDocumentEdited]) { + modifiedBuffers = YES; + break; } } - if (modifiedBuffers || notResponding) { + if (modifiedBuffers) { NSAlert *alert = [[NSAlert alloc] init]; [alert addButtonWithTitle:@"Quit"]; [alert addButtonWithTitle:@"Cancel"]; - if (modifiedBuffers) { - [alert setMessageText:@"Quit without saving?"]; - [alert setInformativeText:@"There are modified buffers, " - "if you quit now all changes will be lost. Quit anyway?"]; - } else { - [alert setMessageText:@"Force Quit?"]; - [alert setInformativeText:@"At least one Vim process is not " - "responding, if you quit now any changes you have made " - "will be lost. Quit anyway?"]; - } + [alert setMessageText:@"Quit without saving?"]; + [alert setInformativeText:@"There are modified buffers, " + "if you quit now all changes will be lost. Quit anyway?"]; [alert setAlertStyle:NSWarningAlertStyle]; - if ([alert runModal] != NSAlertFirstButtonReturn) { + if ([alert runModal] != NSAlertFirstButtonReturn) reply = NSTerminateCancel; - } [alert release]; } @@ -273,7 +244,7 @@ - (void)applicationWillTerminate:(NSNotification *)aNotification [[NSConnection defaultConnection] invalidate]; // Send a SIGINT to all running Vim processes, so that they are sure to - // receive the connectionDidDie: notification (a process has to checking + // receive the connectionDidDie: notification (a process has to be checking // the run-loop for this to happen). unsigned i, count = [vimControllers count]; for (i = 0; i < count; ++i) { diff --git a/src/MacVim/MMBackend.m b/src/MacVim/MMBackend.m index b440f2b070..d947e140b7 100644 --- a/src/MacVim/MMBackend.m +++ b/src/MacVim/MMBackend.m @@ -70,6 +70,7 @@ - (void)handleScrollbarEvent:(NSData *)data; - (void)handleSetFont:(NSData *)data; - (void)handleDropFiles:(NSData *)data; - (void)handleDropString:(NSData *)data; +- (BOOL)checkForModifiedBuffers; @end @@ -1165,18 +1166,6 @@ - (oneway void)processInputAndData:(in bycopy NSArray *)messages } } -- (BOOL)checkForModifiedBuffers -{ - buf_T *buf; - for (buf = firstbuf; buf != NULL; buf = buf->b_next) { - if (bufIsChanged(buf)) { - return YES; - } - } - - return NO; -} - - (BOOL)starRegisterToPasteboard:(byref NSPasteboard *)pboard { if (VIsual_active && (State & NORMAL) && clip_star.available) { @@ -2084,6 +2073,18 @@ - (void)handleDropString:(NSData *)data #endif // FEAT_DND } +- (BOOL)checkForModifiedBuffers +{ + buf_T *buf; + for (buf = firstbuf; buf != NULL; buf = buf->b_next) { + if (bufIsChanged(buf)) { + return YES; + } + } + + return NO; +} + @end // MMBackend (Private) diff --git a/src/MacVim/MacVim.h b/src/MacVim/MacVim.h index e717c96031..db6d1b07fc 100644 --- a/src/MacVim/MacVim.h +++ b/src/MacVim/MacVim.h @@ -29,7 +29,6 @@ @protocol MMBackendProtocol - (oneway void)processInput:(int)msgid data:(in bycopy NSData *)data; - (oneway void)processInputAndData:(in bycopy NSArray *)messages; -- (BOOL)checkForModifiedBuffers; - (oneway void)setDialogReturn:(in bycopy id)obj; - (BOOL)starRegisterToPasteboard:(byref NSPasteboard *)pboard; @end From 702917f6ed86d0c091516ff25751b68c671c06df Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Wed, 7 Nov 2007 23:46:52 +0100 Subject: [PATCH 0322/1156] Add eval & add input methods to MacVim, apply to file open Now possible to evaluate expressions in a Vim process from MacVim [MMBackend evaluateExpression:], and to send arbitrary input to Vim [MMVimController addVimInput:]. Expression evaluation is used to query Vim state from within MacVim. When opening a file use these methods to check if it is already loaded, if so raise the corresponding window (doesn't work for multiple files). --- src/MacVim/MMAppController.m | 24 +++++++++ src/MacVim/MMBackend.m | 96 +++++++++++++++++++++--------------- src/MacVim/MMVimController.h | 2 +- src/MacVim/MMVimController.m | 12 +++++ src/MacVim/MacVim.h | 2 + src/MacVim/MacVim.m | 1 + 6 files changed, 95 insertions(+), 42 deletions(-) diff --git a/src/MacVim/MMAppController.m b/src/MacVim/MMAppController.m index e4cbf48648..f6815a7919 100644 --- a/src/MacVim/MMAppController.m +++ b/src/MacVim/MMAppController.m @@ -175,6 +175,30 @@ - (void)application:(NSApplication *)sender openFiles:(NSArray *)filenames return; } + if ([files count] == 1) { + // Check if the file is already open...if so raise that window. + i, count = [vimControllers count]; + for (i = 0; i < count; ++i) { + MMVimController *controller = [vimControllers objectAtIndex:i]; + id proxy = [controller backendProxy]; + + @try { + NSString *expr = [NSString stringWithFormat: + @"bufloaded(\"%@\")", [files objectAtIndex:0]]; + NSString *eval = [proxy evaluateExpression:expr]; + if ([eval isEqual:@"1"]) { + // TODO: Select the tab with 'file' open. + [controller addVimInput: + @":cal foreground()"]; + return; + } + } + @catch (NSException *e) { + // Do nothing ... + } + } + } + MMVimController *vc; BOOL openInTabs = [[NSUserDefaults standardUserDefaults] boolForKey:MMOpenFilesInTabsKey]; diff --git a/src/MacVim/MMBackend.m b/src/MacVim/MMBackend.m index d947e140b7..4d77f760d8 100644 --- a/src/MacVim/MMBackend.m +++ b/src/MacVim/MMBackend.m @@ -71,6 +71,7 @@ - (void)handleSetFont:(NSData *)data; - (void)handleDropFiles:(NSData *)data; - (void)handleDropString:(NSData *)data; - (BOOL)checkForModifiedBuffers; +- (void)addInput:(NSString *)input; @end @@ -1139,6 +1140,13 @@ - (oneway void)processInput:(int)msgid data:(in bycopy NSData *)data int col = *((int*)bytes); bytes += sizeof(int); gui_mouse_moved(col, row); + } else if (AddInputMsgID == msgid) { + NSString *string = [[NSString alloc] initWithData:data + encoding:NSUTF8StringEncoding]; + if (string) { + [self addInput:string]; + [string release]; + } } else { // Not keyboard or mouse event, queue it and handle later. //NSLog(@"Add event %s to input event queue", MessageStrings[msgid]); @@ -1166,6 +1174,36 @@ - (oneway void)processInputAndData:(in bycopy NSArray *)messages } } +- (NSString *)evaluateExpression:(in bycopy NSString *)expr +{ + NSString *eval = nil; + char_u *s = (char_u*)[expr UTF8String]; + +#ifdef FEAT_MBYTE + s = CONVERT_FROM_UTF8(s); +#endif + + char_u *res = eval_client_expr_to_string(s); + +#ifdef FEAT_MBYTE + CONVERT_FROM_UTF8_FREE(s); +#endif + + if (res != NULL) { + s = res; +#ifdef FEAT_MBYTE + s = CONVERT_TO_UTF8(s); +#endif + eval = [NSString stringWithUTF8String:(char*)s]; +#ifdef FEAT_MBYTE + CONVERT_TO_UTF8_FREE(s); +#endif + vim_free(res); + } + + return eval; +} + - (BOOL)starRegisterToPasteboard:(byref NSPasteboard *)pboard { if (VIsual_active && (State & NORMAL) && clip_star.available) { @@ -1237,18 +1275,7 @@ - (void)addInput:(in bycopy NSString *)input { //NSLog(@"addInput:%@ client:%@", input, (id)client); - char_u *s = (char_u*)[input UTF8String]; - -#ifdef FEAT_MBYTE - s = CONVERT_FROM_UTF8(s); -#endif - - server_to_input_buf(s); - -#ifdef FEAT_MBYTE - CONVERT_FROM_UTF8_FREE(s); -#endif - + [self addInput:input]; [self addClient:(id)client]; inputReceived = YES; @@ -1257,36 +1284,8 @@ - (void)addInput:(in bycopy NSString *)input - (NSString *)evaluateExpression:(in bycopy NSString *)expr client:(in byref id )client { - //NSLog(@"evaluateExpression:%@ client:%@", expr, (id)client); - - NSString *eval = nil; - char_u *s = (char_u*)[expr UTF8String]; - -#ifdef FEAT_MBYTE - s = CONVERT_FROM_UTF8(s); -#endif - - char_u *res = eval_client_expr_to_string(s); - -#ifdef FEAT_MBYTE - CONVERT_FROM_UTF8_FREE(s); -#endif - - if (res != NULL) { - s = res; -#ifdef FEAT_MBYTE - s = CONVERT_TO_UTF8(s); -#endif - eval = [NSString stringWithUTF8String:(char*)s]; -#ifdef FEAT_MBYTE - CONVERT_TO_UTF8_FREE(s); -#endif - vim_free(res); - } - [self addClient:(id)client]; - - return eval; + return [self evaluateExpression:expr]; } - (void)registerServerWithName:(NSString *)name @@ -2085,6 +2084,21 @@ - (BOOL)checkForModifiedBuffers return NO; } +- (void)addInput:(NSString *)input +{ + char_u *s = (char_u*)[input UTF8String]; + +#ifdef FEAT_MBYTE + s = CONVERT_FROM_UTF8(s); +#endif + + server_to_input_buf(s); + +#ifdef FEAT_MBYTE + CONVERT_FROM_UTF8_FREE(s); +#endif +} + @end // MMBackend (Private) diff --git a/src/MacVim/MMVimController.h b/src/MacVim/MMVimController.h index c8fb1183bc..e53e5fdf00 100644 --- a/src/MacVim/MMVimController.h +++ b/src/MacVim/MMVimController.h @@ -54,7 +54,7 @@ - (void)sendMessage:(int)msgid data:(NSData *)data; - (BOOL)sendMessageNow:(int)msgid data:(NSData *)data timeout:(NSTimeInterval)timeout; - +- (void)addVimInput:(NSString *)string; @end // vim: set ft=objc: diff --git a/src/MacVim/MMVimController.m b/src/MacVim/MMVimController.m index 0f0a3c60ee..b06b78b7e3 100644 --- a/src/MacVim/MMVimController.m +++ b/src/MacVim/MMVimController.m @@ -284,6 +284,17 @@ - (BOOL)sendMessageNow:(int)msgid data:(NSData *)data return sendOk; } +- (void)addVimInput:(NSString *)string +{ + // This is a very general method of adding input to the Vim process. It is + // basically the same as calling remote_send() on the process (see + // ':h remote_send'). + if (string) { + NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding]; + [self sendMessage:AddInputMsgID data:data]; + } +} + - (id)backendProxy { return backendProxy; @@ -757,6 +768,7 @@ - (void)handleMessage:(int)msgid data:(NSData *)data [windowController adjustLinespace:linespace]; } else if (ActivateMsgID == msgid) { + //NSLog(@"ActivateMsgID"); [NSApp activateIgnoringOtherApps:YES]; [[windowController window] makeKeyAndOrderFront:self]; } else if (SetServerNameMsgID == msgid) { diff --git a/src/MacVim/MacVim.h b/src/MacVim/MacVim.h index db6d1b07fc..e497c30ac4 100644 --- a/src/MacVim/MacVim.h +++ b/src/MacVim/MacVim.h @@ -30,6 +30,7 @@ - (oneway void)processInput:(int)msgid data:(in bycopy NSData *)data; - (oneway void)processInputAndData:(in bycopy NSArray *)messages; - (oneway void)setDialogReturn:(in bycopy id)obj; +- (NSString *)evaluateExpression:(in bycopy NSString *)expr; - (BOOL)starRegisterToPasteboard:(byref NSPasteboard *)pboard; @end @@ -152,6 +153,7 @@ enum { LeaveFullscreenMsgID, BuffersNotModifiedMsgID, BuffersModifiedMsgID, + AddInputMsgID, }; diff --git a/src/MacVim/MacVim.m b/src/MacVim/MacVim.m index 5ad21d863a..23e903259b 100644 --- a/src/MacVim/MacVim.m +++ b/src/MacVim/MacVim.m @@ -63,6 +63,7 @@ "LeaveFullscreenMsgID", "BuffersNotModifiedMsgID", "BuffersModifiedMsgID", + "AddInputMsgID", }; From 94e4efed2d7d174586dffdef1c8df47f43aeee8f Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Thu, 8 Nov 2007 20:14:34 +0100 Subject: [PATCH 0323/1156] Don't attempt to open dropped file that is already open When a file is dropped, each Vim process is checked to see if the file is already open. If so, raise the corresponding window and select the tab that holds the opened file. Only works when one file is dropped. --- src/MacVim/MMAppController.m | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/MacVim/MMAppController.m b/src/MacVim/MMAppController.m index f6815a7919..652ca91133 100644 --- a/src/MacVim/MMAppController.m +++ b/src/MacVim/MMAppController.m @@ -181,15 +181,20 @@ - (void)application:(NSApplication *)sender openFiles:(NSArray *)filenames for (i = 0; i < count; ++i) { MMVimController *controller = [vimControllers objectAtIndex:i]; id proxy = [controller backendProxy]; + NSString *file = [[files objectAtIndex:0] + stringByEscapingSpecialFilenameCharacters]; @try { NSString *expr = [NSString stringWithFormat: - @"bufloaded(\"%@\")", [files objectAtIndex:0]]; + @"bufloaded(\"%@\")", file]; NSString *eval = [proxy evaluateExpression:expr]; if ([eval isEqual:@"1"]) { // TODO: Select the tab with 'file' open. - [controller addVimInput: - @":cal foreground()"]; + NSString *input = [NSString stringWithFormat:@"" + ":let oldswb=&swb|let &swb=\"useopen,usetab\"|" + "tab sb %@|let &swb=oldswb|unl oldswb|" + "cal foreground()|redr|f", file]; + [controller addVimInput:input]; return; } } From 9d16bac36881cb424a80b4093a7b46e6e2ce641d Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sun, 11 Nov 2007 15:09:22 +0100 Subject: [PATCH 0324/1156] New text drawing model, better unicode support, 'gfw' support, etc. Characters and columns are no longer assumed to be in one-to-one correspondence. Thus when modifying the text storage a (row,column) pair must be searched for. This is managed using [NSString rangeOfComposedCharacterSequenceAtIndex:] and by marking wide characters with an attribute (called "MMWideChar"). We also provide an optimized code path for when characters and columns are in one-to-one correspondence (no wide chars, only chars that can be represented by one utf16 character). A new typesetter is also used. Instead of overriding layoutGlyphsInLayoutManager:::: we override willSetLineFragmentRect::::. This typesetter can handle composing characters, whereas the old typesetter couldn't (it can still be used by setting the user default "MMTypesetter" to "MMTypesetter2".) Note that text rendering still has flaws, the Cocoa Text System and Vim has different opinions on how much space certain characters take up and this results in display bugs. (E.g. nonspacing marks such as U+064C are problematic.) Also, sometimes the layout manager hides glyphs but Vim assumes that each character is displayed (resulting in yet more display bugs). Added support for 'guifontwide'. This can be set to anything (different font size); it is quite possible to set it so that the display becomes completely messed up. --- src/MacVim/MMAppController.m | 19 + src/MacVim/MMApplication.m | 5 + src/MacVim/MMBackend.h | 8 +- src/MacVim/MMBackend.m | 130 +++---- src/MacVim/MMFullscreenWindow.m | 5 + src/MacVim/MMTextStorage.h | 33 +- src/MacVim/MMTextStorage.m | 640 ++++++++++++++++++++++---------- src/MacVim/MMTextView.m | 22 +- src/MacVim/MMTypesetter.h | 8 +- src/MacVim/MMTypesetter.m | 234 +++++++----- src/MacVim/MMVimController.h | 2 - src/MacVim/MMVimController.m | 46 ++- src/MacVim/MMVimView.m | 17 +- src/MacVim/MMWindowController.h | 1 + src/MacVim/MMWindowController.m | 11 + src/MacVim/MacVim.h | 9 +- src/MacVim/MacVim.m | 5 + src/MacVim/gui_macvim.m | 210 ++++++----- 18 files changed, 917 insertions(+), 488 deletions(-) diff --git a/src/MacVim/MMAppController.m b/src/MacVim/MMAppController.m index 652ca91133..25b7f1018e 100644 --- a/src/MacVim/MMAppController.m +++ b/src/MacVim/MMAppController.m @@ -7,6 +7,24 @@ * Do ":help credits" in Vim to see a list of people who contributed. * See README.txt for an overview of the Vim source code. */ +/* + * MMAppController + * + * MMAppController is the delegate of NSApp and as such handles file open + * requests, application termination, etc. It sets up a named NSConnection on + * which it listens to incoming connections from Vim processes. It also + * coordinates all MMVimControllers. + * + * A new Vim process is started by calling launchVimProcessWithArguments:. + * When the Vim process is initialized it notifies the app controller by + * sending a connectBackend:pid: message. At this point a new MMVimController + * is allocated. Afterwards, the Vim process communicates directly with its + * MMVimController. + * + * A Vim process started from the command line connects directly by sending the + * connectBackend:pid: message (launchVimProcessWithArguments: is never called + * in this case). + */ #import "MMAppController.h" #import "MMVimController.h" @@ -63,6 +81,7 @@ + (void)initialize [NSNumber numberWithFloat:-1], MMBaselineOffsetKey, [NSNumber numberWithBool:YES], MMTranslateCtrlClickKey, [NSNumber numberWithBool:NO], MMOpenFilesInTabsKey, + [NSNumber numberWithBool:NO], MMNoFontSubstitutionKey, nil]; [[NSUserDefaults standardUserDefaults] registerDefaults:dict]; diff --git a/src/MacVim/MMApplication.m b/src/MacVim/MMApplication.m index 4aab703b13..a21540e282 100644 --- a/src/MacVim/MMApplication.m +++ b/src/MacVim/MMApplication.m @@ -7,6 +7,11 @@ * Do ":help credits" in Vim to see a list of people who contributed. * See README.txt for an overview of the Vim source code. */ +/* + * MMApplication + * + * Some default NSApplication key input behavior is overridden here. + */ #import "MMApplication.h" diff --git a/src/MacVim/MMBackend.h b/src/MacVim/MMBackend.h index f28c64dbf7..2f8cc74cfe 100644 --- a/src/MacVim/MMBackend.h +++ b/src/MacVim/MMBackend.h @@ -43,6 +43,7 @@ NSMutableDictionary *serverReplyDict; NSString *alternateServerName; ATSFontContainerRef fontContainerRef; + NSFont *oldWideFont; } + (MMBackend *)sharedInstance; @@ -60,8 +61,8 @@ toRow:(int)row2 column:(int)col2; - (void)deleteLinesFromRow:(int)row count:(int)count scrollBottom:(int)bottom left:(int)left right:(int)right; -- (void)replaceString:(char*)s length:(int)len row:(int)row column:(int)col - flags:(int)flags; +- (void)drawString:(char*)s length:(int)len row:(int)row column:(int)col + cells:(int)cells flags:(int)flags; - (void)insertLinesFromRow:(int)row count:(int)count scrollBottom:(int)bottom left:(int)left right:(int)right; - (void)drawCursorAtRow:(int)row column:(int)col shape:(int)shape @@ -96,7 +97,8 @@ - (void)setScrollbarPosition:(int)pos length:(int)len identifier:(long)ident; - (void)setScrollbarThumbValue:(long)val size:(long)size max:(long)max identifier:(long)ident; -- (BOOL)setFontWithName:(char *)name; +- (void)setFont:(NSFont *)font; +- (void)setWideFont:(NSFont *)font; - (void)executeActionWithName:(NSString *)name; - (void)setMouseShape:(int)shape; - (void)setBlinkWait:(int)wait on:(int)on off:(int)off; diff --git a/src/MacVim/MMBackend.m b/src/MacVim/MMBackend.m index 4d77f760d8..9dcf64ed93 100644 --- a/src/MacVim/MMBackend.m +++ b/src/MacVim/MMBackend.m @@ -7,6 +7,25 @@ * Do ":help credits" in Vim to see a list of people who contributed. * See README.txt for an overview of the Vim source code. */ +/* + * MMBackend + * + * MMBackend communicates with the frontend (MacVim). It maintains a queue of + * output which is flushed to the frontend under controlled circumstances (so + * as to maintain a steady framerate). Input from the frontend is also handled + * here. + * + * The frontend communicates with the backend via the MMBackendProtocol. In + * particular, input is sent to the backend via processInput:data: and Vim + * state can be queried from the frontend with evaluateExpression:. + * + * It is very important to realize that all state is held by the backend, the + * frontend must either ask for state [MMBackend evaluateExpression:] or wait + * for the backend to update [MMVimController processCommandQueue:]. + * + * The client/server functionality of Vim is handled by the backend. It sets + * up a named NSConnection to which other Vim processes can connect. + */ #import "MMBackend.h" @@ -30,10 +49,6 @@ static unsigned MMServerMax = 1000; -// NOTE: The default font is bundled with the application. -static NSString *MMDefaultFontName = @"DejaVu Sans Mono"; -static float MMDefaultFontSize = 12.0f; - // TODO: Move to separate file. static int eventModifierFlagsToVimModMask(int modifierFlags); static int vimModMaskToEventModifierFlags(int mods); @@ -134,6 +149,7 @@ - (void)dealloc //NSLog(@"%@ %s", [self className], _cmd); [[NSNotificationCenter defaultCenter] removeObserver:self]; + [oldWideFont release]; oldWideFont = nil; [blinkTimer release]; blinkTimer = nil; [alternateServerName release]; alternateServerName = nil; [serverReplyDict release]; serverReplyDict = nil; @@ -319,12 +335,12 @@ - (void)deleteLinesFromRow:(int)row count:(int)count [drawData appendBytes:&right length:sizeof(int)]; } -- (void)replaceString:(char*)s length:(int)len row:(int)row column:(int)col - flags:(int)flags +- (void)drawString:(char*)s length:(int)len row:(int)row column:(int)col + cells:(int)cells flags:(int)flags { - if (len <= 0) return; + if (len <= 0 || cells <= 0) return; - int type = ReplaceStringDrawType; + int type = DrawStringDrawType; [drawData appendBytes:&type length:sizeof(int)]; @@ -333,6 +349,7 @@ - (void)replaceString:(char*)s length:(int)len row:(int)row column:(int)col [drawData appendBytes:&specialColor length:sizeof(unsigned)]; [drawData appendBytes:&row length:sizeof(int)]; [drawData appendBytes:&col length:sizeof(int)]; + [drawData appendBytes:&cells length:sizeof(int)]; [drawData appendBytes:&flags length:sizeof(int)]; [drawData appendBytes:&len length:sizeof(int)]; [drawData appendBytes:s length:len]; @@ -392,6 +409,13 @@ - (void)flushQueue:(BOOL)force return; if ([drawData length] > 0) { + // HACK! Detect changes to 'guifontwide'. + if (gui.wide_font != (GuiFont)oldWideFont) { + [oldWideFont release]; + oldWideFont = [(NSFont*)gui.wide_font retain]; + [self setWideFont:oldWideFont]; + } + [self queueMessage:BatchDrawMsgID data:[drawData copy]]; [drawData setLength:0]; } @@ -818,81 +842,35 @@ - (void)setScrollbarThumbValue:(long)val size:(long)size max:(long)max [self queueMessage:SetScrollbarThumbMsgID data:data]; } -- (BOOL)setFontWithName:(char *)name +- (void)setFont:(NSFont *)font { - NSString *fontName = MMDefaultFontName; - float size = MMDefaultFontSize; - BOOL parseFailed = NO; - - if (name) { - fontName = [NSString stringWithUTF8String:name]; - - if ([fontName isEqual:@"*"]) { - // :set gfn=* shows the font panel. - do_cmdline_cmd((char_u*)":macaction orderFrontFontPanel:"); - return NO; - } + NSString *fontName = [font displayName]; + float size = [font pointSize]; + int len = [fontName lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; + if (len > 0) { + NSMutableData *data = [NSMutableData data]; - NSArray *components = [fontName componentsSeparatedByString:@":"]; - if ([components count] == 2) { - NSString *sizeString = [components lastObject]; - if ([sizeString length] > 0 - && [sizeString characterAtIndex:0] == 'h') { - sizeString = [sizeString substringFromIndex:1]; - if ([sizeString length] > 0) { - size = [sizeString floatValue]; - fontName = [components objectAtIndex:0]; - } - } else { - parseFailed = YES; - } - } else if ([components count] > 2) { - parseFailed = YES; - } + [data appendBytes:&size length:sizeof(float)]; + [data appendBytes:&len length:sizeof(int)]; + [data appendBytes:[fontName UTF8String] length:len]; - if (!parseFailed) { - // Replace underscores with spaces. - fontName = [[fontName componentsSeparatedByString:@"_"] - componentsJoinedByString:@" "]; - } + [self queueMessage:SetFontMsgID data:data]; } +} - if (!parseFailed && [fontName length] > 0) { - if (size < 6 || size > 100) { - // Font size 0.0 tells NSFont to use the 'user default size'. - size = 0.0f; - } - - NSFont *font = [NSFont fontWithName:fontName size:size]; - - if (!font && MMDefaultFontName == fontName) { - // If for some reason the MacVim default font is not in the app - // bundle, then fall back on the system default font. - size = 0; - font = [NSFont userFixedPitchFontOfSize:size]; - fontName = [font displayName]; - } - - if (font) { - //NSLog(@"Setting font '%@' of size %.2f", fontName, size); - int len = [fontName - lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; - if (len > 0) { - NSMutableData *data = [NSMutableData data]; - - [data appendBytes:&size length:sizeof(float)]; - [data appendBytes:&len length:sizeof(int)]; - [data appendBytes:[fontName UTF8String] length:len]; +- (void)setWideFont:(NSFont *)font +{ + NSString *fontName = [font displayName]; + float size = [font pointSize]; + int len = [fontName lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; + NSMutableData *data = [NSMutableData data]; - [self queueMessage:SetFontMsgID data:data]; - return YES; - } - } - } + [data appendBytes:&size length:sizeof(float)]; + [data appendBytes:&len length:sizeof(int)]; + if (len > 0) + [data appendBytes:[fontName UTF8String] length:len]; - //NSLog(@"WARNING: Cannot set font with name '%@' of size %.2f", - // fontName, size); - return NO; + [self queueMessage:SetWideFontMsgID data:data]; } - (void)executeActionWithName:(NSString *)name diff --git a/src/MacVim/MMFullscreenWindow.m b/src/MacVim/MMFullscreenWindow.m index 9ebc2d5965..360ff3b994 100644 --- a/src/MacVim/MMFullscreenWindow.m +++ b/src/MacVim/MMFullscreenWindow.m @@ -7,6 +7,11 @@ * Do ":help credits" in Vim to see a list of people who contributed. * See README.txt for an overview of the Vim source code. */ +/* + * MMFullscreen + * + * Support for full-screen editing. + */ #import "MMFullscreenWindow.h" #import diff --git a/src/MacVim/MMTextStorage.h b/src/MacVim/MMTextStorage.h index 50f3e6d10b..9cc03104e0 100644 --- a/src/MacVim/MMTextStorage.h +++ b/src/MacVim/MMTextStorage.h @@ -11,6 +11,17 @@ #import +#define MM_USE_ROW_CACHE 1 + + +#if MM_USE_ROW_CACHE +typedef struct { + unsigned length; // length of row in unichars + int col; // last column accessed (in this row) + unsigned colOffset; // offset of 'col' from start of row (in unichars) +} MMRowCacheEntry; +#endif + @interface MMTextStorage : NSTextStorage { @@ -22,15 +33,25 @@ NSFont *boldFont; NSFont *italicFont; NSFont *boldItalicFont; + NSFont *fontWide; + NSFont *boldFontWide; + NSFont *italicFontWide; + NSFont *boldItalicFontWide; NSColor *defaultBackgroundColor; NSColor *defaultForegroundColor; NSSize cellSize; float linespace; +#if MM_USE_ROW_CACHE + MMRowCacheEntry *rowCache; +#endif + BOOL characterEqualsColumn; } - (NSString *)string; - (NSDictionary *)attributesAtIndex:(unsigned)index effectiveRange:(NSRangePointer)aRange; +- (id)attribute:(NSString *)attrib atIndex:(unsigned)index + effectiveRange:(NSRangePointer)range; - (void)replaceCharactersInRange:(NSRange)aRange withString:(NSString *)aString; - (void)setAttributes:(NSDictionary *)attributes range:(NSRange)aRange; @@ -43,9 +64,10 @@ - (void)setLinespace:(float)newLinespace; - (void)getMaxRows:(int*)rows columns:(int*)cols; - (void)setMaxRows:(int)rows columns:(int)cols; -- (void)replaceString:(NSString *)string atRow:(int)row column:(int)col - withFlags:(int)flags foregroundColor:(NSColor *)fg - backgroundColor:(NSColor *)bg specialColor:(NSColor *)sp; +- (void)drawString:(NSString *)string atRow:(int)row column:(int)col + cells:(int)cells withFlags:(int)flags + foregroundColor:(NSColor *)fg backgroundColor:(NSColor *)bg + specialColor:(NSColor *)sp; - (void)deleteLinesFromRow:(int)row lineCount:(int)count scrollBottom:(int)bottom left:(int)left right:(int)right color:(NSColor *)color; @@ -58,6 +80,7 @@ - (void)setDefaultColorsBackground:(NSColor *)bgColor foreground:(NSColor *)fgColor; - (void)setFont:(NSFont *)newFont; +- (void)setWideFont:(NSFont *)newFont; - (NSFont *)font; - (NSColor *)defaultBackgroundColor; - (NSColor *)defaultForegroundColor; @@ -69,5 +92,9 @@ - (BOOL)resizeToFitSize:(NSSize)size; - (NSSize)fitToSize:(NSSize)size; - (NSSize)fitToSize:(NSSize)size rows:(int *)rows columns:(int *)columns; +- (NSRect)boundingRectForCharacterAtRow:(int)row column:(int)col; +#if MM_USE_ROW_CACHE +- (MMRowCacheEntry *)rowCache; +#endif @end diff --git a/src/MacVim/MMTextStorage.m b/src/MacVim/MMTextStorage.m index 5cd014d463..336d51839c 100644 --- a/src/MacVim/MMTextStorage.m +++ b/src/MacVim/MMTextStorage.m @@ -7,6 +7,11 @@ * Do ":help credits" in Vim to see a list of people who contributed. * See README.txt for an overview of the Vim source code. */ +/* + * MMTextStorage + * + * Text rendering related code. + */ #import "MMTextStorage.h" #import "MacVim.h" @@ -22,12 +27,18 @@ #define DRAW_UNDERL 0x04 /* draw underline text */ #define DRAW_UNDERC 0x08 /* draw undercurl text */ #define DRAW_ITALIC 0x10 /* draw italic text */ +#define DRAW_CURSOR 0x20 + + +static NSString *MMWideCharacterAttributeName = @"MMWideChar"; @interface MMTextStorage (Private) - (void)lazyResize:(BOOL)force; +- (NSRange)charRangeForRow:(int)row column:(int)col cells:(int)cells; +- (void)fixInvalidCharactersInRange:(NSRange)range; @end @@ -41,9 +52,6 @@ - (id)init // NOTE! It does not matter which font is set here, Vim will set its // own font on startup anyway. Just set some bogus values. font = [[NSFont userFixedPitchFontOfSize:0] retain]; - boldFont = [font retain]; - italicFont = [font retain]; - boldItalicFont = [font retain]; cellSize.height = [font pointSize]; cellSize.width = [font defaultLineHeightForFont]; } @@ -53,9 +61,17 @@ - (id)init - (void)dealloc { - //NSLog(@"%@ %s", [self className], _cmd); - +#if MM_USE_ROW_CACHE + if (rowCache) { + free(rowCache); + rowCache = NULL; + } +#endif [emptyRowString release]; + [boldItalicFontWide release]; + [italicFontWide release]; + [boldFontWide release]; + [fontWide release]; [boldItalicFont release]; [italicFont release]; [boldFont release]; @@ -68,30 +84,31 @@ - (void)dealloc - (NSString *)string { - //NSLog(@"%s : attribString=%@", _cmd, attribString); return [attribString string]; } - (NSDictionary *)attributesAtIndex:(unsigned)index effectiveRange:(NSRangePointer)range { - //NSLog(@"%s", _cmd); - if (index>=[attribString length]) { - //NSLog(@"%sWARNING: index (%d) out of bounds", _cmd, index); - if (range) { + if (index >= [attribString length]) { + if (range) *range = NSMakeRange(NSNotFound, 0); - } + return [NSDictionary dictionary]; } return [attribString attributesAtIndex:index effectiveRange:range]; } +- (id)attribute:(NSString *)attrib atIndex:(unsigned)index + effectiveRange:(NSRangePointer)range +{ + return [attribString attribute:attrib atIndex:index effectiveRange:range]; +} + - (void)replaceCharactersInRange:(NSRange)range withString:(NSString *)string { - //NSLog(@"replaceCharactersInRange:(%d,%d) withString:%@", range.location, - // range.length, string); NSLog(@"WARNING: calling %s on MMTextStorage is unsupported", _cmd); //[attribString replaceCharactersInRange:range withString:string]; } @@ -102,22 +119,28 @@ - (void)setAttributes:(NSDictionary *)attributes range:(NSRange)range // constantly to 'fix attributes', apply font substitution, etc. #if 0 [attribString setAttributes:attributes range:range]; -#else +#elif 1 // HACK! If the font attribute is being modified, then ensure that the new // font has a fixed advancement which is either the same as the current // font or twice that, depending on whether it is a 'wide' character that - // is being fixed or not. This code really only works if 'range' has - // length 1 or 2. + // is being fixed or not. + // + // TODO: This code assumes that the characters in 'range' all have the same + // width. NSFont *newFont = [attributes objectForKey:NSFontAttributeName]; if (newFont) { + // Allow disabling of font substitution via a user default. Not + // recommended since the typesetter hides the corresponding glyphs and + // the display gets messed up. + if ([[NSUserDefaults standardUserDefaults] + boolForKey:MMNoFontSubstitutionKey]) + return; + float adv = cellSize.width; - if ([attribString length] > range.location+1) { - // If the first char is followed by zero-width space, then it is a - // 'wide' character, so double the advancement. - NSString *string = [attribString string]; - if ([string characterAtIndex:range.location+1] == 0x200b) - adv += adv; - } + if ([attribString attribute:MMWideCharacterAttributeName + atIndex:range.location + effectiveRange:NULL]) + adv += adv; // Create a new font which has the 'fixed advance attribute' set. NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys: @@ -192,9 +215,10 @@ - (void)setMaxRows:(int)rows columns:(int)cols maxColumns = cols; } -- (void)replaceString:(NSString *)string atRow:(int)row column:(int)col - withFlags:(int)flags foregroundColor:(NSColor *)fg - backgroundColor:(NSColor *)bg specialColor:(NSColor *)sp +- (void)drawString:(NSString *)string atRow:(int)row column:(int)col + cells:(int)cells withFlags:(int)flags + foregroundColor:(NSColor *)fg backgroundColor:(NSColor *)bg + specialColor:(NSColor *)sp { //NSLog(@"replaceString:atRow:%d column:%d withFlags:%d " // "foreground:%@ background:%@ special:%@", @@ -202,59 +226,75 @@ - (void)replaceString:(NSString *)string atRow:(int)row column:(int)col [self lazyResize:NO]; if (row < 0 || row >= maxRows || col < 0 || col >= maxColumns - || col+[string length] > maxColumns) { - //NSLog(@"[%s] WARNING : out of range, row=%d (%d) col=%d (%d) " - // "length=%d (%d)", _cmd, row, maxRows, col, maxColumns, - // [string length], [attribString length]); + || col+cells > maxColumns || !string || !(fg && bg && sp)) return; - } - // NOTE: If 'string' was initialized with bad data it might be nil; this - // may be due to 'enc' being set to an unsupported value, so don't print an - // error message or stdout will most likely get flooded. - if (!string) return; - - if (!(fg && bg && sp)) { - NSLog(@"[%s] WARNING: background, foreground or special color not " - "specified", _cmd); + // Find range of characters in text storage to replace. + NSRange range = [self charRangeForRow:row column:col cells:cells]; + if (NSMaxRange(range) > [[attribString string] length]) { + NSLog(@"%s Out of bounds"); return; } - NSRange range = NSMakeRange(col+row*(maxColumns+1), [string length]); - [attribString replaceCharactersInRange:range withString:string]; - + // Create dictionary of attributes to apply to the new characters. NSFont *theFont = font; - if (flags & DRAW_BOLD) - theFont = flags & DRAW_ITALIC ? boldItalicFont : boldFont; - else if (flags & DRAW_ITALIC) - theFont = italicFont; + if (flags & DRAW_WIDE) { + if (flags & DRAW_BOLD) + theFont = flags & DRAW_ITALIC ? boldItalicFontWide : boldFontWide; + else if (flags & DRAW_ITALIC) + theFont = italicFontWide; + else + theFont = fontWide; + } else { + if (flags & DRAW_BOLD) + theFont = flags & DRAW_ITALIC ? boldItalicFont : boldFont; + else if (flags & DRAW_ITALIC) + theFont = italicFont; + } - NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys: + NSMutableDictionary *attributes = + [NSMutableDictionary dictionaryWithObjectsAndKeys: theFont, NSFontAttributeName, bg, NSBackgroundColorAttributeName, fg, NSForegroundColorAttributeName, sp, NSUnderlineColorAttributeName, nil]; - [attribString setAttributes:attributes range:range]; - if (flags & DRAW_UNDERL) { NSNumber *value = [NSNumber numberWithInt:(NSUnderlineStyleSingle | NSUnderlinePatternSolid)]; // | NSUnderlineByWordMask - [attribString addAttribute:NSUnderlineStyleAttributeName - value:value range:range]; + [attributes setObject:value forKey:NSUnderlineStyleAttributeName]; } - // TODO: figure out how do draw proper undercurls if (flags & DRAW_UNDERC) { + // TODO: figure out how do draw proper undercurls NSNumber *value = [NSNumber numberWithInt:(NSUnderlineStyleThick | NSUnderlinePatternDot)]; // | NSUnderlineByWordMask - [attribString addAttribute:NSUnderlineStyleAttributeName - value:value range:range]; + [attributes setObject:value forKey:NSUnderlineStyleAttributeName]; } + // Mark these characters as wide. This attribute is subsequently checked + // when translating (row,col) pairs to offsets within 'attribString'. + if (flags & DRAW_WIDE) + [attributes setObject:[NSNull null] + forKey:MMWideCharacterAttributeName]; + + // Replace characters in text storage and apply new attributes. + NSRange r = NSMakeRange(range.location, [string length]); + [attribString replaceCharactersInRange:range withString:string]; + [attribString setAttributes:attributes range:r]; + + if ((flags & DRAW_WIDE) || [string length] != cells) + characterEqualsColumn = NO; + + [self fixInvalidCharactersInRange:r]; + [self edited:(NSTextStorageEditedCharacters|NSTextStorageEditedAttributes) - range:range changeInLength:0]; + range:range changeInLength:[string length]-range.length]; + +#if MM_USE_ROW_CACHE + rowCache[row].length += [string length] - range.length; +#endif } /* @@ -268,67 +308,56 @@ - (void)deleteLinesFromRow:(int)row lineCount:(int)count //NSLog(@"deleteLinesFromRow:%d lineCount:%d color:%@", row, count, color); [self lazyResize:NO]; - if (row < 0 || row+count > maxRows) { - //NSLog(@"[%s] WARNING : out of range, row=%d (%d) count=%d", _cmd, row, - // maxRows, count); + if (row < 0 || row+count > maxRows) return; - } int total = 1 + bottom - row; int move = total - count; int width = right - left + 1; - NSRange destRange = { row*(maxColumns+1) + left, width }; - NSRange srcRange = { (row+count)*(maxColumns+1) + left, width }; + int destRow = row; + NSRange destRange, srcRange; int i; - if (width != maxColumns) { // if this is the case, then left must be 0 - for (i = 0; i < move; ++i) { - NSAttributedString *srcString = [attribString - attributedSubstringFromRange:srcRange]; - [attribString replaceCharactersInRange:destRange - withAttributedString:srcString]; - [self edited:(NSTextStorageEditedCharacters - | NSTextStorageEditedAttributes) - range:destRange changeInLength:0]; - destRange.location += maxColumns+1; - srcRange.location += maxColumns+1; - } - - NSRange emptyRange = {0,width}; - NSAttributedString *emptyString = - [emptyRowString attributedSubstringFromRange: emptyRange]; - NSDictionary *attribs = [NSDictionary dictionaryWithObjectsAndKeys: - font, NSFontAttributeName, - color, NSBackgroundColorAttributeName, nil]; - - for (i = 0; i < count; ++i) { - [attribString replaceCharactersInRange:destRange - withAttributedString:emptyString]; - [attribString setAttributes:attribs range:destRange]; - [self edited:(NSTextStorageEditedAttributes - | NSTextStorageEditedCharacters) range:destRange - changeInLength:0]; - destRange.location += maxColumns+1; - } - } else { - NSRange delRange = {row*(maxColumns+1), count*(maxColumns+1)}; - [attribString deleteCharactersInRange: delRange]; - destRange.location += move*(maxColumns+1); - - NSDictionary *attribs = [NSDictionary dictionaryWithObjectsAndKeys: - font, NSFontAttributeName, - color, NSBackgroundColorAttributeName, nil]; - destRange.length = maxColumns; - for (i = 0; i < count; ++i) { - [attribString insertAttributedString:emptyRowString - atIndex:destRange.location]; - [attribString setAttributes:attribs range:destRange]; - destRange.location += maxColumns+1; - } - NSRange editedRange = {row*(maxColumns+1),total*(maxColumns+1)}; + for (i = 0; i < move; ++i, ++destRow) { + destRange = [self charRangeForRow:destRow column:left cells:width]; + srcRange = [self charRangeForRow:(destRow+count) column:left + cells:width]; + NSAttributedString *srcString = [attribString + attributedSubstringFromRange:srcRange]; + + [attribString replaceCharactersInRange:destRange + withAttributedString:srcString]; + [self edited:(NSTextStorageEditedCharacters + | NSTextStorageEditedAttributes) range:destRange + changeInLength:([srcString length]-destRange.length)]; + +#if MM_USE_ROW_CACHE + rowCache[destRow].length += [srcString length] - destRange.length; +#endif + } + + NSRange emptyRange = {0,width}; + NSAttributedString *emptyString = + [emptyRowString attributedSubstringFromRange:emptyRange]; + NSDictionary *attribs = [NSDictionary dictionaryWithObjectsAndKeys: + font, NSFontAttributeName, + color, NSBackgroundColorAttributeName, nil]; + + for (i = 0; i < count; ++i, ++destRow) { + destRange = [self charRangeForRow:destRow column:left cells:width]; + + [attribString replaceCharactersInRange:destRange + withAttributedString:emptyString]; + [attribString setAttributes:attribs + range:NSMakeRange(destRange.location, width)]; + [self edited:(NSTextStorageEditedAttributes - | NSTextStorageEditedCharacters) range:editedRange - changeInLength:0]; + | NSTextStorageEditedCharacters) range:destRange + changeInLength:([emptyString length]-destRange.length)]; + +#if MM_USE_ROW_CACHE + rowCache[destRow].length += [emptyString length] - destRange.length; +#endif } } @@ -343,66 +372,55 @@ - (void)insertLinesAtRow:(int)row lineCount:(int)count //NSLog(@"insertLinesAtRow:%d lineCount:%d color:%@", row, count, color); [self lazyResize:NO]; - if (row < 0 || row+count > maxRows) { - //NSLog(@"[%s] WARNING : out of range, row=%d (%d) count=%d", _cmd, row, - // maxRows, count); + if (row < 0 || row+count > maxRows) return; - } int total = 1 + bottom - row; int move = total - count; int width = right - left + 1; - NSRange destRange = { bottom*(maxColumns+1) + left, width }; - NSRange srcRange = { (row+move-1)*(maxColumns+1) + left, width }; + int destRow = bottom; + int srcRow = row + move - 1; + NSRange destRange, srcRange; int i; - if (width != maxColumns) { // if this is the case, then left must be 0 - for (i = 0; i < move; ++i) { - NSAttributedString *srcString = [attribString - attributedSubstringFromRange:srcRange]; - [attribString replaceCharactersInRange:destRange - withAttributedString:srcString]; - [self edited:(NSTextStorageEditedCharacters - | NSTextStorageEditedAttributes) - range:destRange changeInLength:0]; - destRange.location -= maxColumns+1; - srcRange.location -= maxColumns+1; - } - - NSRange emptyRange = {0,width}; - NSAttributedString *emptyString = - [emptyRowString attributedSubstringFromRange:emptyRange]; - NSDictionary *attribs = [NSDictionary dictionaryWithObjectsAndKeys: - font, NSFontAttributeName, - color, NSBackgroundColorAttributeName, nil]; - - for (i = 0; i < count; ++i) { - [attribString replaceCharactersInRange:destRange - withAttributedString:emptyString]; - [attribString setAttributes:attribs range:destRange]; - [self edited:(NSTextStorageEditedAttributes - | NSTextStorageEditedCharacters) range:destRange - changeInLength:0]; - destRange.location -= maxColumns+1; - } - } else { - NSRange delRange = {(row+move)*(maxColumns+1),count*(maxColumns+1)}; - [attribString deleteCharactersInRange: delRange]; + for (i = 0; i < move; ++i, --destRow, --srcRow) { + destRange = [self charRangeForRow:destRow column:left cells:width]; + srcRange = [self charRangeForRow:srcRow column:left cells:width]; + NSAttributedString *srcString = [attribString + attributedSubstringFromRange:srcRange]; + [attribString replaceCharactersInRange:destRange + withAttributedString:srcString]; + [self edited:(NSTextStorageEditedCharacters + | NSTextStorageEditedAttributes) range:destRange + changeInLength:([srcString length]-destRange.length)]; + +#if MM_USE_ROW_CACHE + rowCache[destRow].length += [srcString length] - destRange.length; +#endif + } + + NSRange emptyRange = {0,width}; + NSAttributedString *emptyString = + [emptyRowString attributedSubstringFromRange:emptyRange]; + NSDictionary *attribs = [NSDictionary dictionaryWithObjectsAndKeys: + font, NSFontAttributeName, + color, NSBackgroundColorAttributeName, nil]; + + for (i = 0; i < count; ++i, --destRow) { + destRange = [self charRangeForRow:destRow column:left cells:width]; + + [attribString replaceCharactersInRange:destRange + withAttributedString:emptyString]; + [attribString setAttributes:attribs + range:NSMakeRange(destRange.location, width)]; - NSDictionary *attribs = [NSDictionary dictionaryWithObjectsAndKeys: - font, NSFontAttributeName, - color, NSBackgroundColorAttributeName, nil]; - - destRange.location = row*(maxColumns+1); - for (i = 0; i < count; ++i) { - [attribString insertAttributedString:emptyRowString - atIndex:destRange.location]; - [attribString setAttributes:attribs range:destRange]; - } - NSRange editedRange = {row*(maxColumns+1),total*(maxColumns+1)}; [self edited:(NSTextStorageEditedAttributes - | NSTextStorageEditedCharacters) range:editedRange - changeInLength:0]; + | NSTextStorageEditedCharacters) range:destRange + changeInLength:([emptyString length]-destRange.length)]; + +#if MM_USE_ROW_CACHE + rowCache[destRow].length += [emptyString length] - destRange.length; +#endif } } @@ -413,45 +431,45 @@ - (void)clearBlockFromRow:(int)row1 column:(int)col1 toRow:(int)row2 // row1, col1, row2, col2, color); [self lazyResize:NO]; - if (row1 < 0 || row2 >= maxRows || col1 < 0 || col2 > maxColumns) { - //NSLog(@"[%s] WARNING : out of range, row1=%d row2=%d (%d) col1=%d " - // "col2=%d (%d)", _cmd, row1, row2, maxRows, col1, col2, - // maxColumns); + if (row1 < 0 || row2 >= maxRows || col1 < 0 || col2 > maxColumns) return; - } NSDictionary *attribs = [NSDictionary dictionaryWithObjectsAndKeys: font, NSFontAttributeName, color, NSBackgroundColorAttributeName, nil]; - - NSRange range = { row1*(maxColumns+1) + col1, col2-col1+1 }; - - NSRange emptyRange = {0,col2-col1+1}; + int cells = col2 - col1 + 1; + NSRange range, emptyRange = {0, cells}; NSAttributedString *emptyString = [emptyRowString attributedSubstringFromRange:emptyRange]; int r; + for (r=row1; r<=row2; ++r) { + range = [self charRangeForRow:r column:col1 cells:cells]; + [attribString replaceCharactersInRange:range withAttributedString:emptyString]; - [attribString setAttributes:attribs range:range]; + [attribString setAttributes:attribs + range:NSMakeRange(range.location, cells)]; + [self edited:(NSTextStorageEditedAttributes | NSTextStorageEditedCharacters) range:range - changeInLength:0]; - range.location += maxColumns+1; + changeInLength:cells-range.length]; + +#if MM_USE_ROW_CACHE + rowCache[r].length += cells - range.length; +#endif } } - (void)clearAll { - //NSLog(@"%s%@", _cmd, color); + //NSLog(@"%s", _cmd); [self lazyResize:YES]; } - (void)setDefaultColorsBackground:(NSColor *)bgColor foreground:(NSColor *)fgColor { - //NSLog(@"setDefaultColorsBackground:%@ foreground:%@", bgColor, fgColor); - if (defaultBackgroundColor != bgColor) { [defaultBackgroundColor release]; defaultBackgroundColor = bgColor ? [bgColor retain] : nil; @@ -469,10 +487,13 @@ - (void)setDefaultColorsBackground:(NSColor *)bgColor - (void)setFont:(NSFont*)newFont { if (newFont && font != newFont) { + [boldItalicFont release]; + [italicFont release]; + [boldFont release]; [font release]; // NOTE! When setting a new font we make sure that the advancement of - // each glyph is fixed. + // each glyph is fixed. float em = [newFont widthOfString:@"m"]; float cellWidthMultiplier = [[NSUserDefaults standardUserDefaults] @@ -524,6 +545,51 @@ - (void)setFont:(NSFont*)newFont } } +- (void)setWideFont:(NSFont *)newFont +{ + if (!newFont) { + // Use the normal font as the wide font (note that the normal font may + // very well include wide characters.) + if (font) [self setWideFont:font]; + } else if (newFont != fontWide) { + [boldItalicFontWide release]; + [italicFontWide release]; + [boldFontWide release]; + [fontWide release]; + + float pointSize = [newFont pointSize]; + NSFontDescriptor *desc = [newFont fontDescriptor]; + NSDictionary *dictWide = [NSDictionary + dictionaryWithObject:[NSNumber numberWithFloat:2*cellSize.width] + forKey:NSFontFixedAdvanceAttribute]; + + desc = [desc fontDescriptorByAddingAttributes:dictWide]; + fontWide = [NSFont fontWithDescriptor:desc size:pointSize]; + [fontWide retain]; + + boldFontWide = [[NSFontManager sharedFontManager] + convertFont:fontWide toHaveTrait:NSBoldFontMask]; + desc = [boldFontWide fontDescriptor]; + desc = [desc fontDescriptorByAddingAttributes:dictWide]; + boldFontWide = [NSFont fontWithDescriptor:desc size:pointSize]; + [boldFontWide retain]; + + italicFontWide = [[NSFontManager sharedFontManager] + convertFont:fontWide toHaveTrait:NSItalicFontMask]; + desc = [italicFontWide fontDescriptor]; + desc = [desc fontDescriptorByAddingAttributes:dictWide]; + italicFontWide = [NSFont fontWithDescriptor:desc size:pointSize]; + [italicFontWide retain]; + + boldItalicFontWide = [[NSFontManager sharedFontManager] + convertFont:italicFontWide toHaveTrait:NSBoldFontMask]; + desc = [boldItalicFontWide fontDescriptor]; + desc = [desc fontDescriptorByAddingAttributes:dictWide]; + boldItalicFontWide = [NSFont fontWithDescriptor:desc size:pointSize]; + [boldItalicFontWide retain]; + } +} + - (NSFont*)font { return font; @@ -581,14 +647,8 @@ - (NSRect)rectForColumnsInRange:(NSRange)range - (unsigned)characterIndexForRow:(int)row column:(int)col { - // Ensure the offset returned is valid. - // This code also works if maxRows and/or maxColumns is 0. - if (row >= maxRows) row = maxRows-1; - if (row < 0) row = 0; - if (col >= maxColumns) col = maxColumns-1; - if (col < 0) col = 0; - - return (unsigned)(col + row*(maxColumns+1)); + NSRange range = [self charRangeForRow:row column:col cells:1]; + return range.location != NSNotFound ? range.location : 0; } // XXX: unused at the moment @@ -661,24 +721,71 @@ - (NSSize)fitToSize:(NSSize)size rows:(int *)rows columns:(int *)columns return fitSize; } +- (NSRect)boundingRectForCharacterAtRow:(int)row column:(int)col +{ +#if 1 + // This properly computes the position of where Vim expects the glyph to be + // drawn. Had the typesetter actually computed the right position of each + // character and not hidden some, this code would be correct. + NSRect rect = NSZeroRect; + + rect.origin.x = col*cellSize.width; + rect.origin.y = row*cellSize.height; + rect.size = cellSize; + + // Wide character take up twice the width of a normal character. + NSRange r = [self charRangeForRow:row column:col cells:1]; + if (NSNotFound != r.location + && [attribString attribute:MMWideCharacterAttributeName + atIndex:r.location + effectiveRange:nil]) + rect.size.width += rect.size.width; + + return rect; +#else + // Use layout manager to compute bounding rect. This works in situations + // where the layout manager decides to hide glyphs (Vim assumes all glyphs + // are drawn). + NSLayoutManager *lm = [[self layoutManagers] objectAtIndex:0]; + NSTextContainer *tc = [[lm textContainers] objectAtIndex:0]; + NSRange range = [self charRangeForRow:row column:col cells:1]; + NSRange glyphRange = [lm glyphRangeForCharacterRange:range + actualCharacterRange:NULL]; + + return [lm boundingRectForGlyphRange:glyphRange inTextContainer:tc]; +#endif +} + +#if MM_USE_ROW_CACHE +- (MMRowCacheEntry *)rowCache +{ + return rowCache; +} +#endif + @end // MMTextStorage @implementation MMTextStorage (Private) + - (void)lazyResize:(BOOL)force { - int i; - // Do nothing if the dimensions are already right. if (!force && actualRows == maxRows && actualColumns == maxColumns) return; - NSRange oldRange = NSMakeRange(0, actualRows*(actualColumns+1)); + NSRange oldRange = NSMakeRange(0, [attribString length]); actualRows = maxRows; actualColumns = maxColumns; + characterEqualsColumn = YES; + +#if MM_USE_ROW_CACHE + free(rowCache); + rowCache = (MMRowCacheEntry*)calloc(actualRows, sizeof(MMRowCacheEntry)); +#endif NSDictionary *dict; if (defaultBackgroundColor) { @@ -691,6 +798,7 @@ - (void)lazyResize:(BOOL)force } NSMutableString *rowString = [NSMutableString string]; + int i; for (i = 0; i < maxColumns; ++i) { [rowString appendString:@" "]; } @@ -703,6 +811,9 @@ - (void)lazyResize:(BOOL)force [attribString release]; attribString = [[NSMutableAttributedString alloc] init]; for (i=0; i 16 bit characters), then we can compute the range. + if (characterEqualsColumn) + return NSMakeRange(row*(actualColumns+1) + col, cells); + + NSString *string = [attribString string]; + NSRange r, range = { NSNotFound, 0 }; + unsigned idx; + int i; + + if (row < 0 || row >= actualRows || col < 0 || col >= actualColumns + || col+cells > actualColumns) { + NSLog(@"%s row=%d col=%d cells=%d is out of range (length=%d)", + _cmd, row, col, cells, [string length]); + return range; + } + +#if MM_USE_ROW_CACHE + // Locate the beginning of the row + MMRowCacheEntry *cache = rowCache; + idx = 0; + for (i = 0; i < row; ++i, ++cache) + idx += cache->length; +#else + // Locate the beginning of the row by scanning for EOL characters. + r.location = 0; + for (i = 0; i < row; ++i) { + r.length = [string length] - r.location; + r = [string rangeOfString:@"\n" options:NSLiteralSearch range:r]; + if (NSNotFound == r.location) + return range; + ++r.location; + } +#endif + + // Locate the column +#if MM_USE_ROW_CACHE + cache = &rowCache[row]; + + i = cache->col; + if (col == i) { + // Cache hit + idx += cache->colOffset; + } else { + range.location = idx; + + // Cache miss + if (col < i - col) { + // Search forward from beginning of line. + i = 0; + } else if (actualColumns - col < col - i) { + // Search backward from end of line. + i = actualColumns - 1; + idx += cache->length - 2; + } else { + // Search from cache spot (forward or backward). + idx += cache->colOffset; + } + + if (col > i) { + // Forward search + while (col > i) { + r = [string rangeOfComposedCharacterSequenceAtIndex:idx]; + + // Wide chars take up two display cells. + if ([attribString attribute:MMWideCharacterAttributeName + atIndex:idx + effectiveRange:nil]) + ++i; + + idx += r.length; + ++i; + } + } else if (col < i) { + // Backward search + while (col < i) { + r = [string rangeOfComposedCharacterSequenceAtIndex:idx-1]; + idx -= r.length; + --i; + + // Wide chars take up two display cells. + if ([attribString attribute:MMWideCharacterAttributeName + atIndex:idx + effectiveRange:nil]) + --i; + } + } + + cache->col = i; + cache->colOffset = idx - range.location; + } +#else + idx = r.location; + for (i = 0; i < col; ++i) { + r = [string rangeOfComposedCharacterSequenceAtIndex:idx]; + + // Wide chars take up two display cells. + if ([attribString attribute:MMWideCharacterAttributeName + atIndex:idx + effectiveRange:nil]) + ++i; + + idx += r.length; + } +#endif + + // Count the number of characters that cover the cells. + range.location = idx; + for (i = 0; i < cells; ++i) { + r = [string rangeOfComposedCharacterSequenceAtIndex:idx]; + + // Wide chars take up two display cells. + if ([attribString attribute:MMWideCharacterAttributeName + atIndex:idx + effectiveRange:nil]) + ++i; + + idx += r.length; + range.length += r.length; + } + + return range; +} + +- (void)fixInvalidCharactersInRange:(NSRange)range +{ + static NSCharacterSet *invalidCharacterSet = nil; + NSRange invalidRange; + unsigned end; + + if (!invalidCharacterSet) + invalidCharacterSet = [[NSCharacterSet characterSetWithRange: + NSMakeRange(0x2028, 2)] retain]; + + // HACK! Replace characters that the text system can't handle (currently + // LINE SEPARATOR U+2028 and PARAGRAPH SEPARATOR U+2029) with space. + // + // TODO: Treat these separately inside of Vim so we don't have to bother + // here. + while (range.length > 0) { + invalidRange = [[attribString string] + rangeOfCharacterFromSet:invalidCharacterSet + options:NSLiteralSearch + range:range]; + if (NSNotFound == invalidRange.location) + break; + + [attribString replaceCharactersInRange:invalidRange withString:@" "]; + + end = NSMaxRange(invalidRange); + range.length -= end - range.location; + range.location = end; + } +} + @end // MMTextStorage (Private) diff --git a/src/MacVim/MMTextView.m b/src/MacVim/MMTextView.m index 0e2399d72e..d7e7ba2794 100644 --- a/src/MacVim/MMTextView.m +++ b/src/MacVim/MMTextView.m @@ -7,6 +7,11 @@ * Do ":help credits" in Vim to see a list of people who contributed. * See README.txt for an overview of the Vim source code. */ +/* + * MMTextView + * + * Dispatches keyboard and mouse input to the backend. Also handles drag&drop. + */ #import "MMTextView.h" #import "MMTextStorage.h" @@ -111,20 +116,9 @@ - (void)drawRect:(NSRect)rect if (shouldDrawInsertionPoint) { MMTextStorage *ts = (MMTextStorage*)[self textStorage]; - NSLayoutManager *lm = [self layoutManager]; - NSTextContainer *tc = [self textContainer]; - - // Given (row,column), calculate the bounds of the glyph at that spot. - // We use the layout manager because this gives us exactly the size and - // location of the glyph so that we can match the insertion point to - // it. - unsigned charIdx = [ts characterIndexForRow:insertionPointRow - column:insertionPointColumn]; - NSRange glyphRange = - [lm glyphRangeForCharacterRange:NSMakeRange(charIdx,1) - actualCharacterRange:NULL]; - NSRect ipRect = [lm boundingRectForGlyphRange:glyphRange - inTextContainer:tc]; + + NSRect ipRect = [ts boundingRectForCharacterAtRow:insertionPointRow + column:insertionPointColumn]; ipRect.origin.x += [self textContainerOrigin].x; ipRect.origin.y += [self textContainerOrigin].y; diff --git a/src/MacVim/MMTypesetter.h b/src/MacVim/MMTypesetter.h index c2d149a16a..e63911cdcb 100644 --- a/src/MacVim/MMTypesetter.h +++ b/src/MacVim/MMTypesetter.h @@ -13,10 +13,8 @@ @interface MMTypesetter : NSATSTypesetter { } +@end -- (void)layoutGlyphsInLayoutManager:(NSLayoutManager *)lm - startingAtGlyphIndex:(unsigned)startGlyphIdx - maxNumberOfLineFragments:(unsigned)maxNumLines - nextGlyphIndex:(unsigned *)nextGlyph; - +@interface MMTypesetter2 : NSATSTypesetter { +} @end diff --git a/src/MacVim/MMTypesetter.m b/src/MacVim/MMTypesetter.m index 56ee878f95..44166cb37a 100644 --- a/src/MacVim/MMTypesetter.m +++ b/src/MacVim/MMTypesetter.m @@ -7,27 +7,89 @@ * Do ":help credits" in Vim to see a list of people who contributed. * See README.txt for an overview of the Vim source code. */ +/* + * MMTypesetter + * + * Ensures that each line has a fixed height and deals with some baseline + * issues. + */ #import "MMTypesetter.h" #import "MMTextStorage.h" #import "MacVim.h" -// The 'linerange' functions count U+2028 and U+2029 as line end characters, -// which causes rendering to be screwed up because Vim does not count them as -// line end characters. -#define MM_USE_LINERANGE 0 +@implementation MMTypesetter + +- (void)willSetLineFragmentRect:(NSRectPointer)lineRect + forGlyphRange:(NSRange)glyphRange + usedRect:(NSRectPointer)usedRect + baselineOffset:(float *)baselineOffset +{ + MMTextStorage *ts = (MMTextStorage*)[[self layoutManager] textStorage]; + float h = [ts cellSize].height; + + // HACK! Force each line fragment rect to have a fixed height. By also + // forcing the 'usedRect' to the same height we also ensure that the cursor + // is as high as the line itself. + lineRect->size.height = h; + usedRect->size.height = h; + + // See [MMTextStorage setLinespace:] for info on how 'linespace' support + // works. + *baselineOffset += floor(.5*[ts linespace]); +} + +#if 0 +- (void)setNotShownAttribute:(BOOL)flag forGlyphRange:(NSRange)glyphRange +{ + if (1 != glyphRange.length) + return; + + NSLayoutManager *lm = [self layoutManager]; + unsigned charIdx = [lm characterIndexForGlyphAtIndex:glyphRange.location]; + + if ('\n' == [[[lm textStorage] string] characterAtIndex:charIdx]) + [lm setNotShownAttribute:flag forGlyphAtIndex:glyphRange.location]; +} +#endif + +#if 0 +- (NSTypesetterControlCharacterAction) + actionForControlCharacterAtIndex:(unsigned)charIndex +{ + //NSLog(@"%s%d", _cmd, charIndex); + /*NSTextStorage *ts = [[self layoutManager] textStorage]; + + if ('\n' == [[ts string] characterAtIndex:charIndex]) + return NSTypesetterLineBreakAction;*/ + + return NSTypesetterWhitespaceAction; +} +#endif + #if 0 -@interface MMTypesetter (Private) -- (NSCharacterSet *)hiddenCharSet; -@end +- (void)setLocation:(NSPoint)location + withAdvancements:(const float *)advancements + forStartOfGlyphRange:(NSRange)glyphRange +{ + NSLog(@"setLocation:%@ withAdvancements:%f forStartOfGlyphRange:%@", + NSStringFromPoint(location), advancements ? *advancements : 0, + NSStringFromRange(glyphRange)); + [super setLocation:location withAdvancements:advancements + forStartOfGlyphRange:glyphRange]; +} #endif +@end // MMTypesetter + + -@implementation MMTypesetter + +@implementation MMTypesetter2 // // Layout glyphs so that each line fragment has a fixed size. @@ -37,126 +99,92 @@ @implementation MMTypesetter // depending on whether it is a wide character or not). This is taken care of // by MMTextStorage in setAttributes:range: and in setFont:. All that is left // for the typesetter to do is to make sure each line fragment has the same -// height and that unwanted glyphs are hidden. +// height and that EOL glyphs are hidden. // - (void)layoutGlyphsInLayoutManager:(NSLayoutManager *)lm startingAtGlyphIndex:(unsigned)startGlyphIdx maxNumberOfLineFragments:(unsigned)maxNumLines nextGlyphIndex:(unsigned *)nextGlyph { - // TODO: Check that it really is an MMTextStorage. + // TODO: Check that it really is an MMTextStorage? MMTextStorage *ts = (MMTextStorage*)[lm textStorage]; - NSTextView *tv = [lm firstTextView]; - NSTextContainer *tc = [tv textContainer]; + NSTextContainer *tc = [[lm firstTextView] textContainer]; NSFont *font = [ts font]; NSString *text = [ts string]; - unsigned textLen = [text length]; - NSSize cellSize = [ts cellSize]; - // NOTE: With non-zero linespace the baseline is adjusted so that the text - // is centered within a line. - float baseline = [font descender] - floor(.5*[ts linespace]); - if (!(lm && ts && tv && tc && font && text && textLen + if (!(lm && ts && tc && font && text && [lm isValidGlyphIndex:startGlyphIdx])) return; - float baselineOffset = [[NSUserDefaults standardUserDefaults] - floatForKey:MMBaselineOffsetKey]; - - baseline += baselineOffset; - + // Note that we always start laying out lines from the beginning of a line, + // even if 'startCharIdx' may be somewhere in the middle. unsigned startCharIdx = [lm characterIndexForGlyphAtIndex:startGlyphIdx]; - unsigned i, numberOfLines = 0, firstLine = 0; - NSRange firstLineRange = { 0, 0 }; - -#if MM_USE_LINERANGE - // Find the first line and its range, and count the number of lines. (This - // info could also be gleaned from MMTextStorage, but we do it here anyway - // to make absolutely sure everything is right.) - for (i = 0; i < textLen; numberOfLines++) { - NSRange lineRange = [text lineRangeForRange:NSMakeRange(i, 0)]; - if (NSLocationInRange(startCharIdx, lineRange)) { - firstLine = numberOfLines; - firstLineRange = lineRange; - } - - i = NSMaxRange(lineRange); - } -#else - unsigned stride = 1 + [ts actualColumns]; - numberOfLines = [ts actualRows]; - firstLine = (unsigned)(startCharIdx/stride); - firstLineRange.location = firstLine * stride; - unsigned len = [text length] - firstLineRange.location; - firstLineRange.length = len < stride ? len : stride; -#endif - - // Perform line fragment generation one line at a time. - NSRange lineRange = firstLineRange; - unsigned endGlyphIdx = startGlyphIdx; - for (i = 0; i < maxNumLines && lineRange.length; ++i) { - NSRange glyphRange = [lm glyphRangeForCharacterRange:lineRange - actualCharacterRange:nil]; - NSRect lineRect = { 0, (firstLine+i)*cellSize.height, - cellSize.width*(lineRange.length-1), cellSize.height }; - unsigned endLineIdx = NSMaxRange(lineRange); - NSPoint glyphPt = { 0, cellSize.height+baseline }; - unsigned j; - - endGlyphIdx = NSMaxRange(glyphRange); - - [lm setTextContainer:tc forGlyphRange:glyphRange]; - [lm setLineFragmentRect:lineRect forGlyphRange:glyphRange - usedRect:lineRect]; - [lm setLocation:glyphPt forStartOfGlyphRange:glyphRange]; + if (startCharIdx >= [text length]) + return; - // Hide end-of-line and non-zero space characters (there is one after - // every wide character). - for (j = lineRange.location; j < endLineIdx; ++j) { - unichar ch = [text characterAtIndex:j]; - if (ch == 0x200b || ch == '\n') { - NSRange range = { j, 1 }; - range = [lm glyphRangeForCharacterRange:range - actualCharacterRange:nil]; - [lm setNotShownAttribute:YES forGlyphAtIndex:range.location]; - } - } - -#if MM_USE_LINERANGE - lineRange = [text lineRangeForRange:NSMakeRange(endLineIdx, 0)]; -#else - lineRange.location = endLineIdx; - len = [text length] - lineRange.location; - if (len < lineRange.length) - lineRange.length = len; -#endif + [lm setTextContainer:tc forGlyphRange: + [lm glyphRangeForCharacterRange:NSMakeRange(0, [text length]) + actualCharacterRange:nil]]; + + // + // STEP 1: Locate the line containing 'startCharIdx'. + // + MMRowCacheEntry *cache = [ts rowCache]; + unsigned lineIdx = 0, nextLineIdx = 0; + int actualRows = [ts actualRows]; + int line = 0; + + for (; line < actualRows; ++line, ++cache) { + lineIdx = nextLineIdx; + nextLineIdx += cache->length; + if (startCharIdx < nextLineIdx) + break; } - if (nextGlyph) - *nextGlyph = endGlyphIdx; -} + // + // STEP 2: Generate line fragment rects one line at a time until there are + // no more lines in the text storage, or until 'maxNumLines' have been + // exhausted. (There is no point in just laying out one line, the layout + // manager will keep calling this method until there are no more lines in + // the text storage.) + // -@end // MMTypesetter + // NOTE: With non-zero linespace the baseline is adjusted so that the text + // is centered within a line. + float baseline = [font descender] - floor(.5*[ts linespace]) + + [[NSUserDefaults standardUserDefaults] + floatForKey:MMBaselineOffsetKey]; + NSSize cellSize = [ts cellSize]; + NSPoint glyphPt = { 0, cellSize.height+baseline }; + NSRange lineRange = { lineIdx, 0 }; + NSRange glyphRange = { startGlyphIdx, 0 }; + NSRect lineRect = { 0, line*cellSize.height, + [ts actualColumns]*cellSize.width, cellSize.height }; + int endLine = line + maxNumLines; + if (endLine > actualRows) + endLine = actualRows; + for (; line < endLine; ++line, ++cache) { + lineRange.length = cache->length; + glyphRange = [lm glyphRangeForCharacterRange:lineRange + actualCharacterRange:nil]; -#if 0 -@implementation MMTypesetter (Private) + [lm setLineFragmentRect:lineRect forGlyphRange:glyphRange + usedRect:lineRect]; + [lm setLocation:glyphPt forStartOfGlyphRange:glyphRange]; -- (NSCharacterSet *)hiddenCharSet -{ - static NSCharacterSet *hiddenCharSet = nil; + lineRange.location += lineRange.length; + lineRect.origin.y += cellSize.height; - if (!hiddenCharSet) { - NSString *string = [NSString stringWithFormat:@"%C\n", 0x200b]; - hiddenCharSet = [NSCharacterSet - characterSetWithCharactersInString:string]; - [hiddenCharSet retain]; + // Hide EOL character (otherwise a square will be rendered). + [lm setNotShownAttribute:YES forGlyphAtIndex:lineRange.location-1]; } - return hiddenCharSet; + if (nextGlyph) + *nextGlyph = NSMaxRange(glyphRange); } -@end // MMTypesetter (Private) -#endif +@end // MMTypesetter2 + diff --git a/src/MacVim/MMVimController.h b/src/MacVim/MMVimController.h index e53e5fdf00..78ca65843f 100644 --- a/src/MacVim/MMVimController.h +++ b/src/MacVim/MMVimController.h @@ -56,5 +56,3 @@ timeout:(NSTimeInterval)timeout; - (void)addVimInput:(NSString *)string; @end - -// vim: set ft=objc: diff --git a/src/MacVim/MMVimController.m b/src/MacVim/MMVimController.m index b06b78b7e3..b2aa95b4a1 100644 --- a/src/MacVim/MMVimController.m +++ b/src/MacVim/MMVimController.m @@ -7,6 +7,21 @@ * Do ":help credits" in Vim to see a list of people who contributed. * See README.txt for an overview of the Vim source code. */ +/* + * MMVimController + * + * Coordinates input/output to/from backend. Each MMBackend communicates + * directly with a MMVimController. + * + * MMVimController does not deal with visual presentation. Essentially it + * should be able to run with no window present. + * + * Output from the backend is received in processCommandQueue:. Input is sent + * to the backend via sendMessage:data: or addVimInput:. The latter allows + * execution of arbitrary stings in the Vim process, much like the Vim script + * function remote_send() does. The messages that may be passed between + * frontend and backend are defined in an enum in MacVim.h. + */ #import "MMVimController.h" #import "MMWindowController.h" @@ -716,6 +731,21 @@ - (void)handleMessage:(int)msgid data:(NSData *)data [windowController setFont:font]; [name release]; + } else if (SetWideFontMsgID == msgid) { + const void *bytes = [data bytes]; + float size = *((float*)bytes); bytes += sizeof(float); + int len = *((int*)bytes); bytes += sizeof(int); + if (len > 0) { + NSString *name = [[NSString alloc] + initWithBytes:(void*)bytes length:len + encoding:NSUTF8StringEncoding]; + NSFont *font = [NSFont fontWithName:name size:size]; + [windowController setWideFont:font]; + + [name release]; + } else { + [windowController setWideFont:nil]; + } } else if (SetDefaultColorsMsgID == msgid) { const void *bytes = [data bytes]; unsigned bg = *((unsigned*)bytes); bytes += sizeof(unsigned); @@ -846,12 +876,13 @@ - (void)performBatchDrawWithData:(NSData *)data [textStorage deleteLinesFromRow:row lineCount:count scrollBottom:bot left:left right:right color:[NSColor colorWithArgbInt:color]]; - } else if (ReplaceStringDrawType == type) { + } else if (DrawStringDrawType == type) { int bg = *((int*)bytes); bytes += sizeof(int); int fg = *((int*)bytes); bytes += sizeof(int); int sp = *((int*)bytes); bytes += sizeof(int); int row = *((int*)bytes); bytes += sizeof(int); int col = *((int*)bytes); bytes += sizeof(int); + int cells = *((int*)bytes); bytes += sizeof(int); int flags = *((int*)bytes); bytes += sizeof(int); int len = *((int*)bytes); bytes += sizeof(int); NSString *string = [[NSString alloc] @@ -876,12 +907,13 @@ - (void)performBatchDrawWithData:(NSData *)data // shape:MMInsertionPointBlock // color:color]; } - [textStorage replaceString:string - atRow:row column:col - withFlags:flags - foregroundColor:[NSColor colorWithRgbInt:fg] - backgroundColor:[NSColor colorWithArgbInt:bg] - specialColor:[NSColor colorWithRgbInt:sp]]; + + [textStorage drawString:string + atRow:row column:col cells:cells + withFlags:flags + foregroundColor:[NSColor colorWithRgbInt:fg] + backgroundColor:[NSColor colorWithArgbInt:bg] + specialColor:[NSColor colorWithRgbInt:sp]]; [string release]; } else if (InsertLinesDrawType == type) { diff --git a/src/MacVim/MMVimView.m b/src/MacVim/MMVimView.m index d5a1fb1018..dca6f3cd19 100644 --- a/src/MacVim/MMVimView.m +++ b/src/MacVim/MMVimView.m @@ -7,6 +7,11 @@ * Do ":help credits" in Vim to see a list of people who contributed. * See README.txt for an overview of the Vim source code. */ +/* + * MMVimView + * + * A view class with a tabline, scrollbars, and text view. + */ #import "MMVimView.h" @@ -86,8 +91,12 @@ - (MMVimView *)initWithFrame:(NSRect)frame NSString *typesetterString = [[NSUserDefaults standardUserDefaults] stringForKey:MMTypesetterKey]; - if (![typesetterString isEqual:@"NSTypesetter"]) { - MMTypesetter *typesetter = [[MMTypesetter alloc] init]; + if ([typesetterString isEqual:@"MMTypesetter"]) { + NSTypesetter *typesetter = [[MMTypesetter alloc] init]; + [lm setTypesetter:typesetter]; + [typesetter release]; + } else if ([typesetterString isEqual:@"MMTypesetter2"]) { + NSTypesetter *typesetter = [[MMTypesetter2 alloc] init]; [lm setTypesetter:typesetter]; [typesetter release]; } else { @@ -96,6 +105,10 @@ - (MMVimView *)initWithFrame:(NSRect)frame setFloat:1.0 forKey:MMCellWidthMultiplierKey]; } + // The characters in the text storage are in display order, so disable + // bidirectional text processing (this call is 10.4 only). + [[lm typesetter] setBidiProcessingEnabled:NO]; + [tc setWidthTracksTextView:NO]; [tc setHeightTracksTextView:NO]; [tc setLineFragmentPadding:0]; diff --git a/src/MacVim/MMWindowController.h b/src/MacVim/MMWindowController.h index 782bc5889d..c73bb777f6 100644 --- a/src/MacVim/MMWindowController.h +++ b/src/MacVim/MMWindowController.h @@ -49,6 +49,7 @@ identifier:(long)ident; - (void)setDefaultColorsBackground:(NSColor *)back foreground:(NSColor *)fore; - (void)setFont:(NSFont *)font; +- (void)setWideFont:(NSFont *)font; - (void)processCommandQueueDidFinish; - (void)popupMenu:(NSMenu *)menu atRow:(int)row column:(int)col; - (void)showTabBar:(BOOL)on; diff --git a/src/MacVim/MMWindowController.m b/src/MacVim/MMWindowController.m index 5a5740fac3..9da117808a 100644 --- a/src/MacVim/MMWindowController.m +++ b/src/MacVim/MMWindowController.m @@ -7,6 +7,12 @@ * Do ":help credits" in Vim to see a list of people who contributed. * See README.txt for an overview of the Vim source code. */ +/* + * MMWindowController + * + * Handles resizing of windows, acts as an mediator between MMVimView and + * MMVimController. + */ #import "MMWindowController.h" #import @@ -261,6 +267,11 @@ - (void)setFont:(NSFont *)font [self updateResizeIncrements]; } +- (void)setWideFont:(NSFont *)font +{ + [[vimView textStorage] setWideFont:font]; +} + - (void)processCommandQueueDidFinish { // XXX: If not in live resize and vimview's desired size differs from actual diff --git a/src/MacVim/MacVim.h b/src/MacVim/MacVim.h index e497c30ac4..6d610d12c5 100644 --- a/src/MacVim/MacVim.h +++ b/src/MacVim/MacVim.h @@ -136,6 +136,7 @@ enum { SetScrollbarThumbMsgID, ScrollbarEventMsgID, SetFontMsgID, + SetWideFontMsgID, VimShouldCloseMsgID, SetDefaultColorsMsgID, ExecuteActionMsgID, @@ -157,11 +158,13 @@ enum { }; +#define DRAW_WIDE 0x40 /* draw wide text */ + enum { ClearAllDrawType = 1, ClearBlockDrawType, DeleteLinesDrawType, - ReplaceStringDrawType, + DrawStringDrawType, InsertLinesDrawType, DrawCursorDrawType }; @@ -206,6 +209,7 @@ extern NSString *MMBaselineOffsetKey; extern NSString *MMTranslateCtrlClickKey; extern NSString *MMTopLeftPointKey; extern NSString *MMOpenFilesInTabsKey; +extern NSString *MMNoFontSubstitutionKey; @@ -220,6 +224,3 @@ ATSFontContainerRef loadFonts(); @interface NSString (MMExtras) - (NSString *)stringByEscapingSpecialFilenameCharacters; @end - - -// vim: set ft=objc: diff --git a/src/MacVim/MacVim.m b/src/MacVim/MacVim.m index 23e903259b..33afe4c5e7 100644 --- a/src/MacVim/MacVim.m +++ b/src/MacVim/MacVim.m @@ -7,6 +7,9 @@ * Do ":help credits" in Vim to see a list of people who contributed. * See README.txt for an overview of the Vim source code. */ +/* + * MacVim.m: Code shared between Vim and MacVim. + */ #import "MacVim.h" @@ -46,6 +49,7 @@ "SetScrollbarThumbMsgID", "ScrollbarEventMsgID", "SetFontMsgID", + "SetWideFontMsgID", "VimShouldCloseMsgID", "SetDefaultColorsMsgID", "ExecuteActionMsgID", @@ -86,6 +90,7 @@ NSString *MMTranslateCtrlClickKey = @"MMTranslateCtrlClick"; NSString *MMTopLeftPointKey = @"MMTopLeftPoint"; NSString *MMOpenFilesInTabsKey = @"MMOpenFilesInTabs"; +NSString *MMNoFontSubstitutionKey = @"MMNoFontSubstitution"; diff --git a/src/MacVim/gui_macvim.m b/src/MacVim/gui_macvim.m index 245730494e..58ecde86b8 100644 --- a/src/MacVim/gui_macvim.m +++ b/src/MacVim/gui_macvim.m @@ -7,6 +7,11 @@ * Do ":help credits" in Vim to see a list of people who contributed. * See README.txt for an overview of the Vim source code. */ +/* + * gui_macvim.m + * + * Hooks for the Vim gui code. Mainly passes control on to MMBackend. + */ #import #import "MMBackend.h" @@ -19,7 +24,14 @@ // gui_mch_update()). static NSTimeInterval MMUpdateTimeoutInterval = 0.1f; +// NOTE: The default font is bundled with the application. +static NSString *MMDefaultFontName = @"DejaVu Sans Mono"; +static float MMDefaultFontSize = 12.0f; +static float MMMinFontSize = 6.0f; +static float MMMaxFontSize = 100.0f; + +static NSFont *gui_macvim_font_with_name(char_u *name); static BOOL gui_macvim_is_valid_action(NSString *action); @@ -259,8 +271,8 @@ } #endif - [[MMBackend sharedInstance] replaceString:(char*)s length:len - row:row column:col flags:flags]; + [[MMBackend sharedInstance] drawString:(char*)s length:len row:row + column:col cells:len flags:flags]; #ifdef FEAT_MBYTE if (conv_str) @@ -272,22 +284,12 @@ int gui_macvim_draw_string(int row, int col, char_u *s, int len, int flags) { - // - // Output chars until a wide char found. If a wide char is found, output a - // zero-width space after it so that a wide char looks like two chars to - // MMTextStorage. This way 1 char corresponds to 1 column. - // - - int c; - int cn; - int cl; - int i; + int c, cn, cl, i; int start = 0; int endcol = col; int startcol = col; - BOOL outPad = NO; + BOOL wide = NO; MMBackend *backend = [MMBackend sharedInstance]; - static char ZeroWidthSpace[] = { 0xe2, 0x80, 0x8b }; #ifdef FEAT_MBYTE char_u *conv_str = NULL; @@ -298,74 +300,34 @@ } #endif + // Loop over each character and output text when it changes from normal to + // wide and vice versa. for (i = 0; i < len; i += cl) { c = utf_ptr2char(s + i); cl = utf_ptr2len(s + i); cn = utf_char2cells(c); if (!utf_iscomposing(c)) { - if (outPad) { - outPad = NO; -#if 0 - NSString *string = [[NSString alloc] - initWithBytesNoCopy:(void*)(s+start) - length:i-start - encoding:NSUTF8StringEncoding - freeWhenDone:NO]; - NSLog(@"Flushing string=%@ len=%d row=%d col=%d end=%d", - string, i-start, row, startcol, endcol); - [string release]; -#endif - [backend replaceString:(char*)(s+start) length:i-start - row:row column:startcol flags:flags]; + if ((cn > 1 && !wide) || (cn <= 1 && wide)) { + // Changed from normal to wide or vice versa. + [backend drawString:(char*)(s+start) length:i-start + row:row column:startcol + cells:endcol-startcol + flags:(wide ? flags|DRAW_WIDE : flags)]; + start = i; startcol = endcol; -#if 0 - NSLog(@"Padding len=%d row=%d col=%d", sizeof(ZeroWidthSpace), - row, endcol-1); -#endif - [backend replaceString:ZeroWidthSpace - length:sizeof(ZeroWidthSpace) - row:row column:endcol-1 flags:flags]; } + wide = cn > 1; endcol += cn; } - - if (cn > 1) { -#if 0 - NSLog(@"Wide char detected! (char=%C hex=%x cells=%d)", c, c, cn); -#endif - outPad = YES; - } } -#if 0 - if (row < 1) { - NSString *string = [[NSString alloc] - initWithBytesNoCopy:(void*)(s+start) - length:len-start - encoding:NSUTF8StringEncoding - freeWhenDone:NO]; - NSLog(@"Output string=%@ len=%d row=%d col=%d", string, len-start, row, - startcol); - [string release]; - } -#endif - // Output remaining characters. - [backend replaceString:(char*)(s+start) length:len-start - row:row column:startcol flags:flags]; - - if (outPad) { -#if 0 - NSLog(@"Padding len=%d row=%d col=%d", sizeof(ZeroWidthSpace), row, - endcol-1); -#endif - [backend replaceString:ZeroWidthSpace - length:sizeof(ZeroWidthSpace) - row:row column:endcol-1 flags:flags]; - } + [backend drawString:(char*)(s+start) length:len-start + row:row column:startcol cells:endcol-startcol + flags:(wide ? flags|DRAW_WIDE : flags)]; #ifdef FEAT_MBYTE if (conv_str) @@ -829,6 +791,10 @@ gui_mch_free_font(font) GuiFont font; { + if (font != NOFONT) { + //NSLog(@"gui_mch_free_font(font=0x%x)", font); + [(NSFont*)font release]; + } } @@ -840,7 +806,15 @@ { //NSLog(@"gui_mch_get_font(name=%s, giveErrorIfMissing=%d)", name, // giveErrorIfMissing); - return 0; + + NSFont *font = gui_macvim_font_with_name(name); + if (font) + return (GuiFont)[font retain]; + + if (giveErrorIfMissing) + EMSG2(_(e_font), name); + + return NOFONT; } @@ -852,8 +826,9 @@ char_u * gui_mch_get_fontname(GuiFont font, char_u *name) { - //NSLog(@"gui_mch_get_fontname(font=%d, name=%s)", font, name); - return 0; + if (name == NULL) + return NULL; + return vim_strsave(name); } #endif @@ -867,21 +842,30 @@ { //NSLog(@"gui_mch_init_font(font_name=%s, fontset=%d)", font_name, fontset); - // HACK! This gets called whenever the user types :set gfn=fontname, so - // for now we set the font here. - // TODO! Proper font handling, the way Vim expects it. - -#ifdef FEAT_MBYTE - font_name = CONVERT_TO_UTF8(font_name); -#endif - - BOOL ok = [[MMBackend sharedInstance] setFontWithName:(char*)font_name]; + if (font_name && STRCMP(font_name, "*") == 0) { + // :set gfn=* shows the font panel. + do_cmdline_cmd((char_u*)":macaction orderFrontFontPanel:"); + return FAIL; + } -#ifdef FEAT_MBYTE - CONVERT_TO_UTF8_FREE(font_name); -#endif + NSFont *font = gui_macvim_font_with_name(font_name); + if (font) { + [(NSFont*)gui.norm_font release]; + gui.norm_font = (GuiFont)font; + + // NOTE: MacVim keeps separate track of the normal and wide fonts. + // Unless the user changes 'guifontwide' manually, they are based on + // the same (normal) font. Also note that each time the normal font is + // set, the advancement may change so the wide font needs to be updated + // as well (so that it is always twice the width of the normal font). + [[MMBackend sharedInstance] setFont:font]; + [[MMBackend sharedInstance] setWideFont: + (NOFONT == gui.wide_font ? font : (NSFont*)gui.wide_font)]; + + return OK; + } - return ok; + return FAIL; } @@ -891,9 +875,69 @@ void gui_mch_set_font(GuiFont font) { + // Font selection is done inside MacVim...nothing here to do. } + NSFont * +gui_macvim_font_with_name(char_u *name) +{ + NSFont *font = nil; + NSString *fontName = MMDefaultFontName; + float size = MMDefaultFontSize; + BOOL parseFailed = NO; + +#ifdef FEAT_MBYTE + name = CONVERT_TO_UTF8(name); +#endif + + if (name) { + fontName = [NSString stringWithUTF8String:(char*)name]; + + NSArray *components = [fontName componentsSeparatedByString:@":"]; + if ([components count] == 2) { + NSString *sizeString = [components lastObject]; + if ([sizeString length] > 0 + && [sizeString characterAtIndex:0] == 'h') { + sizeString = [sizeString substringFromIndex:1]; + if ([sizeString length] > 0) { + size = [sizeString floatValue]; + fontName = [components objectAtIndex:0]; + } + } else { + parseFailed = YES; + } + } else if ([components count] > 2) { + parseFailed = YES; + } + + if (!parseFailed) { + // Replace underscores with spaces. + fontName = [[fontName componentsSeparatedByString:@"_"] + componentsJoinedByString:@" "]; + } + } + + if (!parseFailed && [fontName length] > 0) { + if (size < MMMinFontSize) size = MMMinFontSize; + if (size > MMMaxFontSize) size = MMMaxFontSize; + + font = [NSFont fontWithName:fontName size:size]; + + if (!font && MMDefaultFontName == fontName) { + // If for some reason the MacVim default font is not in the app + // bundle, then fall back on the system default font. + font = [NSFont userFixedPitchFontOfSize:0]; + } + } + +#ifdef FEAT_MBYTE + CONVERT_TO_UTF8_FREE(name); +#endif + + return font; +} + // -- Scrollbars ------------------------------------------------------------ From ea9acd7e15a1b1d32c95f30daf843604aa5015f4 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sun, 11 Nov 2007 15:46:04 +0100 Subject: [PATCH 0325/1156] Updated help files Updated gui_mac.txt to reflect better handling of Unicode. Not all occurrences of ":action" and ":menukeyequiv" had been changed to ":macaction" and ":macmenukey". Updated 'guifontwide' entry. --- runtime/doc/gui_mac.txt | 9 +++++---- runtime/doc/index.txt | 4 ++-- runtime/doc/options.txt | 7 ++++--- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/runtime/doc/gui_mac.txt b/runtime/doc/gui_mac.txt index f43a0841e7..98b703426e 100644 --- a/runtime/doc/gui_mac.txt +++ b/runtime/doc/gui_mac.txt @@ -1,4 +1,4 @@ -*gui_mac.txt* For Vim version 7.1. Last change: 2007 Oct 14 +*gui_mac.txt* For Vim version 7.1. Last change: 2007 Nov 11 VIM REFERENCE MANUAL by Bjorn Winckler @@ -118,7 +118,7 @@ strings like "((3) of 2)" to appear in the window title. *macvim-options* These are the non-standard options that MacVim supports: - 'toolbariconsize' 'transparency' + 'fullscreen' 'toolbariconsize' 'transparency' ============================================================================== 2. Starting MacVim *macvim-start* @@ -341,9 +341,10 @@ these are ones that are know and/or which were judged major. - Localized menus are not supported. Choosing anything but "English" in the "International" pane of "System Prefences" may break the menus (and toolbar). -- Composing characters are not supported, they will mess up the display +- Some Unicode characters are not handled well (e.g. nonspacing marks) - Sometimes multibyte characters look "too wide", i.e. they overlap the - following character. It might help to change 'ambiwidth'. + following character. It might help to change 'ambiwidth', or override the + automatic font substitution by setting 'guifontwide' manually. - Printing - No find/replace dialog diff --git a/runtime/doc/index.txt b/runtime/doc/index.txt index cf37974233..b9b0eab78c 100644 --- a/runtime/doc/index.txt +++ b/runtime/doc/index.txt @@ -1039,7 +1039,6 @@ The commands are sorted on the non-optional part of their name. |:abbreviate| :ab[breviate] enter abbreviation |:abclear| :abc[lear] remove all abbreviations |:aboveleft| :abo[veleft] make split window appear left or above -|:action| :ac[tion] send action message |:all| :al[l] open a window for each file in the argument list |:amenu| :am[enu] enter new menu item for all modes @@ -1289,6 +1288,8 @@ The commands are sorted on the non-optional part of their name. |:lwindow| :lw[indow] open or close location window |:move| :m[ove] move lines |:mark| :ma[rk] set a mark +|:macation| :maca[ction] send action message +|:macmenukey| :macm[eyequiv] set key equivalent for menu item |:make| :mak[e] execute external command 'makeprg' and parse error messages |:map| :map show or enter a mapping @@ -1296,7 +1297,6 @@ The commands are sorted on the non-optional part of their name. |:marks| :marks list all marks |:match| :mat[ch] define a match to highlight |:menu| :me[nu] enter a new menu item -|:menukeyequiv| :menuk[eyequiv] set key equivalent for menu item |:menutranslate| :menut[ranslate] add a menu translation item |:messages| :mes[sages] view previously displayed messages |:mkexrc| :mk[exrc] write current mappings and settings to a file diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt index 4ebca01b0c..498beb5d64 100644 --- a/runtime/doc/options.txt +++ b/runtime/doc/options.txt @@ -3225,7 +3225,7 @@ A jump table for the options with a short description can be found at |Q_op|. :set guifont=* < will bring up a font requester, where you can pick the font you want. In MacVim ":set guifont=*" calls: > - :action orderFrontFontPanel: + :macaction orderFrontFontPanel: < which is the same as choosing "Show Fonts..." from the main menu. The font name depends on the GUI used. See |setting-guifont| for a @@ -3317,8 +3317,9 @@ A jump table for the options with a short description can be found at |Q_op|. MacVim only: *guifontwide_macvim* - MacVim performs automatic font substitution, setting 'guifontwide' has - no effect. + MacVim performs automatic font substitution. If 'guifontwide' is set, + that font will be used for all wide fonts. However, if a glyph is + not available in the wide font, then font substitution is still used. GTK+ 2 GUI only: *guifontwide_gtk2* From 8e8f563178d60aac24dfdf733d75ce8f31f3d5bf Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sun, 11 Nov 2007 20:27:03 +0100 Subject: [PATCH 0326/1156] Support file-open check for multiple files When dropping multiple files, make sure none of the files are already open. If all files were already open, then select the window and tab of the first file that was open. If at least one file was not already open, then simply ignore the open files and open the unopened ones. Also don't check if files exists inside application:openFiles: since files that are passed here are assumed to already exists. The existence check has been moved to the system services message openFile:userData:error:. --- src/MacVim/MMAppController.m | 214 +++++++++++++++++++++-------------- src/MacVim/MacVim.h | 7 ++ src/MacVim/MacVim.m | 22 +++- 3 files changed, 159 insertions(+), 84 deletions(-) diff --git a/src/MacVim/MMAppController.m b/src/MacVim/MMAppController.m index 25b7f1018e..4a15f451d1 100644 --- a/src/MacVim/MMAppController.m +++ b/src/MacVim/MMAppController.m @@ -50,6 +50,8 @@ @interface MMAppController (Private) - (MMVimController *)keyVimController; - (MMVimController *)topmostVimController; - (void)launchVimProcessWithArguments:(NSArray *)args; +- (NSArray *)filterFilesAndNotify:(NSArray *)files; +- (NSArray *)filterOpenFilesAndRaiseFirst:(NSArray *)filenames; @end @interface NSMenu (MMExtras) @@ -155,86 +157,21 @@ - (BOOL)applicationOpenUntitledFile:(NSApplication *)sender - (void)application:(NSApplication *)sender openFiles:(NSArray *)filenames { - // Go trough 'filenames' array and make sure each file exists. - NSString *firstMissingFile = nil; - NSMutableArray *files = [NSMutableArray array]; - int i, count = [filenames count]; - for (i = 0; i < count; ++i) { - NSString *name = [filenames objectAtIndex:i]; - if ([[NSFileManager defaultManager] fileExistsAtPath:name]) { - [files addObject:name]; - } else if (!firstMissingFile) { - firstMissingFile = name; - } - } - - if (firstMissingFile) { - NSAlert *alert = [[NSAlert alloc] init]; - [alert addButtonWithTitle:@"OK"]; - - NSString *text; - if ([files count] >= count-1) { - [alert setMessageText:@"File not found"]; - text = [NSString stringWithFormat:@"Could not open file with " - "name %@.", firstMissingFile]; + filenames = [self filterOpenFilesAndRaiseFirst:filenames]; + if ([filenames count]) { + MMVimController *vc; + BOOL openInTabs = [[NSUserDefaults standardUserDefaults] + boolForKey:MMOpenFilesInTabsKey]; + + if (openInTabs && (vc = [self topmostVimController])) { + [vc dropFiles:filenames]; } else { - [alert setMessageText:@"Multiple files not found"]; - text = [NSString stringWithFormat:@"Could not open file with " - "name %@, and %d other files.", firstMissingFile, - count-[files count]-1]; - } - - [alert setInformativeText:text]; - [alert setAlertStyle:NSWarningAlertStyle]; - - [alert runModal]; - [alert release]; - - [NSApp replyToOpenOrPrint:NSApplicationDelegateReplyFailure]; - return; - } - - if ([files count] == 1) { - // Check if the file is already open...if so raise that window. - i, count = [vimControllers count]; - for (i = 0; i < count; ++i) { - MMVimController *controller = [vimControllers objectAtIndex:i]; - id proxy = [controller backendProxy]; - NSString *file = [[files objectAtIndex:0] - stringByEscapingSpecialFilenameCharacters]; - - @try { - NSString *expr = [NSString stringWithFormat: - @"bufloaded(\"%@\")", file]; - NSString *eval = [proxy evaluateExpression:expr]; - if ([eval isEqual:@"1"]) { - // TODO: Select the tab with 'file' open. - NSString *input = [NSString stringWithFormat:@"" - ":let oldswb=&swb|let &swb=\"useopen,usetab\"|" - "tab sb %@|let &swb=oldswb|unl oldswb|" - "cal foreground()|redr|f", file]; - [controller addVimInput:input]; - return; - } - } - @catch (NSException *e) { - // Do nothing ... - } + NSMutableArray *args = [NSMutableArray arrayWithObject:@"-p"]; + [args addObjectsFromArray:filenames]; + [self launchVimProcessWithArguments:args]; } } - MMVimController *vc; - BOOL openInTabs = [[NSUserDefaults standardUserDefaults] - boolForKey:MMOpenFilesInTabsKey]; - - if (openInTabs && (vc = [self topmostVimController])) { - [vc dropFiles:files]; - } else { - NSMutableArray *args = [NSMutableArray arrayWithObject:@"-p"]; - [args addObjectsFromArray:files]; - [self launchVimProcessWithArguments:args]; - } - [NSApp replyToOpenOrPrint:NSApplicationDelegateReplySuccess]; // NSApplicationDelegateReplySuccess = 0, // NSApplicationDelegateReplyCancel = 1, @@ -528,14 +465,18 @@ - (void)openFile:(NSPasteboard *)pboard userData:(NSString *)userData [NSCharacterSet whitespaceAndNewlineCharacterSet]]; string = [string stringByStandardizingPath]; - MMVimController *vc = nil; - if (userData && [userData isEqual:@"Tab"]) - vc = [self topmostVimController]; + NSArray *filenames = [self filterFilesAndNotify: + [NSArray arrayWithObject:string]]; + if ([filenames count] > 0) { + MMVimController *vc = nil; + if (userData && [userData isEqual:@"Tab"]) + vc = [self topmostVimController]; - if (vc) { - [vc dropFiles:[NSArray arrayWithObject:string]]; - } else { - [self application:NSApp openFiles:[NSArray arrayWithObject:string]]; + if (vc) { + [vc dropFiles:filenames]; + } else { + [self application:NSApp openFiles:filenames]; + } } } @@ -614,6 +555,113 @@ - (void)launchVimProcessWithArguments:(NSArray *)args [NSTask launchedTaskWithLaunchPath:shell arguments:shellArgs]; } +- (NSArray *)filterFilesAndNotify:(NSArray *)filenames +{ + // Go trough 'filenames' array and make sure each file exists. Present + // warning dialog if some file was missing. + + NSString *firstMissingFile = nil; + NSMutableArray *files = [NSMutableArray array]; + unsigned i, count = [filenames count]; + + for (i = 0; i < count; ++i) { + NSString *name = [filenames objectAtIndex:i]; + if ([[NSFileManager defaultManager] fileExistsAtPath:name]) { + [files addObject:name]; + } else if (!firstMissingFile) { + firstMissingFile = name; + } + } + + if (firstMissingFile) { + NSAlert *alert = [[NSAlert alloc] init]; + [alert addButtonWithTitle:@"OK"]; + + NSString *text; + if ([files count] >= count-1) { + [alert setMessageText:@"File not found"]; + text = [NSString stringWithFormat:@"Could not open file with " + "name %@.", firstMissingFile]; + } else { + [alert setMessageText:@"Multiple files not found"]; + text = [NSString stringWithFormat:@"Could not open file with " + "name %@, and %d other files.", firstMissingFile, + count-[files count]-1]; + } + + [alert setInformativeText:text]; + [alert setAlertStyle:NSWarningAlertStyle]; + + [alert runModal]; + [alert release]; + + [NSApp replyToOpenOrPrint:NSApplicationDelegateReplyFailure]; + } + + return files; +} + +- (NSArray *)filterOpenFilesAndRaiseFirst:(NSArray *)filenames +{ + // Check if any of the files in the 'filenames' array are open in any Vim + // process. Remove the files that are open from the 'filenames' array and + // return it. If all files were filtered out, then raise the first file in + // the Vim process it is open. + + MMVimController *raiseController = nil; + NSString *raiseFile = nil; + NSMutableArray *files = [filenames mutableCopy]; + NSString *expr = [NSString stringWithFormat: + @"map([\"%@\"],\"bufloaded(v:val)\")", + [files componentsJoinedByString:@"\",\""]]; + unsigned i, count = [vimControllers count]; + + for (i = 0; i < count && [files count]; ++i) { + MMVimController *controller = [vimControllers objectAtIndex:i]; + id proxy = [controller backendProxy]; + + @try { + NSString *eval = [proxy evaluateExpression:expr]; + NSIndexSet *idxSet = [NSIndexSet indexSetWithVimList:eval]; + if ([idxSet count]) { + if (!raiseFile) { + // Remember the file and which Vim that has it open so that + // we can raise it later on. + raiseController = controller; + raiseFile = [files objectAtIndex:[idxSet firstIndex]]; + [[raiseFile retain] autorelease]; + } + + // Remove all the files that were open in this Vim process and + // create a new expression to evaluate. + [files removeObjectsAtIndexes:idxSet]; + expr = [NSString stringWithFormat: + @"map([\"%@\"],\"bufloaded(v:val)\")", + [files componentsJoinedByString:@"\",\""]]; + } + } + @catch (NSException *e) { + // Do nothing ... + } + } + + if (![files count] && raiseFile) { + // Raise the window containing the first file that was already open, + // and make sure that the tab containing that file is selected. Only + // do this if there are no more files to open, otherwise sometimes the + // window with 'raiseFile' will be raised, other times it might be the + // window that will open with the files in the 'files' array. + raiseFile = [raiseFile stringByEscapingSpecialFilenameCharacters]; + NSString *input = [NSString stringWithFormat:@"" + ":let oldswb=&swb|let &swb=\"useopen,usetab\"|" + "tab sb %@|let &swb=oldswb|unl oldswb|" + "cal foreground()|redr|f", raiseFile]; + [raiseController addVimInput:input]; + } + + return files; +} + @end // MMAppController (Private) diff --git a/src/MacVim/MacVim.h b/src/MacVim/MacVim.h index 6d610d12c5..1a77024d02 100644 --- a/src/MacVim/MacVim.h +++ b/src/MacVim/MacVim.h @@ -224,3 +224,10 @@ ATSFontContainerRef loadFonts(); @interface NSString (MMExtras) - (NSString *)stringByEscapingSpecialFilenameCharacters; @end + + + + +@interface NSIndexSet (MMExtras) ++ (id)indexSetWithVimList:(NSString *)list; +@end diff --git a/src/MacVim/MacVim.m b/src/MacVim/MacVim.m index 33afe4c5e7..45504ab4c0 100644 --- a/src/MacVim/MacVim.m +++ b/src/MacVim/MacVim.m @@ -167,5 +167,25 @@ - (NSString *)stringByEscapingSpecialFilenameCharacters return [string autorelease]; } - @end // NSString (MMExtras) + + + +@implementation NSIndexSet (MMExtras) + ++ (id)indexSetWithVimList:(NSString *)list +{ + NSMutableIndexSet *idxSet = [NSMutableIndexSet indexSet]; + NSArray *array = [list componentsSeparatedByString:@"\n"]; + unsigned i, count = [array count]; + + for (i = 0; i < count; ++i) { + NSString *entry = [array objectAtIndex:i]; + if ([entry intValue] > 0) + [idxSet addIndex:i]; + } + + return idxSet; +} + +@end // NSIndexSet (MMExtras) From 3306ace54ed6ab2be7e85601a619d54c3e28274b Mon Sep 17 00:00:00 2001 From: Nico Weber Date: Sun, 11 Nov 2007 20:34:57 +0100 Subject: [PATCH 0327/1156] Enable trackpad scrolling over the black area in full-screen --- src/MacVim/MMFullscreenWindow.m | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/MacVim/MMFullscreenWindow.m b/src/MacVim/MMFullscreenWindow.m index 360ff3b994..df2febdb15 100644 --- a/src/MacVim/MMFullscreenWindow.m +++ b/src/MacVim/MMFullscreenWindow.m @@ -195,6 +195,11 @@ - (BOOL)canBecomeMainWindow #pragma mark Proxy/Decorator/whatever stuff +- (void)scrollWheel:(NSEvent *)theEvent +{ + [[view textView] scrollWheel:theEvent]; +} + // the window controller will send us messages that are meant for the original, // non-fullscreen window. forward those, and interpret the messages that are // interesting for us From eaaacf8af6bda38046c6bf6ee201012614ce0426 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Mon, 12 Nov 2007 20:17:57 +0100 Subject: [PATCH 0328/1156] Disable login shell with "MMLoginShell" New Vim processes are by default launched via a login shell so that the user's environment gets profiled. This behavior can be disabled by setting the user default "MMLoginShell" to 0. --- src/MacVim/MMAppController.m | 65 +++++++++++++++++++++++------------- src/MacVim/MacVim.h | 1 + src/MacVim/MacVim.m | 1 + 3 files changed, 43 insertions(+), 24 deletions(-) diff --git a/src/MacVim/MMAppController.m b/src/MacVim/MMAppController.m index 4a15f451d1..21f61c1ecd 100644 --- a/src/MacVim/MMAppController.m +++ b/src/MacVim/MMAppController.m @@ -84,6 +84,7 @@ + (void)initialize [NSNumber numberWithBool:YES], MMTranslateCtrlClickKey, [NSNumber numberWithBool:NO], MMOpenFilesInTabsKey, [NSNumber numberWithBool:NO], MMNoFontSubstitutionKey, + [NSNumber numberWithBool:YES], MMLoginShellKey, nil]; [[NSUserDefaults standardUserDefaults] registerDefaults:dict]; @@ -520,39 +521,55 @@ - (MMVimController *)topmostVimController - (void)launchVimProcessWithArguments:(NSArray *)args { + NSString *taskPath = nil; + NSArray *taskArgs = nil; NSString *path = [[NSBundle mainBundle] pathForAuxiliaryExecutable:@"Vim"]; + if (!path) { NSLog(@"ERROR: Vim executable could not be found inside app bundle!"); return; } - NSMutableString *execArg = [NSMutableString - stringWithFormat:@"exec \"%@\" -g", path]; - if (args) { - // Append all arguments while making sure that arguments containing - // spaces are enclosed in quotes. - NSCharacterSet *space = [NSCharacterSet whitespaceCharacterSet]; - unsigned i, count = [args count]; - - for (i = 0; i < count; ++i) { - NSString *arg = [args objectAtIndex:i]; - if (NSNotFound != [arg rangeOfCharacterFromSet:space].location) - [execArg appendFormat:@" \"%@\"", arg]; - else - [execArg appendFormat:@" %@", arg]; + if ([[NSUserDefaults standardUserDefaults] boolForKey:MMLoginShellKey]) { + // Run process with a login shell + // $SHELL -l -c "exec Vim args" + + NSMutableString *execArg = [NSMutableString + stringWithFormat:@"exec \"%@\" -g", path]; + if (args) { + // Append all arguments while making sure that arguments containing + // spaces are enclosed in quotes. + NSCharacterSet *space = [NSCharacterSet whitespaceCharacterSet]; + unsigned i, count = [args count]; + + for (i = 0; i < count; ++i) { + NSString *arg = [args objectAtIndex:i]; + if (NSNotFound != [arg rangeOfCharacterFromSet:space].location) + [execArg appendFormat:@" \"%@\"", arg]; + else + [execArg appendFormat:@" %@", arg]; + } } - } - // Launch the process with a login shell so that users environment settings - // get sourced. This does not always happen when MacVim is started. - NSArray *shellArgs = [NSArray arrayWithObjects:@"-l", @"-c", execArg, nil]; - NSString *shell = [[[NSProcessInfo processInfo] environment] - objectForKey:@"SHELL"]; - if (!shell) - shell = @"/bin/sh"; + // Launch the process with a login shell so that users environment + // settings get sourced. This does not always happen when MacVim is + // started. + taskArgs = [NSArray arrayWithObjects:@"-l", @"-c", execArg, nil]; + taskPath = [[[NSProcessInfo processInfo] environment] + objectForKey:@"SHELL"]; + if (!taskPath) + taskPath = @"/bin/sh"; + } else { + // Run process directly: + // Vim args + taskPath = path; + taskArgs = [NSArray arrayWithObject:@"-g"]; + if (args) + taskArgs = [taskArgs arrayByAddingObjectsFromArray:args]; + } - //NSLog(@"Launching: %@ args: %@", shell, shellArgs); - [NSTask launchedTaskWithLaunchPath:shell arguments:shellArgs]; + //NSLog(@"Launching: %@ args: %@", taskPath, taskArgs); + [NSTask launchedTaskWithLaunchPath:taskPath arguments:taskArgs]; } - (NSArray *)filterFilesAndNotify:(NSArray *)filenames diff --git a/src/MacVim/MacVim.h b/src/MacVim/MacVim.h index 1a77024d02..49031ca921 100644 --- a/src/MacVim/MacVim.h +++ b/src/MacVim/MacVim.h @@ -210,6 +210,7 @@ extern NSString *MMTranslateCtrlClickKey; extern NSString *MMTopLeftPointKey; extern NSString *MMOpenFilesInTabsKey; extern NSString *MMNoFontSubstitutionKey; +extern NSString *MMLoginShellKey; diff --git a/src/MacVim/MacVim.m b/src/MacVim/MacVim.m index 45504ab4c0..e3e6a9f416 100644 --- a/src/MacVim/MacVim.m +++ b/src/MacVim/MacVim.m @@ -91,6 +91,7 @@ NSString *MMTopLeftPointKey = @"MMTopLeftPoint"; NSString *MMOpenFilesInTabsKey = @"MMOpenFilesInTabs"; NSString *MMNoFontSubstitutionKey = @"MMNoFontSubstitution"; +NSString *MMLoginShellKey = @"MMLoginShell"; From f7e4a83a9267c334a11787d87005d56c8d473642 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Tue, 13 Nov 2007 19:15:11 +0100 Subject: [PATCH 0329/1156] Add IM control support When the default system keyboard script is non-roman the input manager is automatically switched to a roman keyboard script when going to normal mode. See 'imd', 'imc', 'imi' for some relevant options. MacVim uses an over-the-spot style of IM support. --- src/MacVim/MMBackend.h | 1 + src/MacVim/MMBackend.m | 8 +++++++ src/MacVim/MMTextView.h | 3 +++ src/MacVim/MMTextView.m | 33 +++++++++++++++-------------- src/MacVim/MMVimController.m | 3 +++ src/MacVim/MacVim.h | 1 + src/MacVim/MacVim.m | 1 + src/MacVim/gui_macvim.m | 41 ++++++++++++++++++++++++++++++++++++ src/Makefile | 2 +- src/vim.h | 3 ++- 10 files changed, 78 insertions(+), 18 deletions(-) diff --git a/src/MacVim/MMBackend.h b/src/MacVim/MMBackend.h index 2f8cc74cfe..02b959e195 100644 --- a/src/MacVim/MMBackend.h +++ b/src/MacVim/MMBackend.h @@ -106,6 +106,7 @@ - (void)stopBlink; - (void)adjustLinespace:(int)linespace; - (void)activate; +- (void)setPreEditRow:(int)row column:(int)col; - (int)lookupColorWithKey:(NSString *)key; - (BOOL)hasSpecialKeyWithValue:(NSString *)value; diff --git a/src/MacVim/MMBackend.m b/src/MacVim/MMBackend.m index 9dcf64ed93..ee21c66bc7 100644 --- a/src/MacVim/MMBackend.m +++ b/src/MacVim/MMBackend.m @@ -946,6 +946,14 @@ - (void)activate [self queueMessage:ActivateMsgID data:nil]; } +- (void)setPreEditRow:(int)row column:(int)col +{ + NSMutableData *data = [NSMutableData data]; + [data appendBytes:&row length:sizeof(int)]; + [data appendBytes:&col length:sizeof(int)]; + [self queueMessage:SetPreEditPositionMsgID data:data]; +} + - (int)lookupColorWithKey:(NSString *)key { if (!(key && [key length] > 0)) diff --git a/src/MacVim/MMTextView.h b/src/MacVim/MMTextView.h index 69ea8ba0aa..528d4f0b57 100644 --- a/src/MacVim/MMTextView.h +++ b/src/MacVim/MMTextView.h @@ -26,10 +26,13 @@ int insertionPointShape; int insertionPointFraction; NSTextField *markedTextField; + int preEditRow; + int preEditColumn; } - (NSEvent *)lastMouseDownEvent; - (void)setShouldDrawInsertionPoint:(BOOL)on; +- (void)setPreEditRow:(int)row column:(int)col; - (void)drawInsertionPointAtRow:(int)row column:(int)col shape:(int)shape fraction:(int)percent color:(NSColor *)color; - (void)hideMarkedTextField; diff --git a/src/MacVim/MMTextView.m b/src/MacVim/MMTextView.m index d7e7ba2794..1495dd1b61 100644 --- a/src/MacVim/MMTextView.m +++ b/src/MacVim/MMTextView.m @@ -79,6 +79,12 @@ - (void)setShouldDrawInsertionPoint:(BOOL)on shouldDrawInsertionPoint = on; } +- (void)setPreEditRow:(int)row column:(int)col +{ + preEditRow = row; + preEditColumn = col; +} + - (void)drawInsertionPointAtRow:(int)row column:(int)col shape:(int)shape fraction:(int)percent color:(NSColor *)color { @@ -396,7 +402,7 @@ - (void)setMarkedText:(id)text selectedRange:(NSRange)range // Convert coordinates (row,col) -> view -> window base -> screen NSPoint origin; - if (![self convertRow:insertionPointRow+1 column:insertionPointColumn + if (![self convertRow:preEditRow+1 column:preEditColumn toPoint:&origin]) return; origin = [self convertPoint:origin toView:nil]; @@ -427,26 +433,21 @@ - (NSRect)firstRectForCharacterRange:(NSRange)range // HACK! Since we always return marked text to have location NSNotFound, // this method will be called with 'range.location == NSNotFound' whenever - // the input manager tries to position a popup window near the insertion - // point. For this reason we compute where the insertion point is and - // return a rect which contains it. + // the input manager tries to position a popup window at the pre-edit + // point. The pre-edit point itself is set by the IM routines in Vim + // (MacVim is notified via the SetPreEditPositionMsgID). if (!(ts && lm && tc) || NSNotFound != range.location) return [super firstRectForCharacterRange:range]; - unsigned charIdx = [ts characterIndexForRow:insertionPointRow - column:insertionPointColumn]; - NSRange glyphRange = - [lm glyphRangeForCharacterRange:NSMakeRange(charIdx,1) - actualCharacterRange:NULL]; - NSRect ipRect = [lm boundingRectForGlyphRange:glyphRange - inTextContainer:tc]; - ipRect.origin.x += [self textContainerOrigin].x; - ipRect.origin.y += [self textContainerOrigin].y + [ts cellSize].height; + NSRect rect = [ts boundingRectForCharacterAtRow:preEditRow + column:preEditColumn]; + rect.origin.x += [self textContainerOrigin].x; + rect.origin.y += [self textContainerOrigin].y + [ts cellSize].height; - ipRect.origin = [self convertPoint:ipRect.origin toView:nil]; - ipRect.origin = [[self window] convertBaseToScreen:ipRect.origin]; + rect.origin = [self convertPoint:rect.origin toView:nil]; + rect.origin = [[self window] convertBaseToScreen:rect.origin]; - return ipRect; + return rect; } - (void)scrollWheel:(NSEvent *)event diff --git a/src/MacVim/MMVimController.m b/src/MacVim/MMVimController.m index b2aa95b4a1..d436af5f68 100644 --- a/src/MacVim/MMVimController.m +++ b/src/MacVim/MMVimController.m @@ -814,6 +814,9 @@ - (void)handleMessage:(int)msgid data:(NSData *)data [[windowController window] setDocumentEdited:NO]; } else if (BuffersModifiedMsgID == msgid) { [[windowController window] setDocumentEdited:YES]; + } else if (SetPreEditPositionMsgID == msgid) { + const int *dim = (const int*)[data bytes]; + [[windowController textView] setPreEditRow:dim[0] column:dim[1]]; } else { NSLog(@"WARNING: Unknown message received (msgid=%d)", msgid); } diff --git a/src/MacVim/MacVim.h b/src/MacVim/MacVim.h index 49031ca921..b07b33339f 100644 --- a/src/MacVim/MacVim.h +++ b/src/MacVim/MacVim.h @@ -155,6 +155,7 @@ enum { BuffersNotModifiedMsgID, BuffersModifiedMsgID, AddInputMsgID, + SetPreEditPositionMsgID, }; diff --git a/src/MacVim/MacVim.m b/src/MacVim/MacVim.m index e3e6a9f416..b9a5df8cdf 100644 --- a/src/MacVim/MacVim.m +++ b/src/MacVim/MacVim.m @@ -68,6 +68,7 @@ "BuffersNotModifiedMsgID", "BuffersModifiedMsgID", "AddInputMsgID", + "SetPreEditPositionMsgID", }; diff --git a/src/MacVim/gui_macvim.m b/src/MacVim/gui_macvim.m index 58ecde86b8..839b8383e6 100644 --- a/src/MacVim/gui_macvim.m +++ b/src/MacVim/gui_macvim.m @@ -1104,6 +1104,47 @@ +// -- Input Method ---------------------------------------------------------- + +#if defined(USE_IM_CONTROL) + + void +im_set_position(int row, int col) +{ + // The pre-edit area is a popup window which is displayed by MMTextView. + [[MMBackend sharedInstance] setPreEditRow:row column:col]; +} + + + void +im_set_active(int active) +{ + // Set roman or the system script if 'active' is TRUE or FALSE, + // respectively. + SInt32 systemScript = GetScriptManagerVariable(smSysScript); + + if (!p_imdisable && smRoman != systemScript) + KeyScript(active ? smKeySysScript : smKeyRoman); +} + + + int +im_get_status(void) +{ + // IM is active whenever the current script is the system script and the + // system script isn't roman. (Hence IM can only be active when using + // non-roman scripts.) + SInt32 currentScript = GetScriptManagerVariable(smKeyScript); + SInt32 systemScript = GetScriptManagerVariable(smSysScript); + + return currentScript != smRoman && currentScript == systemScript; +} + +#endif // defined(USE_IM_CONTROL) + + + + // -- Unsorted -------------------------------------------------------------- diff --git a/src/Makefile b/src/Makefile index d7b3852dbf..7516978cda 100644 --- a/src/Makefile +++ b/src/Makefile @@ -1233,7 +1233,7 @@ MACVIMGUI_OBJ = objects/gui.o objects/pty.o objects/gui_macvim.o \ MACVIMGUI_DEFS = -DFEAT_GUI_MACVIM -Wall -Wno-unknown-pragmas -pipe MACVIMGUI_IPATH = -I. -Iproto MACVIMGUI_LIBS_DIR = -MACVIMGUI_LIBS1 = -framework Cocoa +MACVIMGUI_LIBS1 = -framework Cocoa -framework Carbon MACVIMGUI_LIBS2 = MACVIMGUI_INSTALL = install_normal MACVIMGUI_TARGETS = diff --git a/src/vim.h b/src/vim.h index 9b25537ce1..328439a6f9 100644 --- a/src/vim.h +++ b/src/vim.h @@ -463,7 +463,8 @@ typedef unsigned long u8char_T; /* long should be 32 bits or more */ * Check input method control. */ #if defined(FEAT_XIM) || \ - (defined(FEAT_GUI) && (defined(FEAT_MBYTE_IME) || defined(GLOBAL_IME))) + (defined(FEAT_GUI) && (defined(FEAT_MBYTE_IME) || defined(GLOBAL_IME))) \ + || defined(FEAT_GUI_MACVIM) # define USE_IM_CONTROL #endif From e3cd69d29cbd161f4f3eb73f2ceeac1d7e9e0acd Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Tue, 13 Nov 2007 20:18:16 +0100 Subject: [PATCH 0330/1156] Improved marked text handling Delete, enter, escape, all work as expected with marked text visible. --- src/MacVim/MMTextStorage.m | 3 +++ src/MacVim/MMTextView.m | 53 ++++++++++---------------------------- 2 files changed, 16 insertions(+), 40 deletions(-) diff --git a/src/MacVim/MMTextStorage.m b/src/MacVim/MMTextStorage.m index 336d51839c..d4fabf1477 100644 --- a/src/MacVim/MMTextStorage.m +++ b/src/MacVim/MMTextStorage.m @@ -115,6 +115,8 @@ - (void)replaceCharactersInRange:(NSRange)range - (void)setAttributes:(NSDictionary *)attributes range:(NSRange)range { + //NSLog(@"%s%@", _cmd, NSStringFromRange(range)); + // NOTE! This method must be implemented since the text system calls it // constantly to 'fix attributes', apply font substitution, etc. #if 0 @@ -156,6 +158,7 @@ - (void)setAttributes:(NSDictionary *)attributes range:(NSRange)range [attribString setAttributes:newAttr range:range]; } else { + //NSLog(@"NOT fixing font attribute!"); [attribString setAttributes:attributes range:range]; } #endif diff --git a/src/MacVim/MMTextView.m b/src/MacVim/MMTextView.m index 1495dd1b61..bda16d6ef2 100644 --- a/src/MacVim/MMTextView.m +++ b/src/MacVim/MMTextView.m @@ -10,7 +10,11 @@ /* * MMTextView * - * Dispatches keyboard and mouse input to the backend. Also handles drag&drop. + * Dispatches keyboard and mouse input to the backend. Handles drag-n-drop of + * files onto window. + * + * Support for input managers is somewhat hacked together. Marked text is + * displayed in a popup window instead of 'in-line' (because it is easier). */ #import "MMTextView.h" @@ -225,6 +229,8 @@ - (void)insertText:(id)string if ([string isKindOfClass:[NSAttributedString class]]) string = [string string]; + //NSLog(@"send InsertTextMsgID: %@", string); + [[self vimController] sendMessage:InsertTextMsgID data:[string dataUsingEncoding:NSUTF8StringEncoding]]; } @@ -350,12 +356,8 @@ - (BOOL)hasMarkedText - (NSRange)markedRange { //NSLog(@"%s", _cmd); - // HACK! If a valid range is returned, then NSTextView changes the - // background color of the returned range. Since marked text is displayed - // in a separate popup window this behaviour is not wanted. By setting the - // location of the returned range to NSNotFound NSTextView does nothing. - // This hack is continued in 'firstRectForCharacterRange:'. - return NSMakeRange(NSNotFound, 0); + unsigned len = [[markedTextField stringValue] length]; + return NSMakeRange(len > 0 ? 0 : NSNotFound, len); } - (void)setMarkedText:(id)text selectedRange:(NSRange)range @@ -426,18 +428,11 @@ - (void)unmarkText - (NSRect)firstRectForCharacterRange:(NSRange)range { //NSLog(@"%s%@", _cmd, NSStringFromRange(range)); - + // HACK! This method is called when the input manager wants to pop up an + // auxiliary window. The position where this should be is controller by + // Vim by sending SetPreEditPositionMsgID so compute a position based on + // the pre-edit (row,column) pair. MMTextStorage *ts = (MMTextStorage*)[self textStorage]; - NSLayoutManager *lm = [self layoutManager]; - NSTextContainer *tc = [self textContainer]; - - // HACK! Since we always return marked text to have location NSNotFound, - // this method will be called with 'range.location == NSNotFound' whenever - // the input manager tries to position a popup window at the pre-edit - // point. The pre-edit point itself is set by the IM routines in Vim - // (MacVim is notified via the SetPreEditPositionMsgID). - if (!(ts && lm && tc) || NSNotFound != range.location) - return [super firstRectForCharacterRange:range]; NSRect rect = [ts boundingRectForCharacterAtRow:preEditRow column:preEditColumn]; @@ -792,27 +787,6 @@ @implementation MMTextView (Private) - (BOOL)convertPoint:(NSPoint)point toRow:(int *)row column:(int *)column { -#if 0 - NSLayoutManager *lm = [self layoutManager]; - NSTextContainer *tc = [self textContainer]; - MMTextStorage *ts = (MMTextStorage*)[self textStorage]; - - if (!(lm && tc && ts)) - return NO; - - unsigned glyphIdx = [lm glyphIndexForPoint:point inTextContainer:tc]; - unsigned charIdx = [lm characterIndexForGlyphAtIndex:glyphIdx]; - - int mod = [ts maxColumns] + 1; - - if (row) *row = (int)(charIdx / mod); - if (column) *column = (int)(charIdx % mod); - - NSLog(@"convertPoint:%@ toRow:%d column:%d", NSStringFromPoint(point), - *row, *column); - - return YES; -#else MMTextStorage *ts = (MMTextStorage*)[self textStorage]; NSSize cellSize = [ts cellSize]; if (!(cellSize.width > 0 && cellSize.height > 0)) @@ -826,7 +800,6 @@ - (BOOL)convertPoint:(NSPoint)point toRow:(int *)row column:(int *)column // *row, *column); return YES; -#endif } - (BOOL)convertRow:(int)row column:(int)column toPoint:(NSPoint *)point From 5ba1fac48656beb69c2ebde1f67543ac71f81b21 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Thu, 15 Nov 2007 20:40:09 +0100 Subject: [PATCH 0331/1156] Fix autocommands in macvim color scheme Calling ':set bg=dark' in .gvimrc clears colors_name which caused an error message to pop up every time the focus changed due to the autocommands installed in macvim.vim accessing colors_name. --- runtime/colors/macvim.vim | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/runtime/colors/macvim.vim b/runtime/colors/macvim.vim index 320f035515..836cab47cb 100644 --- a/runtime/colors/macvim.vim +++ b/runtime/colors/macvim.vim @@ -1,7 +1,7 @@ " MacVim colorscheme " " Maintainer: Bjorn Winckler -" Last Change: 2007 Oct 25 +" Last Change: 2007 Nov 15 " @@ -84,8 +84,8 @@ hi Todo gui=NONE guifg=DarkGreen guibg=PaleGreen1 " Change the selection color on focus change (but only if the "macvim" " colorscheme is active). if !exists("s:augroups_defined") - au FocusLost * if colors_name == "macvim" | hi Visual guibg=MacSecondarySelectedControlColor | endif - au FocusGained * if colors_name == "macvim" | hi Visual guibg=MacSelectedTextBackgroundColor | endif + au FocusLost * if exists("colors_name") && colors_name == "macvim" | hi Visual guibg=MacSecondarySelectedControlColor | endif + au FocusGained * if exists("colors_name") && colors_name == "macvim" | hi Visual guibg=MacSelectedTextBackgroundColor | endif let s:augroups_defined = 1 endif From 8df6521434b0287c2ccfe9356efbf888e5ecd8f3 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Thu, 15 Nov 2007 22:04:06 +0100 Subject: [PATCH 0332/1156] Preserve swap files after crash Before terminating gracefully, send a TerminateNowMsgID to every Vim process so that they can determine whether MacVim quit or crashed. If MacVim quits, call getout() to exit Vim (this removes swap files), otherwise call getout_preserve_modified() (this preserves swap files). --- src/MacVim/MMAppController.m | 11 ++++++++++- src/MacVim/MMBackend.h | 1 + src/MacVim/MMBackend.m | 14 ++++++++++---- src/MacVim/MacVim.h | 1 + src/MacVim/MacVim.m | 1 + src/main.c | 3 ++- 6 files changed, 25 insertions(+), 6 deletions(-) diff --git a/src/MacVim/MMAppController.m b/src/MacVim/MMAppController.m index 21f61c1ecd..18e106a6be 100644 --- a/src/MacVim/MMAppController.m +++ b/src/MacVim/MMAppController.m @@ -198,7 +198,7 @@ - (NSApplicationTerminateReply)applicationShouldTerminate: // 'documentEdited' flag of the window correspondingly.) NSEnumerator *e = [[NSApp windows] objectEnumerator]; id window; - while (window = [e nextObject]) { + while ((window = [e nextObject])) { if ([window isDocumentEdited]) { modifiedBuffers = YES; break; @@ -220,6 +220,15 @@ - (NSApplicationTerminateReply)applicationShouldTerminate: [alert release]; } + // Tell all Vim processes to terminate now (otherwise they'll leave swap + // files behind). + if (NSTerminateNow == reply) { + e = [vimControllers objectEnumerator]; + id vc; + while ((vc = [e nextObject])) + [vc sendMessage:TerminateNowMsgID data:nil]; + } + return reply; } diff --git a/src/MacVim/MMBackend.h b/src/MacVim/MMBackend.h index 02b959e195..008a97b860 100644 --- a/src/MacVim/MMBackend.h +++ b/src/MacVim/MMBackend.h @@ -44,6 +44,7 @@ NSString *alternateServerName; ATSFontContainerRef fontContainerRef; NSFont *oldWideFont; + BOOL isTerminating; } + (MMBackend *)sharedInstance; diff --git a/src/MacVim/MMBackend.m b/src/MacVim/MMBackend.m index ee21c66bc7..40832d5efe 100644 --- a/src/MacVim/MMBackend.m +++ b/src/MacVim/MMBackend.m @@ -1133,6 +1133,8 @@ - (oneway void)processInput:(int)msgid data:(in bycopy NSData *)data [self addInput:string]; [string release]; } + } else if (TerminateNowMsgID == msgid) { + isTerminating = YES; } else { // Not keyboard or mouse event, queue it and handle later. //NSLog(@"Add event %s to input event queue", MessageStrings[msgid]); @@ -1776,11 +1778,15 @@ - (void)connectionDidDie:(NSNotification *)notification { // If the main connection to MacVim is lost this means that MacVim was // either quit (by the user chosing Quit on the MacVim menu), or it has - // crashed. In either case our only option is to quit now. - // TODO: Write backup file? + // crashed. In the former case the flag 'isTerminating' is set and we then + // quit cleanly; in the latter case we make sure the swap files are left + // for recovery. - //NSLog(@"A Vim process lost its connection to MacVim; quitting."); - getout(0); + NSLog(@"%s isTerminating=%d", _cmd, isTerminating); + if (isTerminating) + getout(0); + else + getout_preserve_modified(1); } - (void)blinkTimerFired:(NSTimer *)timer diff --git a/src/MacVim/MacVim.h b/src/MacVim/MacVim.h index b07b33339f..515f887775 100644 --- a/src/MacVim/MacVim.h +++ b/src/MacVim/MacVim.h @@ -156,6 +156,7 @@ enum { BuffersModifiedMsgID, AddInputMsgID, SetPreEditPositionMsgID, + TerminateNowMsgID, }; diff --git a/src/MacVim/MacVim.m b/src/MacVim/MacVim.m index b9a5df8cdf..5e718fd6d0 100644 --- a/src/MacVim/MacVim.m +++ b/src/MacVim/MacVim.m @@ -69,6 +69,7 @@ "BuffersModifiedMsgID", "AddInputMsgID", "SetPreEditPositionMsgID", + "TerminateNowMsgID", }; diff --git a/src/main.c b/src/main.c index f5533abbd5..4b46964889 100644 --- a/src/main.c +++ b/src/main.c @@ -1226,7 +1226,8 @@ main_loop(cmdwin, noexmode) } -#if defined(USE_XSMP) || defined(FEAT_GUI_MSWIN) || defined(PROTO) +#if defined(USE_XSMP) || defined(FEAT_GUI_MSWIN) || defined(PROTO) \ + || defined(FEAT_GUI_MACVIM) /* * Exit, but leave behind swap files for modified buffers. */ From 2d5e4ef21d0fb236b5024323b0d1d1a6e3b61fe5 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Thu, 15 Nov 2007 22:09:01 +0100 Subject: [PATCH 0333/1156] Removed stray debug log message --- src/MacVim/MMBackend.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/MacVim/MMBackend.m b/src/MacVim/MMBackend.m index 40832d5efe..af2210f2ae 100644 --- a/src/MacVim/MMBackend.m +++ b/src/MacVim/MMBackend.m @@ -1782,7 +1782,7 @@ - (void)connectionDidDie:(NSNotification *)notification // quit cleanly; in the latter case we make sure the swap files are left // for recovery. - NSLog(@"%s isTerminating=%d", _cmd, isTerminating); + //NSLog(@"%s isTerminating=%d", _cmd, isTerminating); if (isTerminating) getout(0); else From 00e0971705a78ad63a3a7fd41315c52eaad15685 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sat, 17 Nov 2007 15:03:56 +0100 Subject: [PATCH 0334/1156] MacVim color scheme supports dark background Change background color with ":set background=dark" (see :h 'background') --- runtime/colors/macvim.vim | 129 +++++++++++++++++++++++--------------- 1 file changed, 79 insertions(+), 50 deletions(-) diff --git a/runtime/colors/macvim.vim b/runtime/colors/macvim.vim index 836cab47cb..26c2f403c1 100644 --- a/runtime/colors/macvim.vim +++ b/runtime/colors/macvim.vim @@ -1,12 +1,13 @@ " MacVim colorscheme " " Maintainer: Bjorn Winckler -" Last Change: 2007 Nov 15 +" Last Change: 2007 Nov 17 +" +" This is the default MacVim color scheme. It supports both light and dark +" backgrounds (see :h 'background'). " -" Tell vim that this is a light color scheme: -set background=light highlight clear " Reset String -> Constant links etc if they were reset @@ -16,73 +17,101 @@ endif let colors_name = "macvim" + +" +" First list all groups common to both 'light' and 'dark' background. +" + " `:he highlight-groups` +hi CursorColumn guibg=#F1F5FA +hi CursorLine guibg=#F1F5FA +hi DiffAdd guibg=MediumSeaGreen +hi Directory guifg=#1600FF hi ErrorMsg guibg=Firebrick2 guifg=White +hi FoldColumn guibg=Grey guifg=DarkBlue +hi Folded guibg=#E6E6E6 guifg=DarkBlue hi IncSearch gui=reverse +hi LineNr guifg=#888888 guibg=#E6E6E6 hi ModeMsg gui=bold +hi MoreMsg gui=bold guifg=SeaGreen4 hi NonText gui=bold guifg=Blue -hi StatusLine gui=NONE guifg=White guibg=DarkSlateGray -hi StatusLineNC gui=NONE guifg=SlateGray guibg=Gray90 -hi VertSplit gui=NONE guifg=DarkSlateGray guibg=Gray90 -hi DiffText gui=NONE guibg=Gold -hi PmenuThumb gui=reverse +hi Pmenu guibg=LightSteelBlue1 hi PmenuSbar guibg=Grey -hi TabLineSel gui=bold -hi TabLineFill gui=reverse -hi Cursor guibg=fg guifg=bg -hi CursorIM guibg=fg guifg=bg -hi lCursor guibg=fg guifg=bg - - -hi Directory guifg=#1600FF -hi LineNr guifg=#888888 guibg=#E6E6E6 -hi MoreMsg gui=bold guifg=SeaGreen4 +hi PmenuSel guifg=White guibg=SkyBlue4 +hi PmenuThumb gui=reverse hi Question gui=bold guifg=Chartreuse4 -hi Search guibg=CadetBlue1 guifg=NONE +hi SignColumn guibg=Grey guifg=DarkBlue +hi SpecialKey guifg=Blue hi SpellBad guisp=Firebrick2 gui=undercurl hi SpellCap guisp=Blue gui=undercurl -hi SpellRare guisp=Magenta gui=undercurl hi SpellLocal guisp=DarkCyan gui=undercurl -hi Pmenu guibg=LightSteelBlue1 -hi PmenuSel guifg=White guibg=SkyBlue4 -hi SpecialKey guifg=Blue +hi SpellRare guisp=Magenta gui=undercurl +hi StatusLine gui=NONE guifg=White guibg=DarkSlateGray +hi StatusLineNC gui=NONE guifg=SlateGray guibg=Gray90 +hi TabLine gui=underline guibg=LightGrey +hi TabLineFill gui=reverse +hi TabLineSel gui=bold hi Title gui=bold guifg=DeepSkyBlue3 -hi WarningMsg guifg=Firebrick2 -hi WildMenu guibg=SkyBlue guifg=Black -hi Folded guibg=#E6E6E6 guifg=DarkBlue -hi FoldColumn guibg=Grey guifg=DarkBlue -hi SignColumn guibg=Grey guifg=DarkBlue +hi VertSplit gui=NONE guifg=DarkSlateGray guibg=Gray90 hi Visual guibg=MacSelectedTextBackgroundColor -hi DiffAdd guibg=MediumSeaGreen -hi DiffChange guibg=DeepSkyBlue -hi DiffDelete gui=bold guifg=Black guibg=SlateBlue -hi TabLine gui=underline guibg=LightGrey -hi CursorColumn guibg=#F1F5FA -hi CursorLine guibg=#F1F5FA "Data browser list view secondary color -hi MatchParen guifg=White guibg=MediumPurple1 -hi Normal gui=NONE guifg=MacTextColor guibg=MacTextBackgroundColor - +hi WarningMsg guifg=Firebrick2 " Syntax items (`:he group-name` -- more groups are available, these are just " the top level syntax items for now). +hi Error gui=NONE guifg=White guibg=Firebrick3 +hi Identifier gui=NONE guifg=Aquamarine4 guibg=NONE +hi Ignore gui=NONE guifg=bg guibg=NONE +hi PreProc gui=NONE guifg=DodgerBlue3 guibg=NONE +hi Special gui=NONE guifg=BlueViolet guibg=NONE +hi String gui=NONE guifg=SkyBlue4 guibg=NONE +hi Underlined gui=underline guifg=SteelBlue1 -hi Comment gui=italic guifg=Blue2 guibg=NONE -hi Constant gui=NONE guifg=DarkOrange guibg=NONE -hi String gui=NONE guifg=SkyBlue4 guibg=NONE -hi Boolean gui=NONE guifg=Red3 guibg=NONE -hi Identifier gui=NONE guifg=Aquamarine4 guibg=NONE -hi Statement gui=bold guifg=Maroon guibg=NONE -hi PreProc gui=NONE guifg=DodgerBlue3 guibg=NONE -hi Type gui=bold guifg=Green4 guibg=NONE -hi Special gui=NONE guifg=BlueViolet guibg=NONE -hi Underlined gui=underline guifg=SteelBlue1 -hi Ignore gui=NONE guifg=bg guibg=NONE -hi Error gui=NONE guifg=White guibg=Firebrick3 -hi Todo gui=NONE guifg=DarkGreen guibg=PaleGreen1 +" +" Groups that differ between 'light' and 'dark' background. +" + +if &background == "dark" + hi Boolean gui=NONE guifg=DeepPink4 guibg=NONE + hi Comment gui=italic guifg=CadetBlue3 + hi Constant gui=NONE guifg=Goldenrod1 guibg=NONE + hi Cursor guibg=LightSlateGrey guifg=bg + hi CursorIM guibg=LightSlateGrey guifg=bg + hi DiffChange guibg=MediumPurple4 + hi DiffDelete gui=bold guifg=White guibg=SlateBlue + hi DiffText gui=NONE guifg=White guibg=SteelBlue + hi MatchParen guifg=White guibg=Magenta + hi Normal guifg=Grey50 guibg=Grey10 + hi Search guibg=Blue4 guifg=NONE + hi Statement gui=bold guifg=Purple1 guibg=NONE + hi Todo gui=NONE guifg=Green4 guibg=DeepSkyBlue1 + hi Type gui=bold guifg=Cyan4 guibg=NONE + hi WildMenu guibg=SkyBlue guifg=White + hi lCursor guibg=LightSlateGrey guifg=bg +else + hi Boolean gui=NONE guifg=Red3 guibg=NONE + hi Comment gui=italic guifg=Blue2 guibg=NONE + hi Constant gui=NONE guifg=DarkOrange guibg=NONE + hi Cursor guibg=fg guifg=bg + hi CursorIM guibg=fg guifg=bg + hi DiffChange guibg=DeepSkyBlue + hi DiffDelete gui=bold guifg=Black guibg=SlateBlue + hi DiffText gui=NONE guibg=Gold + hi MatchParen guifg=White guibg=MediumPurple1 + hi Normal gui=NONE guifg=MacTextColor guibg=MacTextBackgroundColor + hi Search guibg=CadetBlue1 guifg=NONE + hi Statement gui=bold guifg=Maroon guibg=NONE + hi Todo gui=NONE guifg=DarkGreen guibg=PaleGreen1 + hi Type gui=bold guifg=Green4 guibg=NONE + hi WildMenu guibg=SkyBlue guifg=Black + hi lCursor guibg=fg guifg=bg +endif + +" " Change the selection color on focus change (but only if the "macvim" " colorscheme is active). +" if !exists("s:augroups_defined") au FocusLost * if exists("colors_name") && colors_name == "macvim" | hi Visual guibg=MacSecondarySelectedControlColor | endif au FocusGained * if exists("colors_name") && colors_name == "macvim" | hi Visual guibg=MacSelectedTextBackgroundColor | endif From 2e105da555d89aef5da87406fef79159b0cdbc47 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sat, 17 Nov 2007 18:03:47 +0100 Subject: [PATCH 0335/1156] Fix a wide character bug When replacing characters in the text storage it could happen that a row 'lost' one column when a wide character was replaced with a normal one. --- src/MacVim/MMBackend.m | 2 +- src/MacVim/MMFullscreenWindow.m | 2 + src/MacVim/MMTextStorage.m | 241 +++++++++++++++++++++++++++++--- 3 files changed, 225 insertions(+), 20 deletions(-) diff --git a/src/MacVim/MMBackend.m b/src/MacVim/MMBackend.m index af2210f2ae..d273777027 100644 --- a/src/MacVim/MMBackend.m +++ b/src/MacVim/MMBackend.m @@ -997,7 +997,7 @@ - (int)lookupColorWithKey:(NSString *)key } } - NSLog(@"WARNING: No color with key %@ found.", stripKey); + //NSLog(@"WARNING: No color with key %@ found.", stripKey); return INVALCOLOR; } diff --git a/src/MacVim/MMFullscreenWindow.m b/src/MacVim/MMFullscreenWindow.m index df2febdb15..fe781677b1 100644 --- a/src/MacVim/MMFullscreenWindow.m +++ b/src/MacVim/MMFullscreenWindow.m @@ -11,6 +11,8 @@ * MMFullscreen * * Support for full-screen editing. + * + * Author: Nico Weber */ #import "MMFullscreenWindow.h" diff --git a/src/MacVim/MMTextStorage.m b/src/MacVim/MMTextStorage.m index d4fabf1477..7df3935085 100644 --- a/src/MacVim/MMTextStorage.m +++ b/src/MacVim/MMTextStorage.m @@ -11,6 +11,24 @@ * MMTextStorage * * Text rendering related code. + * + * Note that: + * - There are exactly 'actualRows' number of rows + * - Each row is terminated by an EOL character ('\n') + * - Each row must cover exactly 'actualColumns' display cells + * - The attribute "MMWideChar" denotes a character that covers two cells, a + * character without this attribute covers one cell + * - Unicode line (U+2028) and paragraph (U+2029) terminators are considered + * invalid and are replaced by spaces + * - Spaces are used to fill out blank spaces + * + * In order to locate a (row,col) pair it is in general necessary to search one + * character at a time. To speed things up we cache the length of each row, as + * well as the offset of the last column searched within each row. + * + * If each character in the text storage has length 1 and is not wide, then + * there is no need to search for a (row, col) pair since it can easily be + * computed. */ #import "MMTextStorage.h" @@ -18,6 +36,10 @@ +// Enable debug log messages for situations that should never occur. +#define MM_TS_PARANOIA_LOG 1 + + // TODO: What does DRAW_TRANSP flag do? If the background isn't drawn when // this flag is set, then sometimes the character after the cursor becomes @@ -37,7 +59,7 @@ @interface MMTextStorage (Private) - (void)lazyResize:(BOOL)force; -- (NSRange)charRangeForRow:(int)row column:(int)col cells:(int)cells; +- (NSRange)charRangeForRow:(int)row column:(int*)col cells:(int*)cells; - (void)fixInvalidCharactersInRange:(NSRange)range; @end @@ -109,7 +131,9 @@ - (id)attribute:(NSString *)attrib atIndex:(unsigned)index - (void)replaceCharactersInRange:(NSRange)range withString:(NSString *)string { +#if MM_TS_PARANOIA_LOG NSLog(@"WARNING: calling %s on MMTextStorage is unsupported", _cmd); +#endif //[attribString replaceCharactersInRange:range withString:string]; } @@ -233,9 +257,13 @@ - (void)drawString:(NSString *)string atRow:(int)row column:(int)col return; // Find range of characters in text storage to replace. - NSRange range = [self charRangeForRow:row column:col cells:cells]; - if (NSMaxRange(range) > [[attribString string] length]) { - NSLog(@"%s Out of bounds"); + int acol = col; + int acells = cells; + NSRange range = [self charRangeForRow:row column:&acol cells:&acells]; + if (NSNotFound == range.location) { +#if MM_TS_PARANOIA_LOG + NSLog(@"INTERNAL ERROR [%s] Out of bounds", _cmd); +#endif return; } @@ -287,16 +315,50 @@ - (void)drawString:(NSString *)string atRow:(int)row column:(int)col [attribString replaceCharactersInRange:range withString:string]; [attribString setAttributes:attributes range:r]; + unsigned changeInLength = [string length] - range.length; + if (acells != cells || acol != col) { + if (acells == cells + 1) { + // NOTE: A normal width character replaced a double width + // character. To maintain the invariant that each row covers the + // same amount of cells, we compensate by adding an empty column. + [attribString replaceCharactersInRange:NSMakeRange(NSMaxRange(r),0) + withAttributedString:[emptyRowString + attributedSubstringFromRange:NSMakeRange(0,1)]]; + ++changeInLength; +#if 0 + } else if (acol == col - 1) { + NSLog(@"acol == col - 1"); + [attribString replaceCharactersInRange:NSMakeRange(r.location,0) + withAttributedString:[emptyRowString + attributedSubstringFromRange:NSMakeRange(0,1)]]; + ++changeInLength; + } else if (acol == col + 1) { + NSLog(@"acol == col + 1"); + [attribString replaceCharactersInRange:NSMakeRange(r.location-1,1) + withAttributedString:[emptyRowString + attributedSubstringFromRange:NSMakeRange(0,2)]]; + ++changeInLength; +#endif + } else { + // NOTE: It seems that this never gets called. If it ever does, + // then there is another case to treat. +#if MM_TS_PARANOIA_LOG + NSLog(@"row=%d col=%d acol=%d cells=%d acells=%d", row, col, acol, + cells, acells); +#endif + } + } + if ((flags & DRAW_WIDE) || [string length] != cells) characterEqualsColumn = NO; [self fixInvalidCharactersInRange:r]; [self edited:(NSTextStorageEditedCharacters|NSTextStorageEditedAttributes) - range:range changeInLength:[string length]-range.length]; + range:range changeInLength:changeInLength]; #if MM_USE_ROW_CACHE - rowCache[row].length += [string length] - range.length; + rowCache[row].length += changeInLength; #endif } @@ -322,9 +384,30 @@ - (void)deleteLinesFromRow:(int)row lineCount:(int)count int i; for (i = 0; i < move; ++i, ++destRow) { - destRange = [self charRangeForRow:destRow column:left cells:width]; - srcRange = [self charRangeForRow:(destRow+count) column:left - cells:width]; + int acol = left; + int acells = width; + destRange = [self charRangeForRow:destRow column:&acol cells:&acells]; +#if MM_TS_PARANOIA_LOG + if (acells != width || acol != left) + NSLog(@"INTERNAL ERROR [%s]", _cmd); +#endif + + acol = left; acells = width; + srcRange = [self charRangeForRow:(destRow+count) column:&acol + cells:&acells]; +#if MM_TS_PARANOIA_LOG + if (acells != width || acol != left) + NSLog(@"INTERNAL ERROR [%s]", _cmd); +#endif + + if (NSNotFound == destRange.location || NSNotFound == srcRange.location) + { +#if MM_TS_PARANOIA_LOG + NSLog(@"INTERNAL ERROR [%s] Out of bounds", _cmd); +#endif + return; + } + NSAttributedString *srcString = [attribString attributedSubstringFromRange:srcRange]; @@ -347,7 +430,19 @@ - (void)deleteLinesFromRow:(int)row lineCount:(int)count color, NSBackgroundColorAttributeName, nil]; for (i = 0; i < count; ++i, ++destRow) { - destRange = [self charRangeForRow:destRow column:left cells:width]; + int acol = left; + int acells = width; + destRange = [self charRangeForRow:destRow column:&acol cells:&acells]; +#if MM_TS_PARANOIA_LOG + if (acells != width || acol != left) + NSLog(@"INTERNAL ERROR [%s]", _cmd); +#endif + if (NSNotFound == destRange.location) { +#if MM_TS_PARANOIA_LOG + NSLog(@"INTERNAL ERROR [%s] Out of bounds", _cmd); +#endif + return; + } [attribString replaceCharactersInRange:destRange withAttributedString:emptyString]; @@ -387,8 +482,28 @@ - (void)insertLinesAtRow:(int)row lineCount:(int)count int i; for (i = 0; i < move; ++i, --destRow, --srcRow) { - destRange = [self charRangeForRow:destRow column:left cells:width]; - srcRange = [self charRangeForRow:srcRow column:left cells:width]; + int acol = left; + int acells = width; + destRange = [self charRangeForRow:destRow column:&acol cells:&acells]; +#if MM_TS_PARANOIA_LOG + if (acells != width || acol != left) + NSLog(@"INTERNAL ERROR [%s]", _cmd); +#endif + + acol = left; acells = width; + srcRange = [self charRangeForRow:srcRow column:&acol cells:&acells]; +#if MM_TS_PARANOIA_LOG + if (acells != width || acol != left) + NSLog(@"INTERNAL ERROR [%s]", _cmd); +#endif + if (NSNotFound == destRange.location || NSNotFound == srcRange.location) + { +#if MM_TS_PARANOIA_LOG + NSLog(@"INTERNAL ERROR [%s] Out of bounds", _cmd); +#endif + return; + } + NSAttributedString *srcString = [attribString attributedSubstringFromRange:srcRange]; [attribString replaceCharactersInRange:destRange @@ -410,7 +525,19 @@ - (void)insertLinesAtRow:(int)row lineCount:(int)count color, NSBackgroundColorAttributeName, nil]; for (i = 0; i < count; ++i, --destRow) { - destRange = [self charRangeForRow:destRow column:left cells:width]; + int acol = left; + int acells = width; + destRange = [self charRangeForRow:destRow column:&acol cells:&acells]; +#if MM_TS_PARANOIA_LOG + if (acells != width || acol != left) + NSLog(@"INTERNAL ERROR [%s]", _cmd); +#endif + if (NSNotFound == destRange.location) { +#if MM_TS_PARANOIA_LOG + NSLog(@"INTERNAL ERROR [%s] Out of bounds", _cmd); +#endif + return; + } [attribString replaceCharactersInRange:destRange withAttributedString:emptyString]; @@ -447,7 +574,19 @@ - (void)clearBlockFromRow:(int)row1 column:(int)col1 toRow:(int)row2 int r; for (r=row1; r<=row2; ++r) { - range = [self charRangeForRow:r column:col1 cells:cells]; + int acol = col1; + int acells = cells; + range = [self charRangeForRow:r column:&acol cells:&acells]; +#if MM_TS_PARANOIA_LOG + if (acells != cells || acol != col1) + NSLog(@"INTERNAL ERROR [%s]", _cmd); +#endif + if (NSNotFound == range.location) { +#if MM_TS_PARANOIA_LOG + NSLog(@"INTERNAL ERROR [%s] Out of bounds", _cmd); +#endif + return; + } [attribString replaceCharactersInRange:range withAttributedString:emptyString]; @@ -650,7 +789,8 @@ - (NSRect)rectForColumnsInRange:(NSRange)range - (unsigned)characterIndexForRow:(int)row column:(int)col { - NSRange range = [self charRangeForRow:row column:col cells:1]; + int cells = 1; + NSRange range = [self charRangeForRow:row column:&col cells:&cells]; return range.location != NSNotFound ? range.location : 0; } @@ -737,7 +877,8 @@ - (NSRect)boundingRectForCharacterAtRow:(int)row column:(int)col rect.size = cellSize; // Wide character take up twice the width of a normal character. - NSRange r = [self charRangeForRow:row column:col cells:1]; + int cells = 1; + NSRange r = [self charRangeForRow:row column:&col cells:&cells]; if (NSNotFound != r.location && [attribString attribute:MMWideCharacterAttributeName atIndex:r.location @@ -751,7 +892,8 @@ - (NSRect)boundingRectForCharacterAtRow:(int)row column:(int)col // are drawn). NSLayoutManager *lm = [[self layoutManagers] objectAtIndex:0]; NSTextContainer *tc = [[lm textContainers] objectAtIndex:0]; - NSRange range = [self charRangeForRow:row column:col cells:1]; + int cells = 1; + NSRange range = [self charRangeForRow:row column:&col cells:&cells]; NSRange glyphRange = [lm glyphRangeForCharacterRange:range actualCharacterRange:NULL]; @@ -825,8 +967,11 @@ - (void)lazyResize:(BOOL)force range:oldRange changeInLength:fullRange.length-oldRange.length]; } -- (NSRange)charRangeForRow:(int)row column:(int)col cells:(int)cells +- (NSRange)charRangeForRow:(int)row column:(int*)pcol cells:(int*)pcells { + int col = *pcol; + int cells = *pcells; + // If no wide chars are used and if every char has length 1 (no composing // characters, no > 16 bit characters), then we can compute the range. if (characterEqualsColumn) @@ -834,13 +979,15 @@ - (NSRange)charRangeForRow:(int)row column:(int)col cells:(int)cells NSString *string = [attribString string]; NSRange r, range = { NSNotFound, 0 }; - unsigned idx; + unsigned idx, rowEnd; int i; if (row < 0 || row >= actualRows || col < 0 || col >= actualColumns || col+cells > actualColumns) { +#if MM_TS_PARANOIA_LOG NSLog(@"%s row=%d col=%d cells=%d is out of range (length=%d)", _cmd, row, col, cells, [string length]); +#endif return range; } @@ -850,6 +997,8 @@ - (NSRange)charRangeForRow:(int)row column:(int)col cells:(int)cells idx = 0; for (i = 0; i < row; ++i, ++cache) idx += cache->length; + + rowEnd = idx + cache->length; #else // Locate the beginning of the row by scanning for EOL characters. r.location = 0; @@ -873,6 +1022,7 @@ - (NSRange)charRangeForRow:(int)row column:(int)col cells:(int)cells } else { range.location = idx; +#if 0 // Backward search seems to be broken... // Cache miss if (col < i - col) { // Search forward from beginning of line. @@ -915,8 +1065,37 @@ - (NSRange)charRangeForRow:(int)row column:(int)col cells:(int)cells } } + *pcol = i; + cache->col = i; + cache->colOffset = idx - range.location; +#else + // Cache miss + if (col < i) { + // Search forward from beginning of line. + i = 0; + } else { + // Search forward from cache spot. + idx += cache->colOffset; + } + + // Forward search + while (col > i) { + r = [string rangeOfComposedCharacterSequenceAtIndex:idx]; + + // Wide chars take up two display cells. + if ([attribString attribute:MMWideCharacterAttributeName + atIndex:idx + effectiveRange:nil]) + ++i; + + idx += r.length; + ++i; + } + + *pcol = i; cache->col = i; cache->colOffset = idx - range.location; +#endif } #else idx = r.location; @@ -948,6 +1127,30 @@ - (NSRange)charRangeForRow:(int)row column:(int)col cells:(int)cells range.length += r.length; } + *pcells = i; + +#if MM_TS_PARANOIA_LOG +#if MM_USE_ROW_CACHE + if (range.location >= rowEnd-1) { + NSLog(@"INTERNAL ERROR [%s] : row=%d col=%d cells=%d --> range=%@", + _cmd, row, col, cells, NSStringFromRange(range)); + range.location = rowEnd - 2; + range.length = 1; + } else if (NSMaxRange(range) >= rowEnd) { + NSLog(@"INTERNAL ERROR [%s] : row=%d col=%d cells=%d --> range=%@", + _cmd, row, col, cells, NSStringFromRange(range)); + range.length = rowEnd - range.location - 1; + } +#endif + + if (NSMaxRange(range) > [string length]) { + NSLog(@"INTERNAL ERROR [%s] : row=%d col=%d cells=%d --> range=%@", + _cmd, row, col, cells, NSStringFromRange(range)); + range.location = NSNotFound; + range.length = 0; + } +#endif + return range; } From 240bb64660e9e9ea7a691a359869dc9bd7a97e78 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sun, 18 Nov 2007 14:16:42 +0100 Subject: [PATCH 0336/1156] Constrain window frame to screen after live resize Always send SetTextDimensionsMsgID to Vim at the end of live resize to ensure that resizeWindowToFit gets called. Otherwise the window can be too big and will then automatically resize when a dialog sheet is presented or when the window is moved, which feels strange. --- src/MacVim/MMWindowController.m | 41 +++++++++++---------------------- 1 file changed, 14 insertions(+), 27 deletions(-) diff --git a/src/MacVim/MMWindowController.m b/src/MacVim/MMWindowController.m index 9da117808a..35b4091bb0 100644 --- a/src/MacVim/MMWindowController.m +++ b/src/MacVim/MMWindowController.m @@ -381,41 +381,28 @@ - (void)liveResizeDidEnd { if (!setupDone) return; - // At the end of an resize, check if vim view size and number of - // columns / rows agree (the first is set while resizing, the second by - // messages sent from vim). If not, send a synchronous (!) message to vim - // to set columns / rows to the value belonging to the view size. If the - // message couldn't be sent, change the view size to fit columns / rows. - - // NOTE! It is assumed that the window has been resized so that it will - // exactly fit the text storage (possibly after resizing it). If this is - // not the case the display might be messed up. - BOOL resizeFailed = NO; + // NOTE: During live resize the window is not constrained to lie inside the + // screen (because we must not programmatically alter the window size + // during live resize or it will 'jitter'), so at the end of live resize we + // make sure a final SetTextDimensionsMsgID message is sent to ensure that + // resizeWindowToFit does get called. For this reason and also because we + // want to ensure that Vim and MacVim have consistent states, this resize + // message is sent synchronously. (If the states were inconsistent the + // text view may become too large or too small to fit the window.) + NSSize contentSize = [self contentSize]; int desiredSize[2]; [vimView getDesiredRows:&desiredSize[0] columns:&desiredSize[1] forSize:contentSize]; - int rows, columns; - [vimView getActualRows:&rows columns:&columns]; - - if (desiredSize[0] != rows || desiredSize[1] != columns) { - - NSData *data = [NSData dataWithBytes:desiredSize length:2*sizeof(int)]; + NSData *data = [NSData dataWithBytes:desiredSize length:2*sizeof(int)]; - // NOTE: Since we're at the end of a live resize we want to make sure - // that the SetTextDimensionsMsgID message reaches Vim, else Vim and - // MacVim will have inconsistent states (i.e. the text view will be too - // large or too small for the window size). Thus, add a timeout (this - // may have to be tweaked) and take note if the message was sent or - // not. - resizeFailed = ![vimController sendMessageNow:SetTextDimensionsMsgID - data:data - timeout:.5]; - } + BOOL resizeOk = [vimController sendMessageNow:SetTextDimensionsMsgID + data:data + timeout:.5]; - if (resizeFailed) { + if (!resizeOk) { // Force the window size to match the text view size otherwise Vim and // MacVim will have inconsistent states. [self resizeWindowToFit:self]; From 2fbfb74a77ab2891d044871ec4fdef532e0d1c17 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sun, 18 Nov 2007 14:18:12 +0100 Subject: [PATCH 0337/1156] MMLoginShell defaults to NO Starting a tcsh shell with -c and -l doesn't work so disable this user default until further notice. --- src/MacVim/MMAppController.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/MacVim/MMAppController.m b/src/MacVim/MMAppController.m index 18e106a6be..6a2c2bea2a 100644 --- a/src/MacVim/MMAppController.m +++ b/src/MacVim/MMAppController.m @@ -84,7 +84,7 @@ + (void)initialize [NSNumber numberWithBool:YES], MMTranslateCtrlClickKey, [NSNumber numberWithBool:NO], MMOpenFilesInTabsKey, [NSNumber numberWithBool:NO], MMNoFontSubstitutionKey, - [NSNumber numberWithBool:YES], MMLoginShellKey, + [NSNumber numberWithBool:NO], MMLoginShellKey, nil]; [[NSUserDefaults standardUserDefaults] registerDefaults:dict]; From 3a3667298256accac87fdbc01af65b4d0220090e Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Mon, 19 Nov 2007 21:20:56 +0100 Subject: [PATCH 0338/1156] Improved support for Ctrl-mappings Ctrl-letter keys are passed directly to the input buffer so that the backend can separate e.g. and . --- src/MacVim/MMBackend.m | 2 +- src/MacVim/MMTextView.m | 22 ++++++++++++++++------ 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/src/MacVim/MMBackend.m b/src/MacVim/MMBackend.m index d273777027..184d980ff6 100644 --- a/src/MacVim/MMBackend.m +++ b/src/MacVim/MMBackend.m @@ -1722,7 +1722,7 @@ - (void)handleKeyDown:(NSString *)key modifiers:(int)mods // Unfortunately, the only way to deal with when to clear the modifiers // or not seems to be to have hard-wired rules like this. if ( !((' ' == c) || (0xa0 == c) || (mods & MOD_MASK_CMD) - || 0x9 == c || 0xd == c) ) { + || 0x9 == c || 0xd == c || ESC == c) ) { mods &= ~MOD_MASK_SHIFT; mods &= ~MOD_MASK_CTRL; //NSLog(@"clear shift ctrl"); diff --git a/src/MacVim/MMTextView.m b/src/MacVim/MMTextView.m index bda16d6ef2..36e623da07 100644 --- a/src/MacVim/MMTextView.m +++ b/src/MacVim/MMTextView.m @@ -177,17 +177,27 @@ - (void)drawRect:(NSRect)rect - (void)keyDown:(NSEvent *)event { //NSLog(@"%s %@", _cmd, event); - // HACK! If a modifier is held, don't pass the event along to + // HACK! If control modifier is held, don't pass the event along to // interpretKeyEvents: since some keys are bound to multiple commands which // means doCommandBySelector: is called several times. // // TODO: Figure out a way to disable Cocoa key bindings entirely, without // affecting input management. - - if ([event modifierFlags] & NSControlKeyMask) - [self dispatchKeyEvent:event]; - else + if ([event modifierFlags] & NSControlKeyMask) { + NSString *unmod = [event charactersIgnoringModifiers]; + if ([unmod length] == 1 && [unmod characterAtIndex:0] <= 0x7f + && [unmod characterAtIndex:0] >= 0x60) { + // HACK! Send Ctrl-letter keys (and C-@, C-[, C-\, C-], C-^, C-_) + // as normal text to be added to the Vim input buffer. This must + // be done in order for the backend to be able to separate e.g. + // Ctrl-i and Ctrl-tab. + [self insertText:[event characters]]; + } else { + [self dispatchKeyEvent:event]; + } + } else { [super keyDown:event]; + } } - (void)insertText:(id)string @@ -310,7 +320,7 @@ - (BOOL)performKeyEquivalent:(NSEvent *)event // HACK! On Leopard Ctrl-key events end up here instead of keyDown:. if (flags & NSControlKeyMask) { - [self dispatchKeyEvent:event]; + [self keyDown:event]; return YES; } From f99ce72a11a72738955fa9b4246ecc2ba964c105 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Tue, 27 Nov 2007 21:07:08 +0100 Subject: [PATCH 0339/1156] ODB Editor protocol (aka 'external editor') support Programs that support ODB asks MacVim to open files. When a file is written or closed, MacVim notifies the program of these events. (At the moment the 'Burl' parameter is parsed but ignored. The 'RdEV' parameter is ignored.) --- runtime/doc/gui_mac.txt | 4 + src/MacVim/Info.plist | 2 +- src/MacVim/MMAppController.h | 1 + src/MacVim/MMAppController.m | 158 +++++++++++++++++++++++++++++++---- src/MacVim/MMBackend.m | 111 +++++++++++++++++++++++- src/MacVim/MMTextView.m | 2 +- src/MacVim/MMVimController.h | 4 +- src/MacVim/MMVimController.m | 58 ++++++++++++- src/MacVim/MacVim.h | 16 ++++ src/MacVim/MacVim.m | 2 + src/MacVim/gui_macvim.m | 90 ++++++++++++++++++++ src/buffer.c | 4 + src/eval.c | 9 ++ src/feature.h | 7 ++ src/fileio.c | 4 + src/main.c | 3 + src/proto/gui_macvim.pro | 5 ++ src/structs.h | 5 ++ src/version.c | 5 ++ 19 files changed, 466 insertions(+), 24 deletions(-) diff --git a/runtime/doc/gui_mac.txt b/runtime/doc/gui_mac.txt index 98b703426e..59c62be5a5 100644 --- a/runtime/doc/gui_mac.txt +++ b/runtime/doc/gui_mac.txt @@ -102,6 +102,10 @@ window, unless Vim is in command-line mode. In command-line mode the names of the files are added to the command line. Holding down modifier keys whilst dragging is not supported. +If a file is dropped on the Dock icon, it is always opened in a new tab +regardless of the mode Vim is currently in. The same holds if you +double-click on a file in the Finder. + *macvim-default-menu* The default menu in MacVim has been changed to conform better with the Apple Human Interface Guidelines (HIG). At the moment this breaks the localized diff --git a/src/MacVim/Info.plist b/src/MacVim/Info.plist index 1d24daeb97..99cfcf0822 100644 --- a/src/MacVim/Info.plist +++ b/src/MacVim/Info.plist @@ -531,7 +531,7 @@ CFBundleIconFile vim_gloss CFBundleIdentifier - org.vim.MacVim + org.vim.MacVim-odb CFBundleInfoDictionaryVersion 6.0 CFBundleName diff --git a/src/MacVim/MMAppController.h b/src/MacVim/MMAppController.h index 5033d7e719..a9fbe44511 100644 --- a/src/MacVim/MMAppController.h +++ b/src/MacVim/MMAppController.h @@ -20,6 +20,7 @@ NSString *openSelectionString; ATSFontContainerRef fontContainerRef; BOOL untitledWindowOpening; + NSMutableDictionary *pidArguments; } - (void)removeVimController:(id)controller; diff --git a/src/MacVim/MMAppController.m b/src/MacVim/MMAppController.m index 6a2c2bea2a..a488250901 100644 --- a/src/MacVim/MMAppController.m +++ b/src/MacVim/MMAppController.m @@ -32,6 +32,7 @@ + // Default timeout intervals on all connections. static NSTimeInterval MMRequestTimeout = 5; static NSTimeInterval MMReplyTimeout = 5; @@ -49,9 +50,13 @@ - (void)openFile:(NSPasteboard *)pboard userData:(NSString *)userData @interface MMAppController (Private) - (MMVimController *)keyVimController; - (MMVimController *)topmostVimController; -- (void)launchVimProcessWithArguments:(NSArray *)args; +- (int)launchVimProcessWithArguments:(NSArray *)args; - (NSArray *)filterFilesAndNotify:(NSArray *)files; -- (NSArray *)filterOpenFilesAndRaiseFirst:(NSArray *)filenames; +- (NSArray *)filterOpenFiles:(NSArray *)filenames remote:(OSType)theID + path:(NSString *)path + token:(NSAppleEventDescriptor *)token; +- (void)handleXcodeModEvent:(NSAppleEventDescriptor *)event + replyEvent:(NSAppleEventDescriptor *)reply; @end @interface NSMenu (MMExtras) @@ -99,6 +104,7 @@ - (id)init fontContainerRef = loadFonts(); vimControllers = [NSMutableArray new]; + pidArguments = [NSMutableDictionary new]; // NOTE! If the name of the connection changes here it must also be // updated in MMBackend.m. @@ -128,12 +134,22 @@ - (void)dealloc { //NSLog(@"MMAppController dealloc"); + [pidArguments release]; [vimControllers release]; [openSelectionString release]; [super dealloc]; } +- (void)applicationWillFinishLaunching:(NSNotification *)notification +{ + [[NSAppleEventManager sharedAppleEventManager] + setEventHandler:self + andSelector:@selector(handleXcodeModEvent:replyEvent:) + forEventClass:'KAHL' + andEventID:'MOD ']; +} + - (void)applicationDidFinishLaunching:(NSNotification *)notification { [NSApp setServicesProvider:self]; @@ -150,26 +166,79 @@ - (BOOL)applicationShouldOpenUntitledFile:(NSApplication *)sender - (BOOL)applicationOpenUntitledFile:(NSApplication *)sender { - //NSLog(@"%s NSapp=%@ theApp=%@", _cmd, NSApp, sender); - [self newWindow:self]; return YES; } - (void)application:(NSApplication *)sender openFiles:(NSArray *)filenames { - filenames = [self filterOpenFilesAndRaiseFirst:filenames]; + OSType remoteID; + NSString *remotePath; + NSAppleEventDescriptor *remoteToken; + NSAppleEventDescriptor *odbdesc = + [[NSAppleEventManager sharedAppleEventManager] currentAppleEvent]; + + if (![odbdesc paramDescriptorForKeyword:keyFileSender]) { + // The ODB paramaters may hide inside the 'keyAEPropData' descriptor. + odbdesc = [odbdesc paramDescriptorForKeyword:keyAEPropData]; + if (![odbdesc paramDescriptorForKeyword:keyFileSender]) + odbdesc = nil; + } + + if (odbdesc) { + remoteID = [[odbdesc paramDescriptorForKeyword:keyFileSender] + typeCodeValue]; + remotePath = [[odbdesc paramDescriptorForKeyword:keyFileCustomPath] + stringValue]; + remoteToken = [[odbdesc paramDescriptorForKeyword:keyFileSenderToken] + copy]; + + //NSLog(@"ODB parameters: ID=0x%x path=%@ token=%@", + // remoteID, remotePath, remoteToken); + } + + filenames = [self filterOpenFiles:filenames remote:remoteID path:remotePath + token:remoteToken]; if ([filenames count]) { MMVimController *vc; BOOL openInTabs = [[NSUserDefaults standardUserDefaults] boolForKey:MMOpenFilesInTabsKey]; if (openInTabs && (vc = [self topmostVimController])) { - [vc dropFiles:filenames]; + // Open files in tabs in the topmost window. + [vc dropFiles:filenames forceOpen:YES]; + if (odbdesc) + [vc odbEdit:filenames server:remoteID path:remotePath + token:remoteToken]; } else { + // Open files in tabs in a new window. NSMutableArray *args = [NSMutableArray arrayWithObject:@"-p"]; [args addObjectsFromArray:filenames]; - [self launchVimProcessWithArguments:args]; + int pid = [self launchVimProcessWithArguments:args]; + + // The Vim process starts asynchronously. Some arguments cannot be + // on the command line, so store them in a dictionary and pass them + // to the process once it has started. + // + // TODO: If the Vim process fails to start, or if it changes PID, + // then the memory allocated for these parameters will leak. + // Ensure that this cannot happen or somehow detect it. + if (odbdesc) { + // The remote token can be arbitrary data so it is cannot + // (without encoding it as text) be passed on the command line. + NSMutableDictionary *args = + [NSMutableDictionary dictionaryWithObjectsAndKeys: + filenames, @"filenames", + [NSNumber numberWithUnsignedInt:remoteID], @"remoteID", + nil]; + if (remotePath) + [args setObject:remotePath forKey:@"remotePath"]; + if (remoteToken) + [args setObject:remoteToken forKey:@"remoteToken"]; + + [pidArguments setObject:args + forKey:[NSNumber numberWithInt:pid]]; + } } } @@ -232,8 +301,12 @@ - (NSApplicationTerminateReply)applicationShouldTerminate: return reply; } -- (void)applicationWillTerminate:(NSNotification *)aNotification +- (void)applicationWillTerminate:(NSNotification *)notification { + [[NSAppleEventManager sharedAppleEventManager] + removeEventHandlerForEventClass:'KAHL' + andEventID:'MOD ']; + // This will invalidate all connections (since they were spawned from the // default connection). [[NSConnection defaultConnection] invalidate]; @@ -382,8 +455,7 @@ - (IBAction)fontSizeDown:(id)sender connectBackend:(byref in id )backend pid:(int)pid { - //NSLog(@"Frontend got connection request from backend...adding new " - // "MMVimController"); + //NSLog(@"Connect backend (pid=%d)", pid); [(NSDistantObject*)backend setProtocolForProxy:@protocol(MMBackendProtocol)]; @@ -410,6 +482,21 @@ - (IBAction)fontSizeDown:(id)sender untitledWindowOpening = NO; + // Arguments to a new Vim process that cannot be passed on the command line + // are stored in a dictionary and passed to the Vim process here. + NSNumber *key = [NSNumber numberWithInt:pid]; + NSDictionary *args = [pidArguments objectForKey:key]; + if (args) { + if ([args objectForKey:@"remoteID"]) { + [vc odbEdit:[args objectForKey:@"filenames"] + server:[[args objectForKey:@"remoteID"] unsignedIntValue] + path:[args objectForKey:@"remotePath"] + token:[args objectForKey:@"remoteToken"]]; + } + + [pidArguments removeObjectForKey:key]; + } + return vc; } @@ -483,7 +570,7 @@ - (void)openFile:(NSPasteboard *)pboard userData:(NSString *)userData vc = [self topmostVimController]; if (vc) { - [vc dropFiles:filenames]; + [vc dropFiles:filenames forceOpen:YES]; } else { [self application:NSApp openFiles:filenames]; } @@ -528,7 +615,7 @@ - (MMVimController *)topmostVimController return nil; } -- (void)launchVimProcessWithArguments:(NSArray *)args +- (int)launchVimProcessWithArguments:(NSArray *)args { NSString *taskPath = nil; NSArray *taskArgs = nil; @@ -536,7 +623,7 @@ - (void)launchVimProcessWithArguments:(NSArray *)args if (!path) { NSLog(@"ERROR: Vim executable could not be found inside app bundle!"); - return; + return 0; } if ([[NSUserDefaults standardUserDefaults] boolForKey:MMLoginShellKey]) { @@ -577,8 +664,12 @@ - (void)launchVimProcessWithArguments:(NSArray *)args taskArgs = [taskArgs arrayByAddingObjectsFromArray:args]; } - //NSLog(@"Launching: %@ args: %@", taskPath, taskArgs); - [NSTask launchedTaskWithLaunchPath:taskPath arguments:taskArgs]; + NSTask *task =[NSTask launchedTaskWithLaunchPath:taskPath + arguments:taskArgs]; + //NSLog(@"launch %@ with args=%@ (pid=%d)", [task processIdentifier], + // taskPath, taskArgs); + + return [task processIdentifier]; } - (NSArray *)filterFilesAndNotify:(NSArray *)filenames @@ -627,12 +718,15 @@ - (NSArray *)filterFilesAndNotify:(NSArray *)filenames return files; } -- (NSArray *)filterOpenFilesAndRaiseFirst:(NSArray *)filenames +- (NSArray *)filterOpenFiles:(NSArray *)filenames remote:(OSType)theID + path:(NSString *)path + token:(NSAppleEventDescriptor *)token { // Check if any of the files in the 'filenames' array are open in any Vim // process. Remove the files that are open from the 'filenames' array and // return it. If all files were filtered out, then raise the first file in - // the Vim process it is open. + // the Vim process it is open. Files that are filtered are sent an odb + // open event in case theID is not zero. MMVimController *raiseController = nil; NSString *raiseFile = nil; @@ -658,6 +752,11 @@ - (NSArray *)filterOpenFilesAndRaiseFirst:(NSArray *)filenames [[raiseFile retain] autorelease]; } + // Send an odb open event to the Vim process. + if (theID != 0) + [controller odbEdit:[files objectsAtIndexes:idxSet] + server:theID path:path token:token]; + // Remove all the files that were open in this Vim process and // create a new expression to evaluate. [files removeObjectsAtIndexes:idxSet]; @@ -688,6 +787,31 @@ - (NSArray *)filterOpenFilesAndRaiseFirst:(NSArray *)filenames return files; } +- (void)handleXcodeModEvent:(NSAppleEventDescriptor *)event + replyEvent:(NSAppleEventDescriptor *)reply +{ +#if 0 + // Xcode sends this event to query MacVim which open files have been + // modified. + NSLog(@"reply:%@", reply); + NSLog(@"event:%@", event); + + NSEnumerator *e = [vimControllers objectEnumerator]; + id vc; + while ((vc = [e nextObject])) { + DescType type = [reply descriptorType]; + unsigned len = [[type data] length]; + NSMutableData *data = [NSMutableData data]; + + [data appendBytes:&type length:sizeof(DescType)]; + [data appendBytes:&len length:sizeof(unsigned)]; + [data appendBytes:[reply data] length:len]; + + [vc sendMessage:XcodeModMsgID data:data]; + } +#endif +} + @end // MMAppController (Private) diff --git a/src/MacVim/MMBackend.m b/src/MacVim/MMBackend.m index 184d980ff6..0343771d01 100644 --- a/src/MacVim/MMBackend.m +++ b/src/MacVim/MMBackend.m @@ -85,6 +85,8 @@ - (void)handleScrollbarEvent:(NSData *)data; - (void)handleSetFont:(NSData *)data; - (void)handleDropFiles:(NSData *)data; - (void)handleDropString:(NSData *)data; +- (void)handleOdbEdit:(NSData *)data; +- (void)handleXcodeMod:(NSData *)data; - (BOOL)checkForModifiedBuffers; - (void)addInput:(NSString *)input; @end @@ -392,10 +394,12 @@ - (void)update [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantPast]]; +#if 0 // Keyboard and mouse input is handled directly, other input is queued and // processed here. This call may enter a blocking loop. if ([inputQueue count] > 0) [self processInputQueue]; +#endif } - (void)flushQueue:(BOOL)force @@ -451,6 +455,8 @@ - (BOOL)waitForInput:(int)milliseconds BOOL yn = inputReceived; inputReceived = NO; + // Keyboard and mouse input is handled directly, other input is queued and + // processed here. This call may enter a blocking loop. if ([inputQueue count] > 0) [self processInputQueue]; @@ -1586,6 +1592,10 @@ - (void)handleInputEvent:(int)msgid data:(NSData *)data const void *bytes = [data bytes]; int shape = *((int*)bytes); bytes += sizeof(int); update_mouseshape(shape); + } else if (ODBEditMsgID == msgid) { + [self handleOdbEdit:data]; + } else if (XcodeModMsgID == msgid) { + [self handleXcodeMod:data]; } else { NSLog(@"WARNING: Unknown message received (msgid=%d)", msgid); } @@ -1959,12 +1969,14 @@ - (void)handleDropFiles:(NSData *)data #ifdef FEAT_DND const void *bytes = [data bytes]; const void *end = [data bytes] + [data length]; + BOOL forceOpen = *((BOOL*)bytes); bytes += sizeof(BOOL); int n = *((int*)bytes); bytes += sizeof(int); - if (State & CMDLINE) { + if (!forceOpen && (State & CMDLINE)) { // HACK! If Vim is in command line mode then the files names // should be added to the command line, instead of opening the - // files in tabs. This is taken care of by gui_handle_drop(). + // files in tabs (unless forceOpen is set). This is taken care of by + // gui_handle_drop(). char_u **fnames = (char_u **)alloc(n * sizeof(char_u *)); if (fnames) { int i = 0; @@ -1990,7 +2002,12 @@ - (void)handleDropFiles:(NSData *)data // HACK! I'm not sure how to get Vim to open a list of files in // tabs, so instead I create a ':tab drop' command with all the // files to open and execute it. +#if 1 NSMutableString *cmd = [NSMutableString stringWithString:@":tab drop"]; +#else + NSMutableString *cmd = [NSMutableString stringWithString: + @":tab drop"]; +#endif int i; for (i = 0; i < n && bytes < end; ++i) { @@ -2003,6 +2020,7 @@ - (void)handleDropFiles:(NSData *)data [cmd appendString:file]; } +#if 1 // By going to the last tabpage we ensure that the new tabs will // appear last (if this call is left out, the taborder becomes // messy). @@ -2025,6 +2043,11 @@ - (void)handleDropFiles:(NSData *)data gui_update_cursor(FALSE, FALSE); maketitle(); gui_mch_flush(); +#else + [cmd appendString:@"|redr|f"]; + + [self addInput:cmd]; +#endif } #endif // FEAT_DND } @@ -2064,6 +2087,90 @@ - (void)handleDropString:(NSData *)data #endif // FEAT_DND } +- (void)handleOdbEdit:(NSData *)data +{ +#ifdef FEAT_ODB_EDITOR + const void *bytes = [data bytes]; + + OSType serverID = *((OSType*)bytes); bytes += sizeof(OSType); + + char_u *path = NULL; + int pathLen = *((int*)bytes); bytes += sizeof(int); + if (pathLen > 0) { + path = (char_u*)bytes; + bytes += pathLen; +#ifdef FEAT_MBYTE + path = CONVERT_FROM_UTF8(path); +#endif + } + + NSAppleEventDescriptor *token = nil; + DescType tokenType = *((DescType*)bytes); bytes += sizeof(DescType); + int descLen = *((int*)bytes); bytes += sizeof(int); + if (descLen > 0) { + token = [NSAppleEventDescriptor descriptorWithDescriptorType:tokenType + bytes:bytes + length:descLen]; + bytes += descLen; + } + + unsigned i, numFiles = *((unsigned*)bytes); bytes += sizeof(unsigned); + for (i = 0; i < numFiles; ++i) { + int len = *((int*)bytes); bytes += sizeof(int); + char_u *filename = (char_u*)bytes; +#ifdef FEAT_MBYTE + filename = CONVERT_FROM_UTF8(filename); +#endif + buf_T *buf = buflist_findname(filename); + if (buf) { + if (buf->b_odb_token) { + [(NSAppleEventDescriptor*)(buf->b_odb_token) release]; + buf->b_odb_token = NULL; + } + + if (buf->b_odb_fname) { + vim_free(buf->b_odb_fname); + buf->b_odb_fname = NULL; + } + + buf->b_odb_server_id = serverID; + + if (token) + buf->b_odb_token = [token retain]; + if (path) + buf->b_odb_fname = vim_strsave(path); + } else { + NSLog(@"WARNING: Could not find buffer '%s' for ODB editing.", + filename); + } + +#ifdef FEAT_MBYTE + CONVERT_FROM_UTF8_FREE(filename); +#endif + bytes += len; + } +#ifdef FEAT_MBYTE + CONVERT_FROM_UTF8_FREE(path); +#endif +#endif // FEAT_ODB_EDITOR +} + +- (void)handleXcodeMod:(NSData *)data +{ +#if 0 + const void *bytes = [data bytes]; + DescType type = *((DescType*)bytes); bytes += sizeof(DescType); + unsigned len = *((unsigned*)bytes); bytes += sizeof(unsigned); + if (0 == len) + return; + + NSAppleEventDescriptor *replyEvent = [NSAppleEventDescriptor + descriptorWithDescriptorType:type + bytes:bytes + length:len]; +#endif +} + - (BOOL)checkForModifiedBuffers { buf_T *buf; diff --git a/src/MacVim/MMTextView.m b/src/MacVim/MMTextView.m index 36e623da07..21ab4537f0 100644 --- a/src/MacVim/MMTextView.m +++ b/src/MacVim/MMTextView.m @@ -699,7 +699,7 @@ - (BOOL)performDragOperation:(id )sender return YES; } else if ([[pboard types] containsObject:NSFilenamesPboardType]) { NSArray *files = [pboard propertyListForType:NSFilenamesPboardType]; - [[self vimController] dropFiles:files]; + [[self vimController] dropFiles:files forceOpen:NO]; return YES; } diff --git a/src/MacVim/MMVimController.h b/src/MacVim/MMVimController.h index 78ca65843f..14fa504dc5 100644 --- a/src/MacVim/MMVimController.h +++ b/src/MacVim/MMVimController.h @@ -49,8 +49,10 @@ - (NSString *)serverName; - (MMWindowController *)windowController; - (void)cleanup; -- (void)dropFiles:(NSArray *)filenames; +- (void)dropFiles:(NSArray *)filenames forceOpen:(BOOL)force; - (void)dropString:(NSString *)string; +- (void)odbEdit:(NSArray *)filenames server:(OSType)theID path:(NSString *)path + token:(NSAppleEventDescriptor *)token; - (void)sendMessage:(int)msgid data:(NSData *)data; - (BOOL)sendMessageNow:(int)msgid data:(NSData *)data timeout:(NSTimeInterval)timeout; diff --git a/src/MacVim/MMVimController.m b/src/MacVim/MMVimController.m index d436af5f68..8f5a027c07 100644 --- a/src/MacVim/MMVimController.m +++ b/src/MacVim/MMVimController.m @@ -182,11 +182,12 @@ - (int)pid return pid; } -- (void)dropFiles:(NSArray *)filenames +- (void)dropFiles:(NSArray *)filenames forceOpen:(BOOL)force { - int i, numberOfFiles = [filenames count]; + unsigned i, numberOfFiles = [filenames count]; NSMutableData *data = [NSMutableData data]; + [data appendBytes:&force length:sizeof(BOOL)]; [data appendBytes:&numberOfFiles length:sizeof(int)]; for (i = 0; i < numberOfFiles; ++i) { @@ -216,6 +217,59 @@ - (void)dropString:(NSString *)string } } +- (void)odbEdit:(NSArray *)filenames server:(OSType)theID path:(NSString *)path + token:(NSAppleEventDescriptor *)token +{ + int len; + unsigned i, numberOfFiles = [filenames count]; + NSMutableData *data = [NSMutableData data]; + + if (0 == numberOfFiles || 0 == theID) + return; + + [data appendBytes:&theID length:sizeof(theID)]; + + if (path && [path length] > 0) { + len = [path lengthOfBytesUsingEncoding:NSUTF8StringEncoding] + 1; + [data appendBytes:&len length:sizeof(int)]; + [data appendBytes:[path UTF8String] length:len]; + } else { + len = 0; + [data appendBytes:&len length:sizeof(int)]; + } + + if (token) { + DescType tokenType = [token descriptorType]; + NSData *tokenData = [token data]; + len = [tokenData length]; + + [data appendBytes:&tokenType length:sizeof(tokenType)]; + [data appendBytes:&len length:sizeof(int)]; + if (len > 0) + [data appendBytes:[tokenData bytes] length:len]; + } else { + DescType tokenType = 0; + len = 0; + [data appendBytes:&tokenType length:sizeof(tokenType)]; + [data appendBytes:&len length:sizeof(int)]; + } + + [data appendBytes:&numberOfFiles length:sizeof(int)]; + + for (i = 0; i < numberOfFiles; ++i) { + NSString *file = [filenames objectAtIndex:i]; + len = [file lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; + + if (len > 0) { + ++len; // include NUL as well + [data appendBytes:&len length:sizeof(unsigned)]; + [data appendBytes:[file UTF8String] length:len]; + } + } + + [self sendMessage:ODBEditMsgID data:data]; +} + - (void)sendMessage:(int)msgid data:(NSData *)data { //NSLog(@"sendMessage:%s (isInitialized=%d inProcessCommandQueue=%d)", diff --git a/src/MacVim/MacVim.h b/src/MacVim/MacVim.h index 515f887775..f2d351ba1a 100644 --- a/src/MacVim/MacVim.h +++ b/src/MacVim/MacVim.h @@ -157,6 +157,8 @@ enum { AddInputMsgID, SetPreEditPositionMsgID, TerminateNowMsgID, + ODBEditMsgID, + XcodeModMsgID, }; @@ -234,3 +236,17 @@ ATSFontContainerRef loadFonts(); @interface NSIndexSet (MMExtras) + (id)indexSetWithVimList:(NSString *)list; @end + + + + +// ODB Editor Suite Constants (taken from ODBEditorSuite.h) +#define keyFileSender 'FSnd' +#define keyFileSenderToken 'FTok' +#define keyFileCustomPath 'Burl' +#define kODBEditorSuite 'R*ch' +#define kAEModifiedFile 'FMod' +#define keyNewLocation 'New?' +#define kAEClosedFile 'FCls' +#define keySenderToken 'Tokn' + diff --git a/src/MacVim/MacVim.m b/src/MacVim/MacVim.m index 5e718fd6d0..041ffee58d 100644 --- a/src/MacVim/MacVim.m +++ b/src/MacVim/MacVim.m @@ -70,6 +70,8 @@ "AddInputMsgID", "SetPreEditPositionMsgID", "TerminateNowMsgID", + "ODBEditMsgID", + "XcodeModMsgID", }; diff --git a/src/MacVim/gui_macvim.m b/src/MacVim/gui_macvim.m index 839b8383e6..0f20fe999c 100644 --- a/src/MacVim/gui_macvim.m +++ b/src/MacVim/gui_macvim.m @@ -1708,3 +1708,93 @@ } #endif // MAC_CLIENTSERVER + + + + +// -- ODB Editor Support ---------------------------------------------------- + +#ifdef FEAT_ODB_EDITOR +/* + * The ODB Editor protocol works like this: + * - An external program (the server) asks MacVim to open a file and associates + * three things with this file: (1) a server id (a four character code that + * identifies the server), (2) a path that can be used as window title for + * the file (optional), (3) an arbitrary token (optional) + * - When a file is saved or closed, MacVim should tell the server about which + * file was modified and also pass back the token + * + * All communication between MacVim and the server goes via Apple Events. + */ + + static OSErr +odb_event(buf_T *buf, const AEEventID action) +{ + if (!(buf->b_odb_server_id && buf->b_ffname)) + return noErr; + + NSAppleEventDescriptor *targetDesc = [NSAppleEventDescriptor + descriptorWithDescriptorType:typeApplSignature + bytes:&buf->b_odb_server_id + length:sizeof(OSType)]; + + NSString *path = [NSString stringWithUTF8String:(char*)buf->b_ffname]; + NSData *pathData = [[[NSURL fileURLWithPath:path] absoluteString] + dataUsingEncoding:NSUTF8StringEncoding]; + NSAppleEventDescriptor *pathDesc = [NSAppleEventDescriptor + descriptorWithDescriptorType:typeFileURL data:pathData]; + + NSAppleEventDescriptor *event = [NSAppleEventDescriptor + appleEventWithEventClass:kODBEditorSuite + eventID:action + targetDescriptor:targetDesc + returnID:kAutoGenerateReturnID + transactionID:kAnyTransactionID]; + + [event setParamDescriptor:pathDesc forKeyword:keyDirectObject]; + + if (buf->b_odb_token) + [event setParamDescriptor:buf->b_odb_token forKeyword:keySenderToken]; + + return AESendMessage([event aeDesc], NULL, kAENoReply | kAENeverInteract, + kAEDefaultTimeout); +} + + OSErr +odb_buffer_close(buf_T *buf) +{ + OSErr err = noErr; + if (buf) { + err = odb_event(buf, kAEClosedFile); + + buf->b_odb_server_id = 0; + + if (buf->b_odb_token) { + [(NSAppleEventDescriptor *)(buf->b_odb_token) release]; + buf->b_odb_token = NULL; + } + + if (buf->b_odb_fname) { + vim_free(buf->b_odb_fname); + buf->b_odb_fname = NULL; + } + } + + return err; +} + + OSErr +odb_post_buffer_write(buf_T *buf) +{ + return buf ? odb_event(buf, kAEModifiedFile) : noErr; +} + + void +odb_end(void) +{ + buf_T *buf; + for (buf = firstbuf; buf != NULL; buf = buf->b_next) + odb_buffer_close(buf); +} + +#endif // FEAT_ODB_EDITOR diff --git a/src/buffer.c b/src/buffer.c index ab5a25a682..7cddc11f93 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -441,6 +441,10 @@ close_buffer(win, buf, action) if (usingNetbeans) netbeans_file_closed(buf); #endif +#ifdef FEAT_ODB_EDITOR + odb_buffer_close(buf); +#endif + /* Change directories when the 'acd' option is set. */ DO_AUTOCHDIR diff --git a/src/eval.c b/src/eval.c index fe81d74349..21a97c7741 100644 --- a/src/eval.c +++ b/src/eval.c @@ -10865,6 +10865,9 @@ f_has(argvars, rettv) #if !defined(USE_SYSTEM) && defined(UNIX) "fork", #endif +#ifdef FEAT_FULLSCREEN + "fullscreen", +#endif #ifdef FEAT_GETTEXT "gettext", #endif @@ -11052,6 +11055,9 @@ f_has(argvars, rettv) #ifdef FEAT_NETBEANS_INTG "netbeans_intg", #endif +#ifdef FEAT_ODB_EDITOR + "odbeditor", +#endif #ifdef FEAT_SPELL "spell", #endif @@ -11093,6 +11099,9 @@ f_has(argvars, rettv) #ifdef FEAT_TOOLBAR "toolbar", #endif +#ifdef FEAT_TRANSPARENCY + "transparency", +#endif #ifdef FEAT_USR_CMDS "user-commands", /* was accidentally included in 5.4 */ "user_commands", diff --git a/src/feature.h b/src/feature.h index a139b0db2f..f263cf091f 100644 --- a/src/feature.h +++ b/src/feature.h @@ -1282,3 +1282,10 @@ #ifdef FEAT_GUI_MACVIM # define FEAT_FULLSCREEN #endif + +/* + * +odbeditor ODBEditor protocol support (aka. external editor) + */ +#ifdef FEAT_GUI_MACVIM +# define FEAT_ODB_EDITOR +#endif diff --git a/src/fileio.c b/src/fileio.c index 9911abfca0..3d2ea6be7e 100644 --- a/src/fileio.c +++ b/src/fileio.c @@ -4717,6 +4717,10 @@ buf_write(buf, fname, sfname, start, end, eap, append, forceit, /* Update machine specific information. */ mch_post_buffer_write(buf); #endif +#ifdef FEAT_ODB_EDITOR + odb_post_buffer_write(buf); +#endif + return retval; } diff --git a/src/main.c b/src/main.c index 4b46964889..17132624b7 100644 --- a/src/main.c +++ b/src/main.c @@ -1375,6 +1375,9 @@ getout(exitval) #ifdef FEAT_NETBEANS_INTG netbeans_end(); #endif +#ifdef FEAT_ODB_EDITOR + odb_end(); +#endif #ifdef FEAT_CSCOPE cs_end(); #endif diff --git a/src/proto/gui_macvim.pro b/src/proto/gui_macvim.pro index b821f5b2e3..0b9437e412 100644 --- a/src/proto/gui_macvim.pro +++ b/src/proto/gui_macvim.pro @@ -194,3 +194,8 @@ void gui_mch_enter_fullscreen(void); void gui_mch_leave_fullscreen(void); void gui_macvim_update_modified_flag(); + +OSErr odb_buffer_close(buf_T *buf); +OSErr odb_post_buffer_write(buf_T *buf); +void odb_end(void); + diff --git a/src/structs.h b/src/structs.h index f7ce6fbfd6..118035be95 100644 --- a/src/structs.h +++ b/src/structs.h @@ -1583,6 +1583,11 @@ struct file_buffer int b_was_netbeans_file;/* TRUE if b_netbeans_file was once set */ #endif +#ifdef FEAT_ODB_EDITOR + OSType b_odb_server_id; /* FourCC of the ODB server (0 if none) */ + void *b_odb_token; /* NSAppleEventDescriptor (optional) */ + char_u *b_odb_fname; /* Custom file name (optional) */ +#endif }; diff --git a/src/version.c b/src/version.c index be38a78fa0..a7abb05b0f 100644 --- a/src/version.c +++ b/src/version.c @@ -395,6 +395,11 @@ static char *(features[]) = #else "-netbeans_intg", #endif +#ifdef FEAT_ODB_EDITOR + "+odbeditor", +#else + "-odbeditor", +#endif #ifdef FEAT_GUI_W32 # ifdef FEAT_OLE "+ole", From 809f415bda05aa2ebd275820bc4f5ecc83d51a05 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Tue, 27 Nov 2007 21:38:19 +0100 Subject: [PATCH 0340/1156] Docs updated on ODB support, fixed Info.plist --- runtime/doc/eval.txt | 3 +++ runtime/doc/gui_mac.txt | 12 ++++++++++++ runtime/doc/various.txt | 3 +++ src/MacVim/Info.plist | 2 +- src/MacVim/MacVim.xcodeproj/project.pbxproj | 2 +- 5 files changed, 20 insertions(+), 2 deletions(-) diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt index 2a8931a1b9..ac18233ab9 100644 --- a/runtime/doc/eval.txt +++ b/runtime/doc/eval.txt @@ -5333,6 +5333,7 @@ fname_case Case in file names matters (for Amiga, MS-DOS, and folding Compiled with |folding| support. footer Compiled with GUI footer support. |gui-footer| fork Compiled to use fork()/exec() instead of system(). +fullscreen Compiled with 'fullscreen' support. gettext Compiled with message translation |multi-lang| gui Compiled with GUI enabled. gui_athena Compiled with Athena GUI. @@ -5377,6 +5378,7 @@ multi_lang Compiled with support for multiple languages. mzscheme Compiled with MzScheme interface |mzscheme|. netbeans_intg Compiled with support for |netbeans|. netbeans_enabled Compiled with support for |netbeans| and it's used. +odbeditor Compiled with |odbeditor| support. ole Compiled with OLE automation support for Win32. os2 OS/2 version of Vim. osfiletype Compiled with support for osfiletypes |+osfiletype| @@ -5418,6 +5420,7 @@ tgetent Compiled with tgetent support, able to use a termcap or terminfo file. title Compiled with window title support |'title'|. toolbar Compiled with support for |gui-toolbar|. +transparency Compiled with 'transparency' support. unix Unix version of Vim. user_commands User-defined commands. viminfo Compiled with viminfo support. diff --git a/runtime/doc/gui_mac.txt b/runtime/doc/gui_mac.txt index 59c62be5a5..df6c9b5fc9 100644 --- a/runtime/doc/gui_mac.txt +++ b/runtime/doc/gui_mac.txt @@ -168,6 +168,18 @@ command: :gui [++opt] [+cmd] [-f|-b] [files...] Note: Forking ("-b") currently does not work. + *odbeditor* *external-editor* +MacVim can act as an 'external editor' for Mac OS X applications that support +the ODB Editor Protocol (or the 'external editor' protocol). Each application +has different ways of configuring this option, check the applications +documentation. Once configured properly MacVim can be used to open files in +such an application. + +A technical note: MacVim handles file open, modified and closed events. In +the open event the FTok and Burl parameters are parsed (the latter is ignored +at the moment though). In the modified and closed events the Tokn parameter +is sent back to the server application. + ============================================================================== 3. Special colors *macvim-colors* diff --git a/runtime/doc/various.txt b/runtime/doc/various.txt index d5ce26471e..b9c70bb560 100644 --- a/runtime/doc/various.txt +++ b/runtime/doc/various.txt @@ -315,6 +315,7 @@ N *+find_in_path* include file searches: |[I|, |:isearch|, N *+folding* |folding| *+footer* |gui-footer| *+fork* Unix only: |fork| shell commands +m *+fullscreen* MacVim only: edit in full-screen N *+gettext* message translations |multi-lang| *+GUI_Athena* Unix only: Athena |GUI| *+GUI_neXtaw* Unix only: neXtaw |GUI| @@ -350,6 +351,7 @@ N *+multi_lang* non-English language support |multi-lang| m *+mzscheme* Mzscheme interface |mzscheme| m *+mzscheme/dyn* Mzscheme interface |mzscheme-dynamic| |/dyn| m *+netbeans_intg* |netbeans| +m *+odbeditor* MacVim only: ODB Editor Protocol support |odbeditor| m *+ole* Win32 GUI only: |ole-interface| *+osfiletype* Support for the 'osfiletype' option and filetype checking in automatic commands. |autocmd-osfiletypes| @@ -386,6 +388,7 @@ N *+textobjects* |text-objects| selection *+tgetent* non-Unix only: able to use external termcap N *+title* Setting the window 'title' and 'icon' N *+toolbar* |gui-toolbar| +m *+transparency* MacVim only: window background transparency N *+user_commands* User-defined commands. |user-commands| N *+viminfo* |'viminfo'| N *+vertsplit* Vertically split windows |:vsplit| diff --git a/src/MacVim/Info.plist b/src/MacVim/Info.plist index 99cfcf0822..1d24daeb97 100644 --- a/src/MacVim/Info.plist +++ b/src/MacVim/Info.plist @@ -531,7 +531,7 @@ CFBundleIconFile vim_gloss CFBundleIdentifier - org.vim.MacVim-odb + org.vim.MacVim CFBundleInfoDictionaryVersion 6.0 CFBundleName diff --git a/src/MacVim/MacVim.xcodeproj/project.pbxproj b/src/MacVim/MacVim.xcodeproj/project.pbxproj index b5675b0056..df440005f7 100644 --- a/src/MacVim/MacVim.xcodeproj/project.pbxproj +++ b/src/MacVim/MacVim.xcodeproj/project.pbxproj @@ -204,7 +204,7 @@ 29B97325FDCFA39411CA2CEA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = ""; }; 32CA4F630368D1EE00C91783 /* MacVim_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MacVim_Prefix.pch; sourceTree = ""; }; 8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; - 8D1107320486CEB800E47090 /* MacVim.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = MacVim.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 8D1107320486CEB800E47090 /* MacVim.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = MacVim.app; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ From 88d1e3c664c6b1e32ac51a986ad226e0bc6c9f8b Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Wed, 28 Nov 2007 20:12:44 +0100 Subject: [PATCH 0341/1156] Parse selection range when opening files from Xcode Xcode sets the 'keyAEPosition' parameter in the 'odoc' Apple event. This contains information on the line range to select when opening files. --- src/MacVim/MMAppController.m | 96 +++++++++++++++++++++++++++++------- 1 file changed, 79 insertions(+), 17 deletions(-) diff --git a/src/MacVim/MMAppController.m b/src/MacVim/MMAppController.m index a488250901..cf318f8965 100644 --- a/src/MacVim/MMAppController.m +++ b/src/MacVim/MMAppController.m @@ -38,6 +38,18 @@ static NSTimeInterval MMReplyTimeout = 5; +#pragma options align=mac68k +typedef struct +{ + short unused1; // 0 (not used) + short lineNum; // line to select (< 0 to specify range) + long startRange; // start of selection range (if line < 0) + long endRange; // end of selection range (if line < 0) + long unused2; // 0 (not used) + long theDate; // modification date/time +} MMSelectionRange; +#pragma options align=reset + @interface MMAppController (MMServices) - (void)openSelection:(NSPasteboard *)pboard userData:(NSString *)userData @@ -54,9 +66,11 @@ - (int)launchVimProcessWithArguments:(NSArray *)args; - (NSArray *)filterFilesAndNotify:(NSArray *)files; - (NSArray *)filterOpenFiles:(NSArray *)filenames remote:(OSType)theID path:(NSString *)path - token:(NSAppleEventDescriptor *)token; + token:(NSAppleEventDescriptor *)token + selectionRange:(MMSelectionRange *)selRange; - (void)handleXcodeModEvent:(NSAppleEventDescriptor *)event replyEvent:(NSAppleEventDescriptor *)reply; +- (NSString *)inputStringFromSelectionRange:(MMSelectionRange *)selRange; @end @interface NSMenu (MMExtras) @@ -172,12 +186,16 @@ - (BOOL)applicationOpenUntitledFile:(NSApplication *)sender - (void)application:(NSApplication *)sender openFiles:(NSArray *)filenames { - OSType remoteID; - NSString *remotePath; - NSAppleEventDescriptor *remoteToken; - NSAppleEventDescriptor *odbdesc = - [[NSAppleEventManager sharedAppleEventManager] currentAppleEvent]; - + OSType remoteID = 0; + NSString *remotePath = nil; + NSAppleEventManager *aem; + NSAppleEventDescriptor *remoteToken = nil; + NSAppleEventDescriptor *odbdesc = nil; + NSAppleEventDescriptor *xcodedesc = nil; + MMSelectionRange *selRange = NULL; + + aem = [NSAppleEventManager sharedAppleEventManager]; + odbdesc = [aem currentAppleEvent]; if (![odbdesc paramDescriptorForKeyword:keyFileSender]) { // The ODB paramaters may hide inside the 'keyAEPropData' descriptor. odbdesc = [odbdesc paramDescriptorForKeyword:keyAEPropData]; @@ -192,13 +210,15 @@ - (void)application:(NSApplication *)sender openFiles:(NSArray *)filenames stringValue]; remoteToken = [[odbdesc paramDescriptorForKeyword:keyFileSenderToken] copy]; - - //NSLog(@"ODB parameters: ID=0x%x path=%@ token=%@", - // remoteID, remotePath, remoteToken); } + xcodedesc = [[aem currentAppleEvent] + paramDescriptorForKeyword:keyAEPosition]; + if (xcodedesc) + selRange = (MMSelectionRange*)[[xcodedesc data] bytes]; + filenames = [self filterOpenFiles:filenames remote:remoteID path:remotePath - token:remoteToken]; + token:remoteToken selectionRange:selRange]; if ([filenames count]) { MMVimController *vc; BOOL openInTabs = [[NSUserDefaults standardUserDefaults] @@ -210,6 +230,8 @@ - (void)application:(NSApplication *)sender openFiles:(NSArray *)filenames if (odbdesc) [vc odbEdit:filenames server:remoteID path:remotePath token:remoteToken]; + if (selRange) + [vc addVimInput:[self inputStringFromSelectionRange:selRange]]; } else { // Open files in tabs in a new window. NSMutableArray *args = [NSMutableArray arrayWithObject:@"-p"]; @@ -223,22 +245,33 @@ - (void)application:(NSApplication *)sender openFiles:(NSArray *)filenames // TODO: If the Vim process fails to start, or if it changes PID, // then the memory allocated for these parameters will leak. // Ensure that this cannot happen or somehow detect it. + NSMutableDictionary *argDict = nil; if (odbdesc) { // The remote token can be arbitrary data so it is cannot // (without encoding it as text) be passed on the command line. - NSMutableDictionary *args = - [NSMutableDictionary dictionaryWithObjectsAndKeys: + argDict = [NSMutableDictionary dictionaryWithObjectsAndKeys: filenames, @"filenames", [NSNumber numberWithUnsignedInt:remoteID], @"remoteID", nil]; if (remotePath) - [args setObject:remotePath forKey:@"remotePath"]; + [argDict setObject:remotePath forKey:@"remotePath"]; if (remoteToken) - [args setObject:remoteToken forKey:@"remoteToken"]; + [argDict setObject:remoteToken forKey:@"remoteToken"]; + } - [pidArguments setObject:args - forKey:[NSNumber numberWithInt:pid]]; + if (selRange) { + if (!argDict) + argDict = [NSMutableDictionary + dictionaryWithObject:[xcodedesc data] + forKey:@"selectionRangeData"]; + else + [argDict setObject:[xcodedesc data] + forKey:@"selectionRangeData"]; } + + if (argDict) + [pidArguments setObject:argDict + forKey:[NSNumber numberWithInt:pid]]; } } @@ -494,6 +527,12 @@ - (IBAction)fontSizeDown:(id)sender token:[args objectForKey:@"remoteToken"]]; } + if ([args objectForKey:@"selectionRangeData"]) { + MMSelectionRange *selRange = (MMSelectionRange*) + [[args objectForKey:@"selectionRangeData"] bytes]; + [vc addVimInput:[self inputStringFromSelectionRange:selRange]]; + } + [pidArguments removeObjectForKey:key]; } @@ -721,6 +760,7 @@ - (NSArray *)filterFilesAndNotify:(NSArray *)filenames - (NSArray *)filterOpenFiles:(NSArray *)filenames remote:(OSType)theID path:(NSString *)path token:(NSAppleEventDescriptor *)token + selectionRange:(MMSelectionRange *)selRange { // Check if any of the files in the 'filenames' array are open in any Vim // process. Remove the files that are open from the 'filenames' array and @@ -781,6 +821,11 @@ - (NSArray *)filterOpenFiles:(NSArray *)filenames remote:(OSType)theID ":let oldswb=&swb|let &swb=\"useopen,usetab\"|" "tab sb %@|let &swb=oldswb|unl oldswb|" "cal foreground()|redr|f", raiseFile]; + + if (selRange) + input = [input stringByAppendingString: + [self inputStringFromSelectionRange:selRange]]; + [raiseController addVimInput:input]; } @@ -812,6 +857,23 @@ - (void)handleXcodeModEvent:(NSAppleEventDescriptor *)event #endif } +- (NSString *)inputStringFromSelectionRange:(MMSelectionRange *)selRange +{ + if (!selRange) + return [NSString string]; + + NSString *input; + if (selRange->lineNum < 0) { + input = [NSString stringWithFormat:@"%dGV%dG", + selRange->endRange+1, selRange->startRange+1]; + } else { + input = [NSString stringWithFormat:@"%dGz.", + selRange->lineNum+1]; + } + + return input; +} + @end // MMAppController (Private) From b86eee82f8830d29c6add63b1e3c3db7ac27e0a9 Mon Sep 17 00:00:00 2001 From: Nico Weber Date: Sun, 2 Dec 2007 13:05:14 +0100 Subject: [PATCH 0342/1156] Add fork support If vim is started via '-g', it forks and exec()s a new (!) vim instance in the child process. But if the gui is started via `:gui`, no forking is done. In MacVim, pass the '-f' flag when starting a new Vim process (should not fork in this instance). --- src/MacVim/MMAppController.m | 14 +++--- src/gui.c | 89 +++++++++++++++++++++++++++++++++--- src/main.c | 24 ++++++---- src/proto/main.pro | 1 + 4 files changed, 106 insertions(+), 22 deletions(-) diff --git a/src/MacVim/MMAppController.m b/src/MacVim/MMAppController.m index cf318f8965..210f3adfed 100644 --- a/src/MacVim/MMAppController.m +++ b/src/MacVim/MMAppController.m @@ -667,10 +667,11 @@ - (int)launchVimProcessWithArguments:(NSArray *)args if ([[NSUserDefaults standardUserDefaults] boolForKey:MMLoginShellKey]) { // Run process with a login shell - // $SHELL -l -c "exec Vim args" + // $SHELL -l -c "exec Vim -g -f args" + // (-g for GUI, -f for foreground, i.e. don't fork) NSMutableString *execArg = [NSMutableString - stringWithFormat:@"exec \"%@\" -g", path]; + stringWithFormat:@"exec \"%@\" -g -f", path]; if (args) { // Append all arguments while making sure that arguments containing // spaces are enclosed in quotes. @@ -696,17 +697,18 @@ - (int)launchVimProcessWithArguments:(NSArray *)args taskPath = @"/bin/sh"; } else { // Run process directly: - // Vim args + // Vim -g -f args + // (-g for GUI, -f for foreground, i.e. don't fork) taskPath = path; - taskArgs = [NSArray arrayWithObject:@"-g"]; + taskArgs = [NSArray arrayWithObjects:@"-g", @"-f", nil]; if (args) taskArgs = [taskArgs arrayByAddingObjectsFromArray:args]; } NSTask *task =[NSTask launchedTaskWithLaunchPath:taskPath arguments:taskArgs]; - //NSLog(@"launch %@ with args=%@ (pid=%d)", [task processIdentifier], - // taskPath, taskArgs); + //NSLog(@"launch %@ with args=%@ (pid=%d)", taskPath, taskArgs, + // [task processIdentifier]); return [task processIdentifier]; } diff --git a/src/gui.c b/src/gui.c index 49cf9a09e0..79732fc25f 100644 --- a/src/gui.c +++ b/src/gui.c @@ -58,7 +58,7 @@ static int can_update_cursor = TRUE; /* can display the cursor */ gui_start() { char_u *old_term; -#if defined(UNIX) && !defined(__BEOS__) && !defined(MACOS_X) +#if defined(UNIX) && !defined(__BEOS__) # define MAY_FORK int dofork = TRUE; #endif @@ -117,10 +117,75 @@ gui_start() */ if (gui.in_use && dofork) { + pid_t pid = -1; + +# if defined MACOS_X + int i; + + /* on os x, you have to exec after a fork, otherwise calls to + * frameworks will assert (and without corefoundation, you can't start + * the gui. what fun.). See CAVEATS at +http://developer.apple.com/documentation/Darwin/Reference/ManPages/man2/fork.2.html + * + * Since we have to go through this anyways, we might as well use vfork. + * But: then we can't detach from our starting shell, so stick with + * fork. + * + * Kinda sucks to restart vim when doing :gui, so don't fork in that + * case (make sure gui.dofork is only set when interpreting argv, not + * when doing :gui. Currently, gui.dofork is set to false in ex_gui(). + * + * Also doesn't work well if vim starts cscope (or some other + * subprocess I guess), because it's not transferred to the newly + * exec'd process, leaving an orphaned process (not a zombie process) + * behind. The Right Thing is to kill all our child processes before + * calling exec. + */ + + /* stolen from http://paste.lisp.org/display/50906 */ + extern int *_NSGetArgc(void); + extern char ***_NSGetArgv(void); + + int argc = *_NSGetArgc(); + char ** argv = *_NSGetArgv(); + char * newargv[argc+2]; + + for (i = 0; i < argc; i++) { + newargv[i] = argv[i]; + } + newargv[argc] = "-f"; + newargv[argc+1] = NULL; + + pid = fork(); + switch(pid) { + case -1: +# ifndef NDEBUG + fprintf(stderr, "vim: Mac OS X workaround fork() failed!"); +# endif + _exit(255); + case 0: + /* Child. */ + + /* shut down all the stuff we just started, just to start + * it again from the exec :-\ */ + prepare_getout(); + + /* make sure we survive our shell */ + setsid(); + + /* Restarts the vim process, will not return. */ + execvp(argv[0], newargv); + + /* if we come here, exec has failed. bail. */ + _exit(255); + default: + /* Parent */ + _exit(0); + } +# else int pipefd[2]; /* pipe between parent and child */ int pipe_error; char dummy; - pid_t pid = -1; /* Setup a pipe between the child and the parent, so that the parent * knows when the child has done the setsid() call and is allowed to @@ -155,27 +220,30 @@ gui_start() _exit(0); } -# if defined(HAVE_SETSID) || defined(HAVE_SETPGID) +# if defined(HAVE_SETSID) || defined(HAVE_SETPGID) /* * Change our process group. On some systems/shells a CTRL-C in the * shell where Vim was started would otherwise kill gvim! */ if (pid == 0) /* child */ -# if defined(HAVE_SETSID) +# if defined(HAVE_SETSID) (void)setsid(); -# else +# else (void)setpgid(0, 0); +# endif # endif -# endif if (!pipe_error) { close(pipefd[0]); close(pipefd[1]); } -# if defined(FEAT_GUI_GNOME) && defined(FEAT_SESSION) + +# if defined(FEAT_GUI_GNOME) && defined(FEAT_SESSION) /* Tell the session manager our new PID */ gui_mch_forked(); +# endif + # endif } #else @@ -4736,6 +4804,13 @@ ex_gui(eap) { /* Clear the command. Needed for when forking+exiting, to avoid part * of the argument ending up after the shell prompt. */ + +#ifdef MACOS_X + /* os x doesn't really support fork(), so we can't fork of a gui + * in an already running vim. see gui_start() for more details. + */ + gui.dofork = FALSE; +#endif msg_clr_eos_force(); gui_start(); } diff --git a/src/main.c b/src/main.c index 17132624b7..c4ebdb751f 100644 --- a/src/main.c +++ b/src/main.c @@ -1250,10 +1250,9 @@ getout_preserve_modified(exitval) #endif -/* Exit properly */ +/* Prepare proper exit*/ void -getout(exitval) - int exitval; +prepare_getout() { #ifdef FEAT_AUTOCMD buf_T *buf; @@ -1263,12 +1262,6 @@ getout(exitval) exiting = TRUE; - /* When running in Ex mode an error causes us to exit with a non-zero exit - * code. POSIX requires this, although it's not 100% clear from the - * standard. */ - if (exmode_active) - exitval += ex_exitval; - /* Position the cursor on the last screen line, below all the text */ #ifdef FEAT_GUI if (!gui.in_use) @@ -1385,7 +1378,20 @@ getout(exitval) if (garbage_collect_at_exit) garbage_collect(); #endif +} + +/* Exit properly */ + void +getout(exitval) + int exitval; +{ + /* When running in Ex mode an error causes us to exit with a non-zero exit + * code. POSIX requires this, although it's not 100% clear from the + * standard. */ + if (exmode_active) + exitval += ex_exitval; + prepare_getout(); mch_exit(exitval); } diff --git a/src/proto/main.pro b/src/proto/main.pro index 2ecce79557..15c66ecf13 100644 --- a/src/proto/main.pro +++ b/src/proto/main.pro @@ -1,5 +1,6 @@ /* main.c */ void main_loop __ARGS((int cmdwin, int noexmode)); +void prepare_getout __ARGS(()); void getout_preserve_modified __ARGS((int exitval)); void getout __ARGS((int exitval)); int process_env __ARGS((char_u *env, int is_viminit)); From d4855706c09ccbac2051afe10e0e40e0d301b5ae Mon Sep 17 00:00:00 2001 From: Nico Weber Date: Sun, 2 Dec 2007 15:00:37 +0100 Subject: [PATCH 0343/1156] Nicer looking tabs on Leopard Make the tabs look almost identical to the Leopard Terminal.app tabs (only on Leopard, the Tiger tabs are unchanged). --- src/MacVim/MMVimView.m | 32 +++++++ src/MacVim/MMWindowController.m | 95 ++++++++++++++++++--- src/MacVim/MacVim.xcodeproj/project.pbxproj | 14 +-- 3 files changed, 115 insertions(+), 26 deletions(-) diff --git a/src/MacVim/MMVimView.m b/src/MacVim/MMVimView.m index dca6f3cd19..ae8ff2450b 100644 --- a/src/MacVim/MMVimView.m +++ b/src/MacVim/MMVimView.m @@ -182,6 +182,38 @@ - (void)dealloc [super dealloc]; } +- (void)drawRect:(NSRect)rect +{ + // On Leopard, we want to have a textured window background for nice + // looking tabs. However, the textured window background looks really + // weird behind the window resize throbber, so emulate the look of an + // NSScrollView in the bottom right corner. + if (![[self window] showsResizeIndicator] // XXX: make this a flag + || !([[self window] styleMask] & NSTexturedBackgroundWindowMask)) + return; + + int sw = [NSScroller scrollerWidth]; + + // add .5 to the pixel locations to put the lines on a pixel boundary. + // the top and right edges of the rect will be outside of the bounds rect + // and clipped away. + NSRect sizerRect = NSMakeRect([self bounds].size.width - sw + .5, -.5, + sw, sw); + //NSBezierPath* path = [NSBezierPath bezierPath]; + NSBezierPath* path = [NSBezierPath bezierPathWithRect:sizerRect]; + + // On Tiger, we have color #E8E8E8 behind the resize throbber + // (which is windowBackgroundColor on untextured windows or controlColor in + // general). Terminal.app on Leopard has #FFFFFF background and #D9D9D9 as + // stroke. The colors below are #FFFFFF and #D4D4D4, which is close enough + // for me. + [[NSColor controlBackgroundColor] set]; + [path fill]; + + [[NSColor secondarySelectedControlColor] set]; + [path stroke]; +} + - (MMTextView *)textView { return textView; diff --git a/src/MacVim/MMWindowController.m b/src/MacVim/MMWindowController.m index 35b4091bb0..f11abc2c1b 100644 --- a/src/MacVim/MMWindowController.m +++ b/src/MacVim/MMWindowController.m @@ -65,10 +65,14 @@ - (NSSize)resizeVimViewToFitSize:(NSSize)size; } #endif +@interface NSWindow (NSWindowPrivate) // Note: This hack allows us to set content shadowing separately from // the window shadow. This is apparently what webkit and terminal do. -@interface NSWindow (NSWindowPrivate) // new Tiger private method -- (void)_setContentHasShadow:(BOOL)shadow; +- (void)_setContentHasShadow:(BOOL)shadow; // new Tiger private method + +// This is a private api that makes textured windows not have rounded corners. +// We want this on Leopard. +- (void)setBottomCornerRounded:(BOOL)rounded; @end @@ -76,23 +80,38 @@ @implementation MMWindowController - (id)initWithVimController:(MMVimController *)controller { - if ((self = [super initWithWindowNibName:@"EmptyWindow"])) { +#ifndef NSAppKitVersionNumber10_4 // needed for non-10.5 sdk +# define NSAppKitVersionNumber10_4 824 +#endif + unsigned styleMask = NSTitledWindowMask | NSClosableWindowMask + | NSMiniaturizableWindowMask | NSResizableWindowMask + | NSUnifiedTitleAndToolbarWindowMask; + + // Use textured background on Leopard or later (uncomment this on Tiger for + // polished metal window). + if (floor(NSAppKitVersionNumber) > NSAppKitVersionNumber10_4) + styleMask |= NSTexturedBackgroundWindowMask; + + NSWindow *win = [[NSWindow alloc] + initWithContentRect:NSMakeRect(0,0,480,360) + styleMask:styleMask + backing:NSBackingStoreBuffered + defer:YES]; + + if ((self = [super initWithWindow:win])) { vimController = controller; // Window cascading is handled by MMAppController. [self setShouldCascadeWindows:NO]; - NSWindow *win = [self window]; NSView *contentView = [win contentView]; vimView = [[MMVimView alloc] initWithFrame:[contentView frame] vimController:vimController]; [contentView addSubview:vimView]; - // [vimView translateOriginToPoint: - // NSMakePoint([contentView frame].size.width, 0)]; - // [vimView rotateByAngle:45.f]; // Create the tabline separator (which may be visible when the tabline - // is hidden). + // is hidden). See showTabBar: for circumstances when the separator + // should be hidden. NSRect tabSepRect = [contentView frame]; tabSepRect.origin.y = NSMaxY(tabSepRect)-1; tabSepRect.size.height = 1; @@ -109,6 +128,30 @@ - (id)initWithVimController:(MMVimController *)controller [win setDelegate:self]; [win setInitialFirstResponder:[vimView textView]]; + if ([win styleMask] & NSTexturedBackgroundWindowMask) { + // On Leopard, we want to have a textured window to have nice + // looking tabs. But the textured window look implies rounded + // corners, which looks really weird -- disable them. This is a + // private api, though. + if ([win respondsToSelector:@selector(setBottomCornerRounded:)]) + [win setBottomCornerRounded:NO]; + +#if NSAppKitVersionNumber > NSAppKitVersionNumber10_4 // Avoid warning on 10.4 + // When the tab bar is toggled, it changes color for the fraction + // of a second, probably because vim sends us events in a strange + // order, confusing appkit's content border heuristic for a short + // while. This can be worked around with these two methods. There + // might be a better way, but it's good enough. + if ([win respondsToSelector:@selector( + setAutorecalculatesContentBorderThickness:forEdge:)]) + [win setAutorecalculatesContentBorderThickness:NO + forEdge:NSMaxYEdge]; + if ([win respondsToSelector: + @selector(setContentBorderThickness:forEdge:)]) + [win setContentBorderThickness:40 forEdge:NSMaxYEdge]; +#endif // NSAppKitVersionNumber > NSAppKitVersionNumber10_4 + } + // Make us safe on pre-tiger OSX if ([win respondsToSelector:@selector(_setContentHasShadow:)]) [win _setContentHasShadow:NO]; @@ -178,7 +221,6 @@ - (void)cleanup [self leaveFullscreen]; } - setupDone = NO; vimController = nil; @@ -313,11 +355,29 @@ - (void)showTabBar:(BOOL)on { [[vimView tabBarControl] setHidden:!on]; + // Rules for when to show tabline separator: + // + // Tabline visible & Toolbar visible => Separator visible + // ================================================================ + // NO & NO => NO (Tiger), YES (Leopard) + // NO & YES => YES + // YES & NO => NO + // YES & YES => NO + // + // XXX: This is ignored if called while in fullscreen mode if (!on) { NSToolbar *toolbar = [[self window] toolbar]; - [tablineSeparator setHidden:![toolbar isVisible]]; + if (([[self window] styleMask] & NSTexturedBackgroundWindowMask) == 0) { + [tablineSeparator setHidden:![toolbar isVisible]]; + } else { + [tablineSeparator setHidden:NO]; + } } else { - [tablineSeparator setHidden:on]; + if (([[self window] styleMask] & NSTexturedBackgroundWindowMask) == 0) { + [tablineSeparator setHidden:on]; + } else { + [tablineSeparator setHidden:YES]; + } } //if (setupDone) @@ -333,9 +393,18 @@ - (void)showToolbar:(BOOL)on size:(int)size mode:(int)mode [toolbar setDisplayMode:mode]; [toolbar setVisible:on]; - if (!on) { - [tablineSeparator setHidden:YES]; + // See showTabBar: for circumstances when the separator should be hidden. + if (([[self window] styleMask] & NSTexturedBackgroundWindowMask) == 0) { + if (!on) { + [tablineSeparator setHidden:YES]; + } else { + [tablineSeparator setHidden:![[vimView tabBarControl] isHidden]]; + } } else { + // Textured windows don't have a line below there title bar, so we + // need the separator in this case as well. In fact, the only case + // where we don't need the separator is when the tab bar control + // is visible (because it brings its own separator). [tablineSeparator setHidden:![[vimView tabBarControl] isHidden]]; } } diff --git a/src/MacVim/MacVim.xcodeproj/project.pbxproj b/src/MacVim/MacVim.xcodeproj/project.pbxproj index df440005f7..e134dd6927 100644 --- a/src/MacVim/MacVim.xcodeproj/project.pbxproj +++ b/src/MacVim/MacVim.xcodeproj/project.pbxproj @@ -41,7 +41,6 @@ 1DD703B90BA9D15D008679E9 /* vim_gloss.icns in Resources */ = {isa = PBXBuildFile; fileRef = 1DD703B80BA9D15D008679E9 /* vim_gloss.icns */; }; 1DD704310BA9F9C2008679E9 /* SpecialKeys.plist in Resources */ = {isa = PBXBuildFile; fileRef = 1DD704300BA9F9C2008679E9 /* SpecialKeys.plist */; }; 1DD9F5E50C85D60500E8D5A5 /* SystemColors.plist in Resources */ = {isa = PBXBuildFile; fileRef = 1DD9F5E40C85D60500E8D5A5 /* SystemColors.plist */; }; - 1DDBEB6D0C7434150036EEDD /* EmptyWindow.nib in Resources */ = {isa = PBXBuildFile; fileRef = 1DDBEB6B0C7434150036EEDD /* EmptyWindow.nib */; }; 1DE608B40C587FDA0055263D /* runtime in CopyFiles */ = {isa = PBXBuildFile; fileRef = 1DE602470C587FD10055263D /* runtime */; }; 1DE8CC620C5E2AAD003F56E3 /* Actions.plist in Resources */ = {isa = PBXBuildFile; fileRef = 1DE8CC610C5E2AAD003F56E3 /* Actions.plist */; }; 1DED78600C6DE43D0079945F /* vimrc in CopyFiles */ = {isa = PBXBuildFile; fileRef = 1DED785F0C6DE43D0079945F /* vimrc */; }; @@ -173,7 +172,6 @@ 1DD703B80BA9D15D008679E9 /* vim_gloss.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = vim_gloss.icns; sourceTree = ""; }; 1DD704300BA9F9C2008679E9 /* SpecialKeys.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = SpecialKeys.plist; sourceTree = ""; }; 1DD9F5E40C85D60500E8D5A5 /* SystemColors.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = SystemColors.plist; sourceTree = ""; }; - 1DDBEB6C0C7434150036EEDD /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = English.lproj/EmptyWindow.nib; sourceTree = ""; }; 1DE602470C587FD10055263D /* runtime */ = {isa = PBXFileReference; lastKnownFileType = folder; name = runtime; path = ../../runtime; sourceTree = SOURCE_ROOT; }; 1DE8CC610C5E2AAD003F56E3 /* Actions.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = Actions.plist; sourceTree = ""; }; 1DED785F0C6DE43D0079945F /* vimrc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = vimrc; sourceTree = ""; }; @@ -204,7 +202,7 @@ 29B97325FDCFA39411CA2CEA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = ""; }; 32CA4F630368D1EE00C91783 /* MacVim_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MacVim_Prefix.pch; sourceTree = ""; }; 8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; - 8D1107320486CEB800E47090 /* MacVim.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = MacVim.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 8D1107320486CEB800E47090 /* MacVim.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = MacVim.app; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -380,7 +378,6 @@ 8D1107310486CEB800E47090 /* Info.plist */, 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */, 29B97318FDCFA39411CA2CEA /* MainMenu.nib */, - 1DDBEB6B0C7434150036EEDD /* EmptyWindow.nib */, ); name = Resources; sourceTree = ""; @@ -495,7 +492,6 @@ 1DEE0DB30C4E150B008E82B2 /* Undo.png in Resources */, 1DD04DEC0C529C5E006CDC2B /* Credits.rtf in Resources */, 1DE8CC620C5E2AAD003F56E3 /* Actions.plist in Resources */, - 1DDBEB6D0C7434150036EEDD /* EmptyWindow.nib in Resources */, 1DD9F5E50C85D60500E8D5A5 /* SystemColors.plist in Resources */, 1D3D19110CA690FF0004A0A5 /* DejaVuSansMono-Bold.ttf in Resources */, 1D3D19120CA690FF0004A0A5 /* DejaVuSansMono-BoldOblique.ttf in Resources */, @@ -544,14 +540,6 @@ name = InfoPlist.strings; sourceTree = ""; }; - 1DDBEB6B0C7434150036EEDD /* EmptyWindow.nib */ = { - isa = PBXVariantGroup; - children = ( - 1DDBEB6C0C7434150036EEDD /* English */, - ); - name = EmptyWindow.nib; - sourceTree = ""; - }; 29B97318FDCFA39411CA2CEA /* MainMenu.nib */ = { isa = PBXVariantGroup; children = ( From 5fafa98d5f89b70b723499a44e9bdc173c360b04 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sun, 2 Dec 2007 15:22:47 +0100 Subject: [PATCH 0344/1156] Cursor line & column darker when bg=dark in macvim color scheme --- runtime/colors/macvim.vim | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/runtime/colors/macvim.vim b/runtime/colors/macvim.vim index 26c2f403c1..7c82b96366 100644 --- a/runtime/colors/macvim.vim +++ b/runtime/colors/macvim.vim @@ -23,8 +23,6 @@ let colors_name = "macvim" " " `:he highlight-groups` -hi CursorColumn guibg=#F1F5FA -hi CursorLine guibg=#F1F5FA hi DiffAdd guibg=MediumSeaGreen hi Directory guifg=#1600FF hi ErrorMsg guibg=Firebrick2 guifg=White @@ -76,7 +74,9 @@ if &background == "dark" hi Comment gui=italic guifg=CadetBlue3 hi Constant gui=NONE guifg=Goldenrod1 guibg=NONE hi Cursor guibg=LightSlateGrey guifg=bg + hi CursorColumn guibg=Gray20 hi CursorIM guibg=LightSlateGrey guifg=bg + hi CursorLine guibg=Gray20 hi DiffChange guibg=MediumPurple4 hi DiffDelete gui=bold guifg=White guibg=SlateBlue hi DiffText gui=NONE guifg=White guibg=SteelBlue @@ -93,7 +93,9 @@ else hi Comment gui=italic guifg=Blue2 guibg=NONE hi Constant gui=NONE guifg=DarkOrange guibg=NONE hi Cursor guibg=fg guifg=bg + hi CursorColumn guibg=#F1F5FA hi CursorIM guibg=fg guifg=bg + hi CursorLine guibg=#F1F5FA hi DiffChange guibg=DeepSkyBlue hi DiffDelete gui=bold guifg=Black guibg=SlateBlue hi DiffText gui=NONE guibg=Gold From 81a1de822a9d3ac19f87092feb2f09831604c9b6 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sun, 2 Dec 2007 15:57:54 +0100 Subject: [PATCH 0345/1156] Add mvim script, update credits --- src/MacVim/Credits.rtf | 21 ++++++++++--- src/MacVim/mvim | 69 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 85 insertions(+), 5 deletions(-) create mode 100755 src/MacVim/mvim diff --git a/src/MacVim/Credits.rtf b/src/MacVim/Credits.rtf index 1eaff2f41b..dd3a6d939f 100644 --- a/src/MacVim/Credits.rtf +++ b/src/MacVim/Credits.rtf @@ -1,4 +1,4 @@ -{\rtf1\mac\ansicpg10000\cocoartf824\cocoasubrtf410 +{\rtf1\mac\ansicpg10000\cocoartf824\cocoasubrtf440 {\fonttbl\f0\fswiss\fcharset77 Helvetica-Bold;\f1\fswiss\fcharset77 Helvetica;\f2\fswiss\fcharset77 Helvetica-Oblique; } {\colortbl;\red255\green255\blue255;} @@ -7,16 +7,27 @@ \f0\b\fs24 \cf0 VIM - Vi IMproved \f1\b0 \ -by: -\f2\i Bram Moolenaar + +\f2\i Bram Moolenaar et al. \f1\i0 \ \ \f0\b MacVim GUI\ -\f1\b0 by: -\f2\i Bj\'9arn Winckler +\f2\i\b0 Bj\'9arn Winckler\ + +\f1\i0 \ +with the help of:\ + +\f2\i Nico Weber (full-screen editing, ...)\ +George Harker (transparency, ...)\ +Jjgod Jiang\ +Tim Allen\ +Chris Willmore\ + \f1\i0 \ +...and many others who have helped by reporting bugs or otherwise.\ +\ \ Thank you to {\field{\*\fldinst{HYPERLINK "http://www.positivespinmedia.com"}}{\fldrslt Positive Spin Media}} for the PSMTabBarControl Framework.\ \ diff --git a/src/MacVim/mvim b/src/MacVim/mvim new file mode 100755 index 0000000000..ecd801b413 --- /dev/null +++ b/src/MacVim/mvim @@ -0,0 +1,69 @@ +#!/bin/sh +# +# This shell script passes all its arguments to the binary inside the +# MacVim.app application bundle. If you make links to this script as view, +# gvim, etc., then it will peek at the name used to call it and set options +# appropriately. +# +# Based on a script by Wout Mertens and suggestions from Laurent Bihanic. This +# version is the fault of Benji Fisher, 16 May 2005 (with modifications by Nico +# Weber and Bjorn Winckler, Aug 13 2007). +# First, check "All the Usual Suspects" for the location of the Vim.app bundle. +# You can short-circuit this by setting the VIM_APP_DIR environment variable +# or by un-commenting and editing the following line: +# VIM_APP_DIR=/Applications + +if [ -z "$VIM_APP_DIR" ] +then + myDir="`dirname "$0"`" + myAppDir="$myDir/../Applications" + for i in ~/Applications ~/Applications/vim $myDir $myDir/vim $myAppDir $myAppDir/vim /Applications /Applications/vim /Applications/Utilities /Applications/Utilities/vim; do + if [ -x "$i/MacVim.app" ]; then + VIM_APP_DIR="$i" + break + fi + done +fi +if [ -z "$VIM_APP_DIR" ] +then + echo "Sorry, cannot find MacVim.app. Try setting the VIM_APP_DIR environment variable to the directory containing MacVim.app." + exit 1 +fi +binary="$VIM_APP_DIR/MacVim.app/Contents/MacOS/Vim" + +# Next, peek at the name used to invoke this script, and set options +# accordingly. + +name="`basename "$0"`" +gui= +opts= + +# GUI mode, implies forking +case "$name" in m*|g*|rg*) gui=true ;; esac + +# Restricted mode +case "$name" in r*) opts="$opts -Z";; esac + +# vimdiff and view +case "$name" in + *vimdiff) + opts="$opts -dO" + ;; + *view) + opts="$opts -R" + ;; +esac + +# Last step: fire up vim. +# The program should fork by default when started in GUI mode, but it does +# not; we work around this when this script is invoked as "gvim" or "rgview" +# etc., but not when it is invoked as "vim -g". +if [ "$gui" ]; then + # Note: this isn't perfect, because any error output goes to the + # terminal instead of the console log. + # But if you use open instead, you will need to fully qualify the + # path names for any filenames you specify, which is hard. + exec "$binary" -g $opts ${1:+"$@"} +else + exec "$binary" $opts ${1:+"$@"} +fi From 922a70fafc62c64ee53ffb2c870cc20e3a28f4a7 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sun, 2 Dec 2007 16:48:24 +0100 Subject: [PATCH 0346/1156] Fix initial window placement When ~/Library/Preferences/org.vim.MacVim.plist does not exist the window will be placed according to the frame passed when initializing the NSWindow, so set some sane default values. --- src/MacVim/MMWindowController.m | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/MacVim/MMWindowController.m b/src/MacVim/MMWindowController.m index f11abc2c1b..1433fd749d 100644 --- a/src/MacVim/MMWindowController.m +++ b/src/MacVim/MMWindowController.m @@ -92,8 +92,12 @@ - (id)initWithVimController:(MMVimController *)controller if (floor(NSAppKitVersionNumber) > NSAppKitVersionNumber10_4) styleMask |= NSTexturedBackgroundWindowMask; + // NOTE: The content rect is only used the very first time MacVim is + // started (or rather, when ~/Library/Preferences/org.vim.MacVim.plist does + // not exist). The chosen values will put the window somewhere near the + // top and in the middle of a 1024x768 screen. NSWindow *win = [[NSWindow alloc] - initWithContentRect:NSMakeRect(0,0,480,360) + initWithContentRect:NSMakeRect(242,364,480,360) styleMask:styleMask backing:NSBackingStoreBuffered defer:YES]; From 86ba88820190ed83ce403e2597b822c75211b2ad Mon Sep 17 00:00:00 2001 From: Nico Weber Date: Tue, 4 Dec 2007 20:50:31 +0100 Subject: [PATCH 0347/1156] Fix tab color flicker problem on Leopard --- src/MacVim/MMWindowController.m | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/src/MacVim/MMWindowController.m b/src/MacVim/MMWindowController.m index 1433fd749d..3d12c70419 100644 --- a/src/MacVim/MMWindowController.m +++ b/src/MacVim/MMWindowController.m @@ -75,6 +75,27 @@ - (void)_setContentHasShadow:(BOOL)shadow; // new Tiger private method - (void)setBottomCornerRounded:(BOOL)rounded; @end +@interface NSWindow (NSLeopardOnly) +// Note: These functions are Leopard-only, use -[NSObject respondsToSelector:] +// before calling them to make sure everything works on Tiger too. + +#ifndef CGFLOAT_DEFINED + // On Leopard, CGFloat is float on 32bit and double on 64bit. On Tiger, + // we can't use this anyways, so it's just here to keep the compiler happy. + // However, when we're compiling for Tiger and running on Leopard, we + // might need the correct typedef, so this piece is copied from ATSTypes.h +# ifdef __LP64__ + typedef double CGFloat; +# else + typedef float CGFloat; +# endif +#endif +- (void)setAutorecalculatesContentBorderThickness:(BOOL)b forEdge:(NSRectEdge)e; +- (void)setContentBorderThickness:(CGFloat)b forEdge:(NSRectEdge)e; +@end + + + @implementation MMWindowController @@ -140,7 +161,6 @@ - (id)initWithVimController:(MMVimController *)controller if ([win respondsToSelector:@selector(setBottomCornerRounded:)]) [win setBottomCornerRounded:NO]; -#if NSAppKitVersionNumber > NSAppKitVersionNumber10_4 // Avoid warning on 10.4 // When the tab bar is toggled, it changes color for the fraction // of a second, probably because vim sends us events in a strange // order, confusing appkit's content border heuristic for a short @@ -152,8 +172,7 @@ - (id)initWithVimController:(MMVimController *)controller forEdge:NSMaxYEdge]; if ([win respondsToSelector: @selector(setContentBorderThickness:forEdge:)]) - [win setContentBorderThickness:40 forEdge:NSMaxYEdge]; -#endif // NSAppKitVersionNumber > NSAppKitVersionNumber10_4 + [win setContentBorderThickness:0 forEdge:NSMaxYEdge]; } // Make us safe on pre-tiger OSX From c9304c3b82e6dfda53bd57d138acea954fdd8e11 Mon Sep 17 00:00:00 2001 From: Nico Weber Date: Tue, 4 Dec 2007 21:09:31 +0100 Subject: [PATCH 0348/1156] Fix forking infinite loop --- src/gui.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/gui.c b/src/gui.c index 79732fc25f..fceaf11253 100644 --- a/src/gui.c +++ b/src/gui.c @@ -150,10 +150,17 @@ gui_start() char ** argv = *_NSGetArgv(); char * newargv[argc+2]; - for (i = 0; i < argc; i++) { - newargv[i] = argv[i]; + newargv[0] = argv[0]; + + /* + * make sure "-f" is in front of potential "--remote" flags, else + * they would consume it. + */ + newargv[1] = "-f"; + + for (i = 1; i < argc; i++) { + newargv[i + 1] = argv[i]; } - newargv[argc] = "-f"; newargv[argc+1] = NULL; pid = fork(); From 621f94828e2fe5b2da1c13ad70d40eba0ac7c10b Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Fri, 14 Dec 2007 18:56:18 +0100 Subject: [PATCH 0349/1156] Fix memory leak in window controller The NSWindow object for a window controller was alloc'ed but never released when initializing the window controller. --- src/MacVim/MMWindowController.m | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/MacVim/MMWindowController.m b/src/MacVim/MMWindowController.m index 3d12c70419..0228c8a247 100644 --- a/src/MacVim/MMWindowController.m +++ b/src/MacVim/MMWindowController.m @@ -108,7 +108,7 @@ - (id)initWithVimController:(MMVimController *)controller | NSMiniaturizableWindowMask | NSResizableWindowMask | NSUnifiedTitleAndToolbarWindowMask; - // Use textured background on Leopard or later (uncomment this on Tiger for + // Use textured background on Leopard or later (skip the 'if' on Tiger for // polished metal window). if (floor(NSAppKitVersionNumber) > NSAppKitVersionNumber10_4) styleMask |= NSTexturedBackgroundWindowMask; @@ -180,6 +180,8 @@ - (id)initWithVimController:(MMVimController *)controller [win _setContentHasShadow:NO]; } + [win release]; + return self; } From 08e7634e76e9ec8cf503bcdf72e01be00082c356 Mon Sep 17 00:00:00 2001 From: Nico Weber Date: Fri, 14 Dec 2007 19:17:29 +0100 Subject: [PATCH 0350/1156] Documentation updates Added some info about forking on Mac OS X and some other minor improvements. --- .gitignore | 1 + runtime/doc/gui_mac.txt | 20 ++++++++++++-------- runtime/doc/gui_x11.txt | 8 ++++++++ 3 files changed, 21 insertions(+), 8 deletions(-) diff --git a/.gitignore b/.gitignore index afe1c2a0ae..235e08c4df 100644 --- a/.gitignore +++ b/.gitignore @@ -18,4 +18,5 @@ src/auto/pathdef.c src/config.log src/config.status src/objects +src/tags src/xxd/xxd diff --git a/runtime/doc/gui_mac.txt b/runtime/doc/gui_mac.txt index df6c9b5fc9..86c0e80e63 100644 --- a/runtime/doc/gui_mac.txt +++ b/runtime/doc/gui_mac.txt @@ -30,7 +30,7 @@ MacVim is still under development...this is not the finished product! If you have problems with MacVim then make it known either by adding an issue report on the MacVim project page > http://code.google.com/p/macvim -or by posting to the vim_mac mailing list > +or by posting to the vim_mac mailing list *vim_mac* > http://groups.google.com/group/vim_mac Remember to keep checking the project page for new snapshots. (If you @@ -81,7 +81,7 @@ by adding the following lines to your "~/.vimrc" (not .gvimrc) file: > if has("gui_macvim") let macvim_skip_cmd_opt_movement = 1 endif -Note: These are the only key mappings that MacVim make (not counting menu key +Note: These are the only key mappings that MacVim makes (not counting menu key equivalents which are not set up with :map). *macvim-shift-movement* @@ -163,6 +163,10 @@ If you would rather put MacVim.app in some other directory then that is also possible, simply set the environment variable VIM_APP_DIR to whatever folder you have placed MacVim.app in. +Note: Starting MacVim by creating a symlink to > + .../MacVim.app/Contents/MacOS/Vim +with 'ln -s' does not work. + Once in terminal Vim it is possible to start MacVim by using the following command: :gui [++opt] [+cmd] [-f|-b] [files...] @@ -219,7 +223,7 @@ the "Appearance" pane of the System Preferences. It also changes the highlight color when a window becomes inactive. If you have any comments regarding this colorscheme (is it better or worse -than the default?) then post them to vim_mac. +than the default?) then post them to |vim_mac|. ============================================================================== 4. Menus *macvim-menus* @@ -365,10 +369,10 @@ these are ones that are know and/or which were judged major. - No find/replace dialog If you find new bugs then add a new issue at http://code.google.com/p/macvim/ -or post your findings to the vim_mac mailing list. If you are missing feature -X in MacVim then voice your opinion on the vim_mac mailing list; it might be -simple to implement, but unless somebody asks for a particular feature then -there is little incentive to add it. +or post your findings to the |vim_mac| mailing list. If you are missing +feature X in MacVim then voice your opinion on the |vim_mac| mailing list; it +might be simple to implement, but unless somebody asks for a particular +feature then there is little incentive to add it. ============================================================================== 9. Hints *macvim-hints* @@ -442,7 +446,7 @@ Scenario: ~ You can't find the information on MacVim you thought should be in this manual page. Solution: ~ -Post your question on the vim_mac mailing list and wait for an +Post your question on the |vim_mac| mailing list and wait for an answer. vim:tw=78:sw=4:ts=8:ft=help:norl: diff --git a/runtime/doc/gui_x11.txt b/runtime/doc/gui_x11.txt index 9ff6177b7b..80bddab52c 100644 --- a/runtime/doc/gui_x11.txt +++ b/runtime/doc/gui_x11.txt @@ -40,6 +40,9 @@ The "-f" option runs Vim in the foreground. The "-b" option runs Vim in the background (this is the default). Also see |++opt| and |+cmd|. +Note: For technical reasons, MacVim always runs Vim in the foreground when +using :gui. + *gui-fork* When the GUI is started, it does a fork() and exits the current process. When gvim was started from a shell this makes the shell accept further @@ -52,6 +55,11 @@ When using "gvim -f" and then ":gui", Vim will run in the foreground. The "-f" argument will be remembered. To force running Vim in the background use ":gui -b". +MacVim supports forking only when you're launching Vim. "mvim" and +"mvim -f" work as expected: "mvim" launches the gui and forks, while "mvim -f" +launches the gui but doesn't fork (see |mvim|). However, doing |:gui| in an +already running vim will never fork in MacVim. + "gvim --nofork" does the same as "gvim -f". If you want the GUI to run in the foreground always, include the 'f' From 02da38accf72f2031c99a2e433bfec4218c314b8 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Tue, 18 Dec 2007 17:37:11 +0100 Subject: [PATCH 0351/1156] Avoid false 'documented edited' warning when quitting If a Vim process is quit using :wq the 'document edited' flag is never cleared, so always clear it during cleanup. --- src/MacVim/MMWindowController.m | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/MacVim/MMWindowController.m b/src/MacVim/MMWindowController.m index 0228c8a247..2812d7dfea 100644 --- a/src/MacVim/MMWindowController.m +++ b/src/MacVim/MMWindowController.m @@ -253,6 +253,11 @@ - (void)cleanup [vimView removeFromSuperviewWithoutNeedingDisplay]; [vimView cleanup]; // TODO: is this necessary? + // It is feasible that the user quits before the window controller is + // released, make sure the edit flag is cleared so no warning dialog is + // displayed. + [[self window] setDocumentEdited:NO]; + [[self window] orderOut:self]; } From 035e74e287854d9b2d674f9d01e7ec2356405212 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Wed, 19 Dec 2007 23:14:20 +0100 Subject: [PATCH 0352/1156] Update docs Fixed typos, updated section on the macvim color scheme as well as the toolbar section. --- runtime/doc/gui_mac.txt | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/runtime/doc/gui_mac.txt b/runtime/doc/gui_mac.txt index 86c0e80e63..3240b4860b 100644 --- a/runtime/doc/gui_mac.txt +++ b/runtime/doc/gui_mac.txt @@ -175,7 +175,7 @@ Note: Forking ("-b") currently does not work. *odbeditor* *external-editor* MacVim can act as an 'external editor' for Mac OS X applications that support the ODB Editor Protocol (or the 'external editor' protocol). Each application -has different ways of configuring this option, check the applications +has different ways of configuring this option, check the application's documentation. Once configured properly MacVim can be used to open files in such an application. @@ -215,14 +215,18 @@ dictionary is the name of the color and the value is an RGB value on the form #rrggbb stored as an integer. *macvim-colorscheme* -MacVim ships with a custom colorscheme that can be used as an alternative to -the default Vim colorscheme. You can try it out by typing: > +MacVim ships with a custom color scheme that is used instead of the default +Vim color scheme. The color scheme can be changed with > :colorscheme macvim -The colorscheme uses the the system "Highlight Color", which can be changed in +If you prefer a dark background color, then type > + :set bg=dark +after having loaded the "macvim" color scheme. + +The color scheme uses the the system "Highlight Color", which can be changed in the "Appearance" pane of the System Preferences. It also changes the highlight color when a window becomes inactive. -If you have any comments regarding this colorscheme (is it better or worse +If you have any comments regarding this colors cheme (is it better or worse than the default?) then post them to |vim_mac|. ============================================================================== @@ -313,6 +317,14 @@ empty space which will shink or expand so that the items to the right of it are right-aligned. A space (flexspace) will be created for any toolbar item whose name begins with "-space" ("-flexspace") and ends with "-" +Toolbar icons should be tiff, png or icns, of dimension 32x32 or 24x24 pixels. +The larger size is used when 'tbis' is "medium" or "large", otherwise the +smaller size is used (which is the default). If the icon file only contains +one dimension then Mac OS X will scale the icon to the appropriate dimension +if necessary. To avoid this, use a file format which supports multiple +resolutions (such as icns) and provide both 32x32 and 24x24 versions of the +icon. + Note: Only a subset of the builtin toolbar items presently have icons. If no icon can be found a warning triangle is displayed instead. From 38a4d64829ac77448050e90abc394d3c5a1dd5ae Mon Sep 17 00:00:00 2001 From: Nico Weber Date: Mon, 7 Jan 2008 20:04:58 +0100 Subject: [PATCH 0353/1156] Fix full-screen mode for secondary monitors --- src/MacVim/MMFullscreenWindow.m | 95 +++++++++++++++++++++++++++------ 1 file changed, 79 insertions(+), 16 deletions(-) diff --git a/src/MacVim/MMFullscreenWindow.m b/src/MacVim/MMFullscreenWindow.m index fe781677b1..f2f2080836 100644 --- a/src/MacVim/MMFullscreenWindow.m +++ b/src/MacVim/MMFullscreenWindow.m @@ -23,6 +23,14 @@ #import +static int numFullscreenWindows = 0; + +@interface MMFullscreenWindow (Private) +- (void)centerView; +- (BOOL)isOnPrimaryScreen; +- (void)hideDockIfAppropriate; +- (void)revealDockIfAppropriate; +@end @implementation MMFullscreenWindow @@ -40,7 +48,10 @@ - (MMFullscreenWindow *)initWithWindow:(NSWindow *)t view:(MMVimView *)v styleMask:NSBorderlessWindowMask backing:NSBackingStoreBuffered defer:YES - screen:screen]; + // since we're passing [screen frame] above, + // we want the content rect to be relative to + // the main screen (ie, pass nil for screen). + screen:nil]; if (self == nil) return nil; @@ -64,20 +75,9 @@ - (void)dealloc [super dealloc]; } -- (void)centerView -{ - NSRect outer = [self frame], inner = [view frame]; - //NSLog(@"%s %@%@", _cmd, NSStringFromRect(outer), NSStringFromRect(inner)); - - NSPoint origin = NSMakePoint((outer.size.width - inner.size.width)/2, - (outer.size.height - inner.size.height)/2); - [view setFrameOrigin:origin]; -} - - (void)enterFullscreen { - // hide menu and dock, both appear on demand - SetSystemUIMode(kUIModeAllSuppressed, 0); //requires 10.3 + [self hideDockIfAppropriate]; // fade to black Boolean didBlend = NO; @@ -177,8 +177,7 @@ - (void)leaveFullscreen CGReleaseDisplayFadeReservation(token); } - // order menu and dock back in - SetSystemUIMode(kUIModeNormal, 0); + [self revealDockIfAppropriate]; } // Title-less windows normally don't receive key presses, override this @@ -280,4 +279,68 @@ - (void)setOpaque:(BOOL)isOpaque [target setOpaque:isOpaque]; } -@end +@end // MMFullscreenWindow + + + + +@implementation MMFullscreenWindow (Private) + +- (void)centerView +{ + NSRect outer = [self frame], inner = [view frame]; + //NSLog(@"%s %@%@", _cmd, NSStringFromRect(outer), NSStringFromRect(inner)); + + NSPoint origin = NSMakePoint((outer.size.width - inner.size.width)/2, + (outer.size.height - inner.size.height)/2); + [view setFrameOrigin:origin]; +} + +- (BOOL)isOnPrimaryScreen +{ + // The primary screen is the screen the menu bar is on. This is different + // from [NSScreen mainScreen] (which returns the screen containing the + // key window). + NSArray *screens = [NSScreen screens]; + if (screens == nil || [screens count] < 1) + return NO; + + return [self screen] == [screens objectAtIndex:0]; +} + +- (void)hideDockIfAppropriate +{ + // Hide menu and dock, both appear on demand. + // + // Don't hide the dock if going fullscreen on a non-primary screen. Also, + // if there are several fullscreen windows on the primary screen, only + // hide dock and friends for the first fullscreen window (and display + // them again after the last fullscreen window has been closed). + // + // Another way to deal with several fullscreen windows would be to hide/ + // reveal the dock each time a fullscreen window gets/loses focus, but + // this way it's less distracting. + + // XXX: If you have a fullscreen window on a secondary monitor and unplug + // the monitor, this will probably not work right. + + if ([self isOnPrimaryScreen]) { + if (numFullscreenWindows == 0) { + SetSystemUIMode(kUIModeAllSuppressed, 0); //requires 10.3 + } + ++numFullscreenWindows; + } +} + +- (void)revealDockIfAppropriate +{ + // order menu and dock back in + if ([self isOnPrimaryScreen]) { + --numFullscreenWindows; + if (numFullscreenWindows == 0) { + SetSystemUIMode(kUIModeNormal, 0); + } + } +} + +@end // MMFullscreenWindow (Private) From 46b5d6e03d7d9b7de2cd460e549034f603340e49 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Mon, 7 Jan 2008 20:28:10 +0100 Subject: [PATCH 0354/1156] Fixed potential font memory issue The font was not retained when setting gui.norm_font leading to a pointer into freed memory. The font instance is now retained before its pointer value is stored in gui.norm_font. --- src/MacVim/gui_macvim.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/MacVim/gui_macvim.m b/src/MacVim/gui_macvim.m index 0f20fe999c..cc86adace8 100644 --- a/src/MacVim/gui_macvim.m +++ b/src/MacVim/gui_macvim.m @@ -851,7 +851,7 @@ NSFont *font = gui_macvim_font_with_name(font_name); if (font) { [(NSFont*)gui.norm_font release]; - gui.norm_font = (GuiFont)font; + gui.norm_font = (GuiFont)[font retain]; // NOTE: MacVim keeps separate track of the normal and wide fonts. // Unless the user changes 'guifontwide' manually, they are based on From ba1599a054e4e1f3c78bbe04f495f7b3822f4b0f Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Mon, 21 Jan 2008 21:49:29 +0100 Subject: [PATCH 0355/1156] Prepared for ATSUI renderer --- src/MacVim/MMAtsuiTextView.h | 77 +++ src/MacVim/MMAtsuiTextView.m | 721 ++++++++++++++++++++ src/MacVim/MMVimController.m | 40 +- src/MacVim/MMVimView.m | 82 ++- src/MacVim/MMWindowController.m | 1 + src/MacVim/MacVim.h | 9 + src/MacVim/MacVim.m | 28 + src/MacVim/MacVim.xcodeproj/project.pbxproj | 8 + 8 files changed, 897 insertions(+), 69 deletions(-) create mode 100644 src/MacVim/MMAtsuiTextView.h create mode 100644 src/MacVim/MMAtsuiTextView.m diff --git a/src/MacVim/MMAtsuiTextView.h b/src/MacVim/MMAtsuiTextView.h new file mode 100644 index 0000000000..abae6d859d --- /dev/null +++ b/src/MacVim/MMAtsuiTextView.h @@ -0,0 +1,77 @@ +/* vi:set ts=8 sts=4 sw=4 ft=objc: + * + * VIM - Vi IMproved by Bram Moolenaar + * MacVim GUI port by Bjorn Winckler + * + * Do ":help uganda" in Vim to read copying and usage conditions. + * Do ":help credits" in Vim to see a list of people who contributed. + * See README.txt for an overview of the Vim source code. + */ + +#import + + +enum { MMMaxCellsPerChar = 2 }; + + + +@interface MMAtsuiTextView : NSView { + // From MMTextStorage + int maxRows, maxColumns; + int actualRows, actualColumns; + NSColor *defaultBackgroundColor; + NSColor *defaultForegroundColor; + NSSize cellSize; + NSFont *font; + float linespace; + + // From vim-cocoa +} + +- (id)initWithFrame:(NSRect)frame; + +// +// MMTextStorage methods +// +- (void)getMaxRows:(int*)rows columns:(int*)cols; +- (void)setMaxRows:(int)rows columns:(int)cols; +- (void)setDefaultColorsBackground:(NSColor *)bgColor + foreground:(NSColor *)fgColor; +- (NSSize)size; +- (NSSize)fitToSize:(NSSize)size rows:(int *)rows columns:(int *)columns; +- (NSRect)rectForRowsInRange:(NSRange)range; +- (NSRect)rectForColumnsInRange:(NSRange)range; + +- (void)setFont:(NSFont *)newFont; +- (void)setWideFont:(NSFont *)newFont; +- (NSFont *)font; +- (NSSize)cellSize; +- (void)setLinespace:(float)newLinespace; + +// +// MMTextView methods +// +- (NSEvent *)lastMouseDownEvent; +- (void)setShouldDrawInsertionPoint:(BOOL)on; +- (void)setPreEditRow:(int)row column:(int)col; +- (void)drawInsertionPointAtRow:(int)row column:(int)col shape:(int)shape + fraction:(int)percent color:(NSColor *)color; +- (void)hideMarkedTextField; + +// +// NSTextView methods +// +- (void)keyDown:(NSEvent *)event; +- (void)insertText:(id)string; +- (void)doCommandBySelector:(SEL)selector; +- (BOOL)performKeyEquivalent:(NSEvent *)event; +- (NSPoint)textContainerOrigin; +- (void)setTextContainerInset:(NSSize)inset; +- (void)setBackgroundColor:(NSColor *)color; + +// +// MMAtsuiTextView methods +// +- (void)performBatchDrawWithData:(NSData *)data; + +@end diff --git a/src/MacVim/MMAtsuiTextView.m b/src/MacVim/MMAtsuiTextView.m new file mode 100644 index 0000000000..c5e5d9d6d6 --- /dev/null +++ b/src/MacVim/MMAtsuiTextView.m @@ -0,0 +1,721 @@ +/* vi:set ts=8 sts=4 sw=4 ft=objc: + * + * VIM - Vi IMproved by Bram Moolenaar + * MacVim GUI port by Bjorn Winckler + * + * Do ":help uganda" in Vim to read copying and usage conditions. + * Do ":help credits" in Vim to see a list of people who contributed. + * See README.txt for an overview of the Vim source code. + */ +/* + * MMAtsuiTextView + * + * Dispatches keyboard and mouse input to the backend. Handles drag-n-drop of + * files onto window. + */ + +#import "MMAtsuiTextView.h" +#import "MMVimController.h" +#import "MacVim.h" + + + +static char MMKeypadEnter[2] = { 'K', 'A' }; +static NSString *MMKeypadEnterString = @"KA"; + + + +@interface MMAtsuiTextView (Private) +- (void)dispatchKeyEvent:(NSEvent *)event; +- (void)sendKeyDown:(const char *)chars length:(int)len modifiers:(int)flags; +- (MMVimController *)vimController; +@end + +@interface MMAtsuiTextView (Drawing) +- (void)beginDrawing; +- (void)endDrawing; +- (void)drawString:(UniChar *)string length:(UniCharCount)length + atRow:(int)row column:(int)col cells:(int)cells + withFlags:(int)flags foregroundColor:(NSColor *)fg + backgroundColor:(NSColor *)bg specialColor:(NSColor *)sp; +- (void)deleteLinesFromRow:(int)row lineCount:(int)count + scrollBottom:(int)bottom left:(int)left right:(int)right + color:(NSColor *)color; +- (void)insertLinesAtRow:(int)row lineCount:(int)count + scrollBottom:(int)bottom left:(int)left right:(int)right + color:(NSColor *)color; +- (void)clearBlockFromRow:(int)row1 column:(int)col1 toRow:(int)row2 + column:(int)col2 color:(NSColor *)color; +- (void)clearAll; +@end + + +@implementation MMAtsuiTextView + +- (id)initWithFrame:(NSRect)frame +{ + if ((self = [super initWithFrame:frame])) { + // NOTE! It does not matter which font is set here, Vim will set its + // own font on startup anyway. Just set some bogus values. + font = [[NSFont userFixedPitchFontOfSize:0] retain]; + cellSize.width = cellSize.height = 1; + } + + return self; +} + +- (void)dealloc +{ + [font release]; font = nil; + [defaultBackgroundColor release]; defaultBackgroundColor = nil; + [defaultForegroundColor release]; defaultForegroundColor = nil; + + [super dealloc]; +} + +- (void)getMaxRows:(int*)rows columns:(int*)cols +{ + if (rows) *rows = maxRows; + if (cols) *cols = maxColumns; +} + +- (void)setMaxRows:(int)rows columns:(int)cols +{ + // NOTE: Just remember the new values, the actual resizing is done lazily. + maxRows = rows; + maxColumns = cols; +} + +- (void)setDefaultColorsBackground:(NSColor *)bgColor + foreground:(NSColor *)fgColor +{ + if (defaultBackgroundColor != bgColor) { + [defaultBackgroundColor release]; + defaultBackgroundColor = bgColor ? [bgColor retain] : nil; + } + + // NOTE: The default foreground color isn't actually used for anything, but + // other class instances might want to be able to access it so it is stored + // here. + if (defaultForegroundColor != fgColor) { + [defaultForegroundColor release]; + defaultForegroundColor = fgColor ? [fgColor retain] : nil; + } +} + +- (NSSize)size +{ + return NSMakeSize(maxColumns*cellSize.width, maxRows*cellSize.height); +} + +- (NSSize)fitToSize:(NSSize)size rows:(int *)rows columns:(int *)columns +{ + NSSize curSize = [self size]; + NSSize fitSize = curSize; + int fitRows = maxRows; + int fitCols = maxColumns; + + if (size.height < curSize.height) { + // Remove lines until the height of the text storage fits inside + // 'size'. However, always make sure there are at least 3 lines in the + // text storage. (Why 3? It seem Vim never allows less than 3 lines.) + // + // TODO: No need to search since line height is fixed, just calculate + // the new height. + int rowCount = maxRows; + int rowsToRemove; + for (rowsToRemove = 0; rowsToRemove < maxRows-3; ++rowsToRemove) { + float height = cellSize.height*rowCount; + + if (height <= size.height) { + fitSize.height = height; + break; + } + + --rowCount; + } + + fitRows -= rowsToRemove; + } else if (size.height > curSize.height) { + float fh = cellSize.height; + if (fh < 1.0f) fh = 1.0f; + + fitRows = floor(size.height/fh); + fitSize.height = fh*fitRows; + } + + if (size.width != curSize.width) { + float fw = cellSize.width; + if (fw < 1.0f) fw = 1.0f; + + fitCols = floor(size.width/fw); + fitSize.width = fw*fitCols; + } + + if (rows) *rows = fitRows; + if (columns) *columns = fitCols; + + return fitSize; +} + +- (NSRect)rectForRowsInRange:(NSRange)range +{ + NSRect rect = { 0, 0, 0, 0 }; + unsigned start = range.location > maxRows ? maxRows : range.location; + unsigned length = range.length; + + if (start+length > maxRows) + length = maxRows - start; + + rect.origin.y = cellSize.height * start; + rect.size.height = cellSize.height * length; + + return rect; +} + +- (NSRect)rectForColumnsInRange:(NSRange)range +{ + NSRect rect = { 0, 0, 0, 0 }; + unsigned start = range.location > maxColumns ? maxColumns : range.location; + unsigned length = range.length; + + if (start+length > maxColumns) + length = maxColumns - start; + + rect.origin.x = cellSize.width * start; + rect.size.width = cellSize.width * length; + + return rect; +} + + +- (void)setFont:(NSFont *)newFont +{ + if (newFont && font != newFont) { + [font release]; + font = [newFont retain]; + + float em = [newFont widthOfString:@"m"]; + float cellWidthMultiplier = [[NSUserDefaults standardUserDefaults] + floatForKey:MMCellWidthMultiplierKey]; + + // NOTE! Even though NSFontFixedAdvanceAttribute is a float, it will + // only render at integer sizes. Hence, we restrict the cell width to + // an integer here, otherwise the window width and the actual text + // width will not match. + cellSize.width = ceilf(em * cellWidthMultiplier); + cellSize.height = linespace + [newFont defaultLineHeightForFont]; + } +} + +- (void)setWideFont:(NSFont *)newFont +{ +} + +- (NSFont *)font +{ + return font; +} + +- (NSSize)cellSize +{ + return cellSize; +} + +- (void)setLinespace:(float)newLinespace +{ + linespace = newLinespace; + + // NOTE: The linespace is added to the cell height in order for a multiline + // selection not to have white (background color) gaps between lines. Also + // this simplifies the code a lot because there is no need to check the + // linespace when calculating the size of the text view etc. When the + // linespace is non-zero the baseline will be adjusted as well; check + // MMTypesetter. + cellSize.height = linespace + [font defaultLineHeightForFont]; +} + + + + +- (NSEvent *)lastMouseDownEvent +{ + return nil; +} + +- (void)setShouldDrawInsertionPoint:(BOOL)on +{ +} + +- (void)setPreEditRow:(int)row column:(int)col +{ +} + +- (void)drawInsertionPointAtRow:(int)row column:(int)col shape:(int)shape + fraction:(int)percent color:(NSColor *)color +{ +} + +- (void)hideMarkedTextField +{ +} + + + + +- (void)keyDown:(NSEvent *)event +{ + //NSLog(@"%s %@", _cmd, event); + // HACK! If control modifier is held, don't pass the event along to + // interpretKeyEvents: since some keys are bound to multiple commands which + // means doCommandBySelector: is called several times. + // + // TODO: Figure out a way to disable Cocoa key bindings entirely, without + // affecting input management. + if ([event modifierFlags] & NSControlKeyMask) { + NSString *unmod = [event charactersIgnoringModifiers]; + if ([unmod length] == 1 && [unmod characterAtIndex:0] <= 0x7f + && [unmod characterAtIndex:0] >= 0x60) { + // HACK! Send Ctrl-letter keys (and C-@, C-[, C-\, C-], C-^, C-_) + // as normal text to be added to the Vim input buffer. This must + // be done in order for the backend to be able to separate e.g. + // Ctrl-i and Ctrl-tab. + [self insertText:[event characters]]; + } else { + [self dispatchKeyEvent:event]; + } + } else { + [super keyDown:event]; + } +} + +- (void)insertText:(id)string +{ + //NSLog(@"%s %@", _cmd, string); + // NOTE! This method is called for normal key presses but also for + // Option-key presses --- even when Ctrl is held as well as Option. When + // Ctrl is held, the AppKit translates the character to a Ctrl+key stroke, + // so 'string' need not be a printable character! In this case it still + // works to pass 'string' on to Vim as a printable character (since + // modifiers are already included and should not be added to the input + // buffer using CSI, K_MODIFIER). + + [self hideMarkedTextField]; + + NSEvent *event = [NSApp currentEvent]; + + // HACK! In order to be able to bind to , , etc. we have + // to watch for them here. + if ([event type] == NSKeyDown + && [[event charactersIgnoringModifiers] length] > 0 + && [event modifierFlags] + & (NSShiftKeyMask|NSControlKeyMask|NSAlternateKeyMask)) { + unichar c = [[event charactersIgnoringModifiers] characterAtIndex:0]; + + // translates to 0x19 + if (' ' == c || 0x19 == c) { + [self dispatchKeyEvent:event]; + return; + } + } + + // TODO: Support 'mousehide' (check p_mh) + [NSCursor setHiddenUntilMouseMoves:YES]; + + // NOTE: 'string' is either an NSString or an NSAttributedString. Since we + // do not support attributes, simply pass the corresponding NSString in the + // latter case. + if ([string isKindOfClass:[NSAttributedString class]]) + string = [string string]; + + //NSLog(@"send InsertTextMsgID: %@", string); + + [[self vimController] sendMessage:InsertTextMsgID + data:[string dataUsingEncoding:NSUTF8StringEncoding]]; +} + +- (void)doCommandBySelector:(SEL)selector +{ + //NSLog(@"%s %@", _cmd, NSStringFromSelector(selector)); + // By ignoring the selector we effectively disable the key binding + // mechanism of Cocoa. Hopefully this is what the user will expect + // (pressing Ctrl+P would otherwise result in moveUp: instead of previous + // match, etc.). + // + // We usually end up here if the user pressed Ctrl+key (but not + // Ctrl+Option+key). + + NSEvent *event = [NSApp currentEvent]; + + if (selector == @selector(cancelOperation:) + || selector == @selector(insertNewline:)) { + // HACK! If there was marked text which got abandoned as a result of + // hitting escape or enter, then 'insertText:' is called with the + // abandoned text but '[event characters]' includes the abandoned text + // as well. Since 'dispatchKeyEvent:' looks at '[event characters]' we + // must intercept these keys here or the abandonded text gets inserted + // twice. + NSString *key = [event charactersIgnoringModifiers]; + const char *chars = [key UTF8String]; + int len = [key lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; + + if (0x3 == chars[0]) { + // HACK! AppKit turns enter (not return) into Ctrl-C, so we need to + // handle it separately (else Ctrl-C doesn't work). + len = sizeof(MMKeypadEnter)/sizeof(MMKeypadEnter[0]); + chars = MMKeypadEnter; + } + + [self sendKeyDown:chars length:len modifiers:[event modifierFlags]]; + } else { + [self dispatchKeyEvent:event]; + } +} + +- (BOOL)performKeyEquivalent:(NSEvent *)event +{ + //NSLog(@"%s %@", _cmd, event); + // Called for Cmd+key keystrokes, function keys, arrow keys, page + // up/down, home, end. + // + // NOTE: This message cannot be ignored since Cmd+letter keys never are + // passed to keyDown:. It seems as if the main menu consumes Cmd-key + // strokes, unless the key is a function key. + + // NOTE: If the event that triggered this method represents a function key + // down then we do nothing, otherwise the input method never gets the key + // stroke (some input methods use e.g. arrow keys). The function key down + // event will still reach Vim though (via keyDown:). The exceptions to + // this rule are: PageUp/PageDown (keycode 116/121). + int flags = [event modifierFlags]; + if ([event type] != NSKeyDown || flags & NSFunctionKeyMask + && !(116 == [event keyCode] || 121 == [event keyCode])) + return NO; + + // HACK! Let the main menu try to handle any key down event, before + // passing it on to vim, otherwise key equivalents for menus will + // effectively be disabled. + if ([[NSApp mainMenu] performKeyEquivalent:event]) + return YES; + + // HACK! KeyCode 50 represent the key which switches between windows + // within an application (like Cmd+Tab is used to switch between + // applications). Return NO here, else the window switching does not work. + // + // Will this hack work for all languages / keyboard layouts? + if ([event keyCode] == 50) + return NO; + + // HACK! On Leopard Ctrl-key events end up here instead of keyDown:. + if (flags & NSControlKeyMask) { + [self keyDown:event]; + return YES; + } + + //NSLog(@"%s%@", _cmd, event); + + NSString *chars = [event characters]; + NSString *unmodchars = [event charactersIgnoringModifiers]; + int len = [unmodchars lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; + NSMutableData *data = [NSMutableData data]; + + if (len <= 0) + return NO; + + // If 'chars' and 'unmodchars' differs when shift flag is present, then we + // can clear the shift flag as it is already included in 'unmodchars'. + // Failing to clear the shift flag means turns into (on + // an English keyboard). + if (flags & NSShiftKeyMask && ![chars isEqual:unmodchars]) + flags &= ~NSShiftKeyMask; + + if (0x3 == [unmodchars characterAtIndex:0]) { + // HACK! AppKit turns enter (not return) into Ctrl-C, so we need to + // handle it separately (else Cmd-enter turns into Ctrl-C). + unmodchars = MMKeypadEnterString; + len = [unmodchars lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; + } + + [data appendBytes:&flags length:sizeof(int)]; + [data appendBytes:&len length:sizeof(int)]; + [data appendBytes:[unmodchars UTF8String] length:len]; + + [[self vimController] sendMessage:CmdKeyMsgID data:data]; + + return YES; +} + +- (NSPoint)textContainerOrigin +{ + return NSZeroPoint; +} + +- (void)setTextContainerInset:(NSSize)inset +{ +} + +- (void)setBackgroundColor:(NSColor *)color +{ +} + + + + +- (BOOL)acceptsFirstResponder +{ + return YES; +} + +- (BOOL)isFlipped +{ + return YES; +} + +- (void)drawRect:(NSRect)rect +{ + NSColor *color = defaultBackgroundColor ? defaultBackgroundColor + : [NSColor lightGrayColor]; + [color set]; + [NSBezierPath fillRect:rect]; +} + + + + +#define MM_DEBUG_DRAWING 0 + +- (void)performBatchDrawWithData:(NSData *)data +{ + const void *bytes = [data bytes]; + const void *end = bytes + [data length]; + +#if MM_DEBUG_DRAWING + NSLog(@"====> BEGIN %s", _cmd); +#endif + [self beginDrawing]; + + // TODO: Sanity check input + + while (bytes < end) { + int type = *((int*)bytes); bytes += sizeof(int); + + if (ClearAllDrawType == type) { +#if MM_DEBUG_DRAWING + NSLog(@" Clear all"); +#endif + [self clearAll]; + } else if (ClearBlockDrawType == type) { + unsigned color = *((unsigned*)bytes); bytes += sizeof(unsigned); + int row1 = *((int*)bytes); bytes += sizeof(int); + int col1 = *((int*)bytes); bytes += sizeof(int); + int row2 = *((int*)bytes); bytes += sizeof(int); + int col2 = *((int*)bytes); bytes += sizeof(int); + +#if MM_DEBUG_DRAWING + NSLog(@" Clear block (%d,%d) -> (%d,%d)", row1, col1, + row2,col2); +#endif + [self clearBlockFromRow:row1 column:col1 + toRow:row2 column:col2 + color:[NSColor colorWithArgbInt:color]]; + } else if (DeleteLinesDrawType == type) { + unsigned color = *((unsigned*)bytes); bytes += sizeof(unsigned); + int row = *((int*)bytes); bytes += sizeof(int); + int count = *((int*)bytes); bytes += sizeof(int); + int bot = *((int*)bytes); bytes += sizeof(int); + int left = *((int*)bytes); bytes += sizeof(int); + int right = *((int*)bytes); bytes += sizeof(int); + +#if MM_DEBUG_DRAWING + NSLog(@" Delete %d line(s) from %d", count, row); +#endif + [self deleteLinesFromRow:row lineCount:count + scrollBottom:bot left:left right:right + color:[NSColor colorWithArgbInt:color]]; + } else if (DrawStringDrawType == type) { + int bg = *((int*)bytes); bytes += sizeof(int); + int fg = *((int*)bytes); bytes += sizeof(int); + int sp = *((int*)bytes); bytes += sizeof(int); + int row = *((int*)bytes); bytes += sizeof(int); + int col = *((int*)bytes); bytes += sizeof(int); + int cells = *((int*)bytes); bytes += sizeof(int); + int flags = *((int*)bytes); bytes += sizeof(int); + int len = *((int*)bytes); bytes += sizeof(int); + UniChar *string = (UniChar*)bytes; bytes += len; + +#if MM_DEBUG_DRAWING + NSLog(@" Draw string at (%d,%d) length=%d flags=%d fg=0x%x " + "bg=0x%x sp=0x%x", row, col, len, flags, fg, bg, sp); +#endif + [self drawString:string length:len atRow:row column:col + cells:cells withFlags:flags + foregroundColor:[NSColor colorWithRgbInt:fg] + backgroundColor:[NSColor colorWithArgbInt:bg] + specialColor:[NSColor colorWithRgbInt:sp]]; + } else if (InsertLinesDrawType == type) { + unsigned color = *((unsigned*)bytes); bytes += sizeof(unsigned); + int row = *((int*)bytes); bytes += sizeof(int); + int count = *((int*)bytes); bytes += sizeof(int); + int bot = *((int*)bytes); bytes += sizeof(int); + int left = *((int*)bytes); bytes += sizeof(int); + int right = *((int*)bytes); bytes += sizeof(int); + +#if MM_DEBUG_DRAWING + NSLog(@" Insert %d line(s) at row %d", count, row); +#endif + [self insertLinesAtRow:row lineCount:count + scrollBottom:bot left:left right:right + color:[NSColor colorWithArgbInt:color]]; + } else if (DrawCursorDrawType == type) { + unsigned color = *((unsigned*)bytes); bytes += sizeof(unsigned); + int row = *((int*)bytes); bytes += sizeof(int); + int col = *((int*)bytes); bytes += sizeof(int); + int shape = *((int*)bytes); bytes += sizeof(int); + int percent = *((int*)bytes); bytes += sizeof(int); + +#if MM_DEBUG_DRAWING + NSLog(@" Draw cursor at (%d,%d)", row, col); +#endif + [self drawInsertionPointAtRow:row column:col shape:shape + fraction:percent + color:[NSColor colorWithRgbInt:color]]; + } else { + NSLog(@"WARNING: Unknown draw type (type=%d)", type); + } + } + + [self endDrawing]; + + // NOTE: During resizing, Cocoa only sends draw messages before Vim's rows + // and columns are changed (due to ipc delays). Force a redraw here. + [self displayIfNeeded]; + +#if MM_DEBUG_DRAWING + NSLog(@"<==== END %s", _cmd); +#endif +} + +@end // MMAtsuiTextView + + + + +@implementation MMAtsuiTextView (Private) + +- (void)dispatchKeyEvent:(NSEvent *)event +{ + // Only handle the command if it came from a keyDown event + if ([event type] != NSKeyDown) + return; + + NSString *chars = [event characters]; + NSString *unmodchars = [event charactersIgnoringModifiers]; + unichar c = [chars characterAtIndex:0]; + unichar imc = [unmodchars characterAtIndex:0]; + int len = 0; + const char *bytes = 0; + int mods = [event modifierFlags]; + + //NSLog(@"%s chars[0]=0x%x unmodchars[0]=0x%x (chars=%@ unmodchars=%@)", + // _cmd, c, imc, chars, unmodchars); + + if (' ' == imc && 0xa0 != c) { + // HACK! The AppKit turns into which is not standard + // Vim behaviour, so bypass this problem. (0xa0 is , which + // should be passed on as is.) + len = [unmodchars lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; + bytes = [unmodchars UTF8String]; + } else if (imc == c && '2' == c) { + // HACK! Translate Ctrl+2 to . + static char ctrl_at = 0; + len = 1; bytes = &ctrl_at; + } else if (imc == c && '6' == c) { + // HACK! Translate Ctrl+6 to . + static char ctrl_hat = 0x1e; + len = 1; bytes = &ctrl_hat; + } else if (c == 0x19 && imc == 0x19) { + // HACK! AppKit turns back tab into Ctrl-Y, so we need to handle it + // separately (else Ctrl-Y doesn't work). + static char tab = 0x9; + len = 1; bytes = &tab; mods |= NSShiftKeyMask; + } else { + len = [chars lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; + bytes = [chars UTF8String]; + } + + [self sendKeyDown:bytes length:len modifiers:mods]; +} + +- (void)sendKeyDown:(const char *)chars length:(int)len modifiers:(int)flags +{ + if (chars && len > 0) { + NSMutableData *data = [NSMutableData data]; + + [data appendBytes:&flags length:sizeof(int)]; + [data appendBytes:&len length:sizeof(int)]; + [data appendBytes:chars length:len]; + + // TODO: Support 'mousehide' (check p_mh) + [NSCursor setHiddenUntilMouseMoves:YES]; + + //NSLog(@"%s len=%d chars=0x%x", _cmd, len, chars[0]); + [[self vimController] sendMessage:KeyDownMsgID data:data]; + } +} + +- (MMVimController *)vimController +{ + id windowController = [[self window] windowController]; + + // TODO: Make sure 'windowController' is a MMWindowController before type + // casting. + return [(MMWindowController*)windowController vimController]; +} + +@end // MMAtsuiTextView (Private) + + + + +@implementation MMAtsuiTextView (Drawing) + +- (void)beginDrawing +{ +} + +- (void)endDrawing +{ +} + +- (void)drawString:(UniChar *)string length:(UniCharCount)length + atRow:(int)row column:(int)col cells:(int)cells + withFlags:(int)flags foregroundColor:(NSColor *)fg + backgroundColor:(NSColor *)bg specialColor:(NSColor *)sp +{ + // 'string' consists of 'length' utf-16 code pairs and should cover 'cells' + // display cells (a normal character takes up one display cell, a wide + // character takes up two) +} + +- (void)deleteLinesFromRow:(int)row lineCount:(int)count + scrollBottom:(int)bottom left:(int)left right:(int)right + color:(NSColor *)color +{ +} + +- (void)insertLinesAtRow:(int)row lineCount:(int)count + scrollBottom:(int)bottom left:(int)left right:(int)right + color:(NSColor *)color +{ +} + +- (void)clearBlockFromRow:(int)row1 column:(int)col1 toRow:(int)row2 + column:(int)col2 color:(NSColor *)color +{ +} + +- (void)clearAll +{ +} + +@end // MMAtsuiTextView (Drawing) diff --git a/src/MacVim/MMVimController.m b/src/MacVim/MMVimController.m index 8f5a027c07..57ac6f45e0 100644 --- a/src/MacVim/MMVimController.m +++ b/src/MacVim/MMVimController.m @@ -28,6 +28,7 @@ #import "MMTextView.h" #import "MMAppController.h" #import "MMTextStorage.h" +#import "MMAtsuiTextView.h" // This is taken from gui.h @@ -89,14 +90,6 @@ - (void)resendTimerFired:(NSTimer *)timer; -// TODO: Move to separate file -@interface NSColor (MMProtocol) -+ (NSColor *)colorWithRgbInt:(unsigned)rgb; -+ (NSColor *)colorWithArgbInt:(unsigned)argb; -@end - - - @implementation MMVimController @@ -561,7 +554,11 @@ - (void)handleMessage:(int)msgid data:(NSData *)data if (OpenVimWindowMsgID == msgid) { [windowController openWindow]; } else if (BatchDrawMsgID == msgid) { - [self performBatchDrawWithData:data]; + if ([[NSUserDefaults standardUserDefaults] + boolForKey:MMAtsuiRendererKey]) + [[windowController textView] performBatchDrawWithData:data]; + else + [self performBatchDrawWithData:data]; } else if (SelectTabMsgID == msgid) { #if 0 // NOTE: Tab selection is done inside updateTabsWithData:. const void *bytes = [data bytes]; @@ -1376,31 +1373,6 @@ - (void)resendTimerFired:(NSTimer *)timer -@implementation NSColor (MMProtocol) - -+ (NSColor *)colorWithRgbInt:(unsigned)rgb -{ - float r = ((rgb>>16) & 0xff)/255.0f; - float g = ((rgb>>8) & 0xff)/255.0f; - float b = (rgb & 0xff)/255.0f; - - return [NSColor colorWithCalibratedRed:r green:g blue:b alpha:1.0f]; -} - -+ (NSColor *)colorWithArgbInt:(unsigned)argb -{ - float a = ((argb>>24) & 0xff)/255.0f; - float r = ((argb>>16) & 0xff)/255.0f; - float g = ((argb>>8) & 0xff)/255.0f; - float b = (argb & 0xff)/255.0f; - - return [NSColor colorWithCalibratedRed:r green:g blue:b alpha:a]; -} - -@end // NSColor (MMProtocol) - - - @implementation MMAlert - (void)dealloc { diff --git a/src/MacVim/MMVimView.m b/src/MacVim/MMVimView.m index ae8ff2450b..3a617dffdd 100644 --- a/src/MacVim/MMVimView.m +++ b/src/MacVim/MMVimView.m @@ -21,6 +21,7 @@ #import "MMTextStorage.h" #import "MMTypesetter.h" #import "MMVimController.h" +#import "MMAtsuiTextView.h" #import "MMWindowController.h" // needed by MMScroller. TODO: remove @@ -83,53 +84,64 @@ - (MMVimView *)initWithFrame:(NSRect)frame vimController = controller; scrollbars = [[NSMutableArray alloc] init]; - // Set up a complete text system. - textStorage = [[MMTextStorage alloc] init]; - NSLayoutManager *lm = [[NSLayoutManager alloc] init]; - NSTextContainer *tc = [[NSTextContainer alloc] initWithContainerSize: - NSMakeSize(1.0e7,1.0e7)]; - - NSString *typesetterString = [[NSUserDefaults standardUserDefaults] - stringForKey:MMTypesetterKey]; - if ([typesetterString isEqual:@"MMTypesetter"]) { - NSTypesetter *typesetter = [[MMTypesetter alloc] init]; - [lm setTypesetter:typesetter]; - [typesetter release]; - } else if ([typesetterString isEqual:@"MMTypesetter2"]) { - NSTypesetter *typesetter = [[MMTypesetter2 alloc] init]; - [lm setTypesetter:typesetter]; - [typesetter release]; + if ([[NSUserDefaults standardUserDefaults] boolForKey:MMAtsuiRendererKey]) { + // Use ATSUI for text rendering. + textView = [[MMAtsuiTextView alloc] initWithFrame:frame]; + + // HACK! The ATSUI text view has no text storage, but to avoid having + // to rewrite a lot of code we simply pretend like there still is a + // text storage. + textStorage = [textView retain]; } else { - // Only MMTypesetter supports different cell width multipliers. - [[NSUserDefaults standardUserDefaults] - setFloat:1.0 forKey:MMCellWidthMultiplierKey]; - } + // Set up a Cocoa text system. + textStorage = [[MMTextStorage alloc] init]; + NSLayoutManager *lm = [[NSLayoutManager alloc] init]; + NSTextContainer *tc = [[NSTextContainer alloc] initWithContainerSize: + NSMakeSize(1.0e7,1.0e7)]; + + NSString *typesetterString = [[NSUserDefaults standardUserDefaults] + stringForKey:MMTypesetterKey]; + if ([typesetterString isEqual:@"MMTypesetter"]) { + NSTypesetter *typesetter = [[MMTypesetter alloc] init]; + [lm setTypesetter:typesetter]; + [typesetter release]; + } else if ([typesetterString isEqual:@"MMTypesetter2"]) { + NSTypesetter *typesetter = [[MMTypesetter2 alloc] init]; + [lm setTypesetter:typesetter]; + [typesetter release]; + } else { + // Only MMTypesetter supports different cell width multipliers. + [[NSUserDefaults standardUserDefaults] + setFloat:1.0 forKey:MMCellWidthMultiplierKey]; + } - // The characters in the text storage are in display order, so disable - // bidirectional text processing (this call is 10.4 only). - [[lm typesetter] setBidiProcessingEnabled:NO]; + // The characters in the text storage are in display order, so disable + // bidirectional text processing (this call is 10.4 only). + [[lm typesetter] setBidiProcessingEnabled:NO]; - [tc setWidthTracksTextView:NO]; - [tc setHeightTracksTextView:NO]; - [tc setLineFragmentPadding:0]; + [tc setWidthTracksTextView:NO]; + [tc setHeightTracksTextView:NO]; + [tc setLineFragmentPadding:0]; - [textStorage addLayoutManager:lm]; - [lm addTextContainer:tc]; + [textStorage addLayoutManager:lm]; + [lm addTextContainer:tc]; - textView = [[MMTextView alloc] initWithFrame:frame - textContainer:tc]; + textView = [[MMTextView alloc] initWithFrame:frame + textContainer:tc]; + // The text storage retains the layout manager which in turn retains + // the text container. + [tc release]; + [lm release]; + } + + // Allow control of text view inset via MMTextInset* user defaults. NSUserDefaults *ud = [NSUserDefaults standardUserDefaults]; int left = [ud integerForKey:MMTextInsetLeftKey]; int top = [ud integerForKey:MMTextInsetTopKey]; [textView setTextContainerInset:NSMakeSize(left, top)]; [self addSubview:textView]; - - // The text storage retains the layout manager which in turn retains - // the text container. - [tc release]; - [lm release]; // Create the tab view (which is never visible, but the tab bar control // needs it to function). diff --git a/src/MacVim/MMWindowController.m b/src/MacVim/MMWindowController.m index 2812d7dfea..8071af9c01 100644 --- a/src/MacVim/MMWindowController.m +++ b/src/MacVim/MMWindowController.m @@ -24,6 +24,7 @@ #import "MMTypesetter.h" #import "MMFullscreenWindow.h" #import "MMVimView.h" +#import "MMAtsuiTextView.h" diff --git a/src/MacVim/MacVim.h b/src/MacVim/MacVim.h index f2d351ba1a..3b3b5e2490 100644 --- a/src/MacVim/MacVim.h +++ b/src/MacVim/MacVim.h @@ -215,6 +215,7 @@ extern NSString *MMTopLeftPointKey; extern NSString *MMOpenFilesInTabsKey; extern NSString *MMNoFontSubstitutionKey; extern NSString *MMLoginShellKey; +extern NSString *MMAtsuiRendererKey; @@ -240,6 +241,14 @@ ATSFontContainerRef loadFonts(); +@interface NSColor (MMExtras) ++ (NSColor *)colorWithRgbInt:(unsigned)rgb; ++ (NSColor *)colorWithArgbInt:(unsigned)argb; +@end + + + + // ODB Editor Suite Constants (taken from ODBEditorSuite.h) #define keyFileSender 'FSnd' #define keyFileSenderToken 'FTok' diff --git a/src/MacVim/MacVim.m b/src/MacVim/MacVim.m index 041ffee58d..36c1b3551a 100644 --- a/src/MacVim/MacVim.m +++ b/src/MacVim/MacVim.m @@ -96,6 +96,7 @@ NSString *MMOpenFilesInTabsKey = @"MMOpenFilesInTabs"; NSString *MMNoFontSubstitutionKey = @"MMNoFontSubstitution"; NSString *MMLoginShellKey = @"MMLoginShell"; +NSString *MMAtsuiRendererKey = @"MMAtsuiRenderer"; @@ -194,3 +195,30 @@ + (id)indexSetWithVimList:(NSString *)list } @end // NSIndexSet (MMExtras) + + + + +@implementation NSColor (MMExtras) + ++ (NSColor *)colorWithRgbInt:(unsigned)rgb +{ + float r = ((rgb>>16) & 0xff)/255.0f; + float g = ((rgb>>8) & 0xff)/255.0f; + float b = (rgb & 0xff)/255.0f; + + return [NSColor colorWithCalibratedRed:r green:g blue:b alpha:1.0f]; +} + ++ (NSColor *)colorWithArgbInt:(unsigned)argb +{ + float a = ((argb>>24) & 0xff)/255.0f; + float r = ((argb>>16) & 0xff)/255.0f; + float g = ((argb>>8) & 0xff)/255.0f; + float b = (argb & 0xff)/255.0f; + + return [NSColor colorWithCalibratedRed:r green:g blue:b alpha:a]; +} + +@end // NSColor (MMExtras) + diff --git a/src/MacVim/MacVim.xcodeproj/project.pbxproj b/src/MacVim/MacVim.xcodeproj/project.pbxproj index e134dd6927..da1640dd93 100644 --- a/src/MacVim/MacVim.xcodeproj/project.pbxproj +++ b/src/MacVim/MacVim.xcodeproj/project.pbxproj @@ -35,6 +35,8 @@ 1D80FBD40CBBD3B700102A1C /* MMFullscreenWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D80FBD00CBBD3B700102A1C /* MMFullscreenWindow.m */; }; 1D80FBD60CBBD3B700102A1C /* MMVimView.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D80FBD20CBBD3B700102A1C /* MMVimView.m */; }; 1D80FBE40CBBD6F200102A1C /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D80FBE30CBBD6F200102A1C /* Carbon.framework */; }; + 1D9918480D299F9900A96335 /* MMAtsuiTextView.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 1D9918460D299F9900A96335 /* MMAtsuiTextView.h */; }; + 1D9918490D299F9900A96335 /* MMAtsuiTextView.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D9918470D299F9900A96335 /* MMAtsuiTextView.m */; }; 1DD04DEC0C529C5E006CDC2B /* Credits.rtf in Resources */ = {isa = PBXBuildFile; fileRef = 1DD04DEB0C529C5E006CDC2B /* Credits.rtf */; }; 1DD0C20C0C60FFB4008CD84A /* gvimrc in CopyFiles */ = {isa = PBXBuildFile; fileRef = 1DD0C20A0C60FF9A008CD84A /* gvimrc */; }; 1DD66ECE0C803D3600EBDAB3 /* MMApplication.m in Sources */ = {isa = PBXBuildFile; fileRef = 1DD66ECC0C803D3600EBDAB3 /* MMApplication.m */; }; @@ -97,6 +99,7 @@ dstSubfolderSpec = 6; files = ( 1D493D580C5247BF00AB718C /* Vim in CopyFiles */, + 1D9918480D299F9900A96335 /* MMAtsuiTextView.h in CopyFiles */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -165,6 +168,8 @@ 1D80FBD10CBBD3B700102A1C /* MMVimView.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = MMVimView.h; sourceTree = ""; }; 1D80FBD20CBBD3B700102A1C /* MMVimView.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = MMVimView.m; sourceTree = ""; }; 1D80FBE30CBBD6F200102A1C /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = /Developer/SDKs/MacOSX10.4u.sdk/System/Library/Frameworks/Carbon.framework; sourceTree = ""; }; + 1D9918460D299F9900A96335 /* MMAtsuiTextView.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = MMAtsuiTextView.h; sourceTree = ""; }; + 1D9918470D299F9900A96335 /* MMAtsuiTextView.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = MMAtsuiTextView.m; sourceTree = ""; }; 1DD04DEB0C529C5E006CDC2B /* Credits.rtf */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; path = Credits.rtf; sourceTree = ""; }; 1DD0C20A0C60FF9A008CD84A /* gvimrc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = gvimrc; sourceTree = ""; }; 1DD66ECB0C803D3600EBDAB3 /* MMApplication.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = MMApplication.h; sourceTree = ""; }; @@ -222,6 +227,8 @@ 080E96DDFE201D6D7F000001 /* MacVim Source */ = { isa = PBXGroup; children = ( + 1D9918460D299F9900A96335 /* MMAtsuiTextView.h */, + 1D9918470D299F9900A96335 /* MMAtsuiTextView.m */, 1D80FBCF0CBBD3B700102A1C /* MMFullscreenWindow.h */, 1D80FBD00CBBD3B700102A1C /* MMFullscreenWindow.m */, 1D80FBD10CBBD3B700102A1C /* MMVimView.h */, @@ -518,6 +525,7 @@ 1DD66ECE0C803D3600EBDAB3 /* MMApplication.m in Sources */, 1D80FBD40CBBD3B700102A1C /* MMFullscreenWindow.m in Sources */, 1D80FBD60CBBD3B700102A1C /* MMVimView.m in Sources */, + 1D9918490D299F9900A96335 /* MMAtsuiTextView.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; From 41dfa1ceb3067f539b907f077a33332e539976fc Mon Sep 17 00:00:00 2001 From: Jjgod Jiang Date: Mon, 21 Jan 2008 21:54:58 +0100 Subject: [PATCH 0356/1156] Experimental ATSUI text rendering support The ATSUI renderer can be enabled by setting the user default MMAtsuiRenderer. At the moment only very basic text drawing is supported. --- src/MacVim/MMAtsuiTextView.h | 13 +- src/MacVim/MMAtsuiTextView.m | 208 ++++++++++++++++++-- src/MacVim/MMVimController.m | 2 +- src/MacVim/MacVim.xcodeproj/project.pbxproj | 2 + 4 files changed, 210 insertions(+), 15 deletions(-) diff --git a/src/MacVim/MMAtsuiTextView.h b/src/MacVim/MMAtsuiTextView.h index abae6d859d..a3bf52a5ed 100644 --- a/src/MacVim/MMAtsuiTextView.h +++ b/src/MacVim/MMAtsuiTextView.h @@ -13,7 +13,15 @@ enum { MMMaxCellsPerChar = 2 }; - +// TODO: What does DRAW_TRANSP flag do? If the background isn't drawn when +// this flag is set, then sometimes the character after the cursor becomes +// blank. Everything seems to work fine by just ignoring this flag. +#define DRAW_TRANSP 0x01 /* draw with transparant bg */ +#define DRAW_BOLD 0x02 /* draw bold text */ +#define DRAW_UNDERL 0x04 /* draw underline text */ +#define DRAW_UNDERC 0x08 /* draw undercurl text */ +#define DRAW_ITALIC 0x10 /* draw italic text */ +#define DRAW_CURSOR 0x20 @interface MMAtsuiTextView : NSView { // From MMTextStorage @@ -26,6 +34,9 @@ enum { MMMaxCellsPerChar = 2 }; float linespace; // From vim-cocoa + NSImage *contentImage; + NSSize imageSize; + ATSUStyle atsuStyles[MMMaxCellsPerChar]; } - (id)initWithFrame:(NSRect)frame; diff --git a/src/MacVim/MMAtsuiTextView.m b/src/MacVim/MMAtsuiTextView.m index c5e5d9d6d6..495d426522 100644 --- a/src/MacVim/MMAtsuiTextView.m +++ b/src/MacVim/MMAtsuiTextView.m @@ -18,20 +18,24 @@ #import "MMVimController.h" #import "MacVim.h" - - static char MMKeypadEnter[2] = { 'K', 'A' }; static NSString *MMKeypadEnterString = @"KA"; - +@interface NSFont (AppKitPrivate) +- (ATSUFontID) _atsFontID; +@end @interface MMAtsuiTextView (Private) +- (void)initAtsuStyles; +- (void)disposeAtsuStyles; +- (void)updateAtsuStyles; - (void)dispatchKeyEvent:(NSEvent *)event; - (void)sendKeyDown:(const char *)chars length:(int)len modifiers:(int)flags; - (MMVimController *)vimController; @end @interface MMAtsuiTextView (Drawing) +- (void)fitImageToSize; - (void)beginDrawing; - (void)endDrawing; - (void)drawString:(UniChar *)string length:(UniCharCount)length @@ -59,6 +63,10 @@ - (id)initWithFrame:(NSRect)frame // own font on startup anyway. Just set some bogus values. font = [[NSFont userFixedPitchFontOfSize:0] retain]; cellSize.width = cellSize.height = 1; + contentImage = nil; + imageSize = NSZeroSize; + + [self initAtsuStyles]; } return self; @@ -66,6 +74,7 @@ - (id)initWithFrame:(NSRect)frame - (void)dealloc { + [self disposeAtsuStyles]; [font release]; font = nil; [defaultBackgroundColor release]; defaultBackgroundColor = nil; [defaultForegroundColor release]; defaultForegroundColor = nil; @@ -205,6 +214,8 @@ - (void)setFont:(NSFont *)newFont // width will not match. cellSize.width = ceilf(em * cellWidthMultiplier); cellSize.height = linespace + [newFont defaultLineHeightForFont]; + + [self updateAtsuStyles]; } } @@ -468,18 +479,21 @@ - (BOOL)acceptsFirstResponder - (BOOL)isFlipped { - return YES; + return NO; } - (void)drawRect:(NSRect)rect { - NSColor *color = defaultBackgroundColor ? defaultBackgroundColor - : [NSColor lightGrayColor]; - [color set]; - [NSBezierPath fillRect:rect]; + [contentImage drawInRect: rect + fromRect: rect + operation: NSCompositeCopy + fraction: 1.0]; } - +- (BOOL) wantsDefaultClipping +{ + return NO; +} #define MM_DEBUG_DRAWING 0 @@ -489,6 +503,9 @@ - (void)performBatchDrawWithData:(NSData *)data const void *bytes = [data bytes]; const void *end = bytes + [data length]; + if (! NSEqualSizes(imageSize, [self size])) + [self fitImageToSize]; + #if MM_DEBUG_DRAWING NSLog(@"====> BEGIN %s", _cmd); #endif @@ -541,17 +558,26 @@ - (void)performBatchDrawWithData:(NSData *)data int cells = *((int*)bytes); bytes += sizeof(int); int flags = *((int*)bytes); bytes += sizeof(int); int len = *((int*)bytes); bytes += sizeof(int); - UniChar *string = (UniChar*)bytes; bytes += len; - + // UniChar *string = (UniChar*)bytes; bytes += len; + NSString *string = [[NSString alloc] initWithBytesNoCopy:(void*)bytes + length:len + encoding:NSUTF8StringEncoding + freeWhenDone:NO]; + bytes += len; #if MM_DEBUG_DRAWING NSLog(@" Draw string at (%d,%d) length=%d flags=%d fg=0x%x " "bg=0x%x sp=0x%x", row, col, len, flags, fg, bg, sp); #endif - [self drawString:string length:len atRow:row column:col + unichar *characters = malloc(sizeof(unichar) * [string length]); + [string getCharacters:characters]; + + [self drawString:characters length:[string length] atRow:row column:col cells:cells withFlags:flags foregroundColor:[NSColor colorWithRgbInt:fg] backgroundColor:[NSColor colorWithArgbInt:bg] specialColor:[NSColor colorWithRgbInt:sp]]; + free(characters); + [string release]; } else if (InsertLinesDrawType == type) { unsigned color = *((unsigned*)bytes); bytes += sizeof(unsigned); int row = *((int*)bytes); bytes += sizeof(int); @@ -588,7 +614,8 @@ - (void)performBatchDrawWithData:(NSData *)data // NOTE: During resizing, Cocoa only sends draw messages before Vim's rows // and columns are changed (due to ipc delays). Force a redraw here. - [self displayIfNeeded]; + [self setNeedsDisplay:YES]; + // [self displayIfNeeded]; #if MM_DEBUG_DRAWING NSLog(@"<==== END %s", _cmd); @@ -602,6 +629,71 @@ - (void)performBatchDrawWithData:(NSData *)data @implementation MMAtsuiTextView (Private) +- (void)initAtsuStyles +{ + int i; + for (i = 0; i < MMMaxCellsPerChar; i++) + ATSUCreateStyle(&atsuStyles[i]); +} + +- (void)disposeAtsuStyles +{ + int i; + + for (i = 0; i < MMMaxCellsPerChar; i++) + if (atsuStyles[i] != NULL) + { + if (ATSUDisposeStyle(atsuStyles[i]) != noErr) + atsuStyles[i] = NULL; + } +} + +- (void)updateAtsuStyles +{ + ATSUFontID fontID; + Fixed fontSize; + Fixed fontWidth; + int i; + CGAffineTransform transform = CGAffineTransformMakeScale(1, -1); + ATSStyleRenderingOptions options; + + fontID = [font _atsFontID]; + fontSize = Long2Fix([font pointSize]); + options = kATSStyleApplyAntiAliasing; + + ATSUAttributeTag attribTags[] = + { + kATSUFontTag, kATSUSizeTag, kATSUImposeWidthTag, + kATSUFontMatrixTag, kATSUStyleRenderingOptionsTag, + kATSUMaxATSUITagValue + 1 + }; + + ByteCount attribSizes[] = + { + sizeof(ATSUFontID), sizeof(Fixed), sizeof(fontWidth), + sizeof(CGAffineTransform), sizeof(ATSStyleRenderingOptions), + sizeof(font) + }; + + ATSUAttributeValuePtr attribValues[] = + { + &fontID, &fontSize, &fontWidth, &transform, &options, &font + }; + + for (i = 0; i < MMMaxCellsPerChar; i++) + { + fontWidth = Long2Fix(cellSize.width * (i + 1)); + + if (ATSUSetAttributes(atsuStyles[i], + (sizeof attribTags) / sizeof(ATSUAttributeTag), + attribTags, attribSizes, attribValues) != noErr) + { + ATSUDisposeStyle(atsuStyles[i]); + atsuStyles[i] = NULL; + } + } +} + - (void)dispatchKeyEvent:(NSEvent *)event { // Only handle the command if it came from a keyDown event @@ -679,12 +771,31 @@ - (MMVimController *)vimController @implementation MMAtsuiTextView (Drawing) +- (NSRect)rectFromRow:(int)row1 column:(int)col1 + toRow:(int)row2 column:(int)col2 +{ + return NSMakeRect(col1 * cellSize.width, row1 * cellSize.height, + (col2 + 1 - col1) * cellSize.width, + (row2 + 1 - row1) * cellSize.height); +} + - (void)beginDrawing { + [contentImage lockFocus]; } - (void)endDrawing { + [contentImage unlockFocus]; +} + +- (void)fitImageToSize +{ + NSLog(@"fitImageToSize"); + [contentImage release]; + contentImage = [[NSImage alloc] initWithSize:[self size]]; + [contentImage setFlipped: YES]; + imageSize = [self size]; } - (void)drawString:(UniChar *)string length:(UniCharCount)length @@ -695,27 +806,98 @@ - (void)drawString:(UniChar *)string length:(UniCharCount)length // 'string' consists of 'length' utf-16 code pairs and should cover 'cells' // display cells (a normal character takes up one display cell, a wide // character takes up two) + ATSUStyle style = atsuStyles[0]; + ATSUTextLayout layout; + + // NSLog(@"drawString: %d", length); + + ATSUCreateTextLayout(&layout); + ATSUSetTextPointerLocation(layout, string, + kATSUFromTextBeginning, kATSUToTextEnd, + length); + ATSUSetRunStyle(layout, style, kATSUFromTextBeginning, kATSUToTextEnd); + + NSRect rect = NSMakeRect(col * cellSize.width, row * cellSize.height, + length * cellSize.width, cellSize.height); + CGContextRef context = [[NSGraphicsContext currentContext] graphicsPort]; + + ATSUAttributeTag tags[] = { kATSUCGContextTag }; + ByteCount sizes[] = { sizeof(CGContextRef) }; + ATSUAttributeValuePtr values[] = { &context }; + ATSUSetLayoutControls(layout, 1, tags, sizes, values); + + if (! (flags & DRAW_TRANSP)) + { + [bg set]; + NSRectFill(rect); + } + + [fg set]; + + ATSUSetTransientFontMatching(layout, TRUE); + ATSUDrawText(layout, + kATSUFromTextBeginning, + kATSUToTextEnd, + X2Fix(rect.origin.x), + X2Fix(rect.origin.y + [font ascender])); + ATSUDisposeTextLayout(layout); +} + +- (void)scrollRect:(NSRect)rect lineCount:(int)count +{ + NSPoint destPoint = rect.origin; + destPoint.y += count * cellSize.height; + + NSCopyBits(0, rect, destPoint); } - (void)deleteLinesFromRow:(int)row lineCount:(int)count scrollBottom:(int)bottom left:(int)left right:(int)right color:(NSColor *)color { + NSRect rect = [self rectFromRow:row + count + column:left + toRow:bottom + column:right]; + [color set]; + // move rect up for count lines + [self scrollRect:rect lineCount:-count]; + [self clearBlockFromRow:bottom - count + 1 + column:left + toRow:bottom + column:right + color:color]; } - (void)insertLinesAtRow:(int)row lineCount:(int)count scrollBottom:(int)bottom left:(int)left right:(int)right color:(NSColor *)color { + NSRect rect = [self rectFromRow:row + column:left + toRow:bottom - count + column:right]; + [color set]; + // move rect down for count lines + [self scrollRect:rect lineCount:count]; + [self clearBlockFromRow:row + column:left + toRow:row + count - 1 + column:right + color:color]; } - (void)clearBlockFromRow:(int)row1 column:(int)col1 toRow:(int)row2 column:(int)col2 color:(NSColor *)color { + [color set]; + NSRectFill([self rectFromRow:row1 column:col1 toRow:row2 column:col2]); } - (void)clearAll { + [defaultBackgroundColor set]; + NSRectFill(NSMakeRect(0, 0, imageSize.width, imageSize.height)); } @end // MMAtsuiTextView (Drawing) diff --git a/src/MacVim/MMVimController.m b/src/MacVim/MMVimController.m index 57ac6f45e0..4a036cbdb4 100644 --- a/src/MacVim/MMVimController.m +++ b/src/MacVim/MMVimController.m @@ -556,7 +556,7 @@ - (void)handleMessage:(int)msgid data:(NSData *)data } else if (BatchDrawMsgID == msgid) { if ([[NSUserDefaults standardUserDefaults] boolForKey:MMAtsuiRendererKey]) - [[windowController textView] performBatchDrawWithData:data]; + [(MMAtsuiTextView *)[windowController textView] performBatchDrawWithData:data]; else [self performBatchDrawWithData:data]; } else if (SelectTabMsgID == msgid) { diff --git a/src/MacVim/MacVim.xcodeproj/project.pbxproj b/src/MacVim/MacVim.xcodeproj/project.pbxproj index da1640dd93..211e55a960 100644 --- a/src/MacVim/MacVim.xcodeproj/project.pbxproj +++ b/src/MacVim/MacVim.xcodeproj/project.pbxproj @@ -430,6 +430,7 @@ 29B97313FDCFA39411CA2CEA /* Project object */ = { isa = PBXProject; buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "MacVim" */; + compatibilityVersion = "Xcode 2.4"; hasScannedForEncodings = 1; mainGroup = 29B97314FDCFA39411CA2CEA /* MacVim */; projectDirPath = ""; @@ -439,6 +440,7 @@ ProjectRef = 1D493DB30C52533B00AB718C /* PSMTabBarControl.xcodeproj */; }, ); + projectRoot = ""; targets = ( 8D1107260486CEB800E47090 /* MacVim */, ); From a162472912c7e30f782051389452ee07f8c6d78b Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Mon, 21 Jan 2008 22:10:04 +0100 Subject: [PATCH 0357/1156] Window and view refactoring Window and view code was refactored to better accomodate the transition to the ATSUI text rendering code. View specific code has been completely moved into MMVimView and window code is now all in MMWindowController; the window controller is also 'full-screen aware'. Finally, the text storage is no longer referenced outside MMTextView -- the idea is that the text view is the public class for handling the work that MMTextStorage used to be the public interface for. This refactoring also brings some improvements: - window resizing is more responsive - full-screen window memory leak fixed - proper fix for erroneous 'buffer modified' warning - full-screen no longer tried to set 'nil-title' (this caused backend connection problems) - changing lines/columns in full-screen works properly - open dialog now works in full-screen on Tiger --- src/MacVim/MMAppController.m | 90 +-- src/MacVim/MMAtsuiTextView.h | 20 +- src/MacVim/MMAtsuiTextView.m | 274 +++++--- src/MacVim/MMBackend.m | 20 +- src/MacVim/MMFullscreenWindow.h | 1 + src/MacVim/MMFullscreenWindow.m | 136 +--- src/MacVim/MMTextStorage.m | 2 + src/MacVim/MMTextView.h | 22 + src/MacVim/MMTextView.m | 324 +++++++++- src/MacVim/MMVimController.m | 193 +----- src/MacVim/MMVimView.h | 31 +- src/MacVim/MMVimView.m | 602 ++++++++--------- src/MacVim/MMWindow.h | 32 + src/MacVim/MMWindow.m | 120 ++++ src/MacVim/MMWindowController.h | 20 +- src/MacVim/MMWindowController.m | 678 +++++++++----------- src/MacVim/MacVim.h | 1 + src/MacVim/MacVim.m | 1 + src/MacVim/MacVim.xcodeproj/project.pbxproj | 8 + src/MacVim/gui_macvim.m | 5 +- 20 files changed, 1437 insertions(+), 1143 deletions(-) create mode 100644 src/MacVim/MMWindow.h create mode 100644 src/MacVim/MMWindow.m diff --git a/src/MacVim/MMAppController.m b/src/MacVim/MMAppController.m index 210f3adfed..6f60debb3a 100644 --- a/src/MacVim/MMAppController.m +++ b/src/MacVim/MMAppController.m @@ -488,55 +488,67 @@ - (IBAction)fontSizeDown:(id)sender connectBackend:(byref in id )backend pid:(int)pid { + MMVimController *vc = nil; //NSLog(@"Connect backend (pid=%d)", pid); - [(NSDistantObject*)backend - setProtocolForProxy:@protocol(MMBackendProtocol)]; + @try { + [(NSDistantObject*)backend + setProtocolForProxy:@protocol(MMBackendProtocol)]; - MMVimController *vc = [[[MMVimController alloc] - initWithBackend:backend pid:pid] autorelease]; + vc = [[[MMVimController alloc] + initWithBackend:backend pid:pid] autorelease]; - if (![vimControllers count]) { - // The first window autosaves its position. (The autosaving features - // of Cocoa are not used because we need more control over what is - // autosaved and when it is restored.) - [[vc windowController] setWindowAutosaveKey:MMTopLeftPointKey]; - } - - [vimControllers addObject:vc]; - - // HACK! MacVim does not get activated if it is launched from the - // terminal, so we forcibly activate here unless it is an untitled window - // opening (i.e. MacVim was opened from the Finder). Untitled windows are - // treated differently, else MacVim would steal the focus if another app - // was activated while the untitled window was loading. - if (!untitledWindowOpening) - [NSApp activateIgnoringOtherApps:YES]; - - untitledWindowOpening = NO; - - // Arguments to a new Vim process that cannot be passed on the command line - // are stored in a dictionary and passed to the Vim process here. - NSNumber *key = [NSNumber numberWithInt:pid]; - NSDictionary *args = [pidArguments objectForKey:key]; - if (args) { - if ([args objectForKey:@"remoteID"]) { - [vc odbEdit:[args objectForKey:@"filenames"] - server:[[args objectForKey:@"remoteID"] unsignedIntValue] - path:[args objectForKey:@"remotePath"] - token:[args objectForKey:@"remoteToken"]]; + if (![vimControllers count]) { + // The first window autosaves its position. (The autosaving + // features of Cocoa are not used because we need more control over + // what is autosaved and when it is restored.) + [[vc windowController] setWindowAutosaveKey:MMTopLeftPointKey]; } - if ([args objectForKey:@"selectionRangeData"]) { - MMSelectionRange *selRange = (MMSelectionRange*) - [[args objectForKey:@"selectionRangeData"] bytes]; - [vc addVimInput:[self inputStringFromSelectionRange:selRange]]; + [vimControllers addObject:vc]; + + // HACK! MacVim does not get activated if it is launched from the + // terminal, so we forcibly activate here unless it is an untitled + // window opening (i.e. MacVim was opened from the Finder). Untitled + // windows are treated differently, else MacVim would steal the focus + // if another app was activated while the untitled window was loading. + if (!untitledWindowOpening) + [NSApp activateIgnoringOtherApps:YES]; + + untitledWindowOpening = NO; + + // Arguments to a new Vim process that cannot be passed on the command + // line are stored in a dictionary and passed to the Vim process here. + NSNumber *key = [NSNumber numberWithInt:pid]; + NSDictionary *args = [pidArguments objectForKey:key]; + if (args) { + if ([args objectForKey:@"remoteID"]) { + [vc odbEdit:[args objectForKey:@"filenames"] + server:[[args objectForKey:@"remoteID"] unsignedIntValue] + path:[args objectForKey:@"remotePath"] + token:[args objectForKey:@"remoteToken"]]; + } + + if ([args objectForKey:@"selectionRangeData"]) { + MMSelectionRange *selRange = (MMSelectionRange*) + [[args objectForKey:@"selectionRangeData"] bytes]; + [vc addVimInput:[self inputStringFromSelectionRange:selRange]]; + } + + [pidArguments removeObjectForKey:key]; } - [pidArguments removeObjectForKey:key]; + return vc; } - return vc; + @catch (NSException *e) { + NSLog(@"Exception caught in %s: \"%@\"", _cmd, e); + + if (vc) + [vimControllers removeObject:vc]; + } + + return nil; } - (NSArray *)serverList diff --git a/src/MacVim/MMAtsuiTextView.h b/src/MacVim/MMAtsuiTextView.h index a3bf52a5ed..9f7e88dc1a 100644 --- a/src/MacVim/MMAtsuiTextView.h +++ b/src/MacVim/MMAtsuiTextView.h @@ -13,20 +13,10 @@ enum { MMMaxCellsPerChar = 2 }; -// TODO: What does DRAW_TRANSP flag do? If the background isn't drawn when -// this flag is set, then sometimes the character after the cursor becomes -// blank. Everything seems to work fine by just ignoring this flag. -#define DRAW_TRANSP 0x01 /* draw with transparant bg */ -#define DRAW_BOLD 0x02 /* draw bold text */ -#define DRAW_UNDERL 0x04 /* draw underline text */ -#define DRAW_UNDERC 0x08 /* draw undercurl text */ -#define DRAW_ITALIC 0x10 /* draw italic text */ -#define DRAW_CURSOR 0x20 @interface MMAtsuiTextView : NSView { // From MMTextStorage int maxRows, maxColumns; - int actualRows, actualColumns; NSColor *defaultBackgroundColor; NSColor *defaultForegroundColor; NSSize cellSize; @@ -48,8 +38,6 @@ enum { MMMaxCellsPerChar = 2 }; - (void)setMaxRows:(int)rows columns:(int)cols; - (void)setDefaultColorsBackground:(NSColor *)bgColor foreground:(NSColor *)fgColor; -- (NSSize)size; -- (NSSize)fitToSize:(NSSize)size rows:(int *)rows columns:(int *)columns; - (NSRect)rectForRowsInRange:(NSRange)range; - (NSRect)rectForColumnsInRange:(NSRange)range; @@ -65,8 +53,6 @@ enum { MMMaxCellsPerChar = 2 }; - (NSEvent *)lastMouseDownEvent; - (void)setShouldDrawInsertionPoint:(BOOL)on; - (void)setPreEditRow:(int)row column:(int)col; -- (void)drawInsertionPointAtRow:(int)row column:(int)col shape:(int)shape - fraction:(int)percent color:(NSColor *)color; - (void)hideMarkedTextField; // @@ -76,13 +62,13 @@ enum { MMMaxCellsPerChar = 2 }; - (void)insertText:(id)string; - (void)doCommandBySelector:(SEL)selector; - (BOOL)performKeyEquivalent:(NSEvent *)event; -- (NSPoint)textContainerOrigin; -- (void)setTextContainerInset:(NSSize)inset; -- (void)setBackgroundColor:(NSColor *)color; // // MMAtsuiTextView methods // - (void)performBatchDrawWithData:(NSData *)data; +- (NSSize)desiredSize; +- (NSSize)minSize; +- (NSSize)constrainRows:(int *)rows columns:(int *)cols toSize:(NSSize)size; @end diff --git a/src/MacVim/MMAtsuiTextView.m b/src/MacVim/MMAtsuiTextView.m index 495d426522..9ea9fb5b93 100644 --- a/src/MacVim/MMAtsuiTextView.m +++ b/src/MacVim/MMAtsuiTextView.m @@ -11,21 +11,55 @@ * MMAtsuiTextView * * Dispatches keyboard and mouse input to the backend. Handles drag-n-drop of - * files onto window. + * files onto window. The rendering is done using ATSUI. + * + * The text view area consists of two parts: + * 1. The text area - this is where text is rendered; the size is governed by + * the current number of rows and columns. + * 2. The inset area - this is a border around the text area; the size is + * governed by the user defaults MMTextInset[Left|Right|Top|Bottom]. + * + * The current size of the text view frame does not always match the desired + * area, i.e. the area determined by the number of rows, columns plus text + * inset. This distinction is particularly important when the view is being + * resized. */ #import "MMAtsuiTextView.h" #import "MMVimController.h" #import "MacVim.h" + +// TODO: What does DRAW_TRANSP flag do? If the background isn't drawn when +// this flag is set, then sometimes the character after the cursor becomes +// blank. Everything seems to work fine by just ignoring this flag. +#define DRAW_TRANSP 0x01 /* draw with transparant bg */ +#define DRAW_BOLD 0x02 /* draw bold text */ +#define DRAW_UNDERL 0x04 /* draw underline text */ +#define DRAW_UNDERC 0x08 /* draw undercurl text */ +#define DRAW_ITALIC 0x10 /* draw italic text */ +#define DRAW_CURSOR 0x20 + + static char MMKeypadEnter[2] = { 'K', 'A' }; static NSString *MMKeypadEnterString = @"KA"; +enum { + // These values are chosen so that the min size is not too small with the + // default font (they only affect resizing with the mouse, you can still + // use e.g. ":set lines=2" to go below these values). + MMMinRows = 4, + MMMinColumns = 30 +}; + + @interface NSFont (AppKitPrivate) - (ATSUFontID) _atsFontID; @end + @interface MMAtsuiTextView (Private) +- (BOOL)convertPoint:(NSPoint)point toRow:(int *)row column:(int *)column; - (void)initAtsuStyles; - (void)disposeAtsuStyles; - (void)updateAtsuStyles; @@ -34,8 +68,12 @@ - (void)sendKeyDown:(const char *)chars length:(int)len modifiers:(int)flags; - (MMVimController *)vimController; @end + @interface MMAtsuiTextView (Drawing) -- (void)fitImageToSize; +- (NSRect)rectFromRow:(int)row1 column:(int)col1 + toRow:(int)row2 column:(int)col2; +- (NSSize)textAreaSize; +- (void)resizeContentImage; - (void)beginDrawing; - (void)endDrawing; - (void)drawString:(UniChar *)string length:(UniCharCount)length @@ -51,6 +89,8 @@ - (void)insertLinesAtRow:(int)row lineCount:(int)count - (void)clearBlockFromRow:(int)row1 column:(int)col1 toRow:(int)row2 column:(int)col2 color:(NSColor *)color; - (void)clearAll; +- (void)drawInsertionPointAtRow:(int)row column:(int)col shape:(int)shape + fraction:(int)percent color:(NSColor *)color; @end @@ -112,63 +152,9 @@ - (void)setDefaultColorsBackground:(NSColor *)bgColor } } -- (NSSize)size -{ - return NSMakeSize(maxColumns*cellSize.width, maxRows*cellSize.height); -} - -- (NSSize)fitToSize:(NSSize)size rows:(int *)rows columns:(int *)columns -{ - NSSize curSize = [self size]; - NSSize fitSize = curSize; - int fitRows = maxRows; - int fitCols = maxColumns; - - if (size.height < curSize.height) { - // Remove lines until the height of the text storage fits inside - // 'size'. However, always make sure there are at least 3 lines in the - // text storage. (Why 3? It seem Vim never allows less than 3 lines.) - // - // TODO: No need to search since line height is fixed, just calculate - // the new height. - int rowCount = maxRows; - int rowsToRemove; - for (rowsToRemove = 0; rowsToRemove < maxRows-3; ++rowsToRemove) { - float height = cellSize.height*rowCount; - - if (height <= size.height) { - fitSize.height = height; - break; - } - - --rowCount; - } - - fitRows -= rowsToRemove; - } else if (size.height > curSize.height) { - float fh = cellSize.height; - if (fh < 1.0f) fh = 1.0f; - - fitRows = floor(size.height/fh); - fitSize.height = fh*fitRows; - } - - if (size.width != curSize.width) { - float fw = cellSize.width; - if (fw < 1.0f) fw = 1.0f; - - fitCols = floor(size.width/fw); - fitSize.width = fw*fitCols; - } - - if (rows) *rows = fitRows; - if (columns) *columns = fitCols; - - return fitSize; -} - - (NSRect)rectForRowsInRange:(NSRange)range { + // TODO: Add text inset to origin NSRect rect = { 0, 0, 0, 0 }; unsigned start = range.location > maxRows ? maxRows : range.location; unsigned length = range.length; @@ -184,6 +170,7 @@ - (NSRect)rectForRowsInRange:(NSRange)range - (NSRect)rectForColumnsInRange:(NSRange)range { + // TODO: Add text inset to origin NSRect rect = { 0, 0, 0, 0 }; unsigned start = range.location > maxColumns ? maxColumns : range.location; unsigned length = range.length; @@ -262,11 +249,6 @@ - (void)setPreEditRow:(int)row column:(int)col { } -- (void)drawInsertionPointAtRow:(int)row column:(int)col shape:(int)shape - fraction:(int)percent color:(NSColor *)color -{ -} - - (void)hideMarkedTextField { } @@ -296,7 +278,7 @@ - (void)keyDown:(NSEvent *)event [self dispatchKeyEvent:event]; } } else { - [super keyDown:event]; + [self interpretKeyEvents:[NSArray arrayWithObject:event]]; } } @@ -456,19 +438,6 @@ - (BOOL)performKeyEquivalent:(NSEvent *)event return YES; } -- (NSPoint)textContainerOrigin -{ - return NSZeroPoint; -} - -- (void)setTextContainerInset:(NSSize)inset -{ -} - -- (void)setBackgroundColor:(NSColor *)color -{ -} - @@ -503,8 +472,8 @@ - (void)performBatchDrawWithData:(NSData *)data const void *bytes = [data bytes]; const void *end = bytes + [data length]; - if (! NSEqualSizes(imageSize, [self size])) - [self fitImageToSize]; + if (! NSEqualSizes(imageSize, [self textAreaSize])) + [self resizeContentImage]; #if MM_DEBUG_DRAWING NSLog(@"====> BEGIN %s", _cmd); @@ -622,6 +591,108 @@ - (void)performBatchDrawWithData:(NSData *)data #endif } +- (NSSize)constrainRows:(int *)rows columns:(int *)cols toSize:(NSSize)size +{ + // TODO: + // - Take text area inset into consideration + // - Rounding errors may cause size change when there should be none + // - Desired rows/columns shold not be 'too small' + + // Constrain the desired size to the given size. Values for the minimum + // rows and columns is taken from Vim. + NSSize desiredSize = [self desiredSize]; + int desiredRows = maxRows; + int desiredCols = maxColumns; + + if (size.height != desiredSize.height) { + float fh = cellSize.height; + if (fh < 1.0f) fh = 1.0f; + + desiredRows = floor(size.height/fh); + desiredSize.height = fh*desiredRows; + } + + if (size.width != desiredSize.width) { + float fw = cellSize.width; + if (fw < 1.0f) fw = 1.0f; + + desiredCols = floor(size.width/fw); + desiredSize.width = fw*desiredCols; + } + + if (rows) *rows = desiredRows; + if (cols) *cols = desiredCols; + + return desiredSize; +} + +- (NSSize)desiredSize +{ + // Compute the size the text view should be for the entire text area and + // inset area to be visible with the present number of rows and columns. + // + // TODO: Add inset area to size. + return NSMakeSize(maxColumns*cellSize.width, maxRows*cellSize.height); +} + +- (NSSize)minSize +{ + // Compute the smallest size the text view is allowed to be. + // + // TODO: Add inset area to size. + return NSMakeSize(MMMinColumns*cellSize.width, MMMinRows*cellSize.height); +} + +- (void)changeFont:(id)sender +{ + NSFont *newFont = [sender convertFont:font]; + + if (newFont) { + NSString *name = [newFont displayName]; + unsigned len = [name lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; + if (len > 0) { + NSMutableData *data = [NSMutableData data]; + float pointSize = [newFont pointSize]; + + [data appendBytes:&pointSize length:sizeof(float)]; + + ++len; // include NUL byte + [data appendBytes:&len length:sizeof(unsigned)]; + [data appendBytes:[name UTF8String] length:len]; + + [[self vimController] sendMessage:SetFontMsgID data:data]; + } + } +} + +- (void)scrollWheel:(NSEvent *)event +{ + if ([event deltaY] == 0) + return; + + int row, col; + NSPoint pt = [self convertPoint:[event locationInWindow] fromView:nil]; + + // View is not flipped, instead the atsui code draws to a flipped image; + // thus we need to 'flip' the coordinate here since the column number + // increases in an up-to-down order. + pt.y = [self frame].size.height - pt.y; + + if (![self convertPoint:pt toRow:&row column:&col]) + return; + + int flags = [event modifierFlags]; + float dy = [event deltaY]; + NSMutableData *data = [NSMutableData data]; + + [data appendBytes:&row length:sizeof(int)]; + [data appendBytes:&col length:sizeof(int)]; + [data appendBytes:&flags length:sizeof(int)]; + [data appendBytes:&dy length:sizeof(float)]; + + [[self vimController] sendMessage:ScrollWheelMsgID data:data]; +} + @end // MMAtsuiTextView @@ -629,6 +700,23 @@ - (void)performBatchDrawWithData:(NSData *)data @implementation MMAtsuiTextView (Private) +- (BOOL)convertPoint:(NSPoint)point toRow:(int *)row column:(int *)column +{ + // TODO: text inset + NSPoint origin = { 0,0 }; + + if (!(cellSize.width > 0 && cellSize.height > 0)) + return NO; + + if (row) *row = floor((point.y-origin.y-1) / cellSize.height); + if (column) *column = floor((point.x-origin.x-1) / cellSize.width); + + //NSLog(@"convertPoint:%@ toRow:%d column:%d", NSStringFromPoint(point), + // *row, *column); + + return YES; +} + - (void)initAtsuStyles { int i; @@ -779,6 +867,22 @@ - (NSRect)rectFromRow:(int)row1 column:(int)col1 (row2 + 1 - row1) * cellSize.height); } +- (NSSize)textAreaSize +{ + // Calculate the (desired) size of the text area, i.e. the text view area + // minus the inset area. + return NSMakeSize(maxColumns*cellSize.width, maxRows*cellSize.height); +} + +- (void)resizeContentImage +{ + //NSLog(@"resizeContentImage"); + [contentImage release]; + contentImage = [[NSImage alloc] initWithSize:[self textAreaSize]]; + [contentImage setFlipped: YES]; + imageSize = [self textAreaSize]; +} + - (void)beginDrawing { [contentImage lockFocus]; @@ -789,15 +893,6 @@ - (void)endDrawing [contentImage unlockFocus]; } -- (void)fitImageToSize -{ - NSLog(@"fitImageToSize"); - [contentImage release]; - contentImage = [[NSImage alloc] initWithSize:[self size]]; - [contentImage setFlipped: YES]; - imageSize = [self size]; -} - - (void)drawString:(UniChar *)string length:(UniCharCount)length atRow:(int)row column:(int)col cells:(int)cells withFlags:(int)flags foregroundColor:(NSColor *)fg @@ -900,4 +995,9 @@ - (void)clearAll NSRectFill(NSMakeRect(0, 0, imageSize.width, imageSize.height)); } +- (void)drawInsertionPointAtRow:(int)row column:(int)col shape:(int)shape + fraction:(int)percent color:(NSColor *)color +{ +} + @end // MMAtsuiTextView (Drawing) diff --git a/src/MacVim/MMBackend.m b/src/MacVim/MMBackend.m index 0343771d01..d9c2760dc8 100644 --- a/src/MacVim/MMBackend.m +++ b/src/MacVim/MMBackend.m @@ -442,11 +442,19 @@ - (void)flushQueue:(BOOL)force - (BOOL)waitForInput:(int)milliseconds { //NSLog(@"|ENTER| %s%d", _cmd, milliseconds); - NSDate *date = milliseconds > 0 ? - [NSDate dateWithTimeIntervalSinceNow:.001*milliseconds] : - [NSDate distantFuture]; - [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:date]; + // Only start the run loop if the input queue is empty, otherwise process + // the input first so that the input on queue isn't delayed. + if ([inputQueue count]) { + inputReceived = YES; + } else { + NSDate *date = milliseconds > 0 ? + [NSDate dateWithTimeIntervalSinceNow:.001*milliseconds] : + [NSDate distantFuture]; + + [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode + beforeDate:date]; + } // I know of no way to figure out if the run loop exited because input was // found or because of a time out, so I need to manually indicate when @@ -1546,7 +1554,7 @@ - (void)handleInputEvent:(int)msgid data:(NSData *)data int idx = *((int*)bytes); tabpage_move(idx); - } else if (SetTextDimensionsMsgID == msgid) { + } else if (SetTextDimensionsMsgID == msgid || LiveResizeMsgID == msgid) { if (!data) return; const void *bytes = [data bytes]; int rows = *((int*)bytes); bytes += sizeof(int); @@ -1556,7 +1564,7 @@ - (void)handleInputEvent:(int)msgid data:(NSData *)data // gui_resize_shell(), so we have to manually set the rows and columns // here. (MacVim doesn't change the rows and columns to avoid // inconsistent states between Vim and MacVim.) - [self setRows:rows columns:cols]; + [self queueMessage:msgid data:data]; //NSLog(@"[VimTask] Resizing shell to %dx%d.", cols, rows); gui_resize_shell(cols, rows); diff --git a/src/MacVim/MMFullscreenWindow.h b/src/MacVim/MMFullscreenWindow.h index 65d9153b2b..af228aed4e 100644 --- a/src/MacVim/MMFullscreenWindow.h +++ b/src/MacVim/MMFullscreenWindow.h @@ -25,6 +25,7 @@ - (void)enterFullscreen; - (void)leaveFullscreen; +- (void)centerView; - (BOOL)canBecomeKeyWindow; - (BOOL)canBecomeMainWindow; diff --git a/src/MacVim/MMFullscreenWindow.m b/src/MacVim/MMFullscreenWindow.m index f2f2080836..c30b73d2a5 100644 --- a/src/MacVim/MMFullscreenWindow.m +++ b/src/MacVim/MMFullscreenWindow.m @@ -8,9 +8,17 @@ * See README.txt for an overview of the Vim source code. */ /* - * MMFullscreen + * MMFullscreenWindow * - * Support for full-screen editing. + * A window without any decorations which covers an entire screen. + * + * When entering full-screen mode the window controller is set to control an + * instance of this class instead of an MMWindow. (This seems to work fine + * even though the Apple docs state that it is generally a better idea to + * create a separate window controller for each window.) + * + * Most of the full-screen logic is currently in this class although it might + * move to the window controller in the future. * * Author: Nico Weber */ @@ -26,7 +34,6 @@ static int numFullscreenWindows = 0; @interface MMFullscreenWindow (Private) -- (void)centerView; - (BOOL)isOnPrimaryScreen; - (void)hideDockIfAppropriate; - (void)revealDockIfAppropriate; @@ -56,14 +63,14 @@ - (MMFullscreenWindow *)initWithWindow:(NSWindow *)t view:(MMVimView *)v if (self == nil) return nil; + target = [t retain]; + view = [v retain]; + [self setHasShadow:NO]; [self setShowsResizeIndicator:NO]; [self setBackgroundColor:[NSColor blackColor]]; [self setReleasedWhenClosed:NO]; - target = t; [target retain]; - view = v; [view retain]; - return self; } @@ -93,30 +100,29 @@ - (void)enterFullscreen [target setDelegate:nil]; // make target's window controller believe that it's now controlling us - [target retain]; // NSWindowController will release target once in the - // in the next line [[target windowController] setWindow:self]; - oldTabBarStyle = [[view tabBarControl] styleName]; [[view tabBarControl] setStyleNamed:@"Unified"]; // add text view oldPosition = [view frame].origin; + [view removeFromSuperviewWithoutNeedingDisplay]; [[self contentView] addSubview:view]; [self setInitialFirstResponder:[view textView]]; - [self setTitle:[target title]]; + // NOTE: Calling setTitle:nil causes an exception to be raised (and it is + // possible that 'target' has no title when we get here). + if ([target title]) + [self setTitle:[target title]]; + [self setOpaque:[target isOpaque]]; // don't set this sooner, so we don't get an additional // focus gained message [self setDelegate:delegate]; - // update bottom right corner scrollbar (no resize handle in fu mode) - [view placeViews]; - // move vim view to the window's center [self centerView]; @@ -158,6 +164,7 @@ - (void)leaveFullscreen // do this _after_ resetting delegate and window controller, so the // window controller doesn't get a focus lost message from the fullscreen // window. + [view removeFromSuperviewWithoutNeedingDisplay]; [[target contentView] addSubview:view]; [view setFrameOrigin:oldPosition]; [self close]; @@ -167,9 +174,6 @@ - (void)leaveFullscreen // sooner [target setDelegate:delegate]; - // update bottom right corner scrollbar (resize handle reappears) - [view placeViews]; - // fade back in if (didBlend) { CGDisplayFade(token, .25, kCGDisplayBlendSolidColor, @@ -178,6 +182,8 @@ - (void)leaveFullscreen } [self revealDockIfAppropriate]; + + [self autorelease]; // Balance the above retain } // Title-less windows normally don't receive key presses, override this @@ -193,90 +199,22 @@ - (BOOL)canBecomeMainWindow return YES; } - -#pragma mark Proxy/Decorator/whatever stuff - -- (void)scrollWheel:(NSEvent *)theEvent -{ - [[view textView] scrollWheel:theEvent]; -} - -// the window controller will send us messages that are meant for the original, -// non-fullscreen window. forward those, and interpret the messages that are -// interesting for us - -- (void)setTitle:(NSString *)title -{ - [target setTitle:title]; - [super setTitle:title]; -} - -// HACK: if the T flag in guioptions is changed in fu mode, the toolbar needs -// to be changed when nofu is set. MMWindowController gets the toolbar object, -// so we need to return a toolbar from this method, even if none is visible for -// the fullscreen window. Seems to work, though. -- (NSToolbar *)toolbar -{ - return [target toolbar]; -} - -- (void)setFrame:(NSRect)frame display:(BOOL)display -{ - // HACK: if the target window would resize, we have to call our own - // windowDidResize method so that placeViews in MMWindowController is called - if (!NSEqualRects(frame, [target frame])) - { - [target setFrame:frame display:NO]; - - // XXX: send this directly to MMVimView - if ([[self delegate] respondsToSelector:@selector(windowDidResize:)]) - [[self delegate] windowDidResize:nil]; - - [self centerView]; - [self display]; - } -} - -/*- (NSRect)frame -{ - return [target frame]; // really? needed by MMWindowController placeViews. - // but mucks up display -}*/ - -- (NSRect)contentRectForFrameRect:(NSRect)rect -{ - //return [target contentRectForFrameRect:rect]; - - // EVIL HACK: if this is always called with [[self window] frame] as - // argument from MMWindowController, we can't let frame return the frame - // of target so "fix" this here. - if (NSEqualRects([self frame], rect)) { - return [target contentRectForFrameRect:[target frame]]; - } else { - return [target contentRectForFrameRect:rect]; - } -} - -- (NSRect)frameRectForContentRect:(NSRect)contentRect +- (void)centerView { - return [target frameRectForContentRect:contentRect]; + NSRect outer = [self frame], inner = [view frame]; + //NSLog(@"%s %@%@", _cmd, NSStringFromRect(outer), NSStringFromRect(inner)); + + NSPoint origin = NSMakePoint((outer.size.width - inner.size.width)/2, + (outer.size.height - inner.size.height)/2); + [view setFrameOrigin:origin]; } -- (NSRect)constrainFrameRect:(NSRect)frameRect toScreen:(NSScreen*)screen -{ - return [target constrainFrameRect:frameRect toScreen:screen]; -} -- (void)setContentResizeIncrements:(NSSize)size -{ - [target setContentResizeIncrements:size]; -} +#pragma mark Proxy/Decorator/whatever stuff -- (void)setOpaque:(BOOL)isOpaque +- (void)scrollWheel:(NSEvent *)theEvent { - // XXX: Do we want transparency even in fullscreen mode? - [super setOpaque:isOpaque]; - [target setOpaque:isOpaque]; + [[view textView] scrollWheel:theEvent]; } @end // MMFullscreenWindow @@ -286,16 +224,6 @@ - (void)setOpaque:(BOOL)isOpaque @implementation MMFullscreenWindow (Private) -- (void)centerView -{ - NSRect outer = [self frame], inner = [view frame]; - //NSLog(@"%s %@%@", _cmd, NSStringFromRect(outer), NSStringFromRect(inner)); - - NSPoint origin = NSMakePoint((outer.size.width - inner.size.width)/2, - (outer.size.height - inner.size.height)/2); - [view setFrameOrigin:origin]; -} - - (BOOL)isOnPrimaryScreen { // The primary screen is the screen the menu bar is on. This is different diff --git a/src/MacVim/MMTextStorage.m b/src/MacVim/MMTextStorage.m index 7df3935085..9cfa4f77bc 100644 --- a/src/MacVim/MMTextStorage.m +++ b/src/MacVim/MMTextStorage.m @@ -83,6 +83,8 @@ - (id)init - (void)dealloc { + //NSLog(@"MMTextStorage dealloc"); + #if MM_USE_ROW_CACHE if (rowCache) { free(rowCache); diff --git a/src/MacVim/MMTextView.h b/src/MacVim/MMTextView.h index 528d4f0b57..7e40a4a631 100644 --- a/src/MacVim/MMTextView.h +++ b/src/MacVim/MMTextView.h @@ -30,11 +30,33 @@ int preEditColumn; } +- (id)initWithFrame:(NSRect)frame; + - (NSEvent *)lastMouseDownEvent; - (void)setShouldDrawInsertionPoint:(BOOL)on; - (void)setPreEditRow:(int)row column:(int)col; - (void)drawInsertionPointAtRow:(int)row column:(int)col shape:(int)shape fraction:(int)percent color:(NSColor *)color; - (void)hideMarkedTextField; +- (void)performBatchDrawWithData:(NSData *)data; + +// +// MMTextStorage methods +// +- (NSFont *)font; +- (void)setFont:(NSFont *)newFont; +- (void)setWideFont:(NSFont *)newFont; +- (NSSize)cellSize; +- (void)setLinespace:(float)newLinespace; +- (void)getMaxRows:(int*)rows columns:(int*)cols; +- (void)setMaxRows:(int)rows columns:(int)cols; +- (NSRect)rectForRowsInRange:(NSRange)range; +- (NSRect)rectForColumnsInRange:(NSRange)range; +- (void)setDefaultColorsBackground:(NSColor *)bgColor + foreground:(NSColor *)fgColor; + +- (NSSize)constrainRows:(int *)rows columns:(int *)cols toSize:(NSSize)size; +- (NSSize)desiredSize; +- (NSSize)minSize; @end diff --git a/src/MacVim/MMTextView.m b/src/MacVim/MMTextView.m index 21ab4537f0..b1e7148c95 100644 --- a/src/MacVim/MMTextView.m +++ b/src/MacVim/MMTextView.m @@ -21,10 +21,14 @@ #import "MMTextStorage.h" #import "MMWindowController.h" #import "MMVimController.h" +#import "MMTypesetter.h" #import "MacVim.h" +// This is taken from gui.h +#define DRAW_CURSOR 0x20 + // The max/min drag timer interval in seconds static NSTimeInterval MMDragTimerMaxInterval = .3f; static NSTimeInterval MMDragTimerMinInterval = .01f; @@ -35,6 +39,10 @@ static char MMKeypadEnter[2] = { 'K', 'A' }; static NSString *MMKeypadEnterString = @"KA"; +enum { + MMMinRows = 4, + MMMinColumns = 20 +}; @interface MMTextView (Private) @@ -52,8 +60,69 @@ - (void)sendKeyDown:(const char *)chars length:(int)len modifiers:(int)flags; @implementation MMTextView +- (id)initWithFrame:(NSRect)frame +{ + // Set up a Cocoa text system. Note that the textStorage is released in + // -[MMVimView dealloc]. + MMTextStorage *textStorage = [[MMTextStorage alloc] init]; + NSLayoutManager *lm = [[NSLayoutManager alloc] init]; + NSTextContainer *tc = [[NSTextContainer alloc] initWithContainerSize: + NSMakeSize(1.0e7,1.0e7)]; + + NSString *typesetterString = [[NSUserDefaults standardUserDefaults] + stringForKey:MMTypesetterKey]; + if ([typesetterString isEqual:@"MMTypesetter"]) { + NSTypesetter *typesetter = [[MMTypesetter alloc] init]; + [lm setTypesetter:typesetter]; + [typesetter release]; + } else if ([typesetterString isEqual:@"MMTypesetter2"]) { + NSTypesetter *typesetter = [[MMTypesetter2 alloc] init]; + [lm setTypesetter:typesetter]; + [typesetter release]; + } else { + // Only MMTypesetter supports different cell width multipliers. + [[NSUserDefaults standardUserDefaults] + setFloat:1.0 forKey:MMCellWidthMultiplierKey]; + } + + // The characters in the text storage are in display order, so disable + // bidirectional text processing (this call is 10.4 only). + [[lm typesetter] setBidiProcessingEnabled:NO]; + + [tc setWidthTracksTextView:NO]; + [tc setHeightTracksTextView:NO]; + [tc setLineFragmentPadding:0]; + + [textStorage addLayoutManager:lm]; + [lm addTextContainer:tc]; + + // The text storage retains the layout manager which in turn retains + // the text container. + [tc release]; + [lm release]; + + // NOTE: This will make the text storage the principal owner of the text + // system. Releasing the text storage will in turn release the layout + // manager, the text container, and finally the text view (self). This + // complicates deallocation somewhat, see -[MMVimView dealloc]. + if (![super initWithFrame:frame textContainer:tc]) { + [textStorage release]; + return nil; + } + + // Allow control of text view inset via MMTextInset* user defaults. + NSUserDefaults *ud = [NSUserDefaults standardUserDefaults]; + int left = [ud integerForKey:MMTextInsetLeftKey]; + int top = [ud integerForKey:MMTextInsetTopKey]; + [self setTextContainerInset:NSMakeSize(left, top)]; + + return self; +} + - (void)dealloc { + //NSLog(@"MMTextView dealloc"); + if (markedTextField) { [[markedTextField window] autorelease]; [markedTextField release]; @@ -115,6 +184,245 @@ - (void)hideMarkedTextField } } + +#define MM_DEBUG_DRAWING 0 + +- (void)performBatchDrawWithData:(NSData *)data +{ + MMTextStorage *textStorage = (MMTextStorage *)[self textStorage]; + if (!textStorage) + return; + + const void *bytes = [data bytes]; + const void *end = bytes + [data length]; + +#if MM_DEBUG_DRAWING + NSLog(@"====> BEGIN %s", _cmd); +#endif + [textStorage beginEditing]; + + // TODO: Sanity check input + + while (bytes < end) { + int type = *((int*)bytes); bytes += sizeof(int); + + if (ClearAllDrawType == type) { +#if MM_DEBUG_DRAWING + NSLog(@" Clear all"); +#endif + [textStorage clearAll]; + } else if (ClearBlockDrawType == type) { + unsigned color = *((unsigned*)bytes); bytes += sizeof(unsigned); + int row1 = *((int*)bytes); bytes += sizeof(int); + int col1 = *((int*)bytes); bytes += sizeof(int); + int row2 = *((int*)bytes); bytes += sizeof(int); + int col2 = *((int*)bytes); bytes += sizeof(int); + +#if MM_DEBUG_DRAWING + NSLog(@" Clear block (%d,%d) -> (%d,%d)", row1, col1, + row2,col2); +#endif + [textStorage clearBlockFromRow:row1 column:col1 + toRow:row2 column:col2 + color:[NSColor colorWithArgbInt:color]]; + } else if (DeleteLinesDrawType == type) { + unsigned color = *((unsigned*)bytes); bytes += sizeof(unsigned); + int row = *((int*)bytes); bytes += sizeof(int); + int count = *((int*)bytes); bytes += sizeof(int); + int bot = *((int*)bytes); bytes += sizeof(int); + int left = *((int*)bytes); bytes += sizeof(int); + int right = *((int*)bytes); bytes += sizeof(int); + +#if MM_DEBUG_DRAWING + NSLog(@" Delete %d line(s) from %d", count, row); +#endif + [textStorage deleteLinesFromRow:row lineCount:count + scrollBottom:bot left:left right:right + color:[NSColor colorWithArgbInt:color]]; + } else if (DrawStringDrawType == type) { + int bg = *((int*)bytes); bytes += sizeof(int); + int fg = *((int*)bytes); bytes += sizeof(int); + int sp = *((int*)bytes); bytes += sizeof(int); + int row = *((int*)bytes); bytes += sizeof(int); + int col = *((int*)bytes); bytes += sizeof(int); + int cells = *((int*)bytes); bytes += sizeof(int); + int flags = *((int*)bytes); bytes += sizeof(int); + int len = *((int*)bytes); bytes += sizeof(int); + NSString *string = [[NSString alloc] + initWithBytesNoCopy:(void*)bytes + length:len + encoding:NSUTF8StringEncoding + freeWhenDone:NO]; + bytes += len; + +#if MM_DEBUG_DRAWING + NSLog(@" Draw string at (%d,%d) length=%d flags=%d fg=0x%x " + "bg=0x%x sp=0x%x (%@)", row, col, len, flags, fg, bg, sp, + len > 0 ? [string substringToIndex:1] : @""); +#endif + // NOTE: If this is a call to draw the (block) cursor, then cancel + // any previous request to draw the insertion point, or it might + // get drawn as well. + if (flags & DRAW_CURSOR) { + [self setShouldDrawInsertionPoint:NO]; + //NSColor *color = [NSColor colorWithRgbInt:bg]; + //[self drawInsertionPointAtRow:row column:col + // shape:MMInsertionPointBlock + // color:color]; + } + + [textStorage drawString:string + atRow:row column:col cells:cells + withFlags:flags + foregroundColor:[NSColor colorWithRgbInt:fg] + backgroundColor:[NSColor colorWithArgbInt:bg] + specialColor:[NSColor colorWithRgbInt:sp]]; + + [string release]; + } else if (InsertLinesDrawType == type) { + unsigned color = *((unsigned*)bytes); bytes += sizeof(unsigned); + int row = *((int*)bytes); bytes += sizeof(int); + int count = *((int*)bytes); bytes += sizeof(int); + int bot = *((int*)bytes); bytes += sizeof(int); + int left = *((int*)bytes); bytes += sizeof(int); + int right = *((int*)bytes); bytes += sizeof(int); + +#if MM_DEBUG_DRAWING + NSLog(@" Insert %d line(s) at row %d", count, row); +#endif + [textStorage insertLinesAtRow:row lineCount:count + scrollBottom:bot left:left right:right + color:[NSColor colorWithArgbInt:color]]; + } else if (DrawCursorDrawType == type) { + unsigned color = *((unsigned*)bytes); bytes += sizeof(unsigned); + int row = *((int*)bytes); bytes += sizeof(int); + int col = *((int*)bytes); bytes += sizeof(int); + int shape = *((int*)bytes); bytes += sizeof(int); + int percent = *((int*)bytes); bytes += sizeof(int); + +#if MM_DEBUG_DRAWING + NSLog(@" Draw cursor at (%d,%d)", row, col); +#endif + [self drawInsertionPointAtRow:row column:col shape:shape + fraction:percent + color:[NSColor colorWithRgbInt:color]]; + } else { + NSLog(@"WARNING: Unknown draw type (type=%d)", type); + } + } + + [textStorage endEditing]; + + // NOTE: During resizing, Cocoa only sends draw messages before Vim's rows + // and columns are changed (due to ipc delays). Force a redraw here. + [self displayIfNeeded]; + +#if MM_DEBUG_DRAWING + NSLog(@"<==== END %s", _cmd); +#endif +} + +- (NSFont *)font +{ + return [(MMTextStorage*)[self textStorage] font]; +} + +- (void)setFont:(NSFont *)newFont +{ + [(MMTextStorage*)[self textStorage] setFont:newFont]; +} + +- (void)setWideFont:(NSFont *)newFont +{ + [(MMTextStorage*)[self textStorage] setWideFont:newFont]; +} + +- (NSSize)cellSize +{ + return [(MMTextStorage*)[self textStorage] cellSize]; +} + +- (void)setLinespace:(float)newLinespace +{ + return [(MMTextStorage*)[self textStorage] setLinespace:newLinespace]; +} + +- (void)getMaxRows:(int*)rows columns:(int*)cols +{ + return [(MMTextStorage*)[self textStorage] getMaxRows:rows columns:cols]; +} + +- (void)setMaxRows:(int)rows columns:(int)cols +{ + return [(MMTextStorage*)[self textStorage] setMaxRows:rows columns:cols]; +} + +- (NSRect)rectForRowsInRange:(NSRange)range +{ + return [(MMTextStorage*)[self textStorage] rectForRowsInRange:range]; +} + +- (NSRect)rectForColumnsInRange:(NSRange)range +{ + return [(MMTextStorage*)[self textStorage] rectForColumnsInRange:range]; +} + +- (void)setDefaultColorsBackground:(NSColor *)bgColor + foreground:(NSColor *)fgColor +{ + [self setBackgroundColor:bgColor]; + return [(MMTextStorage*)[self textStorage] + setDefaultColorsBackground:bgColor foreground:fgColor]; +} + +- (NSSize)constrainRows:(int *)rows columns:(int *)cols toSize:(NSSize)size +{ + NSUserDefaults *ud = [NSUserDefaults standardUserDefaults]; + int right = [ud integerForKey:MMTextInsetRightKey]; + int bot = [ud integerForKey:MMTextInsetBottomKey]; + + size.width -= [self textContainerOrigin].x + right; + size.height -= [self textContainerOrigin].y + bot; + + NSSize newSize = [(MMTextStorage*)[self textStorage] fitToSize:size + rows:rows + columns:cols]; + + newSize.width += [self textContainerOrigin].x + right; + newSize.height += [self textContainerOrigin].y + bot; + + return newSize; +} + +- (NSSize)desiredSize +{ + NSSize size = [(MMTextStorage*)[self textStorage] size]; + + NSUserDefaults *ud = [NSUserDefaults standardUserDefaults]; + int right = [ud integerForKey:MMTextInsetRightKey]; + int bot = [ud integerForKey:MMTextInsetBottomKey]; + + size.width += [self textContainerOrigin].x + right; + size.height += [self textContainerOrigin].y + bot; + + return size; +} + +- (NSSize)minSize +{ + NSSize cellSize = [(MMTextStorage*)[self textStorage] cellSize]; + NSSize size = { MMMinColumns*cellSize.width, MMMinRows*cellSize.height }; + + NSUserDefaults *ud = [NSUserDefaults standardUserDefaults]; + int right = [ud integerForKey:MMTextInsetRightKey]; + int bot = [ud integerForKey:MMTextInsetBottomKey]; + + size.width += [self textContainerOrigin].x + right; + size.height += [self textContainerOrigin].y + bot; + + return size; +} + - (BOOL)isOpaque { return NO; @@ -772,22 +1080,6 @@ - (void)updateFontPanel // The font panel is updated whenever the font is set. } -- (void)viewWillStartLiveResize -{ - id windowController = [[self window] windowController]; - [windowController liveResizeWillStart]; - - [super viewWillStartLiveResize]; -} - -- (void)viewDidEndLiveResize -{ - id windowController = [[self window] windowController]; - [windowController liveResizeDidEnd]; - - [super viewDidEndLiveResize]; -} - @end // MMTextView diff --git a/src/MacVim/MMVimController.m b/src/MacVim/MMVimController.m index 4a036cbdb4..442b5ddb06 100644 --- a/src/MacVim/MMVimController.m +++ b/src/MacVim/MMVimController.m @@ -25,15 +25,12 @@ #import "MMVimController.h" #import "MMWindowController.h" -#import "MMTextView.h" #import "MMAppController.h" -#import "MMTextStorage.h" +#import "MMVimView.h" +#import "MMTextView.h" #import "MMAtsuiTextView.h" -// This is taken from gui.h -#define DRAW_CURSOR 0x20 - static NSString *MMDefaultToolbarImageName = @"Attention"; static int MMAlertTextFieldHeight = 22; @@ -61,7 +58,6 @@ - (NSTextField *)textField; @interface MMVimController (Private) - (void)handleMessage:(int)msgid data:(NSData *)data; -- (void)performBatchDrawWithData:(NSData *)data; - (void)savePanelDidEnd:(NSSavePanel *)panel code:(int)code context:(void *)context; - (void)alertDidEnd:(MMAlert *)alert code:(int)code context:(void *)context; @@ -116,13 +112,12 @@ - (id)initWithBackend:(id)backend pid:(int)processIdentifier name:NSConnectionDidDieNotification object:connection]; - NSWindow *win = [windowController window]; - + // TODO: What if [windowController window] is the full-screen window? [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(windowDidBecomeMain:) name:NSWindowDidBecomeMainNotification - object:win]; + object:[windowController window]]; isInitialized = YES; } @@ -322,6 +317,11 @@ - (void)sendMessage:(int)msgid data:(NSData *)data - (BOOL)sendMessageNow:(int)msgid data:(NSData *)data timeout:(NSTimeInterval)timeout { + // Send a message with a timeout. USE WITH EXTREME CAUTION! Sending + // messages in rapid succession with a timeout may cause MacVim to beach + // ball forever. In almost all circumstances sendMessage:data: should be + // used instead. + if (!isInitialized || inProcessCommandQueue) return NO; @@ -549,16 +549,13 @@ @implementation MMVimController (Private) - (void)handleMessage:(int)msgid data:(NSData *)data { - //NSLog(@"%@ %s", [self className], _cmd); + //if (msgid != AddMenuMsgID && msgid != AddMenuItemMsgID) + // NSLog(@"%@ %s%s", [self className], _cmd, MessageStrings[msgid]); if (OpenVimWindowMsgID == msgid) { [windowController openWindow]; } else if (BatchDrawMsgID == msgid) { - if ([[NSUserDefaults standardUserDefaults] - boolForKey:MMAtsuiRendererKey]) - [(MMAtsuiTextView *)[windowController textView] performBatchDrawWithData:data]; - else - [self performBatchDrawWithData:data]; + [[[windowController vimView] textView] performBatchDrawWithData:data]; } else if (SelectTabMsgID == msgid) { #if 0 // NOTE: Tab selection is done inside updateTabsWithData:. const void *bytes = [data bytes]; @@ -572,12 +569,13 @@ - (void)handleMessage:(int)msgid data:(NSData *)data [windowController showTabBar:YES]; } else if (HideTabBarMsgID == msgid) { [windowController showTabBar:NO]; - } else if (SetTextDimensionsMsgID == msgid) { + } else if (SetTextDimensionsMsgID == msgid || LiveResizeMsgID == msgid) { const void *bytes = [data bytes]; int rows = *((int*)bytes); bytes += sizeof(int); int cols = *((int*)bytes); bytes += sizeof(int); - [windowController setTextDimensionsWithRows:rows columns:cols]; + [windowController setTextDimensionsWithRows:rows columns:cols + live:(LiveResizeMsgID==msgid)]; } else if (SetWindowTitleMsgID == msgid) { const void *bytes = [data bytes]; int len = *((int*)bytes); bytes += sizeof(int); @@ -585,7 +583,7 @@ - (void)handleMessage:(int)msgid data:(NSData *)data NSString *string = [[NSString alloc] initWithBytes:(void*)bytes length:len encoding:NSUTF8StringEncoding]; - [[windowController window] setTitle:string]; + [windowController setTitle:string]; [string release]; } else if (AddMenuMsgID == msgid) { @@ -614,17 +612,7 @@ - (void)handleMessage:(int)msgid data:(NSData *)data [toolbar setDisplayMode:NSToolbarDisplayModeIconOnly]; [toolbar setSizeMode:NSToolbarSizeModeSmall]; - NSWindow *win = [windowController window]; - [win setToolbar:toolbar]; - - // HACK! Redirect the pill button so that we can ask Vim to - // hide the toolbar. - NSButton *pillButton = [win - standardWindowButton:NSWindowToolbarButton]; - if (pillButton) { - [pillButton setAction:@selector(toggleToolbar:)]; - [pillButton setTarget:windowController]; - } + [windowController setToolbar:toolbar]; } } else if (title) { [self addMenuWithTag:tag parent:parentTag title:title atIndex:idx]; @@ -862,157 +850,18 @@ - (void)handleMessage:(int)msgid data:(NSData *)data } else if (LeaveFullscreenMsgID == msgid) { [windowController leaveFullscreen]; } else if (BuffersNotModifiedMsgID == msgid) { - [[windowController window] setDocumentEdited:NO]; + [windowController setBuffersModified:NO]; } else if (BuffersModifiedMsgID == msgid) { - [[windowController window] setDocumentEdited:YES]; + [windowController setBuffersModified:YES]; } else if (SetPreEditPositionMsgID == msgid) { const int *dim = (const int*)[data bytes]; - [[windowController textView] setPreEditRow:dim[0] column:dim[1]]; + [[[windowController vimView] textView] setPreEditRow:dim[0] + column:dim[1]]; } else { NSLog(@"WARNING: Unknown message received (msgid=%d)", msgid); } } - -#define MM_DEBUG_DRAWING 0 - -- (void)performBatchDrawWithData:(NSData *)data -{ - // TODO! Move to window controller. - MMTextStorage *textStorage = [windowController textStorage]; - MMTextView *textView = [windowController textView]; - if (!(textStorage && textView)) - return; - - const void *bytes = [data bytes]; - const void *end = bytes + [data length]; - -#if MM_DEBUG_DRAWING - NSLog(@"====> BEGIN %s", _cmd); -#endif - [textStorage beginEditing]; - - // TODO: Sanity check input - - while (bytes < end) { - int type = *((int*)bytes); bytes += sizeof(int); - - if (ClearAllDrawType == type) { -#if MM_DEBUG_DRAWING - NSLog(@" Clear all"); -#endif - [textStorage clearAll]; - } else if (ClearBlockDrawType == type) { - unsigned color = *((unsigned*)bytes); bytes += sizeof(unsigned); - int row1 = *((int*)bytes); bytes += sizeof(int); - int col1 = *((int*)bytes); bytes += sizeof(int); - int row2 = *((int*)bytes); bytes += sizeof(int); - int col2 = *((int*)bytes); bytes += sizeof(int); - -#if MM_DEBUG_DRAWING - NSLog(@" Clear block (%d,%d) -> (%d,%d)", row1, col1, - row2,col2); -#endif - [textStorage clearBlockFromRow:row1 column:col1 - toRow:row2 column:col2 - color:[NSColor colorWithArgbInt:color]]; - } else if (DeleteLinesDrawType == type) { - unsigned color = *((unsigned*)bytes); bytes += sizeof(unsigned); - int row = *((int*)bytes); bytes += sizeof(int); - int count = *((int*)bytes); bytes += sizeof(int); - int bot = *((int*)bytes); bytes += sizeof(int); - int left = *((int*)bytes); bytes += sizeof(int); - int right = *((int*)bytes); bytes += sizeof(int); - -#if MM_DEBUG_DRAWING - NSLog(@" Delete %d line(s) from %d", count, row); -#endif - [textStorage deleteLinesFromRow:row lineCount:count - scrollBottom:bot left:left right:right - color:[NSColor colorWithArgbInt:color]]; - } else if (DrawStringDrawType == type) { - int bg = *((int*)bytes); bytes += sizeof(int); - int fg = *((int*)bytes); bytes += sizeof(int); - int sp = *((int*)bytes); bytes += sizeof(int); - int row = *((int*)bytes); bytes += sizeof(int); - int col = *((int*)bytes); bytes += sizeof(int); - int cells = *((int*)bytes); bytes += sizeof(int); - int flags = *((int*)bytes); bytes += sizeof(int); - int len = *((int*)bytes); bytes += sizeof(int); - NSString *string = [[NSString alloc] - initWithBytesNoCopy:(void*)bytes - length:len - encoding:NSUTF8StringEncoding - freeWhenDone:NO]; - bytes += len; - -#if MM_DEBUG_DRAWING - NSLog(@" Draw string at (%d,%d) length=%d flags=%d fg=0x%x " - "bg=0x%x sp=0x%x (%@)", row, col, len, flags, fg, bg, sp, - len > 0 ? [string substringToIndex:1] : @""); -#endif - // NOTE: If this is a call to draw the (block) cursor, then cancel - // any previous request to draw the insertion point, or it might - // get drawn as well. - if (flags & DRAW_CURSOR) { - [textView setShouldDrawInsertionPoint:NO]; - //NSColor *color = [NSColor colorWithRgbInt:bg]; - //[textView drawInsertionPointAtRow:row column:col - // shape:MMInsertionPointBlock - // color:color]; - } - - [textStorage drawString:string - atRow:row column:col cells:cells - withFlags:flags - foregroundColor:[NSColor colorWithRgbInt:fg] - backgroundColor:[NSColor colorWithArgbInt:bg] - specialColor:[NSColor colorWithRgbInt:sp]]; - - [string release]; - } else if (InsertLinesDrawType == type) { - unsigned color = *((unsigned*)bytes); bytes += sizeof(unsigned); - int row = *((int*)bytes); bytes += sizeof(int); - int count = *((int*)bytes); bytes += sizeof(int); - int bot = *((int*)bytes); bytes += sizeof(int); - int left = *((int*)bytes); bytes += sizeof(int); - int right = *((int*)bytes); bytes += sizeof(int); - -#if MM_DEBUG_DRAWING - NSLog(@" Insert %d line(s) at row %d", count, row); -#endif - [textStorage insertLinesAtRow:row lineCount:count - scrollBottom:bot left:left right:right - color:[NSColor colorWithArgbInt:color]]; - } else if (DrawCursorDrawType == type) { - unsigned color = *((unsigned*)bytes); bytes += sizeof(unsigned); - int row = *((int*)bytes); bytes += sizeof(int); - int col = *((int*)bytes); bytes += sizeof(int); - int shape = *((int*)bytes); bytes += sizeof(int); - int percent = *((int*)bytes); bytes += sizeof(int); - -#if MM_DEBUG_DRAWING - NSLog(@" Draw cursor at (%d,%d)", row, col); -#endif - [textView drawInsertionPointAtRow:row column:col shape:shape - fraction:percent - color:[NSColor colorWithRgbInt:color]]; - } else { - NSLog(@"WARNING: Unknown draw type (type=%d)", type); - } - } - - [textStorage endEditing]; - - // NOTE: During resizing, Cocoa only sends draw messages before Vim's rows - // and columns are changed (due to ipc delays). Force a redraw here. - [[windowController vimView] displayIfNeeded]; - -#if MM_DEBUG_DRAWING - NSLog(@"<==== END %s", _cmd); -#endif -} - - (void)savePanelDidEnd:(NSSavePanel *)panel code:(int)code context:(void *)context { diff --git a/src/MacVim/MMVimView.h b/src/MacVim/MMVimView.h index 8f2e3d9024..676e5ab815 100644 --- a/src/MacVim/MMVimView.h +++ b/src/MacVim/MMVimView.h @@ -14,7 +14,6 @@ @class PSMTabBarControl; @class MMTextView; -@class MMTextStorage; @class MMScroller; @class MMVimController; @@ -22,29 +21,22 @@ @interface MMVimView : NSView { PSMTabBarControl *tabBarControl; NSTabView *tabView; - MMVimController *vimController; BOOL vimTaskSelectedTab; MMTextView *textView; - MMTextStorage *textStorage; NSMutableArray *scrollbars; - - // This is temporary to make the refactoring easier (XXX) - BOOL shouldUpdateWindowSize; } -- (MMVimView *)initWithFrame:(NSRect)frame vimController:(MMVimController *) c; +- (MMVimView *)initWithFrame:(NSRect)frame vimController:(MMVimController *)c; - (MMTextView *)textView; -- (MMTextStorage *)textStorage; - (NSMutableArray *)scrollbars; -- (BOOL)inLiveResize; - (void)cleanup; -- (NSSize)desiredSizeForActualRowsAndColumns; -- (NSSize)getDesiredRows:(int *)r columns:(int *)c forSize:(NSSize)size; -- (void)getActualRows:(int *)r columns:(int *)c; -- (void)setActualRows:(int)r columns:(int)c; +- (NSSize)desiredSize; +- (NSSize)minSize; +- (NSSize)constrainRows:(int *)r columns:(int *)c toSize:(NSSize)size; +- (void)setDesiredRows:(int)r columns:(int)c; - (PSMTabBarControl *)tabBarControl; - (IBAction)addNewTab:(id)sender; @@ -53,18 +45,17 @@ - (NSTabViewItem *)addNewTabViewItem; - (void)createScrollbarWithIdentifier:(long)ident type:(int)type; -- (void)destroyScrollbarWithIdentifier:(long)ident; -- (void)showScrollbarWithIdentifier:(long)ident state:(BOOL)visible; +- (BOOL)destroyScrollbarWithIdentifier:(long)ident; +- (BOOL)showScrollbarWithIdentifier:(long)ident state:(BOOL)visible; - (void)setScrollbarThumbValue:(float)val proportion:(float)prop identifier:(long)ident; - (void)setScrollbarPosition:(int)pos length:(int)len identifier:(long)ident; - (void)setDefaultColorsBackground:(NSColor *)back foreground:(NSColor *)fore; -- (BOOL)shouldUpdateWindowSize; -- (NSRect)textViewRectForContentSize:(NSSize)contentSize; -- (void)setShouldUpdateWindowSize:(BOOL)b; - -- (void)placeViews; // XXX: this should probably not be public +- (void)viewWillStartLiveResize; +- (void)viewDidEndLiveResize; +- (void)setFrameSize:(NSSize)size; +- (void)setFrame:(NSRect)frame; @end diff --git a/src/MacVim/MMVimView.m b/src/MacVim/MMVimView.m index 3a617dffdd..6935657450 100644 --- a/src/MacVim/MMVimView.m +++ b/src/MacVim/MMVimView.m @@ -10,7 +10,12 @@ /* * MMVimView * - * A view class with a tabline, scrollbars, and text view. + * A view class with a tabline, scrollbars, and a text view. The tabline may + * appear at the top of the view in which case it fills up the view from left + * to right edge. Any number of scrollbars may appear adjacent to all other + * edges of the view (there may be more than one scrollbar per edge and + * scrollbars may also be placed on the left edge of the view). The rest of + * the view is filled by the text view. */ #import "MMVimView.h" @@ -18,12 +23,10 @@ #import #import "MacVim.h" #import "MMTextView.h" -#import "MMTextStorage.h" -#import "MMTypesetter.h" #import "MMVimController.h" #import "MMAtsuiTextView.h" -#import "MMWindowController.h" // needed by MMScroller. TODO: remove + // Scroller type; these must match SBAR_* in gui.h enum { @@ -59,88 +62,49 @@ - (BOOL)rightScrollbarVisible; - (void)placeScrollbars; - (int)representedIndexOfTabViewItem:(NSTabViewItem *)tvi; - (MMScroller *)scrollbarForIdentifier:(long)ident index:(unsigned *)idx; -- (NSSize)contentSizeForTextStorageSize:(NSSize)textViewSize; -- (NSSize)textStorageSizeForTextViewSize:(NSSize)textViewSize; +- (NSSize)vimViewSizeForTextViewSize:(NSSize)textViewSize; +- (NSRect)textViewRectForVimViewSize:(NSSize)contentSize; - (NSTabView *)tabView; +- (void)frameSizeMayHaveChanged; @end -@implementation MMVimView +// This is an informal protocol implemented by MMWindowController (maybe it +// shold be a formal protocol, but ...). +@interface NSWindowController (MMVimViewDelegate) +- (void)liveResizeWillStart; +- (void)liveResizeDidEnd; +@end -- (NSRect)tabBarFrameForFrame:(NSRect)frame -{ - NSRect tabFrame = { - { 0, frame.size.height - 22 }, - { frame.size.width, 22 } - }; - return tabFrame; -} + + +@implementation MMVimView - (MMVimView *)initWithFrame:(NSRect)frame - vimController:(MMVimController *)controller { + vimController:(MMVimController *)controller +{ if (![super initWithFrame:frame]) return nil; vimController = controller; scrollbars = [[NSMutableArray alloc] init]; + // Only the tabline is autoresized, all other subview placement is done in + // frameSizeMayHaveChanged. + [self setAutoresizesSubviews:YES]; + if ([[NSUserDefaults standardUserDefaults] boolForKey:MMAtsuiRendererKey]) { // Use ATSUI for text rendering. + // + // HACK! 'textView' has type MMTextView, but MMAtsuiTextView is not + // derived from MMTextView. textView = [[MMAtsuiTextView alloc] initWithFrame:frame]; - - // HACK! The ATSUI text view has no text storage, but to avoid having - // to rewrite a lot of code we simply pretend like there still is a - // text storage. - textStorage = [textView retain]; } else { - // Set up a Cocoa text system. - textStorage = [[MMTextStorage alloc] init]; - NSLayoutManager *lm = [[NSLayoutManager alloc] init]; - NSTextContainer *tc = [[NSTextContainer alloc] initWithContainerSize: - NSMakeSize(1.0e7,1.0e7)]; - - NSString *typesetterString = [[NSUserDefaults standardUserDefaults] - stringForKey:MMTypesetterKey]; - if ([typesetterString isEqual:@"MMTypesetter"]) { - NSTypesetter *typesetter = [[MMTypesetter alloc] init]; - [lm setTypesetter:typesetter]; - [typesetter release]; - } else if ([typesetterString isEqual:@"MMTypesetter2"]) { - NSTypesetter *typesetter = [[MMTypesetter2 alloc] init]; - [lm setTypesetter:typesetter]; - [typesetter release]; - } else { - // Only MMTypesetter supports different cell width multipliers. - [[NSUserDefaults standardUserDefaults] - setFloat:1.0 forKey:MMCellWidthMultiplierKey]; - } - - // The characters in the text storage are in display order, so disable - // bidirectional text processing (this call is 10.4 only). - [[lm typesetter] setBidiProcessingEnabled:NO]; - - [tc setWidthTracksTextView:NO]; - [tc setHeightTracksTextView:NO]; - [tc setLineFragmentPadding:0]; - - [textStorage addLayoutManager:lm]; - [lm addTextContainer:tc]; - - textView = [[MMTextView alloc] initWithFrame:frame - textContainer:tc]; - - // The text storage retains the layout manager which in turn retains - // the text container. - [tc release]; - [lm release]; + // Use Cocoa text system for text rendering. + textView = [[MMTextView alloc] initWithFrame:frame]; } - // Allow control of text view inset via MMTextInset* user defaults. - NSUserDefaults *ud = [NSUserDefaults standardUserDefaults]; - int left = [ud integerForKey:MMTextInsetLeftKey]; - int top = [ud integerForKey:MMTextInsetTopKey]; - [textView setTextContainerInset:NSMakeSize(left, top)]; - + [textView setAutoresizingMask:NSViewNotSizable]; [self addSubview:textView]; // Create the tab view (which is never visible, but the tab bar control @@ -149,7 +113,8 @@ - (MMVimView *)initWithFrame:(NSRect)frame // Create the tab bar control (which is responsible for actually // drawing the tabline and tabs). - NSRect tabFrame = [self tabBarFrameForFrame:frame]; + NSRect tabFrame = { { 0, frame.size.height - 22 }, + { frame.size.width, 22 } }; tabBarControl = [[PSMTabBarControl alloc] initWithFrame:tabFrame]; [tabView setDelegate:tabBarControl]; @@ -157,16 +122,21 @@ - (MMVimView *)initWithFrame:(NSRect)frame [tabBarControl setTabView:tabView]; [tabBarControl setDelegate:self]; [tabBarControl setHidden:YES]; + + NSUserDefaults *ud = [NSUserDefaults standardUserDefaults]; [tabBarControl setCellMinWidth:[ud integerForKey:MMTabMinWidthKey]]; [tabBarControl setCellMaxWidth:[ud integerForKey:MMTabMaxWidthKey]]; [tabBarControl setCellOptimumWidth: [ud integerForKey:MMTabOptimumWidthKey]]; + [tabBarControl setShowAddTabButton:YES]; [[tabBarControl addTabButton] setTarget:self]; [[tabBarControl addTabButton] setAction:@selector(addNewTab:)]; [tabBarControl setAllowsDragBetweenWindows:NO]; + + [tabBarControl setAutoresizingMask:NSViewWidthSizable|NSViewMinYMargin]; - [tabBarControl setPartnerView:[self textView]]; + //[tabBarControl setPartnerView:[self textView]]; // tab bar resizing only works if awakeFromNib is called (that's where // the NSViewFrameDidChangeNotification callback is installed). Sounds like @@ -175,11 +145,6 @@ - (MMVimView *)initWithFrame:(NSRect)frame [self addSubview:tabBarControl]; - [self setPostsFrameChangedNotifications:YES]; - [[NSNotificationCenter defaultCenter] - addObserver:self selector:@selector(placeViews) - name:NSViewFrameDidChangeNotification object:self]; - return self; } @@ -188,8 +153,15 @@ - (void)dealloc [tabBarControl release]; tabBarControl = nil; [tabView release]; tabView = nil; [scrollbars release]; scrollbars = nil; + + // HACK! The text storage is the principal owner of the text system, but we + // keep only a reference to the text view, so release the text storage + // first (unless we are using the ATSUI renderer). + if (![[NSUserDefaults standardUserDefaults] + boolForKey:MMAtsuiRendererKey]) + [[textView textStorage] release]; + [textView release]; textView = nil; - [textStorage release]; textStorage = nil; [super dealloc]; } @@ -231,52 +203,33 @@ - (MMTextView *)textView return textView; } -- (MMTextStorage *)textStorage -{ - return textStorage; -} - - (NSMutableArray *)scrollbars { return scrollbars; } -- (BOOL)inLiveResize -{ - return [textView inLiveResize]; -} - - (PSMTabBarControl *)tabBarControl { return tabBarControl; } -- (NSTabView *)tabView -{ - return tabView; -} - - - (void)cleanup { vimController = nil; // NOTE! There is a bug in PSMTabBarControl in that it retains the delegate - // (which is the MMWindowController) so reset the delegate here, otherwise - // the MMWindowController never gets released resulting in a pretty serious - // memory leak. + // so reset the delegate here, otherwise the delegate may never get + // released. [tabView setDelegate:nil]; [tabBarControl setDelegate:nil]; [tabBarControl setTabView:nil]; [[self window] setDelegate:nil]; // NOTE! There is another bug in PSMTabBarControl where the control is not - // removed as an observer, so remove it here (else lots of evil nasty bugs - // will come and gnaw at your feet while you are sleeping). + // removed as an observer, so remove it here (failing to remove an observer + // may lead to very strange bugs). [[NSNotificationCenter defaultCenter] removeObserver:tabBarControl]; - [[NSNotificationCenter defaultCenter] removeObserver:self]; - [tabBarControl removeFromSuperviewWithoutNeedingDisplay]; [textView removeFromSuperviewWithoutNeedingDisplay]; @@ -289,34 +242,30 @@ - (void)cleanup [tabView removeAllTabViewItems]; } -- (NSSize)desiredSizeForActualRowsAndColumns +- (NSSize)desiredSize { - return [self contentSizeForTextStorageSize:[[self textStorage] size]]; + return [self vimViewSizeForTextViewSize:[[self textView] desiredSize]]; } -- (NSSize)getDesiredRows:(int *)r columns:(int *)c forSize:(NSSize)size +- (NSSize)minSize { - NSSize textViewSize = [self textViewRectForContentSize:size].size; - NSSize textStorageSize = [self textStorageSizeForTextViewSize:textViewSize]; - NSSize newSize = [textStorage fitToSize:textStorageSize rows:r columns:c]; - return [self contentSizeForTextStorageSize:newSize]; + return [self vimViewSizeForTextViewSize:[[self textView] minSize]]; } -- (void)getActualRows:(int *)r columns:(int *)c +- (NSSize)constrainRows:(int *)r columns:(int *)c toSize:(NSSize)size { - [textStorage getMaxRows:r columns:c]; + NSSize textViewSize = [self textViewRectForVimViewSize:size].size; + textViewSize = [textView constrainRows:r columns:c toSize:textViewSize]; + return [self vimViewSizeForTextViewSize:textViewSize]; } -- (void)setActualRows:(int)r columns:(int)c +- (void)setDesiredRows:(int)r columns:(int)c { - [textStorage setMaxRows:r columns:c]; + [textView setMaxRows:r columns:c]; } - (IBAction)addNewTab:(id)sender { - // NOTE! This can get called a lot if the user holds down the key - // equivalent for this action, which causes the ports to fill up. If we - // wait for the message to be sent then the app might become unresponsive. [vimController sendMessage:AddNewTabMsgID data:nil]; } @@ -389,16 +338,16 @@ - (void)selectTabWithIndex:(int)idx [[self tabView] selectTabViewItem:tvi]; vimTaskSelectedTab = NO; - // we might need to change the scrollbars that are visible + // We might need to change the scrollbars that are visible. [self placeScrollbars]; } } - (NSTabViewItem *)addNewTabViewItem { - // NOTE! A newly created tab is not by selected by default; the VimTask - // decides which tab should be selected at all times. However, the AppKit - // will automatically select the first tab added to a tab view. + // NOTE! A newly created tab is not by selected by default; Vim decides + // which tab should be selected at all times. However, the AppKit will + // automatically select the first tab added to a tab view. NSTabViewItem *tvi = [[NSTabViewItem alloc] initWithIdentifier:nil]; @@ -412,48 +361,6 @@ - (NSTabViewItem *)addNewTabViewItem return tvi; } -- (int)representedIndexOfTabViewItem:(NSTabViewItem *)tvi -{ - NSArray *tabViewItems = [[self tabBarControl] representedTabViewItems]; - return [tabViewItems indexOfObject:tvi]; -} - -- (BOOL)bottomScrollbarVisible -{ - unsigned i, count = [scrollbars count]; - for (i = 0; i < count; ++i) { - MMScroller *scroller = [scrollbars objectAtIndex:i]; - if ([scroller type] == MMScrollerTypeBottom && ![scroller isHidden]) - return YES; - } - - return NO; -} - -- (BOOL)leftScrollbarVisible -{ - unsigned i, count = [scrollbars count]; - for (i = 0; i < count; ++i) { - MMScroller *scroller = [scrollbars objectAtIndex:i]; - if ([scroller type] == MMScrollerTypeLeft && ![scroller isHidden]) - return YES; - } - - return NO; -} - -- (BOOL)rightScrollbarVisible -{ - unsigned i, count = [scrollbars count]; - for (i = 0; i < count; ++i) { - MMScroller *scroller = [scrollbars objectAtIndex:i]; - if ([scroller type] == MMScrollerTypeRight && ![scroller isHidden]) - return YES; - } - - return NO; -} - - (void)createScrollbarWithIdentifier:(long)ident type:(int)type { //NSLog(@"Create scroller %d of type %d", ident, type); @@ -468,42 +375,35 @@ - (void)createScrollbarWithIdentifier:(long)ident type:(int)type [scroller release]; } -- (void)destroyScrollbarWithIdentifier:(long)ident +- (BOOL)destroyScrollbarWithIdentifier:(long)ident { //NSLog(@"Destroy scroller %d", ident); unsigned idx = 0; MMScroller *scroller = [self scrollbarForIdentifier:ident index:&idx]; - if (scroller) { - [scroller removeFromSuperview]; - [[self scrollbars] removeObjectAtIndex:idx]; + if (!scroller) return NO; - if (![scroller isHidden]) { - // A visible scroller was removed, so the window must resize to - // fit. - //NSLog(@"Visible scroller %d was destroyed, resizing window.", - // ident); - shouldUpdateWindowSize = YES; - } - } + [scroller removeFromSuperview]; + [[self scrollbars] removeObjectAtIndex:idx]; + + // If a visible scroller was removed then the vim view must resize. This + // is handled by the window controller (the vim view never resizes itself). + return ![scroller isHidden]; } -- (void)showScrollbarWithIdentifier:(long)ident state:(BOOL)visible +- (BOOL)showScrollbarWithIdentifier:(long)ident state:(BOOL)visible { MMScroller *scroller = [self scrollbarForIdentifier:ident index:NULL]; - if (!scroller) return; + if (!scroller) return NO; BOOL wasVisible = ![scroller isHidden]; //NSLog(@"%s scroller %d (was %svisible)", visible ? "Show" : "Hide", // ident, wasVisible ? "" : "in"); [scroller setHidden:!visible]; - if (wasVisible != visible) { - // A scroller was hidden or shown, so the window must resize to fit. - //NSLog(@"%s scroller %d and resize.", visible ? "Show" : "Hide", - // ident); - shouldUpdateWindowSize = YES; - } + // If a scroller was hidden or shown then the vim view must resize. This + // is handled by the window controller (the vim view never resizes itself). + return wasVisible != visible; } - (void)setScrollbarThumbValue:(float)val proportion:(float)prop @@ -531,6 +431,161 @@ - (void)scroll:(id)sender [vimController sendMessage:ScrollbarEventMsgID data:data]; } +- (void)setScrollbarPosition:(int)pos length:(int)len identifier:(long)ident +{ + MMScroller *scroller = [self scrollbarForIdentifier:ident index:NULL]; + NSRange range = NSMakeRange(pos, len); + if (!NSEqualRanges(range, [scroller range])) { + //NSLog(@"Set range %@ for scroller %d", + // NSStringFromRange(range), ident); + [scroller setRange:range]; + // TODO! Should only do this once per update. + + // This could be sent because a text window was created or closed, so + // we might need to update which scrollbars are visible. + [self placeScrollbars]; + } +} + +- (void)setDefaultColorsBackground:(NSColor *)back foreground:(NSColor *)fore +{ + [textView setDefaultColorsBackground:back foreground:fore]; +} + + +// -- PSMTabBarControl delegate ---------------------------------------------- + + +- (BOOL)tabView:(NSTabView *)theTabView shouldSelectTabViewItem: + (NSTabViewItem *)tabViewItem +{ + // NOTE: It would be reasonable to think that 'shouldSelect...' implies + // that this message only gets sent when the user clicks the tab. + // Unfortunately it is not so, which is why we need the + // 'vimTaskSelectedTab' flag. + // + // HACK! The selection message should not be propagated to Vim if Vim + // selected the tab (e.g. as opposed the user clicking the tab). The + // delegate method has no way of knowing who initiated the selection so a + // flag is set when Vim initiated the selection. + if (!vimTaskSelectedTab) { + // Propagate the selection message to Vim. + int idx = [self representedIndexOfTabViewItem:tabViewItem]; + if (NSNotFound != idx) { + NSData *data = [NSData dataWithBytes:&idx length:sizeof(int)]; + [vimController sendMessage:SelectTabMsgID data:data]; + } + } + + // Unless Vim selected the tab, return NO, and let Vim decide if the tab + // should get selected or not. + return vimTaskSelectedTab; +} + +- (BOOL)tabView:(NSTabView *)theTabView shouldCloseTabViewItem: + (NSTabViewItem *)tabViewItem +{ + // HACK! This method is only called when the user clicks the close button + // on the tab. Instead of letting the tab bar close the tab, we return NO + // and pass a message on to Vim to let it handle the closing. + int idx = [self representedIndexOfTabViewItem:tabViewItem]; + //NSLog(@"Closing tab with index %d", idx); + NSData *data = [NSData dataWithBytes:&idx length:sizeof(int)]; + [vimController sendMessage:CloseTabMsgID data:data]; + + return NO; +} + +- (void)tabView:(NSTabView *)theTabView didDragTabViewItem: + (NSTabViewItem *)tabViewItem toIndex:(int)idx +{ + NSMutableData *data = [NSMutableData data]; + [data appendBytes:&idx length:sizeof(int)]; + + [vimController sendMessage:DraggedTabMsgID data:data]; +} + + +// -- NSView customization --------------------------------------------------- + + +- (void)viewWillStartLiveResize +{ + id windowController = [[self window] windowController]; + [windowController liveResizeWillStart]; + + [super viewWillStartLiveResize]; +} + +- (void)viewDidEndLiveResize +{ + id windowController = [[self window] windowController]; + [windowController liveResizeDidEnd]; + + [super viewDidEndLiveResize]; +} + +- (void)setFrameSize:(NSSize)size +{ + // NOTE: Instead of only acting when a frame was resized, we do some + // updating each time a frame may be resized. (At the moment, if we only + // respond to actual frame changes then typing ":set lines=1000" twice in a + // row will result in the vim view holding more rows than the can fit + // inside the window.) + [super setFrameSize:size]; + [self frameSizeMayHaveChanged]; +} + +- (void)setFrame:(NSRect)frame +{ + // See comment in setFrameSize: above. + [super setFrame:frame]; + [self frameSizeMayHaveChanged]; +} + +@end // MMVimView + + + + +@implementation MMVimView (Private) + +- (BOOL)bottomScrollbarVisible +{ + unsigned i, count = [scrollbars count]; + for (i = 0; i < count; ++i) { + MMScroller *scroller = [scrollbars objectAtIndex:i]; + if ([scroller type] == MMScrollerTypeBottom && ![scroller isHidden]) + return YES; + } + + return NO; +} + +- (BOOL)leftScrollbarVisible +{ + unsigned i, count = [scrollbars count]; + for (i = 0; i < count; ++i) { + MMScroller *scroller = [scrollbars objectAtIndex:i]; + if ([scroller type] == MMScrollerTypeLeft && ![scroller isHidden]) + return YES; + } + + return NO; +} + +- (BOOL)rightScrollbarVisible +{ + unsigned i, count = [scrollbars count]; + for (i = 0; i < count; ++i) { + MMScroller *scroller = [scrollbars objectAtIndex:i]; + if ([scroller type] == MMScrollerTypeRight && ![scroller isHidden]) + return YES; + } + + return NO; +} + - (void)placeScrollbars { NSRect textViewFrame = [textView frame]; @@ -574,7 +629,7 @@ - (void)placeScrollbars NSRect rect; if ([scroller type] == MMScrollerTypeBottom) { - rect = [textStorage rectForColumnsInRange:[scroller range]]; + rect = [textView rectForColumnsInRange:[scroller range]]; rect.size.height = [NSScroller scrollerWidth]; if (lsbVisible) rect.origin.x += [NSScroller scrollerWidth]; @@ -598,7 +653,7 @@ - (void)placeScrollbars if (rect.size.width < 0) rect.size.width = 0; } else { - rect = [textStorage rectForRowsInRange:[scroller range]]; + rect = [textView rectForRowsInRange:[scroller range]]; // Adjust for the fact that text layout is flipped. rect.origin.y = NSMaxY(textViewFrame) - rect.origin.y - rect.size.height; @@ -653,6 +708,12 @@ - (void)placeScrollbars } } +- (int)representedIndexOfTabViewItem:(NSTabViewItem *)tvi +{ + NSArray *tabViewItems = [[self tabBarControl] representedTabViewItems]; + return [tabViewItems indexOfObject:tvi]; +} + - (MMScroller *)scrollbarForIdentifier:(long)ident index:(unsigned *)idx { unsigned i, count = [[self scrollbars] count]; @@ -667,53 +728,7 @@ - (MMScroller *)scrollbarForIdentifier:(long)ident index:(unsigned *)idx return nil; } -- (void)setScrollbarPosition:(int)pos length:(int)len identifier:(long)ident -{ - MMScroller *scroller = [self scrollbarForIdentifier:ident index:NULL]; - NSRange range = NSMakeRange(pos, len); - if (!NSEqualRanges(range, [scroller range])) { - //NSLog(@"Set range %@ for scroller %d", - // NSStringFromRange(range), ident); - [scroller setRange:range]; - // TODO! Should only do this once per update. - - // This could be sent because a text window was created or closed, so - // we might need to update which scrollbars are visible. - [self placeScrollbars]; - } -} - -- (void)placeViews -{ - NSRect textViewRect = [self textViewRectForContentSize:[self frame].size]; - - // Give all superfluous space to the text view. It might be smaller or - // larger than it wants to be, but this is needed during life resizing - [[self textView] setFrame:textViewRect]; - - // for some reason, autoresizing doesn't work...set tab size manually - [tabBarControl setFrame:[self tabBarFrameForFrame:[self frame]]]; - - [self placeScrollbars]; -} - -- (void)setDefaultColorsBackground:(NSColor *)back foreground:(NSColor *)fore -{ - [textStorage setDefaultColorsBackground:back foreground:fore]; - [textView setBackgroundColor:back]; -} - -- (BOOL)shouldUpdateWindowSize -{ - return shouldUpdateWindowSize; -} - -- (void)setShouldUpdateWindowSize:(BOOL)b -{ - shouldUpdateWindowSize = b; -} - -- (NSSize)contentSizeForTextStorageSize:(NSSize)textViewSize +- (NSSize)vimViewSizeForTextViewSize:(NSSize)textViewSize { NSSize size = textViewSize; @@ -727,17 +742,10 @@ - (NSSize)contentSizeForTextStorageSize:(NSSize)textViewSize if ([self rightScrollbarVisible]) size.width += [NSScroller scrollerWidth]; - NSUserDefaults *ud = [NSUserDefaults standardUserDefaults]; - int right = [ud integerForKey:MMTextInsetRightKey]; - int bot = [ud integerForKey:MMTextInsetBottomKey]; - - size.width += [[self textView] textContainerOrigin].x + right; - size.height += [[self textView] textContainerOrigin].y + bot; - return size; } -- (NSRect)textViewRectForContentSize:(NSSize)contentSize +- (NSRect)textViewRectForVimViewSize:(NSSize)contentSize { NSRect rect = { 0, 0, contentSize.width, contentSize.height }; @@ -758,74 +766,65 @@ - (NSRect)textViewRectForContentSize:(NSSize)contentSize return rect; } -- (NSSize)textStorageSizeForTextViewSize:(NSSize)textViewSize +- (NSTabView *)tabView { - NSSize size = textViewSize; - - NSUserDefaults *ud = [NSUserDefaults standardUserDefaults]; - int right = [ud integerForKey:MMTextInsetRightKey]; - int bot = [ud integerForKey:MMTextInsetBottomKey]; - - size.width -= [[self textView] textContainerOrigin].x + right; - size.height -= [[self textView] textContainerOrigin].y + bot; - - return size; + return tabView; } +- (void)frameSizeMayHaveChanged +{ + // NOTE: Whenever a call is made that may have changed the frame size we + // take the opportunity to make sure all subviews are in place and that the + // (rows,columns) are constrained to lie inside the new frame. We not only + // do this when the frame really has changed since it is possible to modify + // the number of (rows,columns) without changing the frame size. -// -- PSMTabBarControl delegate ---------------------------------------------- + // Give all superfluous space to the text view. It might be smaller or + // larger than it wants to be, but this is needed during live resizing. + NSRect textViewRect = [self textViewRectForVimViewSize:[self frame].size]; + [[self textView] setFrame:textViewRect]; + [self placeScrollbars]; -- (BOOL)tabView:(NSTabView *)theTabView shouldSelectTabViewItem: - (NSTabViewItem *)tabViewItem -{ - // NOTE: It would be reasonable to think that 'shouldSelect...' implies - // that this message only gets sent when the user clicks the tab. - // Unfortunately it is not so, which is why we need the - // 'vimTaskSelectedTab' flag. + // It is possible that the current number of (rows,columns) is too big or + // too small to fit the new frame. If so, notify Vim that the text + // dimensions should change, but don't actually change the number of + // (rows,columns). These numbers may only change when Vim initiates the + // change (as opposed to the user dragging the window resizer, for + // example). // - // HACK! The selection message should not be propagated to the VimTask if - // the VimTask selected the tab (e.g. as opposed the user clicking the - // tab). The delegate method has no way of knowing who initiated the - // selection so a flag is set when the VimTask initiated the selection. - if (!vimTaskSelectedTab) { - // Propagate the selection message to the VimTask. - int idx = [self representedIndexOfTabViewItem:tabViewItem]; - if (NSNotFound != idx) { - NSData *data = [NSData dataWithBytes:&idx length:sizeof(int)]; - [vimController sendMessage:SelectTabMsgID data:data]; + // Note that the message sent to Vim depends on whether we're in + // a live resize or not -- this is necessary to avoid the window jittering + // when the user drags to resize. + int constrained[2]; + NSSize textViewSize = [[self textView] frame].size; + [textView constrainRows:&constrained[0] columns:&constrained[1] + toSize:textViewSize]; + + int rows, cols; + [textView getMaxRows:&rows columns:&cols]; + + if (constrained[0] != rows || constrained[1] != cols) { + NSData *data = [NSData dataWithBytes:constrained length:2*sizeof(int)]; + int msgid = [self inLiveResize] ? LiveResizeMsgID + : SetTextDimensionsMsgID; + + //NSLog(@"Notify Vim that text dimensions changed from %dx%d to %dx%d" + // " (%s)", cols, rows, constrained[1], constrained[0], + // MessageStrings[msgid]); + + [vimController sendMessage:msgid data:data]; + + // We only want to set the window title if this resize came from + // a live-resize, not (for example) setting 'columns' or 'lines'. + if ([self inLiveResize]) { + [[self window] setTitle:[NSString stringWithFormat:@"%dx%d", + constrained[1], constrained[0]]]; } } - - // Unless Vim selected the tab, return NO, and let Vim decide if the tab - // should get selected or not. - return vimTaskSelectedTab; } -- (BOOL)tabView:(NSTabView *)theTabView shouldCloseTabViewItem: - (NSTabViewItem *)tabViewItem -{ - // HACK! This method is only called when the user clicks the close button - // on the tab. Instead of letting the tab bar close the tab, we return NO - // and pass a message on to Vim to let it handle the closing. - int idx = [self representedIndexOfTabViewItem:tabViewItem]; - //NSLog(@"Closing tab with index %d", idx); - NSData *data = [NSData dataWithBytes:&idx length:sizeof(int)]; - [vimController sendMessage:CloseTabMsgID data:data]; - - return NO; -} - -- (void)tabView:(NSTabView *)theTabView didDragTabViewItem: - (NSTabViewItem *)tabViewItem toIndex:(int)idx -{ - NSMutableData *data = [NSMutableData data]; - [data appendBytes:&idx length:sizeof(int)]; - - [vimController sendMessage:DraggedTabMsgID data:data]; -} - -@end +@end // MMVimView (Private) @@ -858,12 +857,14 @@ - (id)initWithIdentifier:(long)ident type:(int)theType ? NSMakeRect(0, 0, 1, 0) : NSMakeRect(0, 0, 0, 1); - if ((self = [super initWithFrame:frame])) { - identifier = ident; - type = theType; - [self setHidden:YES]; - [self setEnabled:YES]; - } + self = [super initWithFrame:frame]; + if (!self) return nil; + + identifier = ident; + type = theType; + [self setHidden:YES]; + [self setEnabled:YES]; + [self setAutoresizingMask:NSViewNotSizable]; return self; } @@ -891,8 +892,9 @@ - (void)setRange:(NSRange)newRange - (void)scrollWheel:(NSEvent *)event { // HACK! Pass message on to the text view. - MMWindowController *wc = [[self window] windowController]; - [[wc textView] scrollWheel:event]; + NSView *vimView = [self superview]; + if ([vimView isKindOfClass:[MMVimView class]]) + [[(MMVimView*)vimView textView] scrollWheel:event]; } @end // MMScroller diff --git a/src/MacVim/MMWindow.h b/src/MacVim/MMWindow.h new file mode 100644 index 0000000000..e80dafcb9e --- /dev/null +++ b/src/MacVim/MMWindow.h @@ -0,0 +1,32 @@ +/* vi:set ts=8 sts=4 sw=4 ft=objc: + * + * VIM - Vi IMproved by Bram Moolenaar + * MacVim GUI port by Bjorn Winckler + * + * Do ":help uganda" in Vim to read copying and usage conditions. + * Do ":help credits" in Vim to see a list of people who contributed. + * See README.txt for an overview of the Vim source code. + */ + +#import + + + +@interface MMWindow : NSWindow { + NSBox *tablineSeparator; +} + +- (id)initWithContentRect:(NSRect)rect + styleMask:(unsigned int)style + backing:(NSBackingStoreType)bufferingType + defer:(BOOL)flag; + +- (BOOL)hideTablineSeparator:(BOOL)hide; + +- (NSRect)contentRectForFrameRect:(NSRect)frame; +- (NSRect)frameRectForContentRect:(NSRect)rect; +- (void)setContentMinSize:(NSSize)size; +- (void)setContentMaxSize:(NSSize)size; +- (void)setContentSize:(NSSize)size; + +@end diff --git a/src/MacVim/MMWindow.m b/src/MacVim/MMWindow.m new file mode 100644 index 0000000000..2a5968f586 --- /dev/null +++ b/src/MacVim/MMWindow.m @@ -0,0 +1,120 @@ +/* vi:set ts=8 sts=4 sw=4 ft=objc: + * + * VIM - Vi IMproved by Bram Moolenaar + * MacVim GUI port by Bjorn Winckler + * + * Do ":help uganda" in Vim to read copying and usage conditions. + * Do ":help credits" in Vim to see a list of people who contributed. + * See README.txt for an overview of the Vim source code. + */ +/* + * MMWindow + * + * A normal window with a (possibly hidden) tabline separator at the top of the + * content view. + * + * The main point of this class is for the window controller to be able to call + * contentRectForFrameRect: without having to worry about whether the separator + * is visible or not. + * + * This is a bit of a hack, it would be nicer to be able to leave the content + * view alone, but as it is the tabline separator is a subview of the content + * view. Since we want to pretend that the content view does not contain the + * separator this leads to some dangerous situations. For instance, calling + * [window setContentMinSize:size] when the separator is visible results in + * size != [window contentMinSize], since the latter is one pixel higher than + * 'size'. + */ + +#import "MMWindow.h" +#import "MacVim.h" + + + + +@implementation MMWindow + +- (id)initWithContentRect:(NSRect)rect + styleMask:(unsigned int)style + backing:(NSBackingStoreType)bufferingType + defer:(BOOL)flag +{ + self = [super initWithContentRect:rect + styleMask:style + backing:bufferingType + defer:flag]; + if (!self) return nil; + + NSRect tabSepRect = { 0, rect.size.height - 1, rect.size.width, 1 }; + tablineSeparator = [[NSBox alloc] initWithFrame:tabSepRect]; + + [tablineSeparator setBoxType:NSBoxSeparator]; + [tablineSeparator setHidden:YES]; + [tablineSeparator setAutoresizingMask:NSViewWidthSizable|NSViewMinYMargin]; + + NSView *contentView = [self contentView]; + [contentView setAutoresizesSubviews:YES]; + [contentView addSubview:tablineSeparator]; + + return self; +} + +- (void)dealloc +{ + [tablineSeparator removeFromSuperviewWithoutNeedingDisplay]; + [tablineSeparator release]; tablineSeparator = nil; + [super dealloc]; +} + +- (BOOL)hideTablineSeparator:(BOOL)hide +{ + BOOL isHidden = [tablineSeparator isHidden]; + [tablineSeparator setHidden:hide]; + + // Return YES if visibility state was toggled, NO if it was unchanged. + return isHidden != hide; +} + +- (NSRect)contentRectForFrameRect:(NSRect)frame +{ + NSRect rect = [super contentRectForFrameRect:frame]; + if (![tablineSeparator isHidden]) + --rect.size.height; + + return rect; +} + +- (NSRect)frameRectForContentRect:(NSRect)rect +{ + NSRect frame = [super frameRectForContentRect:rect]; + if (![tablineSeparator isHidden]) + ++frame.size.height; + + return frame; +} + +- (void)setContentMinSize:(NSSize)size +{ + if (![tablineSeparator isHidden]) + ++size.height; + + [super setContentMinSize:size]; +} + +- (void)setContentMaxSize:(NSSize)size +{ + if (![tablineSeparator isHidden]) + ++size.height; + + [super setContentMaxSize:size]; +} + +- (void)setContentSize:(NSSize)size +{ + if (![tablineSeparator isHidden]) + ++size.height; + + [super setContentSize:size]; +} + +@end // MMWindow diff --git a/src/MacVim/MMWindowController.h b/src/MacVim/MMWindowController.h index c73bb777f6..a2fd82e7d2 100644 --- a/src/MacVim/MMWindowController.h +++ b/src/MacVim/MMWindowController.h @@ -12,27 +12,25 @@ +@class MMWindow; @class MMFullscreenWindow; @class MMVimController; -@class MMTextStorage; -@class MMTextView; @class MMVimView; @interface MMWindowController : NSWindowController { - NSBox *tablineSeparator; MMVimController *vimController; MMVimView *vimView; BOOL setupDone; - BOOL shouldUpdateWindowSize; + BOOL shouldResizeVimView; + BOOL fullscreenEnabled; NSString *windowAutosaveKey; MMFullscreenWindow *fullscreenWindow; + MMWindow *decoratedWindow; NSString *lastSetTitle; } - (id)initWithVimController:(MMVimController *)controller; - (MMVimController *)vimController; -- (MMTextView *)textView; -- (MMTextStorage *)textStorage; - (MMVimView *)vimView; - (NSString *)windowAutosaveKey; - (void)setWindowAutosaveKey:(NSString *)key; @@ -40,10 +38,12 @@ - (void)openWindow; - (void)updateTabsWithData:(NSData *)data; - (void)selectTabWithIndex:(int)idx; -- (void)setTextDimensionsWithRows:(int)rows columns:(int)cols; +- (void)setTextDimensionsWithRows:(int)rows columns:(int)cols live:(BOOL)live; +- (void)setTitle:(NSString *)title; +- (void)setToolbar:(NSToolbar *)toolbar; - (void)createScrollbarWithIdentifier:(long)ident type:(int)type; -- (void)destroyScrollbarWithIdentifier:(long)ident; -- (void)showScrollbarWithIdentifier:(long)ident state:(BOOL)visible; +- (BOOL)destroyScrollbarWithIdentifier:(long)ident; +- (BOOL)showScrollbarWithIdentifier:(long)ident state:(BOOL)visible; - (void)setScrollbarPosition:(int)pos length:(int)len identifier:(long)ident; - (void)setScrollbarThumbValue:(float)val proportion:(float)prop identifier:(long)ident; @@ -58,10 +58,10 @@ - (void)adjustLinespace:(int)linespace; - (void)liveResizeWillStart; - (void)liveResizeDidEnd; -- (void)placeViews; - (void)enterFullscreen; - (void)leaveFullscreen; +- (void)setBuffersModified:(BOOL)mod; - (IBAction)addNewTab:(id)sender; - (IBAction)toggleToolbar:(id)sender; diff --git a/src/MacVim/MMWindowController.m b/src/MacVim/MMWindowController.m index 8071af9c01..acf09f8b09 100644 --- a/src/MacVim/MMWindowController.m +++ b/src/MacVim/MMWindowController.m @@ -12,60 +12,76 @@ * * Handles resizing of windows, acts as an mediator between MMVimView and * MMVimController. + * + * Resizing in windowed mode: + * + * In windowed mode resizing can occur either due to the window frame changing + * size (e.g. when the user drags to resize), or due to Vim changing the number + * of (rows,columns). The former case is dealt with by letting the vim view + * fill the entire content view when the window has resized. In the latter + * case we ensure that vim view fits on the screen. + * + * The vim view notifies Vim if the number of (rows,columns) does not match the + * current number whenver the view size is about to change. Upon receiving a + * dimension change message, Vim notifies the window controller and the window + * resizes. However, the window is never resized programmatically during a + * live resize (in order to avoid jittering). + * + * The window size is constrained to not become too small during live resize, + * and it is also constrained to always fit an integer number of + * (rows,columns). + * + * In windowed mode we have to manually draw a tabline separator (due to bugs + * in the way Cocoa deals with the toolbar separator) when certain conditions + * are met. The rules for this are as follows: + * + * Tabline visible & Toolbar visible => Separator visible + * ===================================================================== + * NO & NO => YES, if the window is textured + * NO, otherwise + * NO & YES => YES + * YES & NO => NO + * YES & YES => NO + * + * + * Resizing in full-screen mode: + * + * The window never resizes since it fills the screen, however the vim view may + * change size, e.g. when the user types ":set lines=60", or when a scrollbar + * is toggled. + * + * It is ensured that the vim view never becomes larger than the screen size + * and that it always stays in the center of the screen. + * */ #import "MMWindowController.h" -#import -#import "MMTextView.h" -#import "MMTextStorage.h" -#import "MMVimController.h" -#import "MacVim.h" #import "MMAppController.h" -#import "MMTypesetter.h" +#import "MMAtsuiTextView.h" #import "MMFullscreenWindow.h" +#import "MMTextView.h" +#import "MMTypesetter.h" +#import "MMVimController.h" #import "MMVimView.h" -#import "MMAtsuiTextView.h" +#import "MMWindow.h" +#import "MacVim.h" + +#import @interface MMWindowController (Private) - (NSSize)contentSize; -- (NSRect)contentRectForFrameRect:(NSRect)frame; -- (NSRect)frameRectForContentRect:(NSRect)contentRect; -- (void)resizeWindowToFit:(id)sender; -- (NSRect)fitWindowToFrame:(NSRect)frame; -- (void)updateResizeIncrements; +- (void)resizeWindowToFitContentSize:(NSSize)contentSize; +- (NSSize)constrainContentSizeToScreenSize:(NSSize)contentSize; +- (void)updateResizeConstraints; - (NSTabViewItem *)addNewTabViewItem; - (IBAction)vimMenuItemAction:(id)sender; - (BOOL)askBackendForStarRegister:(NSPasteboard *)pb; -- (void)checkWindowNeedsResizing; -- (NSSize)resizeVimViewToFitSize:(NSSize)size; +- (void)hideTablineSeparator:(BOOL)hide; @end - -#if 0 -NSString *buildMenuItemDescriptor(NSMenu *menu, NSString *tail) -{ - return menu ? buildMenuItemDescriptor([menu supermenu], [[menu title] - stringByAppendingString:tail]) - : tail; -} - -NSMutableArray *buildMenuAddress(NSMenu *menu) -{ - NSMutableArray *addr; - if (menu) { - addr = buildMenuAddress([menu supermenu]); - [addr addObject:[menu title]]; - } else { - addr = [NSMutableArray array]; - } - - return addr; -} -#endif - @interface NSWindow (NSWindowPrivate) // Note: This hack allows us to set content shadowing separately from // the window shadow. This is apparently what webkit and terminal do. @@ -76,6 +92,7 @@ - (void)_setContentHasShadow:(BOOL)shadow; // new Tiger private method - (void)setBottomCornerRounded:(BOOL)rounded; @end + @interface NSWindow (NSLeopardOnly) // Note: These functions are Leopard-only, use -[NSObject respondsToSelector:] // before calling them to make sure everything works on Tiger too. @@ -118,70 +135,61 @@ - (id)initWithVimController:(MMVimController *)controller // started (or rather, when ~/Library/Preferences/org.vim.MacVim.plist does // not exist). The chosen values will put the window somewhere near the // top and in the middle of a 1024x768 screen. - NSWindow *win = [[NSWindow alloc] + MMWindow *win = [[[MMWindow alloc] initWithContentRect:NSMakeRect(242,364,480,360) styleMask:styleMask backing:NSBackingStoreBuffered - defer:YES]; - - if ((self = [super initWithWindow:win])) { - vimController = controller; - - // Window cascading is handled by MMAppController. - [self setShouldCascadeWindows:NO]; - - NSView *contentView = [win contentView]; - vimView = [[MMVimView alloc] initWithFrame:[contentView frame] - vimController:vimController]; - [contentView addSubview:vimView]; - - // Create the tabline separator (which may be visible when the tabline - // is hidden). See showTabBar: for circumstances when the separator - // should be hidden. - NSRect tabSepRect = [contentView frame]; - tabSepRect.origin.y = NSMaxY(tabSepRect)-1; - tabSepRect.size.height = 1; - tablineSeparator = [[NSBox alloc] initWithFrame:tabSepRect]; - - [tablineSeparator setBoxType:NSBoxSeparator]; - [tablineSeparator setHidden:NO]; - [tablineSeparator setAutoresizingMask:NSViewWidthSizable - | NSViewMinYMargin]; - - [contentView setAutoresizesSubviews:YES]; - [contentView addSubview:tablineSeparator]; - - [win setDelegate:self]; - [win setInitialFirstResponder:[vimView textView]]; - - if ([win styleMask] & NSTexturedBackgroundWindowMask) { - // On Leopard, we want to have a textured window to have nice - // looking tabs. But the textured window look implies rounded - // corners, which looks really weird -- disable them. This is a - // private api, though. - if ([win respondsToSelector:@selector(setBottomCornerRounded:)]) - [win setBottomCornerRounded:NO]; - - // When the tab bar is toggled, it changes color for the fraction - // of a second, probably because vim sends us events in a strange - // order, confusing appkit's content border heuristic for a short - // while. This can be worked around with these two methods. There - // might be a better way, but it's good enough. - if ([win respondsToSelector:@selector( - setAutorecalculatesContentBorderThickness:forEdge:)]) - [win setAutorecalculatesContentBorderThickness:NO - forEdge:NSMaxYEdge]; - if ([win respondsToSelector: - @selector(setContentBorderThickness:forEdge:)]) - [win setContentBorderThickness:0 forEdge:NSMaxYEdge]; - } - - // Make us safe on pre-tiger OSX - if ([win respondsToSelector:@selector(_setContentHasShadow:)]) - [win _setContentHasShadow:NO]; + defer:YES] autorelease]; + + self = [super initWithWindow:win]; + if (!self) return nil; + + vimController = controller; + decoratedWindow = [win retain]; + + // Window cascading is handled by MMAppController. + [self setShouldCascadeWindows:NO]; + + // NOTE: Autoresizing is enabled for the content view, but only used + // for the tabline separator. The vim view must be resized manually + // because of full-screen considerations, and because its size depends + // on whether the tabline separator is visible or not. + NSView *contentView = [win contentView]; + [contentView setAutoresizesSubviews:YES]; + + vimView = [[MMVimView alloc] initWithFrame:[contentView frame] + vimController:vimController]; + [vimView setAutoresizingMask:NSViewNotSizable]; + [contentView addSubview:vimView]; + + [win setDelegate:self]; + [win setInitialFirstResponder:[vimView textView]]; + + if ([win styleMask] & NSTexturedBackgroundWindowMask) { + // On Leopard, we want to have a textured window to have nice + // looking tabs. But the textured window look implies rounded + // corners, which looks really weird -- disable them. This is a + // private api, though. + if ([win respondsToSelector:@selector(setBottomCornerRounded:)]) + [win setBottomCornerRounded:NO]; + + // When the tab bar is toggled, it changes color for the fraction + // of a second, probably because vim sends us events in a strange + // order, confusing appkit's content border heuristic for a short + // while. This can be worked around with these two methods. There + // might be a better way, but it's good enough. + if ([win respondsToSelector:@selector( + setAutorecalculatesContentBorderThickness:forEdge:)]) + [win setAutorecalculatesContentBorderThickness:NO + forEdge:NSMaxYEdge]; + if ([win respondsToSelector: + @selector(setContentBorderThickness:forEdge:)]) + [win setContentBorderThickness:0 forEdge:NSMaxYEdge]; } - [win release]; + // Make us safe on pre-tiger OSX + if ([win respondsToSelector:@selector(_setContentHasShadow:)]) + [win _setContentHasShadow:NO]; return self; } @@ -190,7 +198,7 @@ - (void)dealloc { //NSLog(@"%@ %s", [self className], _cmd); - [tablineSeparator release]; tablineSeparator = nil; + [decoratedWindow release]; decoratedWindow = nil; [windowAutosaveKey release]; windowAutosaveKey = nil; [vimView release]; vimView = nil; @@ -210,16 +218,6 @@ - (MMVimController *)vimController return vimController; } -- (MMTextView *)textView -{ - return [vimView textView]; -} - -- (MMTextStorage *)textStorage -{ - return [vimView textStorage]; -} - - (MMVimView *)vimView { return vimView; @@ -240,24 +238,23 @@ - (void)cleanup { //NSLog(@"%@ %s", [self className], _cmd); - if (fullscreenWindow != nil) { - // if we are closed while still in fullscreen, end fullscreen mode, + if (fullscreenEnabled) { + // If we are closed while still in fullscreen, end fullscreen mode, // release ourselves (because this won't happen in MMWindowController) - // and perform close operation on the original window + // and perform close operation on the original window. [self leaveFullscreen]; } setupDone = NO; vimController = nil; - [tablineSeparator removeFromSuperviewWithoutNeedingDisplay]; [vimView removeFromSuperviewWithoutNeedingDisplay]; - [vimView cleanup]; // TODO: is this necessary? + [vimView cleanup]; - // It is feasible that the user quits before the window controller is - // released, make sure the edit flag is cleared so no warning dialog is - // displayed. - [[self window] setDocumentEdited:NO]; + // It is feasible (though unlikely) that the user quits before the window + // controller is released, make sure the edit flag is cleared so no warning + // dialog is displayed. + [decoratedWindow setDocumentEdited:NO]; [[self window] orderOut:self]; } @@ -270,8 +267,8 @@ - (void)openWindow setupDone = YES; - [self updateResizeIncrements]; - [self resizeWindowToFit:self]; + [self updateResizeConstraints]; + [self resizeWindowToFitContentSize:[vimView desiredSize]]; [[self window] makeKeyAndOrderFront:self]; } @@ -285,14 +282,47 @@ - (void)selectTabWithIndex:(int)idx [vimView selectTabWithIndex:idx]; } -- (void)setTextDimensionsWithRows:(int)rows columns:(int)cols +- (void)setTextDimensionsWithRows:(int)rows columns:(int)cols live:(BOOL)live { - //NSLog(@"setTextDimensionsWithRows:%d columns:%d", rows, cols); + //NSLog(@"setTextDimensionsWithRows:%d columns:%d live:%s", rows, cols, + // live ? "YES" : "NO"); + + // NOTE: This is the only place where the (rows,columns) of the vim view + // are modified. Setting these values have no immediate effect, the actual + // resizing of the view is done in processCommandQueueDidFinish. + // + // The 'live' flag indicates that this resize originated from a live + // resize; it may very well happen that the view is no longer in live + // resize when this message is received. We refrain from changing the view + // size when this flag is set, otherwise the window might jitter when the + // user drags to resize the window. - [vimView setActualRows:rows columns:cols]; + [vimView setDesiredRows:rows columns:cols]; - if (setupDone && ![vimView inLiveResize]) - shouldUpdateWindowSize = YES; + if (setupDone && !live) + shouldResizeVimView = YES; +} + +- (void)setTitle:(NSString *)title +{ + // The full-screen window has no title (?!) and it does not show up in the + // Window menu. + [decoratedWindow setTitle:title]; +} + +- (void)setToolbar:(NSToolbar *)toolbar +{ + // The full-screen window has no toolbar. + [decoratedWindow setToolbar:toolbar]; + + // HACK! Redirect the pill button so that we can ask Vim to hide the + // toolbar. + NSButton *pillButton = [decoratedWindow + standardWindowButton:NSWindowToolbarButton]; + if (pillButton) { + [pillButton setAction:@selector(toggleToolbar:)]; + [pillButton setTarget:self]; + } } - (void)createScrollbarWithIdentifier:(long)ident type:(int)type @@ -300,16 +330,21 @@ - (void)createScrollbarWithIdentifier:(long)ident type:(int)type [vimView createScrollbarWithIdentifier:ident type:type]; } -- (void)destroyScrollbarWithIdentifier:(long)ident +- (BOOL)destroyScrollbarWithIdentifier:(long)ident { - [vimView destroyScrollbarWithIdentifier:ident]; - [self checkWindowNeedsResizing]; + BOOL scrollbarHidden = [vimView destroyScrollbarWithIdentifier:ident]; + shouldResizeVimView = shouldResizeVimView || scrollbarHidden; + + return scrollbarHidden; } -- (void)showScrollbarWithIdentifier:(long)ident state:(BOOL)visible +- (BOOL)showScrollbarWithIdentifier:(long)ident state:(BOOL)visible { - [vimView showScrollbarWithIdentifier:ident state:visible]; - [self checkWindowNeedsResizing]; + BOOL scrollbarToggled = [vimView showScrollbarWithIdentifier:ident + state:visible]; + shouldResizeVimView = shouldResizeVimView || scrollbarToggled; + + return scrollbarToggled; } - (void)setScrollbarPosition:(int)pos length:(int)len identifier:(long)ident @@ -336,23 +371,38 @@ - (void)setDefaultColorsBackground:(NSColor *)back foreground:(NSColor *)fore - (void)setFont:(NSFont *)font { [[NSFontManager sharedFontManager] setSelectedFont:font isMultiple:NO]; - [[vimView textStorage] setFont:font]; - [self updateResizeIncrements]; + [[vimView textView] setFont:font]; + [self updateResizeConstraints]; } - (void)setWideFont:(NSFont *)font { - [[vimView textStorage] setWideFont:font]; + [[vimView textView] setWideFont:font]; } - (void)processCommandQueueDidFinish { - // XXX: If not in live resize and vimview's desired size differs from actual - // size, resize ourselves - if (shouldUpdateWindowSize) { - shouldUpdateWindowSize = NO; - [vimView setShouldUpdateWindowSize:NO]; - [self resizeWindowToFit:self]; + // NOTE: Resizing is delayed until after all commands have been processed + // since it often happens that more than one command will cause a resize. + // If we were to immediately resize then the vim view size would jitter + // (e.g. hiding/showing scrollbars often happens several time in one + // update). + + if (shouldResizeVimView) { + shouldResizeVimView = NO; + + NSSize contentSize = [vimView desiredSize]; + contentSize = [self constrainContentSizeToScreenSize:contentSize]; + contentSize = [vimView constrainRows:NULL columns:NULL + toSize:contentSize]; + [vimView setFrameSize:contentSize]; + + if (fullscreenEnabled) { + [[fullscreenWindow contentView] setNeedsDisplay:YES]; + [fullscreenWindow centerView]; + } else { + [self resizeWindowToFitContentSize:contentSize]; + } } } @@ -362,7 +412,8 @@ - (void)popupMenu:(NSMenu *)menu atRow:(int)row column:(int)col NSEvent *event; if (row >= 0 && col >= 0) { - NSSize cellSize = [[vimView textStorage] cellSize]; + // TODO: Let textView convert (row,col) to NSPoint. + NSSize cellSize = [[vimView textView] cellSize]; NSPoint pt = { (col+1)*cellSize.width, (row+1)*cellSize.height }; pt = [[vimView textView] convertPoint:pt toView:nil]; @@ -386,57 +437,47 @@ - (void)showTabBar:(BOOL)on { [[vimView tabBarControl] setHidden:!on]; - // Rules for when to show tabline separator: - // - // Tabline visible & Toolbar visible => Separator visible - // ================================================================ - // NO & NO => NO (Tiger), YES (Leopard) - // NO & YES => YES - // YES & NO => NO - // YES & YES => NO - // - // XXX: This is ignored if called while in fullscreen mode + // Showing the tabline may result in the tabline separator being hidden or + // shown; this does not apply to full-screen mode. if (!on) { - NSToolbar *toolbar = [[self window] toolbar]; - if (([[self window] styleMask] & NSTexturedBackgroundWindowMask) == 0) { - [tablineSeparator setHidden:![toolbar isVisible]]; + NSToolbar *toolbar = [decoratedWindow toolbar]; + if (([decoratedWindow styleMask] & NSTexturedBackgroundWindowMask) + == 0) { + [self hideTablineSeparator:![toolbar isVisible]]; } else { - [tablineSeparator setHidden:NO]; + [self hideTablineSeparator:NO]; } } else { - if (([[self window] styleMask] & NSTexturedBackgroundWindowMask) == 0) { - [tablineSeparator setHidden:on]; + if (([decoratedWindow styleMask] & NSTexturedBackgroundWindowMask) + == 0) { + [self hideTablineSeparator:on]; } else { - [tablineSeparator setHidden:YES]; + [self hideTablineSeparator:YES]; } } - - //if (setupDone) - // shouldUpdateWindowSize = YES; } - (void)showToolbar:(BOOL)on size:(int)size mode:(int)mode { - NSToolbar *toolbar = [[self window] toolbar]; + NSToolbar *toolbar = [decoratedWindow toolbar]; if (!toolbar) return; [toolbar setSizeMode:size]; [toolbar setDisplayMode:mode]; [toolbar setVisible:on]; - // See showTabBar: for circumstances when the separator should be hidden. - if (([[self window] styleMask] & NSTexturedBackgroundWindowMask) == 0) { + if (([decoratedWindow styleMask] & NSTexturedBackgroundWindowMask) == 0) { if (!on) { - [tablineSeparator setHidden:YES]; + [self hideTablineSeparator:YES]; } else { - [tablineSeparator setHidden:![[vimView tabBarControl] isHidden]]; + [self hideTablineSeparator:![[vimView tabBarControl] isHidden]]; } } else { // Textured windows don't have a line below there title bar, so we // need the separator in this case as well. In fact, the only case // where we don't need the separator is when the tab bar control // is visible (because it brings its own separator). - [tablineSeparator setHidden:![[vimView tabBarControl] isHidden]]; + [self hideTablineSeparator:![[vimView tabBarControl] isHidden]]; } } @@ -463,9 +504,9 @@ - (void)setMouseShape:(int)shape - (void)adjustLinespace:(int)linespace { - if (vimView && [vimView textStorage]) { - [[vimView textStorage] setLinespace:(float)linespace]; - shouldUpdateWindowSize = YES; + if (vimView && [vimView textView]) { + [[vimView textView] setLinespace:(float)linespace]; + shouldResizeVimView = YES; } } @@ -473,7 +514,7 @@ - (void)liveResizeWillStart { // Save the original title, if we haven't already. if (lastSetTitle == nil) { - lastSetTitle = [[[self window] title] retain]; + lastSetTitle = [[decoratedWindow title] retain]; } } @@ -481,75 +522,74 @@ - (void)liveResizeDidEnd { if (!setupDone) return; - // NOTE: During live resize the window is not constrained to lie inside the - // screen (because we must not programmatically alter the window size - // during live resize or it will 'jitter'), so at the end of live resize we - // make sure a final SetTextDimensionsMsgID message is sent to ensure that - // resizeWindowToFit does get called. For this reason and also because we - // want to ensure that Vim and MacVim have consistent states, this resize - // message is sent synchronously. (If the states were inconsistent the - // text view may become too large or too small to fit the window.) - - NSSize contentSize = [self contentSize]; - - int desiredSize[2]; - [vimView getDesiredRows:&desiredSize[0] columns:&desiredSize[1] - forSize:contentSize]; - - NSData *data = [NSData dataWithBytes:desiredSize length:2*sizeof(int)]; - - BOOL resizeOk = [vimController sendMessageNow:SetTextDimensionsMsgID - data:data - timeout:.5]; - - if (!resizeOk) { - // Force the window size to match the text view size otherwise Vim and - // MacVim will have inconsistent states. - [self resizeWindowToFit:self]; + // NOTE: During live resize messages from MacVim to Vim are often dropped + // (because too many messages are sent at once). This may lead to + // inconsistent states between Vim and MacVim; to avoid this we send a + // synchronous resize message to Vim now (this is not fool-proof, but it + // does seem to work quite well). + + int constrained[2]; + NSSize textViewSize = [[vimView textView] frame].size; + [[vimView textView] constrainRows:&constrained[0] columns:&constrained[1] + toSize:textViewSize]; + + //NSLog(@"End of live resize, notify Vim that text dimensions are %dx%d", + // constrained[1], constrained[0]); + + NSData *data = [NSData dataWithBytes:constrained length:2*sizeof(int)]; + BOOL sendOk = [vimController sendMessageNow:SetTextDimensionsMsgID + data:data + timeout:.5]; + + if (!sendOk) { + // Sending of synchronous message failed. Force the window size to + // match the last dimensions received from Vim, otherwise we end up + // with inconsistent states. + [self resizeWindowToFitContentSize:[vimView desiredSize]]; } // If we saved the original title while resizing, restore it. if (lastSetTitle != nil) { - [[self window] setTitle:lastSetTitle]; + [decoratedWindow setTitle:lastSetTitle]; [lastSetTitle release]; lastSetTitle = nil; } } -- (void)placeViews -{ - if (!setupDone) return; - - NSRect vimViewRect; - vimViewRect.origin = NSMakePoint(0, 0); - vimViewRect.size = [vimView getDesiredRows:NULL columns:NULL - forSize:[self contentSize]]; - - // HACK! If the window does resize, then windowDidResize is called which in - // turn calls placeViews. In case the computed new size of the window is - // no different from the current size, then we need to call placeViews - // manually. - if (NSEqualRects(vimViewRect, [vimView frame])) { - [vimView placeViews]; - } else { - [vimView setFrame:vimViewRect]; - } -} - - (void)enterFullscreen { - fullscreenWindow = [[MMFullscreenWindow alloc] initWithWindow:[self window] - view:vimView]; + if (fullscreenEnabled) return; + + fullscreenWindow = [[MMFullscreenWindow alloc] + initWithWindow:decoratedWindow view:vimView]; [fullscreenWindow enterFullscreen]; - [fullscreenWindow setDelegate:self]; + fullscreenEnabled = YES; + + // The resize handle disappears so the vim view needs to update the + // scrollbars. + shouldResizeVimView = YES; } - (void)leaveFullscreen { + if (!fullscreenEnabled) return; + + fullscreenEnabled = NO; [fullscreenWindow leaveFullscreen]; [fullscreenWindow release]; fullscreenWindow = nil; + + // The vim view may be too large to fit the screen, so update it. + shouldResizeVimView = YES; +} + +- (void)setBuffersModified:(BOOL)mod +{ + // NOTE: We only set the document edited flag on the decorated window since + // the full-screen window has no close button anyway. (It also saves us + // from keeping track of the flag in two different places.) + [decoratedWindow setDocumentEdited:mod]; } @@ -571,10 +611,9 @@ - (void)windowDidBecomeMain:(NSNotification *)notification { [vimController sendMessage:GotFocusMsgID data:nil]; - if ([vimView textStorage]) { - NSFontManager *fontManager = [NSFontManager sharedFontManager]; - [fontManager setSelectedFont:[[vimView textStorage] font] - isMultiple:NO]; + if ([vimView textView]) { + NSFontManager *fm = [NSFontManager sharedFontManager]; + [fm setSelectedFont:[[vimView textView] font] isMultiple:NO]; } } @@ -588,6 +627,8 @@ - (void)windowDidResignMain:(NSNotification *)notification - (BOOL)windowShouldClose:(id)sender { + // Don't close the window now; Instead let Vim decide whether to close the + // window or not. [vimController sendMessage:VimShouldCloseMsgID data:nil]; return NO; } @@ -595,7 +636,7 @@ - (BOOL)windowShouldClose:(id)sender - (void)windowDidMove:(NSNotification *)notification { if (setupDone && windowAutosaveKey) { - NSRect frame = [[self window] frame]; + NSRect frame = [decoratedWindow frame]; NSPoint topLeft = { frame.origin.x, NSMaxY(frame) }; NSString *topLeftString = NSStringFromPoint(topLeft); @@ -606,47 +647,18 @@ - (void)windowDidMove:(NSNotification *)notification - (void)windowDidResize:(id)sender { - if (!setupDone) return; + if (!setupDone || fullscreenEnabled) return; - // Live resizing works as follows: - // VimView's size is changed immediatly, and a resize message to the - // remote vim instance is sent. The remote vim instance sends a - // "vim content size changed" right back, but in live resize mode this - // doesn't change the VimView (because we assume that it already has the - // correct size because we set the resize increments correctly). Afterward, - // the remote vim view sends a batch draw for the text visible in the - // resized text area. - - NSSize contentSize = [self contentSize]; - [self resizeVimViewToFitSize:contentSize]; - - NSRect frame; - frame.origin = NSMakePoint(0, 0); - frame.size = contentSize; - [vimView setFrame:frame]; + // NOTE: Since we have no control over when the window may resize (Cocoa + // may resize automatically) we simply set the view to fill the entire + // window. The vim view takes care of notifying Vim if the number of + // (rows,columns) changed. + [vimView setFrameSize:[self contentSize]]; } - (NSRect)windowWillUseStandardFrame:(NSWindow *)win defaultFrame:(NSRect)frame { - // HACK! For some reason 'frame' is not always constrained to fit on the - // screen (e.g. it may overlap the menu bar), so first constrain it to the - // screen; otherwise the new frame we compute may be too large and this - // will mess up the display after the window resizes. - frame = [win constrainFrameRect:frame toScreen:[win screen]]; - - // HACK! If the top of 'frame' is lower than the current window frame, - // increase 'frame' so that their tops align. Really, 'frame' should - // already have its top at least as high as the current window frame, but - // for some reason this is not always the case. - // (See resizeWindowToFit: for a similar hack.) - NSRect cur = [win frame]; - if (NSMaxY(cur) > NSMaxY(frame)) { - frame.size.height = cur.origin.y - frame.origin.y + cur.size.height; - } - - frame = [self fitWindowToFrame:frame]; - // Keep old width and horizontal position unless user clicked while the // Command key is held down. NSEvent *event = [NSApp currentEvent]; @@ -690,105 +702,52 @@ - (BOOL)writeSelectionToPasteboard:(NSPasteboard *)pboard @implementation MMWindowController (Private) -- (NSRect)contentRectForFrameRect:(NSRect)frame -{ - NSRect result = [[self window] contentRectForFrameRect:frame]; - if (![tablineSeparator isHidden]) - --result.size.height; - return result; -} - -- (NSRect)frameRectForContentRect:(NSRect)contentRect -{ - if (![tablineSeparator isHidden]) - ++contentRect.size.height; - return [[self window] frameRectForContentRect:contentRect]; -} - - (NSSize)contentSize { - return [self contentRectForFrameRect:[[self window] frame]].size; + // NOTE: Never query the content view directly for its size since it may + // not return the same size as contentRectForFrameRect: (e.g. when in + // windowed mode and the tabline separator is visible)! + NSWindow *win = [self window]; + return [win contentRectForFrameRect:[win frame]].size; } -- (void)resizeWindowToFit:(id)sender +- (void)resizeWindowToFitContentSize:(NSSize)contentSize { - // Makes the window large enough to contain the vim view, called after the - // vim view's size was changed. If the window had to become to big, the - // vim view is made smaller. - - // NOTE: Be very careful when you call this method! Do not call while - // processing command queue, instead set 'shouldUpdateWindowSize' to YES. - // The only other place it is currently called is when live resize ends. - // This is done to ensure that the text view and window sizes match up - // (they may become out of sync if a SetTextDimensionsMsgID message to the - // backend is dropped). - - if (!setupDone) return; - - // Get size of text view, adapt window size to it - NSWindow *win = [self window]; - NSRect frame = [win frame]; - NSRect contentRect = [self contentRectForFrameRect:frame]; - NSSize newSize = [vimView desiredSizeForActualRowsAndColumns]; + NSRect frame = [decoratedWindow frame]; + NSRect contentRect = [decoratedWindow contentRectForFrameRect:frame]; // Keep top-left corner of the window fixed when resizing. - contentRect.origin.y -= newSize.height - contentRect.size.height; - contentRect.size = newSize; - - frame = [self frameRectForContentRect:contentRect]; - NSRect maxFrame = [win constrainFrameRect:frame toScreen:[win screen]]; - - // HACK! Assuming the window frame cannot already be placed too high, - // adjust 'maxFrame' so that it at least as high up as the current frame. - // The reason for doing this is that constrainFrameRect:toScreen: does not - // always seem to utilize as much area as possible. - if (NSMaxY(frame) > NSMaxY(maxFrame)) { - maxFrame.size.height = frame.origin.y - maxFrame.origin.y - + frame.size.height; - } + contentRect.origin.y -= contentSize.height - contentRect.size.height; + contentRect.size = contentSize; - if (!NSEqualRects(maxFrame, frame)) { - // The new window frame is too big to fit on the screen, so fit the - // text storage to the biggest frame which will fit on the screen. - //NSLog(@"Proposed window frame does not fit on the screen!"); - frame = [self fitWindowToFrame:maxFrame]; - [self resizeVimViewToFitSize:[self contentRectForFrameRect:frame].size]; - } - - // NSLog(@"%s %@", _cmd, NSStringFromRect(frame)); - - // HACK! If the window does resize, then windowDidResize is called which in - // turn calls placeViews. In case the computed new size of the window is - // no different from the current size, then we need to call placeViews - // manually. - if (NSEqualRects(frame, [win frame])) { - [self placeViews]; - } else { - [win setFrame:frame display:YES]; - } + frame = [decoratedWindow frameRectForContentRect:contentRect]; + [decoratedWindow setFrame:frame display:YES]; } -- (NSRect)fitWindowToFrame:(NSRect)frame +- (NSSize)constrainContentSizeToScreenSize:(NSSize)contentSize { - if (!setupDone) return frame; - - NSRect contentRect = [self contentRectForFrameRect:frame]; - NSSize size = [vimView getDesiredRows:NULL columns:NULL - forSize:contentRect.size]; + NSWindow *win = [self window]; + NSRect rect = [win contentRectForFrameRect:[[win screen] visibleFrame]]; - // Keep top-left corner of 'frame' fixed. - contentRect.origin.y -= size.height - contentRect.size.height; - contentRect.size = size; + if (contentSize.height > rect.size.height) + contentSize.height = rect.size.height; + if (contentSize.width > rect.size.width) + contentSize.width = rect.size.width; - return [self frameRectForContentRect:contentRect]; + return contentSize; } -- (void)updateResizeIncrements +- (void)updateResizeConstraints { if (!setupDone) return; - NSSize size = [[vimView textStorage] cellSize]; - [[self window] setContentResizeIncrements:size]; + // Set the resize increments to exactly match the font size; this way the + // window will always hold an integer number of (rows,columns). + NSSize cellSize = [[vimView textView] cellSize]; + [decoratedWindow setContentResizeIncrements:cellSize]; + + NSSize minSize = [vimView minSize]; + [decoratedWindow setContentMinSize:minSize]; } - (NSTabViewItem *)addNewTabViewItem @@ -808,6 +767,7 @@ - (IBAction)vimMenuItemAction:(id)sender - (BOOL)askBackendForStarRegister:(NSPasteboard *)pb { + // TODO: Can this be done with evaluateExpression: instead? BOOL reply = NO; id backendProxy = [vimController backendProxy]; @@ -823,40 +783,16 @@ - (BOOL)askBackendForStarRegister:(NSPasteboard *)pb return reply; } -- (void)checkWindowNeedsResizing -{ - shouldUpdateWindowSize = - shouldUpdateWindowSize || [vimView shouldUpdateWindowSize]; -} - -- (NSSize)resizeVimViewToFitSize:(NSSize)size +- (void)hideTablineSeparator:(BOOL)hide { - // If our optimal (rows,cols) do not match our current (rows,cols), resize - // ourselves and tell the Vim process to sync up. - int desired[2]; - NSSize newSize = [vimView getDesiredRows:&desired[0] columns:&desired[1] - forSize:size]; - - int rows, columns; - [vimView getActualRows:&rows columns:&columns]; - - if (desired[0] != rows || desired[1] != columns) { - // NSLog(@"Notify Vim that text storage dimensions changed from %dx%d " - // @"to %dx%d", columns, rows, desired[0], desired[1]); - NSData *data = [NSData dataWithBytes:desired length:2*sizeof(int)]; - - [vimController sendMessage:SetTextDimensionsMsgID data:data]; - - // We only want to set the window title if this resize came from - // a live-resize, not (for example) setting 'columns' or 'lines'. - if ([[self textView] inLiveResize]) { - [[self window] setTitle:[NSString stringWithFormat:@"%dx%d", - desired[1], desired[0]]]; - } + // The full-screen window has no tabline separator so we operate on + // decoratedWindow instead of [self window]. + if ([decoratedWindow hideTablineSeparator:hide]) { + // The tabline separator was toggled so the content view must change + // size. + [self updateResizeConstraints]; + shouldResizeVimView = YES; } - - return newSize; } - @end // MMWindowController (Private) diff --git a/src/MacVim/MacVim.h b/src/MacVim/MacVim.h index 3b3b5e2490..55f92dba0b 100644 --- a/src/MacVim/MacVim.h +++ b/src/MacVim/MacVim.h @@ -159,6 +159,7 @@ enum { TerminateNowMsgID, ODBEditMsgID, XcodeModMsgID, + LiveResizeMsgID, }; diff --git a/src/MacVim/MacVim.m b/src/MacVim/MacVim.m index 36c1b3551a..d78bf433e5 100644 --- a/src/MacVim/MacVim.m +++ b/src/MacVim/MacVim.m @@ -72,6 +72,7 @@ "TerminateNowMsgID", "ODBEditMsgID", "XcodeModMsgID", + "LiveResizeMsgID", }; diff --git a/src/MacVim/MacVim.xcodeproj/project.pbxproj b/src/MacVim/MacVim.xcodeproj/project.pbxproj index 211e55a960..9d55b367e1 100644 --- a/src/MacVim/MacVim.xcodeproj/project.pbxproj +++ b/src/MacVim/MacVim.xcodeproj/project.pbxproj @@ -45,6 +45,8 @@ 1DD9F5E50C85D60500E8D5A5 /* SystemColors.plist in Resources */ = {isa = PBXBuildFile; fileRef = 1DD9F5E40C85D60500E8D5A5 /* SystemColors.plist */; }; 1DE608B40C587FDA0055263D /* runtime in CopyFiles */ = {isa = PBXBuildFile; fileRef = 1DE602470C587FD10055263D /* runtime */; }; 1DE8CC620C5E2AAD003F56E3 /* Actions.plist in Resources */ = {isa = PBXBuildFile; fileRef = 1DE8CC610C5E2AAD003F56E3 /* Actions.plist */; }; + 1DE9B94F0D341AB8008FEDD4 /* MMWindow.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 1DE9B94D0D341AB8008FEDD4 /* MMWindow.h */; }; + 1DE9B9500D341AB8008FEDD4 /* MMWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = 1DE9B94E0D341AB8008FEDD4 /* MMWindow.m */; }; 1DED78600C6DE43D0079945F /* vimrc in CopyFiles */ = {isa = PBXBuildFile; fileRef = 1DED785F0C6DE43D0079945F /* vimrc */; }; 1DEE0D9F0C4E150B008E82B2 /* Attention.png in Resources */ = {isa = PBXBuildFile; fileRef = 1DEE0D8A0C4E150B008E82B2 /* Attention.png */; }; 1DEE0DA00C4E150B008E82B2 /* Copy.png in Resources */ = {isa = PBXBuildFile; fileRef = 1DEE0D8B0C4E150B008E82B2 /* Copy.png */; }; @@ -100,6 +102,7 @@ files = ( 1D493D580C5247BF00AB718C /* Vim in CopyFiles */, 1D9918480D299F9900A96335 /* MMAtsuiTextView.h in CopyFiles */, + 1DE9B94F0D341AB8008FEDD4 /* MMWindow.h in CopyFiles */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -179,6 +182,8 @@ 1DD9F5E40C85D60500E8D5A5 /* SystemColors.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = SystemColors.plist; sourceTree = ""; }; 1DE602470C587FD10055263D /* runtime */ = {isa = PBXFileReference; lastKnownFileType = folder; name = runtime; path = ../../runtime; sourceTree = SOURCE_ROOT; }; 1DE8CC610C5E2AAD003F56E3 /* Actions.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = Actions.plist; sourceTree = ""; }; + 1DE9B94D0D341AB8008FEDD4 /* MMWindow.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = MMWindow.h; sourceTree = ""; }; + 1DE9B94E0D341AB8008FEDD4 /* MMWindow.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = MMWindow.m; sourceTree = ""; }; 1DED785F0C6DE43D0079945F /* vimrc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = vimrc; sourceTree = ""; }; 1DEE0D8A0C4E150B008E82B2 /* Attention.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Attention.png; path = Toolbar/Attention.png; sourceTree = ""; }; 1DEE0D8B0C4E150B008E82B2 /* Copy.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Copy.png; path = Toolbar/Copy.png; sourceTree = ""; }; @@ -227,6 +232,8 @@ 080E96DDFE201D6D7F000001 /* MacVim Source */ = { isa = PBXGroup; children = ( + 1DE9B94D0D341AB8008FEDD4 /* MMWindow.h */, + 1DE9B94E0D341AB8008FEDD4 /* MMWindow.m */, 1D9918460D299F9900A96335 /* MMAtsuiTextView.h */, 1D9918470D299F9900A96335 /* MMAtsuiTextView.m */, 1D80FBCF0CBBD3B700102A1C /* MMFullscreenWindow.h */, @@ -528,6 +535,7 @@ 1D80FBD40CBBD3B700102A1C /* MMFullscreenWindow.m in Sources */, 1D80FBD60CBBD3B700102A1C /* MMVimView.m in Sources */, 1D9918490D299F9900A96335 /* MMAtsuiTextView.m in Sources */, + 1DE9B9500D341AB8008FEDD4 /* MMWindow.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/src/MacVim/gui_macvim.m b/src/MacVim/gui_macvim.m index cc86adace8..3ad3dbddd0 100644 --- a/src/MacVim/gui_macvim.m +++ b/src/MacVim/gui_macvim.m @@ -87,8 +87,11 @@ { //NSLog(@"gui_mch_init()"); - if (![[MMBackend sharedInstance] checkin]) + if (![[MMBackend sharedInstance] checkin]) { + // TODO: Kill the process if there is no terminal to fall back on, + // otherwise the process will run outputting to the console. return FAIL; + } // Force 'termencoding' to utf-8 (changes to 'tenc' are disallowed in // 'option.c', so that ':set termencoding=...' is impossible). From 2273c98630838ca142509f8171e460ee6394c73b Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Mon, 21 Jan 2008 22:18:58 +0100 Subject: [PATCH 0358/1156] Cursor color change in dark macvim color scheme --- runtime/colors/macvim.vim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runtime/colors/macvim.vim b/runtime/colors/macvim.vim index 7c82b96366..516dbf55be 100644 --- a/runtime/colors/macvim.vim +++ b/runtime/colors/macvim.vim @@ -73,7 +73,7 @@ if &background == "dark" hi Boolean gui=NONE guifg=DeepPink4 guibg=NONE hi Comment gui=italic guifg=CadetBlue3 hi Constant gui=NONE guifg=Goldenrod1 guibg=NONE - hi Cursor guibg=LightSlateGrey guifg=bg + hi Cursor guibg=LightGoldenrod guifg=bg hi CursorColumn guibg=Gray20 hi CursorIM guibg=LightSlateGrey guifg=bg hi CursorLine guibg=Gray20 From 284ae9fd34415bbe0d14c52f592eaa95016e45d9 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Tue, 22 Jan 2008 19:50:50 +0100 Subject: [PATCH 0359/1156] Make text view first responder when leaving full-screen The 'plus' button on the tabline got first responder status when leaving full-screen, which (among other things) looks bad when full keyboard access is enabled. Also some code cleanup. --- src/MacVim/MMFullscreenWindow.m | 5 +++++ src/MacVim/MMVimView.m | 10 +++++----- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/MacVim/MMFullscreenWindow.m b/src/MacVim/MMFullscreenWindow.m index c30b73d2a5..5b4cda52f6 100644 --- a/src/MacVim/MMFullscreenWindow.m +++ b/src/MacVim/MMFullscreenWindow.m @@ -168,6 +168,11 @@ - (void)leaveFullscreen [[target contentView] addSubview:view]; [view setFrameOrigin:oldPosition]; [self close]; + + // Set the text view to initial first responder, otherwise the 'plus' + // button on the tabline steals the first responder status. + [target setInitialFirstResponder:[view textView]]; + [target makeKeyAndOrderFront:self]; // ...but we don't want a focus gained message either, so don't set this diff --git a/src/MacVim/MMVimView.m b/src/MacVim/MMVimView.m index 6935657450..e925239a65 100644 --- a/src/MacVim/MMVimView.m +++ b/src/MacVim/MMVimView.m @@ -136,7 +136,7 @@ - (MMVimView *)initWithFrame:(NSRect)frame [tabBarControl setAutoresizingMask:NSViewWidthSizable|NSViewMinYMargin]; - //[tabBarControl setPartnerView:[self textView]]; + //[tabBarControl setPartnerView:textView]; // tab bar resizing only works if awakeFromNib is called (that's where // the NSViewFrameDidChangeNotification callback is installed). Sounds like @@ -244,12 +244,12 @@ - (void)cleanup - (NSSize)desiredSize { - return [self vimViewSizeForTextViewSize:[[self textView] desiredSize]]; + return [self vimViewSizeForTextViewSize:[textView desiredSize]]; } - (NSSize)minSize { - return [self vimViewSizeForTextViewSize:[[self textView] minSize]]; + return [self vimViewSizeForTextViewSize:[textView minSize]]; } - (NSSize)constrainRows:(int *)r columns:(int *)c toSize:(NSSize)size @@ -782,7 +782,7 @@ - (void)frameSizeMayHaveChanged // Give all superfluous space to the text view. It might be smaller or // larger than it wants to be, but this is needed during live resizing. NSRect textViewRect = [self textViewRectForVimViewSize:[self frame].size]; - [[self textView] setFrame:textViewRect]; + [textView setFrame:textViewRect]; [self placeScrollbars]; @@ -797,7 +797,7 @@ - (void)frameSizeMayHaveChanged // a live resize or not -- this is necessary to avoid the window jittering // when the user drags to resize. int constrained[2]; - NSSize textViewSize = [[self textView] frame].size; + NSSize textViewSize = [textView frame].size; [textView constrainRows:&constrained[0] columns:&constrained[1] toSize:textViewSize]; From e5519102a70d239a6f39e8d9d2cfc0b5c80404fe Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Wed, 23 Jan 2008 19:06:58 +0100 Subject: [PATCH 0360/1156] Ensure menus are updated when window focus changes --- src/MacVim/MMVimController.h | 1 + src/MacVim/MMVimController.m | 93 ++++++++++++++------------------- src/MacVim/MMWindowController.m | 1 + 3 files changed, 41 insertions(+), 54 deletions(-) diff --git a/src/MacVim/MMVimController.h b/src/MacVim/MMVimController.h index 14fa504dc5..65b60ff365 100644 --- a/src/MacVim/MMVimController.h +++ b/src/MacVim/MMVimController.h @@ -57,4 +57,5 @@ - (BOOL)sendMessageNow:(int)msgid data:(NSData *)data timeout:(NSTimeInterval)timeout; - (void)addVimInput:(NSString *)string; +- (void)updateMainMenu; @end diff --git a/src/MacVim/MMVimController.m b/src/MacVim/MMVimController.m index 442b5ddb06..a0d4559dcf 100644 --- a/src/MacVim/MMVimController.m +++ b/src/MacVim/MMVimController.m @@ -71,7 +71,6 @@ - (void)addMenuItemWithTag:(int)tag parent:(NSMenu *)parent title:(NSString *)title tip:(NSString *)tip keyEquivalent:(int)key modifiers:(int)mask action:(NSString *)action atIndex:(int)idx; -- (void)updateMainMenu; - (NSToolbarItem *)toolbarItemForTag:(int)tag index:(int *)index; - (void)addToolbarItemToDictionaryWithTag:(int)tag label:(NSString *)title toolTip:(NSString *)tip icon:(NSString *)icon; @@ -111,14 +110,6 @@ - (id)initWithBackend:(id)backend pid:(int)processIdentifier selector:@selector(connectionDidDie:) name:NSConnectionDidDieNotification object:connection]; - - // TODO: What if [windowController window] is the full-screen window? - [[NSNotificationCenter defaultCenter] - addObserver:self - selector:@selector(windowDidBecomeMain:) - name:NSWindowDidBecomeMainNotification - object:[windowController window]]; - isInitialized = YES; } @@ -513,12 +504,6 @@ - (oneway void)processCommandQueue:(in bycopy NSArray *)queue } } -- (void)windowDidBecomeMain:(NSNotification *)notification -{ - if (isInitialized) - [self updateMainMenu]; -} - - (NSToolbarItem *)toolbar:(NSToolbar *)theToolbar itemForItemIdentifier:(NSString *)itemId willBeInsertedIntoToolbar:(BOOL)flag @@ -541,6 +526,45 @@ - (NSArray *)toolbarDefaultItemIdentifiers:(NSToolbar *)theToolbar return nil; } +- (void)updateMainMenu +{ + NSMenu *mainMenu = [NSApp mainMenu]; + + // Stop NSApp from updating the Window menu. + [NSApp setWindowsMenu:nil]; + + // Remove all menus from main menu (except the MacVim menu). + int i, count = [mainMenu numberOfItems]; + for (i = count-1; i > 0; --i) { + [mainMenu removeItemAtIndex:i]; + } + + // Add menus from 'mainMenuItems' to main menu. + count = [mainMenuItems count]; + for (i = 0; i < count; ++i) { + [mainMenu addItem:[mainMenuItems objectAtIndex:i]]; + } + + // Set the new Window menu. + // TODO! Need to look for 'Window' in all localized languages. + NSMenu *windowMenu = [[mainMenu itemWithTitle:@"Window"] submenu]; + if (windowMenu) { + // Remove all AppKit owned menu items (tag == 0); they will be added + // again when setWindowsMenu: is called. + count = [windowMenu numberOfItems]; + for (i = count-1; i >= 0; --i) { + NSMenuItem *item = [windowMenu itemAtIndex:i]; + if (![item tag]) { + [windowMenu removeItem:item]; + } + } + + [NSApp setWindowsMenu:windowMenu]; + } + + shouldUpdateMainMenu = NO; +} + @end // MMVimController @@ -1061,45 +1085,6 @@ - (void)addMenuItemWithTag:(int)tag parent:(NSMenu *)parent } } -- (void)updateMainMenu -{ - NSMenu *mainMenu = [NSApp mainMenu]; - - // Stop NSApp from updating the Window menu. - [NSApp setWindowsMenu:nil]; - - // Remove all menus from main menu (except the MacVim menu). - int i, count = [mainMenu numberOfItems]; - for (i = count-1; i > 0; --i) { - [mainMenu removeItemAtIndex:i]; - } - - // Add menus from 'mainMenuItems' to main menu. - count = [mainMenuItems count]; - for (i = 0; i < count; ++i) { - [mainMenu addItem:[mainMenuItems objectAtIndex:i]]; - } - - // Set the new Window menu. - // TODO! Need to look for 'Window' in all localized languages. - NSMenu *windowMenu = [[mainMenu itemWithTitle:@"Window"] submenu]; - if (windowMenu) { - // Remove all AppKit owned menu items (tag == 0); they will be added - // again when setWindowsMenu: is called. - count = [windowMenu numberOfItems]; - for (i = count-1; i >= 0; --i) { - NSMenuItem *item = [windowMenu itemAtIndex:i]; - if (![item tag]) { - [windowMenu removeItem:item]; - } - } - - [NSApp setWindowsMenu:windowMenu]; - } - - shouldUpdateMainMenu = NO; -} - - (NSToolbarItem *)toolbarItemForTag:(int)tag index:(int *)index { if (!toolbar) return nil; diff --git a/src/MacVim/MMWindowController.m b/src/MacVim/MMWindowController.m index acf09f8b09..c3bc4a4079 100644 --- a/src/MacVim/MMWindowController.m +++ b/src/MacVim/MMWindowController.m @@ -609,6 +609,7 @@ - (IBAction)toggleToolbar:(id)sender - (void)windowDidBecomeMain:(NSNotification *)notification { + [vimController updateMainMenu]; [vimController sendMessage:GotFocusMsgID data:nil]; if ([vimView textView]) { From 807c4255779ccd6b76bd41d600b4ac5a722a0458 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Wed, 23 Jan 2008 19:17:03 +0100 Subject: [PATCH 0361/1156] Window title is set on both decorated and full-screen window --- src/MacVim/MMWindowController.m | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/MacVim/MMWindowController.m b/src/MacVim/MMWindowController.m index c3bc4a4079..7039fae7c5 100644 --- a/src/MacVim/MMWindowController.m +++ b/src/MacVim/MMWindowController.m @@ -135,11 +135,12 @@ - (id)initWithVimController:(MMVimController *)controller // started (or rather, when ~/Library/Preferences/org.vim.MacVim.plist does // not exist). The chosen values will put the window somewhere near the // top and in the middle of a 1024x768 screen. - MMWindow *win = [[[MMWindow alloc] + MMWindow *win = [[MMWindow alloc] initWithContentRect:NSMakeRect(242,364,480,360) styleMask:styleMask backing:NSBackingStoreBuffered - defer:YES] autorelease]; + defer:YES]; + [win autorelease]; self = [super initWithWindow:win]; if (!self) return nil; @@ -305,9 +306,10 @@ - (void)setTextDimensionsWithRows:(int)rows columns:(int)cols live:(BOOL)live - (void)setTitle:(NSString *)title { - // The full-screen window has no title (?!) and it does not show up in the - // Window menu. - [decoratedWindow setTitle:title]; + if (title) { + [decoratedWindow setTitle:title]; + [fullscreenWindow setTitle:title]; + } } - (void)setToolbar:(NSToolbar *)toolbar From bc28f07b5ebd9c84f59a9b672f178ac990540563 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Wed, 23 Jan 2008 19:39:13 +0100 Subject: [PATCH 0362/1156] and not triggered twice The default Cocoa key bindings map these key presses to two commands which led them to be triggered twice. Avoid this by passing Alt+Function key presses straight to Vim instead of to interpretKeyEvents:. --- src/MacVim/MMAtsuiTextView.m | 9 +++++++-- src/MacVim/MMTextView.m | 9 +++++++-- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/MacVim/MMAtsuiTextView.m b/src/MacVim/MMAtsuiTextView.m index 9ea9fb5b93..3e4b73a667 100644 --- a/src/MacVim/MMAtsuiTextView.m +++ b/src/MacVim/MMAtsuiTextView.m @@ -261,11 +261,16 @@ - (void)keyDown:(NSEvent *)event //NSLog(@"%s %@", _cmd, event); // HACK! If control modifier is held, don't pass the event along to // interpretKeyEvents: since some keys are bound to multiple commands which - // means doCommandBySelector: is called several times. + // means doCommandBySelector: is called several times. Do the same for + // Alt+Function key presses (Alt+Up and Alt+Down are bound to two + // commands). This hack may break input management, but unless we can + // figure out a way to disable key bindings there seems little else to do. // // TODO: Figure out a way to disable Cocoa key bindings entirely, without // affecting input management. - if ([event modifierFlags] & NSControlKeyMask) { + int flags = [event modifierFlags]; + if ((flags & NSControlKeyMask) || + ((flags & NSAlternateKeyMask) && (flags & NSFunctionKeyMask))) { NSString *unmod = [event charactersIgnoringModifiers]; if ([unmod length] == 1 && [unmod characterAtIndex:0] <= 0x7f && [unmod characterAtIndex:0] >= 0x60) { diff --git a/src/MacVim/MMTextView.m b/src/MacVim/MMTextView.m index b1e7148c95..3d7df765c0 100644 --- a/src/MacVim/MMTextView.m +++ b/src/MacVim/MMTextView.m @@ -487,11 +487,16 @@ - (void)keyDown:(NSEvent *)event //NSLog(@"%s %@", _cmd, event); // HACK! If control modifier is held, don't pass the event along to // interpretKeyEvents: since some keys are bound to multiple commands which - // means doCommandBySelector: is called several times. + // means doCommandBySelector: is called several times. Do the same for + // Alt+Function key presses (Alt+Up and Alt+Down are bound to two + // commands). This hack may break input management, but unless we can + // figure out a way to disable key bindings there seems little else to do. // // TODO: Figure out a way to disable Cocoa key bindings entirely, without // affecting input management. - if ([event modifierFlags] & NSControlKeyMask) { + int flags = [event modifierFlags]; + if ((flags & NSControlKeyMask) || + ((flags & NSAlternateKeyMask) && (flags & NSFunctionKeyMask))) { NSString *unmod = [event charactersIgnoringModifiers]; if ([unmod length] == 1 && [unmod characterAtIndex:0] <= 0x7f && [unmod characterAtIndex:0] >= 0x60) { From 863b5ab5dc400649d2d521e2e68956a32734b441 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Wed, 23 Jan 2008 20:30:49 +0100 Subject: [PATCH 0363/1156] Removed window nib files Windows are created programatically instead of via a nib file. --- .../English.lproj/EmptyWindow.nib/classes.nib | 19 --------- .../English.lproj/EmptyWindow.nib/info.nib | 16 -------- .../EmptyWindow.nib/keyedobjects.nib | Bin 1940 -> 0 bytes .../English.lproj/VimWindow.nib/classes.nib | 37 ------------------ .../English.lproj/VimWindow.nib/info.nib | 20 ---------- .../VimWindow.nib/keyedobjects.nib | Bin 5976 -> 0 bytes 6 files changed, 92 deletions(-) delete mode 100644 src/MacVim/English.lproj/EmptyWindow.nib/classes.nib delete mode 100644 src/MacVim/English.lproj/EmptyWindow.nib/info.nib delete mode 100644 src/MacVim/English.lproj/EmptyWindow.nib/keyedobjects.nib delete mode 100644 src/MacVim/English.lproj/VimWindow.nib/classes.nib delete mode 100644 src/MacVim/English.lproj/VimWindow.nib/info.nib delete mode 100644 src/MacVim/English.lproj/VimWindow.nib/keyedobjects.nib diff --git a/src/MacVim/English.lproj/EmptyWindow.nib/classes.nib b/src/MacVim/English.lproj/EmptyWindow.nib/classes.nib deleted file mode 100644 index 1b3240d12a..0000000000 --- a/src/MacVim/English.lproj/EmptyWindow.nib/classes.nib +++ /dev/null @@ -1,19 +0,0 @@ -{ - IBClasses = ( - {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, - { - ACTIONS = {addNewTab = id; toggleToolbar = id; }; - CLASS = MMWindowController; - LANGUAGE = ObjC; - OUTLETS = { - statusSeparator = NSBox; - statusTextField = NSTextField; - tabBarControl = PSMTabBarControl; - tabView = NSTabView; - tablineSeparator = NSBox; - }; - SUPERCLASS = NSWindowController; - } - ); - IBVersion = 1; -} \ No newline at end of file diff --git a/src/MacVim/English.lproj/EmptyWindow.nib/info.nib b/src/MacVim/English.lproj/EmptyWindow.nib/info.nib deleted file mode 100644 index dab4ca583e..0000000000 --- a/src/MacVim/English.lproj/EmptyWindow.nib/info.nib +++ /dev/null @@ -1,16 +0,0 @@ - - - - - IBDocumentLocation - 69 14 356 240 0 0 1024 746 - IBFramework Version - 446.1 - IBOpenObjects - - 5 - - IBSystem Version - 8R218 - - diff --git a/src/MacVim/English.lproj/EmptyWindow.nib/keyedobjects.nib b/src/MacVim/English.lproj/EmptyWindow.nib/keyedobjects.nib deleted file mode 100644 index c0f2ad096907269ea3217404ca52a1bd0f9d250f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1940 zcmZWpYitx%6rOwU99jg*w3MZ#QWsb#$Wpf3m6le}wpggJTj{jh2gN$wj%Da}r|e8= z%erz!MFj-W0vaSh3j#rW#`jx%1kj*`7-NVUHEM`4#`uTC7|+ZsRdj#sz31HTob!F> zo;&S5QOz)Yz6*ph5yqrl)9g{=k+s?eHQwaGKSR@F^&V62Y4Ygp>(q#8v`G^~@(Oi8 z?Wjlrvjno`;OFUM*VI%NI-m~4R5*E7nm=xQ(G3f4TwHNW%_?nOmu_shD|yf6d+&ST z!R?Ri-uvXCr;Z*w@yttazV-Gy@1FYTbb}|>8;yP=WlhMKC}n0%%AV|+l9M|%@7ihk z*SV+9nCY1{yI{`T>*smr7cTJGG-@46VI|tDBC*_%ToH+=hM~1W~~#x>b9>CM2g|*2(`n3sW^8zBI*fxn4Kr6(4OcBK$2JCgO$GZVt7bz;#(#uYFF&-5kL9@+Ze8J884T6> zQ1(*QFtwOsVjmkr@=B#$jbc$*?~O-Pehr_(b2zrMnpeb(NWOd{*mA>D1=+Zy+Lceo}v5_NUQutuR_#!&<| z#i7SDu**H`hu6o;ZK+rKd<7-j8;mw%^%g6halWtLRk$%>qpi8BQ;i-y)}h9+;r4BE zfoJlpHYq!iDDt`&UCj)u-Mwje6EDYEwDO_Y(FASMDcEkj#S2tKsb&8XcyQN>ilefEPx#6w$$ zw{Am7Hogk2y|x!`&K&&);Jl)9)I|8hJBD}cwB|U~n2LB@89=4>ibJ?-a7Ybu31=%0 z(R+3d?JP&{#{Wep7u4Ik#$aW~HkJ0x4HwWwNPxNG}j_?(uwjt?HR z_#h+UtB4pUn&S9G)kEM5Hun4935={2Dw_ybf=`Tkt-df)C*g Sd@9&KN}N^rB( - - - - IBDocumentLocation - 12 50 356 240 0 0 1024 746 - IBFramework Version - 446.1 - IBLockedTabItems - - 10 - - IBOpenObjects - - 28 - - IBSystem Version - 8R218 - - diff --git a/src/MacVim/English.lproj/VimWindow.nib/keyedobjects.nib b/src/MacVim/English.lproj/VimWindow.nib/keyedobjects.nib deleted file mode 100644 index 218166e6c6e277880792ffd46c809b27b7ef9a8d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5976 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 Date: Wed, 23 Jan 2008 21:21:51 +0100 Subject: [PATCH 0364/1156] Give warning if user symlinked to Vim binary Cocoa does not support symlinking because NSBundle then fails to find resources. Give a warning if possible symlinking is detected. --- src/MacVim/MMBackend.m | 60 ++++++++++++++++++++++-------------------- 1 file changed, 32 insertions(+), 28 deletions(-) diff --git a/src/MacVim/MMBackend.m b/src/MacVim/MMBackend.m index d9c2760dc8..d13500b283 100644 --- a/src/MacVim/MMBackend.m +++ b/src/MacVim/MMBackend.m @@ -62,6 +62,12 @@ MMBlinkStateOff }; +static NSString *MMSymlinkWarningString = + @"\n\n\tMost likely this is because you have symlinked directly to\n" + "\tthe Vim binary, which Cocoa does not allow. Please use an\n" + "\talias or the mvim shell script instead. If you have not used\n" + "\ta symlink, then your MacVim.app bundle is incomplete.\n\n"; + @interface NSString (MMServerNameCompare) @@ -114,34 +120,31 @@ + (MMBackend *)sharedInstance - (id)init { - if ((self = [super init])) { - fontContainerRef = loadFonts(); - - outputQueue = [[NSMutableArray alloc] init]; - inputQueue = [[NSMutableArray alloc] init]; - drawData = [[NSMutableData alloc] initWithCapacity:1024]; - connectionNameDict = [[NSMutableDictionary alloc] init]; - clientProxyDict = [[NSMutableDictionary alloc] init]; - serverReplyDict = [[NSMutableDictionary alloc] init]; - - NSString *path = [[NSBundle mainBundle] pathForResource:@"Colors" - ofType:@"plist"]; - if (path) { - colorDict = [[NSDictionary dictionaryWithContentsOfFile:path] - retain]; - } else { - NSLog(@"WARNING: Could not locate Colors.plist."); - } + self = [super init]; + if (!self) return nil; - path = [[NSBundle mainBundle] pathForResource:@"SystemColors" - ofType:@"plist"]; - if (path) { - sysColorDict = [[NSDictionary dictionaryWithContentsOfFile:path] - retain]; - } else { - NSLog(@"WARNING: Could not locate SystemColors.plist."); - } - } + fontContainerRef = loadFonts(); + + outputQueue = [[NSMutableArray alloc] init]; + inputQueue = [[NSMutableArray alloc] init]; + drawData = [[NSMutableData alloc] initWithCapacity:1024]; + connectionNameDict = [[NSMutableDictionary alloc] init]; + clientProxyDict = [[NSMutableDictionary alloc] init]; + serverReplyDict = [[NSMutableDictionary alloc] init]; + + NSBundle *mainBundle = [NSBundle mainBundle]; + NSString *path = [mainBundle pathForResource:@"Colors" ofType:@"plist"]; + if (path) + colorDict = [[NSDictionary dictionaryWithContentsOfFile:path] retain]; + + path = [mainBundle pathForResource:@"SystemColors" ofType:@"plist"]; + if (path) + sysColorDict = [[NSDictionary dictionaryWithContentsOfFile:path] + retain]; + + if (!(colorDict && sysColorDict)) + NSLog(@"ERROR: Failed to load color dictionaries.%@", + MMSymlinkWarningString); return self; } @@ -237,7 +240,8 @@ - (BOOL)checkin objectForKey:@"CFBundleExecutable"]; NSString *path = [mainBundle pathForAuxiliaryExecutable:exeName]; if (!path) { - NSLog(@"ERROR: Could not find MacVim executable in bundle"); + NSLog(@"ERROR: Could not find MacVim executable in bundle.%@", + MMSymlinkWarningString); return NO; } From 2d4573091ba66f81ae77aeec4df219c36f3e56cd Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Wed, 23 Jan 2008 21:55:43 +0100 Subject: [PATCH 0365/1156] File->Open pops up a modal 'open files' dialog The File->Open dialog lets the user choose one or more files which are opened in tabs in a new window; it replaces the behaviour where File->Open presented a sheet which opened (at most) one file in the topmost window. This conforms better with the standard File->Open behaviour of Mac apps. --- src/MacVim/Actions.plist | 2 ++ src/MacVim/MMAppController.h | 1 + src/MacVim/MMAppController.m | 10 ++++++++++ src/MacVim/gvimrc | 2 ++ 4 files changed, 15 insertions(+) diff --git a/src/MacVim/Actions.plist b/src/MacVim/Actions.plist index 6e8d8a3320..74334236c6 100644 --- a/src/MacVim/Actions.plist +++ b/src/MacVim/Actions.plist @@ -6,6 +6,8 @@ arrangeInFront: + fileOpen: + fontSizeDown: fontSizeUp: diff --git a/src/MacVim/MMAppController.h b/src/MacVim/MMAppController.h index a9fbe44511..1ed3822116 100644 --- a/src/MacVim/MMAppController.h +++ b/src/MacVim/MMAppController.h @@ -26,6 +26,7 @@ - (void)removeVimController:(id)controller; - (void)windowControllerWillOpen:(MMWindowController *)windowController; - (IBAction)newWindow:(id)sender; +- (IBAction)fileOpen:(id)sender; - (IBAction)selectNextWindow:(id)sender; - (IBAction)selectPreviousWindow:(id)sender; - (IBAction)fontSizeUp:(id)sender; diff --git a/src/MacVim/MMAppController.m b/src/MacVim/MMAppController.m index 6f60debb3a..c52228e2bc 100644 --- a/src/MacVim/MMAppController.m +++ b/src/MacVim/MMAppController.m @@ -429,6 +429,16 @@ - (IBAction)newWindow:(id)sender [self launchVimProcessWithArguments:nil]; } +- (IBAction)fileOpen:(id)sender +{ + NSOpenPanel *panel = [NSOpenPanel openPanel]; + [panel setAllowsMultipleSelection:YES]; + + int result = [panel runModalForTypes:nil]; + if (NSOKButton == result) + [self application:NSApp openFiles:[panel filenames]]; +} + - (IBAction)selectNextWindow:(id)sender { unsigned i, count = [vimControllers count]; diff --git a/src/MacVim/gvimrc b/src/MacVim/gvimrc index 61f0e67160..dcbe5db984 100644 --- a/src/MacVim/gvimrc +++ b/src/MacVim/gvimrc @@ -36,6 +36,7 @@ endif " File menu aunmenu File.New +aunmenu File.Open\.\.\. aunmenu File.Close aunmenu File.-SEP4- aunmenu File.Exit @@ -43,6 +44,7 @@ aunmenu File.Save-Exit an 10.290 File.New\ Window :maca newWindow: an 10.295 File.New\ Tab :tabnew +an 10.310 File.&Open\.\.\. :maca fileOpen: an 10.328 File.-SEP0- an 10.330 File.Close\ Window:qa :confirm qa an 10.331 File.Close:q :confirm q From a08f1f6181f5586438de716a8162cd02dd29c5b4 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Fri, 25 Jan 2008 22:14:40 +0100 Subject: [PATCH 0366/1156] File opening procedure changed When files is being opened (via [MMAppController application:openFiles:]) try to open the files in an untitled window (either one that is already open, or one that is currently launching). This avoids two windows opening when the 'Edit in MacVim' input manager is used, or when files are opened from Xcode. --- src/MacVim/MMAppController.m | 227 +++++++++++++++++++++++++---------- src/MacVim/MMBackend.m | 15 +-- src/MacVim/MacVim.h | 3 + src/MacVim/MacVim.m | 48 ++++++++ 4 files changed, 217 insertions(+), 76 deletions(-) diff --git a/src/MacVim/MMAppController.m b/src/MacVim/MMAppController.m index c52228e2bc..23c689a00f 100644 --- a/src/MacVim/MMAppController.m +++ b/src/MacVim/MMAppController.m @@ -31,6 +31,8 @@ #import "MMWindowController.h" +#define MM_HANDLE_XCODE_MOD_EVENT 0 + // Default timeout intervals on all connections. @@ -67,10 +69,13 @@ - (NSArray *)filterFilesAndNotify:(NSArray *)files; - (NSArray *)filterOpenFiles:(NSArray *)filenames remote:(OSType)theID path:(NSString *)path token:(NSAppleEventDescriptor *)token - selectionRange:(MMSelectionRange *)selRange; + selectionRange:(NSRange)selectionRange; +#if MM_HANDLE_XCODE_MOD_EVENT - (void)handleXcodeModEvent:(NSAppleEventDescriptor *)event replyEvent:(NSAppleEventDescriptor *)reply; -- (NSString *)inputStringFromSelectionRange:(MMSelectionRange *)selRange; +#endif +- (int)findLaunchingProcessWithoutArguments; +- (MMVimController *)findUntitledWindow; @end @interface NSMenu (MMExtras) @@ -104,6 +109,7 @@ + (void)initialize [NSNumber numberWithBool:NO], MMOpenFilesInTabsKey, [NSNumber numberWithBool:NO], MMNoFontSubstitutionKey, [NSNumber numberWithBool:NO], MMLoginShellKey, + [NSNumber numberWithBool:NO], MMAtsuiRendererKey, nil]; [[NSUserDefaults standardUserDefaults] registerDefaults:dict]; @@ -148,13 +154,14 @@ - (void)dealloc { //NSLog(@"MMAppController dealloc"); - [pidArguments release]; - [vimControllers release]; - [openSelectionString release]; + [pidArguments release]; pidArguments = nil; + [vimControllers release]; vimControllers = nil; + [openSelectionString release]; openSelectionString = nil; [super dealloc]; } +#if MM_HANDLE_XCODE_MOD_EVENT - (void)applicationWillFinishLaunching:(NSNotification *)notification { [[NSAppleEventManager sharedAppleEventManager] @@ -163,6 +170,7 @@ - (void)applicationWillFinishLaunching:(NSNotification *)notification forEventClass:'KAHL' andEventID:'MOD ']; } +#endif - (void)applicationDidFinishLaunching:(NSNotification *)notification { @@ -171,6 +179,11 @@ - (void)applicationDidFinishLaunching:(NSNotification *)notification - (BOOL)applicationShouldOpenUntitledFile:(NSApplication *)sender { + // Never open an untitled window if there is at least one open window or if + // there are processes that are currently launching. + if ([vimControllers count] > 0 || [pidArguments count] > 0) + return NO; + // NOTE! This way it possible to start the app with the command-line // argument '-nowindow yes' and no window will be opened by default. untitledWindowOpening = @@ -186,14 +199,29 @@ - (BOOL)applicationOpenUntitledFile:(NSApplication *)sender - (void)application:(NSApplication *)sender openFiles:(NSArray *)filenames { + // Opening files works like this: + // a) extract ODB and/or Xcode parameters from the current Apple event + // b) filter out any already open files (see filterOpenFiles:::::) + // c) open any remaining files + // + // A file is opened in an untitled window if there is one (it may be + // currently launching, or it may already be visible), otherwise a new + // window is opened. + // + // Each launching Vim process has a dictionary of arguments that are passed + // to the process when in checks in (via connectBackend:pid:). The + // arguments for each launching process can be looked up by its PID (in the + // pidArguments dictionary). + OSType remoteID = 0; NSString *remotePath = nil; NSAppleEventManager *aem; NSAppleEventDescriptor *remoteToken = nil; NSAppleEventDescriptor *odbdesc = nil; NSAppleEventDescriptor *xcodedesc = nil; - MMSelectionRange *selRange = NULL; + NSRange selectionRange = { NSNotFound, 0 }; + // 1. Extract ODB parameters (if any) aem = [NSAppleEventManager sharedAppleEventManager]; odbdesc = [aem currentAppleEvent]; if (![odbdesc paramDescriptorForKeyword:keyFileSender]) { @@ -212,64 +240,94 @@ - (void)application:(NSApplication *)sender openFiles:(NSArray *)filenames copy]; } + // 2. Extract Xcode parameters (if any) xcodedesc = [[aem currentAppleEvent] paramDescriptorForKeyword:keyAEPosition]; - if (xcodedesc) - selRange = (MMSelectionRange*)[[xcodedesc data] bytes]; + if (xcodedesc) { + MMSelectionRange *sr = (MMSelectionRange*)[[xcodedesc data] bytes]; + if (sr->lineNum < 0) { + // Should select a range of lines. + selectionRange.location = sr->startRange + 1; + selectionRange.length = sr->endRange - sr->startRange + 1; + } else { + // Should only move cursor to a line. + selectionRange.location = sr->lineNum + 1; + } + } + // 3. Filter out files that are already open filenames = [self filterOpenFiles:filenames remote:remoteID path:remotePath - token:remoteToken selectionRange:selRange]; + token:remoteToken + selectionRange:selectionRange]; + + // 4. Open any files that remain if ([filenames count]) { MMVimController *vc; BOOL openInTabs = [[NSUserDefaults standardUserDefaults] boolForKey:MMOpenFilesInTabsKey]; - if (openInTabs && (vc = [self topmostVimController])) { - // Open files in tabs in the topmost window. + if ((openInTabs && (vc = [self topmostVimController])) + || (vc = [self findUntitledWindow])) { + + // 5-1 Open files in an already open window (either due to the fact + // that MMMOpenFilesInTabs was set or because there was already an + // untitled Vim process open). + [vc dropFiles:filenames forceOpen:YES]; if (odbdesc) [vc odbEdit:filenames server:remoteID path:remotePath token:remoteToken]; - if (selRange) - [vc addVimInput:[self inputStringFromSelectionRange:selRange]]; + if (selectionRange.location != NSNotFound) + [vc addVimInput:buildSelectRangeCommand(selectionRange)]; } else { - // Open files in tabs in a new window. - NSMutableArray *args = [NSMutableArray arrayWithObject:@"-p"]; - [args addObjectsFromArray:filenames]; - int pid = [self launchVimProcessWithArguments:args]; - - // The Vim process starts asynchronously. Some arguments cannot be - // on the command line, so store them in a dictionary and pass them - // to the process once it has started. - // + + // 5-2. Open files + // a) in a launching Vim that has no arguments, if there is one + // else + // b) launch a new Vim process and open files there. + + NSMutableDictionary *argDict = [NSMutableDictionary dictionary]; + + int pid = [self findLaunchingProcessWithoutArguments]; + if (pid) { + // The filenames are passed as arguments in connectBackend::. + [argDict setObject:filenames forKey:@"filenames"]; + } else { + // Pass the filenames to the process straight away. + // + // TODO: It would be nicer if all arguments were passed to the + // Vim process in connectBackend::, but if we don't pass the + // filename arguments here, the window 'flashes' once when it + // opens. This is due to the 'welcome' screen first being + // displayed, then quickly thereafter the files are opened. + NSArray *fileArgs = [NSArray arrayWithObject:@"-p"]; + fileArgs = [fileArgs arrayByAddingObjectsFromArray:filenames]; + + pid = [self launchVimProcessWithArguments:fileArgs]; + } + // TODO: If the Vim process fails to start, or if it changes PID, // then the memory allocated for these parameters will leak. // Ensure that this cannot happen or somehow detect it. - NSMutableDictionary *argDict = nil; + if (odbdesc) { + [argDict setObject:filenames forKey:@"remoteFiles"]; + // The remote token can be arbitrary data so it is cannot // (without encoding it as text) be passed on the command line. - argDict = [NSMutableDictionary dictionaryWithObjectsAndKeys: - filenames, @"filenames", - [NSNumber numberWithUnsignedInt:remoteID], @"remoteID", - nil]; + [argDict setObject:[NSNumber numberWithUnsignedInt:remoteID] + forKey:@"remoteID"]; if (remotePath) [argDict setObject:remotePath forKey:@"remotePath"]; if (remoteToken) [argDict setObject:remoteToken forKey:@"remoteToken"]; } - if (selRange) { - if (!argDict) - argDict = [NSMutableDictionary - dictionaryWithObject:[xcodedesc data] - forKey:@"selectionRangeData"]; - else - [argDict setObject:[xcodedesc data] - forKey:@"selectionRangeData"]; - } + if (selectionRange.location != NSNotFound) + [argDict setObject:NSStringFromRange(selectionRange) + forKey:@"selectionRange"]; - if (argDict) + if ([argDict count] > 0) [pidArguments setObject:argDict forKey:[NSNumber numberWithInt:pid]]; } @@ -336,9 +394,11 @@ - (NSApplicationTerminateReply)applicationShouldTerminate: - (void)applicationWillTerminate:(NSNotification *)notification { +#if MM_HANDLE_XCODE_MOD_EVENT [[NSAppleEventManager sharedAppleEventManager] removeEventHandlerForEventClass:'KAHL' andEventID:'MOD ']; +#endif // This will invalidate all connections (since they were spawned from the // default connection). @@ -416,6 +476,9 @@ - (void)windowControllerWillOpen:(MMWindowController *)windowController } if (openSelectionString) { + // TODO: Pass this as a parameter instead! Get rid of + // 'openSelectionString' etc. + // // There is some text to paste into this window as a result of the // services menu "Open selection ..." being used. [[windowController vimController] dropString:openSelectionString]; @@ -498,6 +561,7 @@ - (IBAction)fontSizeDown:(id)sender connectBackend:(byref in id )backend pid:(int)pid { + NSNumber *pidKey = [NSNumber numberWithInt:pid]; MMVimController *vc = nil; //NSLog(@"Connect backend (pid=%d)", pid); @@ -527,27 +591,36 @@ - (IBAction)fontSizeDown:(id)sender untitledWindowOpening = NO; - // Arguments to a new Vim process that cannot be passed on the command - // line are stored in a dictionary and passed to the Vim process here. - NSNumber *key = [NSNumber numberWithInt:pid]; - NSDictionary *args = [pidArguments objectForKey:key]; - if (args) { - if ([args objectForKey:@"remoteID"]) { - [vc odbEdit:[args objectForKey:@"filenames"] + // Pass arguments to the Vim process. + id args = [pidArguments objectForKey:pidKey]; + if (args && args != [NSNull null]) { + // Pass filenames to open + NSArray *filenames = [args objectForKey:@"filenames"]; + if (filenames) { + NSString *tabDrop = buildTabDropCommand(filenames); + [vc addVimInput:tabDrop]; + } + + // Pass ODB data + if ([args objectForKey:@"remoteFiles"] + && [args objectForKey:@"remoteID"]) { + [vc odbEdit:[args objectForKey:@"remoteFiles"] server:[[args objectForKey:@"remoteID"] unsignedIntValue] path:[args objectForKey:@"remotePath"] token:[args objectForKey:@"remoteToken"]]; } - if ([args objectForKey:@"selectionRangeData"]) { - MMSelectionRange *selRange = (MMSelectionRange*) - [[args objectForKey:@"selectionRangeData"] bytes]; - [vc addVimInput:[self inputStringFromSelectionRange:selRange]]; + // Pass range of lines to select + if ([args objectForKey:@"selectionRange"]) { + NSRange selectionRange = NSRangeFromString( + [args objectForKey:@"selectionRange"]); + [vc addVimInput:buildSelectRangeCommand(selectionRange)]; } - - [pidArguments removeObjectForKey:key]; } + if (args) + [pidArguments removeObjectForKey:pidKey]; + return vc; } @@ -556,6 +629,8 @@ - (IBAction)fontSizeDown:(id)sender if (vc) [vimControllers removeObject:vc]; + + [pidArguments removeObjectForKey:pidKey]; } return nil; @@ -732,7 +807,16 @@ - (int)launchVimProcessWithArguments:(NSArray *)args //NSLog(@"launch %@ with args=%@ (pid=%d)", taskPath, taskArgs, // [task processIdentifier]); - return [task processIdentifier]; + int pid = [task processIdentifier]; + + // If the process has no arguments, then add a null argument to the + // pidArguments dictionary. This is later used to detect that a process + // without arguments is being launched. + if (!args) + [pidArguments setObject:[NSNull null] + forKey:[NSNumber numberWithInt:pid]]; + + return pid; } - (NSArray *)filterFilesAndNotify:(NSArray *)filenames @@ -784,7 +868,7 @@ - (NSArray *)filterFilesAndNotify:(NSArray *)filenames - (NSArray *)filterOpenFiles:(NSArray *)filenames remote:(OSType)theID path:(NSString *)path token:(NSAppleEventDescriptor *)token - selectionRange:(MMSelectionRange *)selRange + selectionRange:(NSRange)selectionRange { // Check if any of the files in the 'filenames' array are open in any Vim // process. Remove the files that are open from the 'filenames' array and @@ -846,9 +930,9 @@ - (NSArray *)filterOpenFiles:(NSArray *)filenames remote:(OSType)theID "tab sb %@|let &swb=oldswb|unl oldswb|" "cal foreground()|redr|f", raiseFile]; - if (selRange) + if (selectionRange.location != NSNotFound) input = [input stringByAppendingString: - [self inputStringFromSelectionRange:selRange]]; + buildSelectRangeCommand(selectionRange)]; [raiseController addVimInput:input]; } @@ -856,6 +940,7 @@ - (NSArray *)filterOpenFiles:(NSArray *)filenames remote:(OSType)theID return files; } +#if MM_HANDLE_XCODE_MOD_EVENT - (void)handleXcodeModEvent:(NSAppleEventDescriptor *)event replyEvent:(NSAppleEventDescriptor *)reply { @@ -880,22 +965,34 @@ - (void)handleXcodeModEvent:(NSAppleEventDescriptor *)event } #endif } +#endif -- (NSString *)inputStringFromSelectionRange:(MMSelectionRange *)selRange +- (int)findLaunchingProcessWithoutArguments { - if (!selRange) - return [NSString string]; + NSArray *keys = [pidArguments allKeysForObject:[NSNull null]]; + if ([keys count] > 0) { + //NSLog(@"found launching process without arguments"); + return [[keys objectAtIndex:0] intValue]; + } - NSString *input; - if (selRange->lineNum < 0) { - input = [NSString stringWithFormat:@"%dGV%dG", - selRange->endRange+1, selRange->startRange+1]; - } else { - input = [NSString stringWithFormat:@"%dGz.", - selRange->lineNum+1]; + return 0; +} + +- (MMVimController *)findUntitledWindow +{ + NSEnumerator *e = [vimControllers objectEnumerator]; + id vc; + while ((vc = [e nextObject])) { + // TODO: This is a moronic test...should query the Vim process if there + // are any open buffers or something like that instead. + NSString *title = [[[vc windowController] window] title]; + if ([title hasPrefix:@"[No Name]"]) { + //NSLog(@"found untitled window"); + return vc; + } } - return input; + return nil; } @end // MMAppController (Private) diff --git a/src/MacVim/MMBackend.m b/src/MacVim/MMBackend.m index d13500b283..22c696d4a2 100644 --- a/src/MacVim/MMBackend.m +++ b/src/MacVim/MMBackend.m @@ -1976,6 +1976,10 @@ - (void)handleSetFont:(NSData *)data - (void)handleDropFiles:(NSData *)data { + // TODO: Get rid of this method; instead use Vim script directly. At the + // moment I know how to do this to open files in tabs, but I'm not sure how + // to add the filenames to the command line when in command line mode. + if (!data) return; #ifdef FEAT_DND @@ -2014,12 +2018,7 @@ - (void)handleDropFiles:(NSData *)data // HACK! I'm not sure how to get Vim to open a list of files in // tabs, so instead I create a ':tab drop' command with all the // files to open and execute it. -#if 1 NSMutableString *cmd = [NSMutableString stringWithString:@":tab drop"]; -#else - NSMutableString *cmd = [NSMutableString stringWithString: - @":tab drop"]; -#endif int i; for (i = 0; i < n && bytes < end; ++i) { @@ -2032,7 +2031,6 @@ - (void)handleDropFiles:(NSData *)data [cmd appendString:file]; } -#if 1 // By going to the last tabpage we ensure that the new tabs will // appear last (if this call is left out, the taborder becomes // messy). @@ -2055,11 +2053,6 @@ - (void)handleDropFiles:(NSData *)data gui_update_cursor(FALSE, FALSE); maketitle(); gui_mch_flush(); -#else - [cmd appendString:@"|redr|f"]; - - [self addInput:cmd]; -#endif } #endif // FEAT_DND } diff --git a/src/MacVim/MacVim.h b/src/MacVim/MacVim.h index 55f92dba0b..5455b2f433 100644 --- a/src/MacVim/MacVim.h +++ b/src/MacVim/MacVim.h @@ -225,6 +225,9 @@ extern NSString *MMAtsuiRendererKey; // container reference (which should be used to deactivate the loaded fonts). ATSFontContainerRef loadFonts(); +// Functions to create command strings that can be sent to Vim as input. +NSString *buildTabDropCommand(NSArray *filenames); +NSString *buildSelectRangeCommand(NSRange range); diff --git a/src/MacVim/MacVim.m b/src/MacVim/MacVim.m index d78bf433e5..7ce61a5aa1 100644 --- a/src/MacVim/MacVim.m +++ b/src/MacVim/MacVim.m @@ -135,6 +135,54 @@ + NSString * +buildTabDropCommand(NSArray *filenames) +{ + // Create a command line string that will open the specified files in tabs. + + if (!filenames || [filenames count] == 0) + return [NSString string]; + + NSMutableString *cmd = [NSMutableString stringWithString: + @":tab drop"]; + + NSEnumerator *e = [filenames objectEnumerator]; + id o; + while ((o = [e nextObject])) { + NSString *file = [o stringByEscapingSpecialFilenameCharacters]; + [cmd appendString:@" "]; + [cmd appendString:file]; + } + + [cmd appendString:@"|redr|f"]; + + return cmd; +} + + NSString * +buildSelectRangeCommand(NSRange range) +{ + // Build a command line string that will select the given range of lines. + // If range.length == 0, then position the cursor on the given line but do + // not select. + + if (range.location == NSNotFound) + return [NSString string]; + + NSString *cmd; + if (range.length > 0) { + cmd = [NSString stringWithFormat:@"%dGV%dGz.0", + NSMaxRange(range), range.location]; + } else { + cmd = [NSString stringWithFormat:@"%dGz.0", range.location]; + } + + return cmd; +} + + + + @implementation NSString (MMExtras) - (NSString *)stringByEscapingSpecialFilenameCharacters From c438b122f7a6c70312ba9eaf4a8b418da8c3d8e6 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sat, 26 Jan 2008 16:40:24 +0100 Subject: [PATCH 0367/1156] Use Launch Services, user default for untitled windows Use Launch Services when launching MacVim from a Vim process instead of using NSTask. Added user default 'MMUntitledWindow' which controls when an untitled window should open. It can take the following values: 0 = Never open untitled window 1 = Open untitled window on 'Open' event 2 = Open untitled window on 'Reopen' event 3 = Open untitled window on both 'Open' and 'Reopen' events --- src/MacVim/MMAppController.h | 1 - src/MacVim/MMAppController.m | 49 ++++++++++++++++++-------- src/MacVim/MMBackend.m | 66 ++++++++++++++++-------------------- src/MacVim/MacVim.h | 12 +++++++ src/MacVim/MacVim.m | 1 + 5 files changed, 77 insertions(+), 52 deletions(-) diff --git a/src/MacVim/MMAppController.h b/src/MacVim/MMAppController.h index 1ed3822116..6c9d1df579 100644 --- a/src/MacVim/MMAppController.h +++ b/src/MacVim/MMAppController.h @@ -19,7 +19,6 @@ NSMutableArray *vimControllers; NSString *openSelectionString; ATSFontContainerRef fontContainerRef; - BOOL untitledWindowOpening; NSMutableDictionary *pidArguments; } diff --git a/src/MacVim/MMAppController.m b/src/MacVim/MMAppController.m index 23c689a00f..6dd5b5969e 100644 --- a/src/MacVim/MMAppController.m +++ b/src/MacVim/MMAppController.m @@ -110,6 +110,8 @@ + (void)initialize [NSNumber numberWithBool:NO], MMNoFontSubstitutionKey, [NSNumber numberWithBool:NO], MMLoginShellKey, [NSNumber numberWithBool:NO], MMAtsuiRendererKey, + [NSNumber numberWithInt:MMUntitledWindowAlways], + MMUntitledWindowKey, nil]; [[NSUserDefaults standardUserDefaults] registerDefaults:dict]; @@ -179,6 +181,27 @@ - (void)applicationDidFinishLaunching:(NSNotification *)notification - (BOOL)applicationShouldOpenUntitledFile:(NSApplication *)sender { + NSUserDefaults *ud = [NSUserDefaults standardUserDefaults]; + NSAppleEventManager *aem = [NSAppleEventManager sharedAppleEventManager]; + NSAppleEventDescriptor *desc = [aem currentAppleEvent]; + + // The user default MMUntitledWindow can be set to control whether an + // untitled window should open on 'Open' and 'Reopen' events. + int untitledWindowFlag = [ud integerForKey:MMUntitledWindowKey]; + if ([desc eventID] == kAEOpenApplication + && (untitledWindowFlag & MMUntitledWindowOnOpen) == 0) + return NO; + else if ([desc eventID] == kAEReopenApplication + && (untitledWindowFlag & MMUntitledWindowOnReopen) == 0) + return NO; + + // When a process is started from the command line, the 'Open' event will + // contain a parameter to surpress the opening of an untitled window. + desc = [desc paramDescriptorForKeyword:keyAEPropData]; + desc = [desc paramDescriptorForKeyword:keyMMUntitledWindow]; + if (desc && ![desc booleanValue]) + return NO; + // Never open an untitled window if there is at least one open window or if // there are processes that are currently launching. if ([vimControllers count] > 0 || [pidArguments count] > 0) @@ -186,9 +209,7 @@ - (BOOL)applicationShouldOpenUntitledFile:(NSApplication *)sender // NOTE! This way it possible to start the app with the command-line // argument '-nowindow yes' and no window will be opened by default. - untitledWindowOpening = - ![[NSUserDefaults standardUserDefaults] boolForKey:MMNoWindowKey]; - return untitledWindowOpening; + return ![ud boolForKey:MMNoWindowKey]; } - (BOOL)applicationOpenUntitledFile:(NSApplication *)sender @@ -215,7 +236,7 @@ - (void)application:(NSApplication *)sender openFiles:(NSArray *)filenames OSType remoteID = 0; NSString *remotePath = nil; - NSAppleEventManager *aem; + NSAppleEventManager *aem = nil; NSAppleEventDescriptor *remoteToken = nil; NSAppleEventDescriptor *odbdesc = nil; NSAppleEventDescriptor *xcodedesc = nil; @@ -561,9 +582,9 @@ - (IBAction)fontSizeDown:(id)sender connectBackend:(byref in id )backend pid:(int)pid { + //NSLog(@"Connect backend (pid=%d)", pid); NSNumber *pidKey = [NSNumber numberWithInt:pid]; MMVimController *vc = nil; - //NSLog(@"Connect backend (pid=%d)", pid); @try { [(NSDistantObject*)backend @@ -581,16 +602,6 @@ - (IBAction)fontSizeDown:(id)sender [vimControllers addObject:vc]; - // HACK! MacVim does not get activated if it is launched from the - // terminal, so we forcibly activate here unless it is an untitled - // window opening (i.e. MacVim was opened from the Finder). Untitled - // windows are treated differently, else MacVim would steal the focus - // if another app was activated while the untitled window was loading. - if (!untitledWindowOpening) - [NSApp activateIgnoringOtherApps:YES]; - - untitledWindowOpening = NO; - // Pass arguments to the Vim process. id args = [pidArguments objectForKey:pidKey]; if (args && args != [NSNull null]) { @@ -618,6 +629,14 @@ - (IBAction)fontSizeDown:(id)sender } } + // HACK! MacVim does not get activated if it is launched from the + // terminal, so we forcibly activate here unless it is an untitled + // window opening. Untitled windows are treated differently, else + // MacVim would steal the focus if another app was activated while the + // untitled window was loading. + if (!args || args != [NSNull null]) + [NSApp activateIgnoringOtherApps:YES]; + if (args) [pidArguments removeObjectForKey:pidKey]; diff --git a/src/MacVim/MMBackend.m b/src/MacVim/MMBackend.m index 22c696d4a2..b4d9ea7c05 100644 --- a/src/MacVim/MMBackend.m +++ b/src/MacVim/MMBackend.m @@ -219,51 +219,45 @@ - (BOOL)checkin { if (![self connection]) { NSBundle *mainBundle = [NSBundle mainBundle]; -#if 0 - NSString *path = [mainBundle bundlePath]; - if (![[NSWorkspace sharedWorkspace] launchApplication:path]) { - NSLog(@"WARNING: Failed to launch GUI with path %@", path); - return NO; + OSStatus status; + FSRef ref; + NSString *ident = [mainBundle bundleIdentifier]; + + // Launch MacVim using Launch Services (NSWorkspace would be nicer, but + // the API to pass Apple Event parameters is broken on 10.4). + status = LSFindApplicationForInfo(kLSUnknownCreator, + (CFStringRef)ident, NULL, &ref, NULL); + if (noErr == status) { + // Pass parameter to the 'Open' Apple Event that tells MacVim not + // to open an untitled window. + NSAppleEventDescriptor *desc = + [NSAppleEventDescriptor recordDescriptor]; + [desc setParamDescriptor: + [NSAppleEventDescriptor descriptorWithBoolean:NO] + forKeyword:keyMMUntitledWindow]; + + LSLaunchFSRefSpec spec = { &ref, 0, NULL, [desc aeDesc], + kLSLaunchDefaults, NULL }; + status = LSOpenFromRefSpec(&spec, NULL); } -#else - // HACK! It would be preferable to launch the GUI using NSWorkspace, - // however I have not managed to figure out how to pass arguments using - // NSWorkspace. - // - // NOTE! Using NSTask to launch the GUI has the negative side-effect - // that the GUI won't be activated (or raised) so there is a hack in - // MMWindowController which always raises the app when a new window is - // opened. - NSMutableArray *args = [NSMutableArray arrayWithObjects: - [NSString stringWithFormat:@"-%@", MMNoWindowKey], @"yes", nil]; - NSString *exeName = [[mainBundle infoDictionary] - objectForKey:@"CFBundleExecutable"]; - NSString *path = [mainBundle pathForAuxiliaryExecutable:exeName]; - if (!path) { - NSLog(@"ERROR: Could not find MacVim executable in bundle.%@", - MMSymlinkWarningString); + + if (noErr != status) { + NSLog(@"ERROR: Failed to launch MacVim using bundle identifier %@", + ident); return NO; } - [NSTask launchedTaskWithLaunchPath:path arguments:args]; -#endif - - // HACK! The NSWorkspaceDidLaunchApplicationNotification does not work - // for tasks like this, so poll the mach bootstrap server until it - // returns a valid connection. Also set a time-out date so that we - // don't get stuck doing this forever. - NSDate *timeOutDate = [NSDate dateWithTimeIntervalSinceNow:15]; - while (!connection && + // HACK! Poll the mach bootstrap server until it returns a valid + // connection to detect that MacVim has finished launching. Also set a + // time-out date so that we don't get stuck doing this forever. + NSDate *timeOutDate = [NSDate dateWithTimeIntervalSinceNow:10]; + while (![self connection] && NSOrderedDescending == [timeOutDate compare:[NSDate date]]) - { [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:1]]; - // NOTE: This call will set 'connection' as a side-effect. - [self connection]; - } - + // NOTE: [self connection] will set 'connection' as a side-effect. if (!connection) { NSLog(@"WARNING: Timed-out waiting for GUI to launch."); return NO; diff --git a/src/MacVim/MacVim.h b/src/MacVim/MacVim.h index 5455b2f433..3f45752599 100644 --- a/src/MacVim/MacVim.h +++ b/src/MacVim/MacVim.h @@ -217,7 +217,15 @@ extern NSString *MMOpenFilesInTabsKey; extern NSString *MMNoFontSubstitutionKey; extern NSString *MMLoginShellKey; extern NSString *MMAtsuiRendererKey; +extern NSString *MMUntitledWindowKey; +// Enum for MMUntitledWindowKey +enum { + MMUntitledWindowNever = 0, + MMUntitledWindowOnOpen = 1, + MMUntitledWindowOnReopen = 2, + MMUntitledWindowAlways = 3 +}; @@ -263,3 +271,7 @@ NSString *buildSelectRangeCommand(NSRange range); #define kAEClosedFile 'FCls' #define keySenderToken 'Tokn' + +// MacVim Apple Event Constants +#define keyMMUntitledWindow 'MMuw' + diff --git a/src/MacVim/MacVim.m b/src/MacVim/MacVim.m index 7ce61a5aa1..671b2eaaaa 100644 --- a/src/MacVim/MacVim.m +++ b/src/MacVim/MacVim.m @@ -98,6 +98,7 @@ NSString *MMNoFontSubstitutionKey = @"MMNoFontSubstitution"; NSString *MMLoginShellKey = @"MMLoginShell"; NSString *MMAtsuiRendererKey = @"MMAtsuiRenderer"; +NSString *MMUntitledWindowKey = @"MMUntitledWindow"; From 81598be3304f9ccdb0b2cce3430a7ed0d185e5e4 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sat, 26 Jan 2008 18:36:32 +0100 Subject: [PATCH 0368/1156] Added MMTexturedWindow user default Enable MMTexturedWindow to get textured window on Tiger (Leopard always uses a textured window). --- src/MacVim/MMAppController.m | 1 + src/MacVim/MMWindowController.m | 3 ++- src/MacVim/MacVim.h | 1 + src/MacVim/MacVim.m | 1 + 4 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/MacVim/MMAppController.m b/src/MacVim/MMAppController.m index 6dd5b5969e..33209b7e1b 100644 --- a/src/MacVim/MMAppController.m +++ b/src/MacVim/MMAppController.m @@ -112,6 +112,7 @@ + (void)initialize [NSNumber numberWithBool:NO], MMAtsuiRendererKey, [NSNumber numberWithInt:MMUntitledWindowAlways], MMUntitledWindowKey, + [NSNumber numberWithBool:NO], MMTexturedWindowKey, nil]; [[NSUserDefaults standardUserDefaults] registerDefaults:dict]; diff --git a/src/MacVim/MMWindowController.m b/src/MacVim/MMWindowController.m index 7039fae7c5..048741f8d2 100644 --- a/src/MacVim/MMWindowController.m +++ b/src/MacVim/MMWindowController.m @@ -128,7 +128,8 @@ - (id)initWithVimController:(MMVimController *)controller // Use textured background on Leopard or later (skip the 'if' on Tiger for // polished metal window). - if (floor(NSAppKitVersionNumber) > NSAppKitVersionNumber10_4) + if ([[NSUserDefaults standardUserDefaults] boolForKey:MMTexturedWindowKey] + || (floor(NSAppKitVersionNumber) > NSAppKitVersionNumber10_4)) styleMask |= NSTexturedBackgroundWindowMask; // NOTE: The content rect is only used the very first time MacVim is diff --git a/src/MacVim/MacVim.h b/src/MacVim/MacVim.h index 3f45752599..47cb286090 100644 --- a/src/MacVim/MacVim.h +++ b/src/MacVim/MacVim.h @@ -218,6 +218,7 @@ extern NSString *MMNoFontSubstitutionKey; extern NSString *MMLoginShellKey; extern NSString *MMAtsuiRendererKey; extern NSString *MMUntitledWindowKey; +extern NSString *MMTexturedWindowKey; // Enum for MMUntitledWindowKey enum { diff --git a/src/MacVim/MacVim.m b/src/MacVim/MacVim.m index 671b2eaaaa..5f66971064 100644 --- a/src/MacVim/MacVim.m +++ b/src/MacVim/MacVim.m @@ -99,6 +99,7 @@ NSString *MMLoginShellKey = @"MMLoginShell"; NSString *MMAtsuiRendererKey = @"MMAtsuiRenderer"; NSString *MMUntitledWindowKey = @"MMUntitledWindow"; +NSString *MMTexturedWindowKey = @"MMTexturedWindow"; From ff9125d6acbea94650cbfce1c9d8718795aafb17 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sat, 26 Jan 2008 22:25:09 +0100 Subject: [PATCH 0369/1156] Highlight spotlight queries on open When MacVim is started from a spotlight search, the query text from spotlight is highlighted. --- src/MacVim/MMAppController.m | 263 ++++++++++++++++++----------------- src/MacVim/MacVim.h | 1 + src/MacVim/MacVim.m | 8 ++ 3 files changed, 141 insertions(+), 131 deletions(-) diff --git a/src/MacVim/MMAppController.m b/src/MacVim/MMAppController.m index 33209b7e1b..59961a05a8 100644 --- a/src/MacVim/MMAppController.m +++ b/src/MacVim/MMAppController.m @@ -66,16 +66,17 @@ - (MMVimController *)keyVimController; - (MMVimController *)topmostVimController; - (int)launchVimProcessWithArguments:(NSArray *)args; - (NSArray *)filterFilesAndNotify:(NSArray *)files; -- (NSArray *)filterOpenFiles:(NSArray *)filenames remote:(OSType)theID - path:(NSString *)path - token:(NSAppleEventDescriptor *)token - selectionRange:(NSRange)selectionRange; +- (NSArray *)filterOpenFiles:(NSArray *)filenames + arguments:(NSDictionary *)args; #if MM_HANDLE_XCODE_MOD_EVENT - (void)handleXcodeModEvent:(NSAppleEventDescriptor *)event replyEvent:(NSAppleEventDescriptor *)reply; #endif - (int)findLaunchingProcessWithoutArguments; - (MMVimController *)findUntitledWindow; +- (NSMutableDictionary *)extractArgumentsFromOdocEvent: + (NSAppleEventDescriptor *)desc; +- (void)passArguments:(NSDictionary *)args toVimController:(MMVimController*)vc; @end @interface NSMenu (MMExtras) @@ -222,8 +223,8 @@ - (BOOL)applicationOpenUntitledFile:(NSApplication *)sender - (void)application:(NSApplication *)sender openFiles:(NSArray *)filenames { // Opening files works like this: - // a) extract ODB and/or Xcode parameters from the current Apple event - // b) filter out any already open files (see filterOpenFiles:::::) + // a) extract ODB/Xcode/Spotlight parameters from the current Apple event + // b) filter out any already open files (see filterOpenFiles::) // c) open any remaining files // // A file is opened in an untitled window if there is one (it may be @@ -235,86 +236,29 @@ - (void)application:(NSApplication *)sender openFiles:(NSArray *)filenames // arguments for each launching process can be looked up by its PID (in the // pidArguments dictionary). - OSType remoteID = 0; - NSString *remotePath = nil; - NSAppleEventManager *aem = nil; - NSAppleEventDescriptor *remoteToken = nil; - NSAppleEventDescriptor *odbdesc = nil; - NSAppleEventDescriptor *xcodedesc = nil; - NSRange selectionRange = { NSNotFound, 0 }; + NSMutableDictionary *arguments = [self extractArgumentsFromOdocEvent: + [[NSAppleEventManager sharedAppleEventManager] currentAppleEvent]]; - // 1. Extract ODB parameters (if any) - aem = [NSAppleEventManager sharedAppleEventManager]; - odbdesc = [aem currentAppleEvent]; - if (![odbdesc paramDescriptorForKeyword:keyFileSender]) { - // The ODB paramaters may hide inside the 'keyAEPropData' descriptor. - odbdesc = [odbdesc paramDescriptorForKeyword:keyAEPropData]; - if (![odbdesc paramDescriptorForKeyword:keyFileSender]) - odbdesc = nil; - } - - if (odbdesc) { - remoteID = [[odbdesc paramDescriptorForKeyword:keyFileSender] - typeCodeValue]; - remotePath = [[odbdesc paramDescriptorForKeyword:keyFileCustomPath] - stringValue]; - remoteToken = [[odbdesc paramDescriptorForKeyword:keyFileSenderToken] - copy]; - } - - // 2. Extract Xcode parameters (if any) - xcodedesc = [[aem currentAppleEvent] - paramDescriptorForKeyword:keyAEPosition]; - if (xcodedesc) { - MMSelectionRange *sr = (MMSelectionRange*)[[xcodedesc data] bytes]; - if (sr->lineNum < 0) { - // Should select a range of lines. - selectionRange.location = sr->startRange + 1; - selectionRange.length = sr->endRange - sr->startRange + 1; - } else { - // Should only move cursor to a line. - selectionRange.location = sr->lineNum + 1; - } - } + // Filter out files that are already open + filenames = [self filterOpenFiles:filenames arguments:arguments]; - // 3. Filter out files that are already open - filenames = [self filterOpenFiles:filenames remote:remoteID path:remotePath - token:remoteToken - selectionRange:selectionRange]; - - // 4. Open any files that remain + // Open any files that remain if ([filenames count]) { MMVimController *vc; BOOL openInTabs = [[NSUserDefaults standardUserDefaults] boolForKey:MMOpenFilesInTabsKey]; + [arguments setObject:filenames forKey:@"filenames"]; + [arguments setObject:[NSNumber numberWithBool:YES] forKey:@"openFiles"]; + if ((openInTabs && (vc = [self topmostVimController])) || (vc = [self findUntitledWindow])) { - - // 5-1 Open files in an already open window (either due to the fact - // that MMMOpenFilesInTabs was set or because there was already an - // untitled Vim process open). - - [vc dropFiles:filenames forceOpen:YES]; - if (odbdesc) - [vc odbEdit:filenames server:remoteID path:remotePath - token:remoteToken]; - if (selectionRange.location != NSNotFound) - [vc addVimInput:buildSelectRangeCommand(selectionRange)]; + // Open files in an already open window. + [self passArguments:arguments toVimController:vc]; } else { - - // 5-2. Open files - // a) in a launching Vim that has no arguments, if there is one - // else - // b) launch a new Vim process and open files there. - - NSMutableDictionary *argDict = [NSMutableDictionary dictionary]; - + // Open files in a launching Vim process or start a new process. int pid = [self findLaunchingProcessWithoutArguments]; - if (pid) { - // The filenames are passed as arguments in connectBackend::. - [argDict setObject:filenames forKey:@"filenames"]; - } else { + if (!pid) { // Pass the filenames to the process straight away. // // TODO: It would be nicer if all arguments were passed to the @@ -326,31 +270,19 @@ - (void)application:(NSApplication *)sender openFiles:(NSArray *)filenames fileArgs = [fileArgs arrayByAddingObjectsFromArray:filenames]; pid = [self launchVimProcessWithArguments:fileArgs]; + + // Make sure these files aren't opened again when + // connectBackend:pid: is called. + [arguments setObject:[NSNumber numberWithBool:NO] + forKey:@"openFiles"]; } // TODO: If the Vim process fails to start, or if it changes PID, // then the memory allocated for these parameters will leak. // Ensure that this cannot happen or somehow detect it. - if (odbdesc) { - [argDict setObject:filenames forKey:@"remoteFiles"]; - - // The remote token can be arbitrary data so it is cannot - // (without encoding it as text) be passed on the command line. - [argDict setObject:[NSNumber numberWithUnsignedInt:remoteID] - forKey:@"remoteID"]; - if (remotePath) - [argDict setObject:remotePath forKey:@"remotePath"]; - if (remoteToken) - [argDict setObject:remoteToken forKey:@"remoteToken"]; - } - - if (selectionRange.location != NSNotFound) - [argDict setObject:NSStringFromRange(selectionRange) - forKey:@"selectionRange"]; - - if ([argDict count] > 0) - [pidArguments setObject:argDict + if ([arguments count] > 0) + [pidArguments setObject:arguments forKey:[NSNumber numberWithInt:pid]]; } } @@ -603,32 +535,9 @@ - (IBAction)fontSizeDown:(id)sender [vimControllers addObject:vc]; - // Pass arguments to the Vim process. id args = [pidArguments objectForKey:pidKey]; - if (args && args != [NSNull null]) { - // Pass filenames to open - NSArray *filenames = [args objectForKey:@"filenames"]; - if (filenames) { - NSString *tabDrop = buildTabDropCommand(filenames); - [vc addVimInput:tabDrop]; - } - - // Pass ODB data - if ([args objectForKey:@"remoteFiles"] - && [args objectForKey:@"remoteID"]) { - [vc odbEdit:[args objectForKey:@"remoteFiles"] - server:[[args objectForKey:@"remoteID"] unsignedIntValue] - path:[args objectForKey:@"remotePath"] - token:[args objectForKey:@"remoteToken"]]; - } - - // Pass range of lines to select - if ([args objectForKey:@"selectionRange"]) { - NSRange selectionRange = NSRangeFromString( - [args objectForKey:@"selectionRange"]); - [vc addVimInput:buildSelectRangeCommand(selectionRange)]; - } - } + if (args && [NSNull null] != args) + [self passArguments:args toVimController:vc]; // HACK! MacVim does not get activated if it is launched from the // terminal, so we forcibly activate here unless it is an untitled @@ -885,10 +794,8 @@ - (NSArray *)filterFilesAndNotify:(NSArray *)filenames return files; } -- (NSArray *)filterOpenFiles:(NSArray *)filenames remote:(OSType)theID - path:(NSString *)path - token:(NSAppleEventDescriptor *)token - selectionRange:(NSRange)selectionRange +- (NSArray *)filterOpenFiles:(NSArray *)filenames + arguments:(NSDictionary *)args { // Check if any of the files in the 'filenames' array are open in any Vim // process. Remove the files that are open from the 'filenames' array and @@ -896,6 +803,8 @@ - (NSArray *)filterOpenFiles:(NSArray *)filenames remote:(OSType)theID // the Vim process it is open. Files that are filtered are sent an odb // open event in case theID is not zero. + NSMutableDictionary *localArgs = + [NSMutableDictionary dictionaryWithDictionary:args]; MMVimController *raiseController = nil; NSString *raiseFile = nil; NSMutableArray *files = [filenames mutableCopy]; @@ -904,11 +813,15 @@ - (NSArray *)filterOpenFiles:(NSArray *)filenames remote:(OSType)theID [files componentsJoinedByString:@"\",\""]]; unsigned i, count = [vimControllers count]; + // Ensure that the files aren't opened when passing arguments. + [localArgs setObject:[NSNumber numberWithBool:NO] forKey:@"openFiles"]; + for (i = 0; i < count && [files count]; ++i) { MMVimController *controller = [vimControllers objectAtIndex:i]; id proxy = [controller backendProxy]; @try { + // Query Vim for which files in the 'files' array are open. NSString *eval = [proxy evaluateExpression:expr]; NSIndexSet *idxSet = [NSIndexSet indexSetWithVimList:eval]; if ([idxSet count]) { @@ -920,10 +833,10 @@ - (NSArray *)filterOpenFiles:(NSArray *)filenames remote:(OSType)theID [[raiseFile retain] autorelease]; } - // Send an odb open event to the Vim process. - if (theID != 0) - [controller odbEdit:[files objectsAtIndexes:idxSet] - server:theID path:path token:token]; + // Pass (ODB/Xcode/Spotlight) arguments to this process. + [localArgs setObject:[files objectsAtIndexes:idxSet] + forKey:@"filenames"]; + [self passArguments:localArgs toVimController:controller]; // Remove all the files that were open in this Vim process and // create a new expression to evaluate. @@ -950,10 +863,6 @@ - (NSArray *)filterOpenFiles:(NSArray *)filenames remote:(OSType)theID "tab sb %@|let &swb=oldswb|unl oldswb|" "cal foreground()|redr|f", raiseFile]; - if (selectionRange.location != NSNotFound) - input = [input stringByAppendingString: - buildSelectRangeCommand(selectionRange)]; - [raiseController addVimInput:input]; } @@ -1015,6 +924,98 @@ - (MMVimController *)findUntitledWindow return nil; } +- (NSMutableDictionary *)extractArgumentsFromOdocEvent: + (NSAppleEventDescriptor *)desc +{ + NSMutableDictionary *dict = [NSMutableDictionary dictionary]; + + // 1. Extract ODB parameters (if any) + NSAppleEventDescriptor *odbdesc = desc; + if (![odbdesc paramDescriptorForKeyword:keyFileSender]) { + // The ODB paramaters may hide inside the 'keyAEPropData' descriptor. + odbdesc = [odbdesc paramDescriptorForKeyword:keyAEPropData]; + if (![odbdesc paramDescriptorForKeyword:keyFileSender]) + odbdesc = nil; + } + + if (odbdesc) { + NSAppleEventDescriptor *p = + [odbdesc paramDescriptorForKeyword:keyFileSender]; + if (p) + [dict setObject:[NSNumber numberWithUnsignedInt:[p typeCodeValue]] + forKey:@"remoteID"]; + + p = [odbdesc paramDescriptorForKeyword:keyFileCustomPath]; + if (p) + [dict setObject:[p stringValue] forKey:@"remotePath"]; + + p = [odbdesc paramDescriptorForKeyword:keyFileSenderToken]; + if (p) + [dict setObject:p forKey:@"remotePath"]; + } + + // 2. Extract Xcode parameters (if any) + NSAppleEventDescriptor *xcodedesc = + [desc paramDescriptorForKeyword:keyAEPosition]; + if (xcodedesc) { + NSRange range; + MMSelectionRange *sr = (MMSelectionRange*)[[xcodedesc data] bytes]; + + if (sr->lineNum < 0) { + // Should select a range of lines. + range.location = sr->startRange + 1; + range.length = sr->endRange - sr->startRange + 1; + } else { + // Should only move cursor to a line. + range.location = sr->lineNum + 1; + range.length = 0; + } + + [dict setObject:NSStringFromRange(range) forKey:@"selectionRange"]; + } + + // 3. Extract Spotlight search text (if any) + NSAppleEventDescriptor *spotlightdesc = + [desc paramDescriptorForKeyword:keyAESearchText]; + if (spotlightdesc) + [dict setObject:[spotlightdesc stringValue] forKey:@"searchText"]; + + return dict; +} + +- (void)passArguments:(NSDictionary *)args toVimController:(MMVimController*)vc +{ + if (!args) return; + + // Pass filenames to open if required (the 'openFiles' argument can be used + // to disallow opening of the files). + NSArray *filenames = [args objectForKey:@"filenames"]; + if (filenames && [[args objectForKey:@"openFiles"] boolValue]) { + NSString *tabDrop = buildTabDropCommand(filenames); + [vc addVimInput:tabDrop]; + } + + // Pass ODB data + if (filenames && [args objectForKey:@"remoteID"]) { + [vc odbEdit:filenames + server:[[args objectForKey:@"remoteID"] unsignedIntValue] + path:[args objectForKey:@"remotePath"] + token:[args objectForKey:@"remoteToken"]]; + } + + // Pass range of lines to select + if ([args objectForKey:@"selectionRange"]) { + NSRange selectionRange = NSRangeFromString( + [args objectForKey:@"selectionRange"]); + [vc addVimInput:buildSelectRangeCommand(selectionRange)]; + } + + // Pass search text + NSString *searchText = [args objectForKey:@"searchText"]; + if (searchText) + [vc addVimInput:buildSearchTextCommand(searchText)]; +} + @end // MMAppController (Private) diff --git a/src/MacVim/MacVim.h b/src/MacVim/MacVim.h index 47cb286090..98aee7036d 100644 --- a/src/MacVim/MacVim.h +++ b/src/MacVim/MacVim.h @@ -237,6 +237,7 @@ ATSFontContainerRef loadFonts(); // Functions to create command strings that can be sent to Vim as input. NSString *buildTabDropCommand(NSArray *filenames); NSString *buildSelectRangeCommand(NSRange range); +NSString *buildSearchTextCommand(NSString *searchText); diff --git a/src/MacVim/MacVim.m b/src/MacVim/MacVim.m index 5f66971064..23566f7786 100644 --- a/src/MacVim/MacVim.m +++ b/src/MacVim/MacVim.m @@ -182,6 +182,14 @@ return cmd; } + NSString * +buildSearchTextCommand(NSString *searchText) +{ + // TODO: Searching is an exclusive motion, so if the pattern would match on + // row 0 column 0 then this pattern will miss that match. + return [NSString stringWithFormat:@"gg/\\c%@", searchText]; +} + From ec81b3fea1ad9d122819ae07c8ee47a169c74e0c Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sun, 27 Jan 2008 13:28:57 +0100 Subject: [PATCH 0370/1156] Launch MacVim from path instead of bundle id Use bundle path instead of bundle identifier when MacVim is launched from a Vim process. This avoids problems when there are several copies of MacVim.app on the hard drive. --- src/MacVim/MMBackend.m | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/MacVim/MMBackend.m b/src/MacVim/MMBackend.m index b4d9ea7c05..89d5d1c156 100644 --- a/src/MacVim/MMBackend.m +++ b/src/MacVim/MMBackend.m @@ -221,12 +221,17 @@ - (BOOL)checkin NSBundle *mainBundle = [NSBundle mainBundle]; OSStatus status; FSRef ref; - NSString *ident = [mainBundle bundleIdentifier]; // Launch MacVim using Launch Services (NSWorkspace would be nicer, but // the API to pass Apple Event parameters is broken on 10.4). +#if 0 + NSString *ident = [mainBundle bundleIdentifier]; status = LSFindApplicationForInfo(kLSUnknownCreator, (CFStringRef)ident, NULL, &ref, NULL); +#else + NSString *path = [mainBundle bundlePath]; + status = FSPathMakeRef((const UInt8 *)[path UTF8String], &ref, NULL); +#endif if (noErr == status) { // Pass parameter to the 'Open' Apple Event that tells MacVim not // to open an untitled window. @@ -242,8 +247,13 @@ - (BOOL)checkin } if (noErr != status) { +#if 0 NSLog(@"ERROR: Failed to launch MacVim using bundle identifier %@", ident); +#else + NSLog(@"ERROR: Failed to launch MacVim (path=%@).%@", + path, MMSymlinkWarningString); +#endif return NO; } From d2b63e9e8fe100bbc99979a46e889cae96efb702 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sun, 27 Jan 2008 14:37:59 +0100 Subject: [PATCH 0371/1156] Revert to using NSTask to launch MacVim Using Launch Services (LS) caused several problems, so this commit reverts back to using NSTask to launch MacVim from a Vim process. The most severe problem LS caused was that sometimes MacVim would never finish launching (the dock icon kept bouncing forever). Rebuilding the LS database seemed to temporarily fix this problem, but it kept reoccuring. --- src/MacVim/MMBackend.m | 35 ++++++++++++++++++++++++----------- 1 file changed, 24 insertions(+), 11 deletions(-) diff --git a/src/MacVim/MMBackend.m b/src/MacVim/MMBackend.m index 89d5d1c156..598272ab94 100644 --- a/src/MacVim/MMBackend.m +++ b/src/MacVim/MMBackend.m @@ -219,19 +219,14 @@ - (BOOL)checkin { if (![self connection]) { NSBundle *mainBundle = [NSBundle mainBundle]; +#if 0 OSStatus status; FSRef ref; // Launch MacVim using Launch Services (NSWorkspace would be nicer, but // the API to pass Apple Event parameters is broken on 10.4). -#if 0 - NSString *ident = [mainBundle bundleIdentifier]; - status = LSFindApplicationForInfo(kLSUnknownCreator, - (CFStringRef)ident, NULL, &ref, NULL); -#else NSString *path = [mainBundle bundlePath]; status = FSPathMakeRef((const UInt8 *)[path UTF8String], &ref, NULL); -#endif if (noErr == status) { // Pass parameter to the 'Open' Apple Event that tells MacVim not // to open an untitled window. @@ -247,15 +242,33 @@ - (BOOL)checkin } if (noErr != status) { -#if 0 - NSLog(@"ERROR: Failed to launch MacVim using bundle identifier %@", - ident); -#else NSLog(@"ERROR: Failed to launch MacVim (path=%@).%@", path, MMSymlinkWarningString); -#endif return NO; } +#else + // Launch MacVim using NSTask. For some reason the above code using + // Launch Services sometimes fails on LSOpenFromRefSpec() (when it + // fails, the dock icon starts bouncing and never stops). It seems + // like rebuilding the Launch Services database takes care of this + // problem, but the NSTask way seems more stable so stick with it. + // + // NOTE! Using NSTask to launch the GUI has the negative side-effect + // that the GUI won't be activated (or raised) so there is a hack in + // MMAppController which raises the app when a new window is opened. + NSMutableArray *args = [NSMutableArray arrayWithObjects: + [NSString stringWithFormat:@"-%@", MMNoWindowKey], @"yes", nil]; + NSString *exeName = [[mainBundle infoDictionary] + objectForKey:@"CFBundleExecutable"]; + NSString *path = [mainBundle pathForAuxiliaryExecutable:exeName]; + if (!path) { + NSLog(@"ERROR: Could not find MacVim executable in bundle.%@", + MMSymlinkWarningString); + return NO; + } + + [NSTask launchedTaskWithLaunchPath:path arguments:args]; +#endif // HACK! Poll the mach bootstrap server until it returns a valid // connection to detect that MacVim has finished launching. Also set a From 112f86ba330f8ef472ecef4783bd574fedcedf82 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Tue, 29 Jan 2008 20:05:21 +0100 Subject: [PATCH 0372/1156] File->Close sends performClose: This fixes a bug where would close not close the about dialog box, but instead would close a (partially) obscured window. --- src/MacVim/MMFullscreenWindow.m | 12 +++++++++--- src/MacVim/MMWindow.m | 9 +++++++++ src/MacVim/MMWindowController.h | 1 + src/MacVim/MMWindowController.m | 8 ++++++++ src/MacVim/gvimrc | 2 +- 5 files changed, 28 insertions(+), 4 deletions(-) diff --git a/src/MacVim/MMFullscreenWindow.m b/src/MacVim/MMFullscreenWindow.m index 5b4cda52f6..e1caa370b4 100644 --- a/src/MacVim/MMFullscreenWindow.m +++ b/src/MacVim/MMFullscreenWindow.m @@ -214,14 +214,20 @@ - (void)centerView [view setFrameOrigin:origin]; } - -#pragma mark Proxy/Decorator/whatever stuff - - (void)scrollWheel:(NSEvent *)theEvent { [[view textView] scrollWheel:theEvent]; } +- (void)performClose:(id)sender +{ + id wc = [self windowController]; + if ([wc respondsToSelector:@selector(performClose:)]) + [wc performClose:sender]; + else + [super performClose:sender]; +} + @end // MMFullscreenWindow diff --git a/src/MacVim/MMWindow.m b/src/MacVim/MMWindow.m index 2a5968f586..70a9fd2ef7 100644 --- a/src/MacVim/MMWindow.m +++ b/src/MacVim/MMWindow.m @@ -117,4 +117,13 @@ - (void)setContentSize:(NSSize)size [super setContentSize:size]; } +- (void)performClose:(id)sender +{ + id wc = [self windowController]; + if ([wc respondsToSelector:@selector(performClose:)]) + [wc performClose:sender]; + else + [super performClose:sender]; +} + @end // MMWindow diff --git a/src/MacVim/MMWindowController.h b/src/MacVim/MMWindowController.h index a2fd82e7d2..f42fde41ef 100644 --- a/src/MacVim/MMWindowController.h +++ b/src/MacVim/MMWindowController.h @@ -65,5 +65,6 @@ - (IBAction)addNewTab:(id)sender; - (IBAction)toggleToolbar:(id)sender; +- (IBAction)performClose:(id)sender; @end diff --git a/src/MacVim/MMWindowController.m b/src/MacVim/MMWindowController.m index 048741f8d2..9f6fe0fd09 100644 --- a/src/MacVim/MMWindowController.m +++ b/src/MacVim/MMWindowController.m @@ -606,6 +606,14 @@ - (IBAction)toggleToolbar:(id)sender [vimController sendMessage:ToggleToolbarMsgID data:nil]; } +- (IBAction)performClose:(id)sender +{ + // NOTE: File->Close is bound to this action message instead binding it + // directly to the below vim input so that File->Close also works for + // auxiliary windows such as the About dialog. (If we were to bind the + // below, then will not close e.g. the About dialog.) + [vimController addVimInput:@":conf q"]; +} // -- NSWindow delegate ------------------------------------------------------ diff --git a/src/MacVim/gvimrc b/src/MacVim/gvimrc index dcbe5db984..433fb90ccc 100644 --- a/src/MacVim/gvimrc +++ b/src/MacVim/gvimrc @@ -47,7 +47,7 @@ an 10.295 File.New\ Tab :tabnew an 10.310 File.&Open\.\.\. :maca fileOpen: an 10.328 File.-SEP0- an 10.330 File.Close\ Window:qa :confirm qa -an 10.331 File.Close:q :confirm q +an 10.331 File.Close :maca performClose: "an 10.331 File.Close\ Tab :tabclose an 20.460 Edit.-SEP4- From b8e984431aaf0fa77d22595c284c2fef0d781395 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Wed, 30 Jan 2008 20:16:25 +0100 Subject: [PATCH 0373/1156] Added preference panel The preference panel is very simplistic at the moment. We might want to consider making it a Safari-style preference panel if the number of preferences increase. --- src/MacVim/Actions.plist | 2 + .../English.lproj/MainMenu.nib/classes.nib | 10 ++- .../English.lproj/MainMenu.nib/info.nib | 4 +- .../MainMenu.nib/keyedobjects.nib | Bin 7498 -> 7564 bytes .../English.lproj/Preferences.nib/classes.nib | 25 ++++++ .../English.lproj/Preferences.nib/info.nib | 16 ++++ .../Preferences.nib/keyedobjects.nib | Bin 0 -> 7505 bytes src/MacVim/MMAppController.h | 1 + src/MacVim/MMAppController.m | 6 ++ src/MacVim/MMPreferenceController.h | 29 +++++++ src/MacVim/MMPreferenceController.m | 82 ++++++++++++++++++ src/MacVim/MacVim.xcodeproj/project.pbxproj | 20 +++++ 12 files changed, 192 insertions(+), 3 deletions(-) create mode 100644 src/MacVim/English.lproj/Preferences.nib/classes.nib create mode 100644 src/MacVim/English.lproj/Preferences.nib/info.nib create mode 100644 src/MacVim/English.lproj/Preferences.nib/keyedobjects.nib create mode 100644 src/MacVim/MMPreferenceController.h create mode 100644 src/MacVim/MMPreferenceController.m diff --git a/src/MacVim/Actions.plist b/src/MacVim/Actions.plist index 74334236c6..b555ae9f98 100644 --- a/src/MacVim/Actions.plist +++ b/src/MacVim/Actions.plist @@ -24,6 +24,8 @@ orderFrontFontPanel: + orderFrontPreferencePanel: + performClose: performMiniaturize: diff --git a/src/MacVim/English.lproj/MainMenu.nib/classes.nib b/src/MacVim/English.lproj/MainMenu.nib/classes.nib index 72ef18a17f..09e79c993f 100644 --- a/src/MacVim/English.lproj/MainMenu.nib/classes.nib +++ b/src/MacVim/English.lproj/MainMenu.nib/classes.nib @@ -13,7 +13,15 @@ SUPERCLASS = NSObject; }, { - ACTIONS = {newWindow = id; selectNextWindow = id; selectPreviousWindow = id; }; + ACTIONS = { + fileOpen = id; + fontSizeDown = id; + fontSizeUp = id; + newWindow = id; + orderFrontPreferencePanel = id; + selectNextWindow = id; + selectPreviousWindow = id; + }; CLASS = MMAppController; LANGUAGE = ObjC; SUPERCLASS = NSObject; diff --git a/src/MacVim/English.lproj/MainMenu.nib/info.nib b/src/MacVim/English.lproj/MainMenu.nib/info.nib index 3879585f32..0384cf233e 100644 --- a/src/MacVim/English.lproj/MainMenu.nib/info.nib +++ b/src/MacVim/English.lproj/MainMenu.nib/info.nib @@ -10,12 +10,12 @@ 130 475 458 44 0 0 1024 746 IBFramework Version - 446.1 + 489.0 IBOpenObjects 29 IBSystem Version - 8R218 + 8S165 diff --git a/src/MacVim/English.lproj/MainMenu.nib/keyedobjects.nib b/src/MacVim/English.lproj/MainMenu.nib/keyedobjects.nib index b61013f5eeff5b7f8c988a3a78b1f89512246a60..66cb63120915824e42eaee161b112b69a833923e 100644 GIT binary patch literal 7564 zcmb7I33wD$wm!FR?_J$h-Bs0q2qY!}ku?D^>?A-SKmyrA5(u57LK@QDp}Rv^1TMSC zAcE|OED-?_PtbEF#XW;<+84ki<;W*yC2q)kqoQ5-S7S6*3 zcpomphj0bHfN$YD_#XZN*9j0p48%eNA`*$TAZ^JVB!MK7Bytx?CMl!`=}CH%K_rc& zlfh&d36t4mK3PB(;`b7=jI1K7$y&0GJVy4B1LP=%c4fWAUbTX}_ej1=bT1ThQ5Dn7^t*29I1D!!S|yT zXirfneHA`6G0?$U{D=NGDVPyL4I6@?$+#vX7>Hzf1Kx>hXe`Q8r$umLVRl|_Fc@JQ z*#-6}+s+O@Vj%v)xHr+_DbNFYBJn6$O(kYz^iAl6L-#-` zitQSXgnWUC2$xoeX6&=2|->-5xciGCA68I8~%2Ef3mYqIJiUNlBt zR7!DnUh|F4SeKIq>DwS3298HX>cf$sKQ^f8F$7Y}MKLpdaIiAyZRW43FbqeBLngYg zsZfNsFpDm6B#df=QIG`#(LXUA)JOp;phonSqoM2x7y~(w3we+a1yBe@Pz+Shg-Jt?1p$aWCL=8uLfv9DQvhzlHE7V$z zX|O(2sWOgvSPN!<8>(R<)PN5r!DOgK34RDb5b9tGgdhwNbX=Ais7G;G0o5N2_$o&Q zE6YV!v_1}H%+aI{?2&!oa@)G zyD`gvIheqlOk&Cz)L|;(H^4NQ4l`gTB5R(qR6`IQQF`dwQ{oG8=9=UWf3fHgvD^5 z795xHo;Jp8p;Tv0!S!OaheXL!+lk1+~`OR_T!wIa?w+R z&(X)555rc3P5npH`oQPmaH^B7xDbRp^CHEzi`wGgv3+3MV zdvag9$&ejmhAhsj2{y!~)z+f^^#M&V-v5sN=in`P8@jX3tSjqwqw2kfm97iMX;v1l zYw~<8Zd9t&T6JP`Onm^C8sU;2ByuzyM%QERMVe#ebW=6>2)SHlJ&{TBZ<$<;ruwyJ zCMm2(jLD5`{1U#xZ2X2zW&upS+WeAW&|g-khN^=hzjogz2K56%{lt1BRIlHI`WHg| z9Cbzty9c3CHD?rO`2s$_Z-$!VkA@!Mw9u29Ahbbmq&|e>7;sHk#0Ztd%=#l%-`~L^ zwwq}6i_t0<-RWB2(0mjZ3C2Z3TSs+isDd{X@&+cVnStoYO^7lgde~q@9QYeV(o!=d zX$4bA>nOWHEDaIUHFl@5tYJ|j?O+CpXLHen^9lyn2E%Gj!?-4j(Z`!2@EqxYU>z|s zh9lh2--GLna9x|=G7xT<23L};HpJ;IJ||ETP#g67UrFzU(o<1-7D^xS8|iujAbnAK z|E9bdiPA@D(rd9Xg>YY6jUVkAK$oi!j%%OO8TTSLip7|aTCIlEK&2Y36wx|JhLE9+ zWGKmq_S2@`mxkt^j@3DOjrKn>oP_p?9Z4qmNh%pdvfvfck&J<>Bo`hg`J@1^QWoiuP%X_N_*nX1}9b=O)|iXxd$DjcGvk;>IE~oTt`#Ltfkoql;R{G_wA` z*8gh7E&b6H&|}DR&8SCkm6w&rkl2LcJT)}chkNrIUU-2VL(?8-6|4%4Td5a`qmbIP z!y_+2*%p?KC8J#1yy>g8{{G)<{ok)BLrkr$s2bpJ-JBbB^TilljPpq`s3{#nYu#pnnHdo4!2OKGOAGfm~@mpD<=7m6l%$JjVnw;=>Lx z8!P_<*h{8jUs&;n)+XiLtY)-%h_;BWZAM#HiaBrt5Kpb#LXxqKV0YBv7wc^>NJ_AN z`LX%=NlPrds07}jLiiojKKP%H&9MMKb=pk47GXn-jzz~?lCgNL#1!q0zjjAG=A++v z|I(Q?NIrAXRN<3X)yaG^ULYLL=}P#3{H(&cV+HUE}>Ev>lss zDxN^kksvmJ5jfTvXEco;!g1~|++pso+!5|5dxULfTi8~%jcv$J#=pGel;mhB;*LXV znHJq0!f~S;0%}MrNOQ`FJG17p>Cge=dIwFQi8P6}ryb~>v?INX zcA}kW7uuC}qupsTO`$z#PkJ})Mem`hv^VWT`_g{2KOH~^vK?$E+r=JdyV(}j^2{SSMFJ^1f}dxM=~Z?e>YNVz02NX8^opJRq=wjQv6K3D1I;gulS=l zUtBK!B>qjjBCZhM6W59FivJK-i zKNdd~zY^aOKN07OKZuLO2gMJ?YhoYq8#rPHF#T)&@rBcAB&rhCj! zI+xDdM(0I$ubJuko1h{11{f^(ZZHAg{3YYNr&0LcrVzuY8efYhbN6x&aF1iipWse& zm$+ZhVQtU>DRdCN$gIH^kn`xD=tFchT}#)~jdT;;Ot;cTx}ENzyXbDZhwh_K(f#xp zdVn6KC+TbS4f+oKh<-!Aqdyyr2GP*M(9w`$=xZ2a$TSoiyoQKjs$q`de#273GQ%3f zCd1=~Ck+P;ZyL@R&Kce|oHx8@c;E1W;X}j6hAW0^hEENj8-6j`jgs+pV_RdK@eX66 zaj0>WvBVfKPBk*)QsX+~2IFSqqsGUKJB^PUpD^w<9x=XXeA9Twc+U8?@x1Yh@tW}m zlfh&%Sxh#Q+mvYPV(MucW-2w+m?oKOO##zf)BUF9rVXY>(_Yh)rh}%VrngO3P5&_c z%k;D9-)1nkF}E|vn-k1Q<__kL=3eG|%!AAm%oXOax!&Aho^GCLe%SnoxzW7cyu-Z9 zyxY9Te9(Nze8zm)eAWDk`7`qu7N2fk*=5;n*<*Ru@@LC)mXnsVmiH}}Ek9eWR=d?<6|CK@Db}9W zUe;7=A8S8rmUXl>$C_s?u$EXSS|iq})@jxm){WLp*3H(f)<)}g>kjLa)~Bt9tf#D} ztshuFw0>;8Vl&&UHoMJX6KpP*>Zu`>qwe4Hm_qOYHV(0B`?CtFF_5^#9 zJ;OfSKEgiAo^2mv&$Ums`|V5YEA8v;JMB-}5Asf4?&*sPQxqLof$QSb^d>KEU zpTJk}OZnCOBm5SA8~-T(7{8N$oPUDf%OByN=a2En`4jwW{006~{&W6I{%ii9{LlQq z9pH#}Bsh{B9UL7Uog7^pJskZUX^!EJ97l~~lB3oUaMU?Mj)-HbW13@z<6g&X2Xkz9 z>~}olIN&(wIOI6&IN~_!xa_#<_{8y<;|s@Ej&B^_I$Jy2INLenoe9n)X9s6TXD4S* z=TPS`XQp$cGs{`%EOvUG70xQ>ROd$LCg*17R%fGgyK{$gr}I_k>&{co)6TQbx18@d z&pWRQ7QrU)f>RI$w;&7gLV}PabP&1=_Xxd(bYY~BC5#qwggl`@m@O<7mI=#+6~ank zm9R!wC#)BC3VVcSg@eK&;jr+sa8h_pctbcRTogVOJ{GQsX3;9zMTaPeE>RNui37wz zV!Aj)%n*l*Bg9c+zUUPzMOB$LZWA9BUlm^$Pl>0+v*KG= z!rsM#_#qa=ud(2LFaGFi=ZbeFxRP8QTpeAVTwPqV@FT!UQcu3@e*t~^(PtH?FY zHN$nUYqpEI=D8NQ_PF-Bo^tJXJ>xpyI_Ns&I_$dQy5{=S^||Xy*VnFZUEjNYbhmTI zyA#|=?hfvb?oRG5?r!c>cbYrbo$oGm7rRT`W$y9r3GNDam3x_cxqF5CA@^$cTK9VQ zM)xN7F89;!1MZ`eBDIiONv)+eQadSLN|2JI4pK*{lhj4(CM8Qfq`Reiq~20rslPN( zN|OdlL#1I-rZiH@l1588Ql3;G6-i^IQfZu2E_tO&NtGr_J}D&4lIBQrrTNlAX|c3K zS}ARkHcMNjMrpgWL)s7r)%G>1~ z@-BI|yhq+AKPB&%pOFv92jxTZVfl#synIYPE}xKJl3$Tum0y=n$*1M_l#xo7GFr(| z@{|IlNExe?D&v%L#j8{*sxndWDU%hy5>%!rVWnPaP^K$0m08LhWv((`S*R>lmMBY= zWy*48h4PTHT3M^CS2ik}l+DUkrBT_g>`-a!NU^oK@aZ-cjCFE+`k3OUg&eW#y{!iSn89h4Pj1jq;uHgYuK| zPvw7=UzF<};-Ma+$Lz6s>>h_l@VGpZNAa}qwDPp}wDGj_#CsAvNuI8rZk}XMA5ULT ce@}*Im?zVd>nVchAIIreI$yuWzCG3d2b`XmcK`qY literal 7498 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 XCGM`cwh;Xj1pSxJ)_-HyxP<=#AK!X= diff --git a/src/MacVim/English.lproj/Preferences.nib/classes.nib b/src/MacVim/English.lproj/Preferences.nib/classes.nib new file mode 100644 index 0000000000..506294265c --- /dev/null +++ b/src/MacVim/English.lproj/Preferences.nib/classes.nib @@ -0,0 +1,25 @@ +{ + IBClasses = ( + {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, + { + ACTIONS = { + loginShellDidChange = id; + openFilesInTabsDidChange = id; + terminateAfterLastWindowClosedDidChange = id; + translateCtrlClickDidChange = id; + untitledWindowDidChange = id; + }; + CLASS = MMPreferenceController; + LANGUAGE = ObjC; + OUTLETS = { + loginShellButton = id; + openFilesInTabsButton = id; + terminateAfterLastWindowClosedButton = id; + translateCtrlClickButton = id; + untitledWindowPopUp = id; + }; + SUPERCLASS = NSWindowController; + } + ); + IBVersion = 1; +} \ No newline at end of file diff --git a/src/MacVim/English.lproj/Preferences.nib/info.nib b/src/MacVim/English.lproj/Preferences.nib/info.nib new file mode 100644 index 0000000000..a38ba92bac --- /dev/null +++ b/src/MacVim/English.lproj/Preferences.nib/info.nib @@ -0,0 +1,16 @@ + + + + + IBDocumentLocation + 69 14 356 240 0 0 1024 746 + IBFramework Version + 489.0 + IBOpenObjects + + 5 + + IBSystem Version + 8S165 + + diff --git a/src/MacVim/English.lproj/Preferences.nib/keyedobjects.nib b/src/MacVim/English.lproj/Preferences.nib/keyedobjects.nib new file mode 100644 index 0000000000000000000000000000000000000000..98e3fed998bf27b51f80c845119188d5b12469fb GIT binary patch literal 7505 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 I#8uk)|2$5z_y7O^ literal 0 HcmV?d00001 diff --git a/src/MacVim/MMAppController.h b/src/MacVim/MMAppController.h index 6c9d1df579..c8f3994e4f 100644 --- a/src/MacVim/MMAppController.h +++ b/src/MacVim/MMAppController.h @@ -30,5 +30,6 @@ - (IBAction)selectPreviousWindow:(id)sender; - (IBAction)fontSizeUp:(id)sender; - (IBAction)fontSizeDown:(id)sender; +- (IBAction)orderFrontPreferencePanel:(id)sender; @end diff --git a/src/MacVim/MMAppController.m b/src/MacVim/MMAppController.m index 59961a05a8..442b42df8a 100644 --- a/src/MacVim/MMAppController.m +++ b/src/MacVim/MMAppController.m @@ -29,6 +29,7 @@ #import "MMAppController.h" #import "MMVimController.h" #import "MMWindowController.h" +#import "MMPreferenceController.h" #define MM_HANDLE_XCODE_MOD_EVENT 0 @@ -511,6 +512,11 @@ - (IBAction)fontSizeDown:(id)sender [NSNumber numberWithInt:NSSizeDownFontAction]]; } +- (IBAction)orderFrontPreferencePanel:(id)sender +{ + [[MMPreferenceController sharedPreferenceController] showWindow:self]; +} + - (byref id ) connectBackend:(byref in id )backend pid:(int)pid diff --git a/src/MacVim/MMPreferenceController.h b/src/MacVim/MMPreferenceController.h new file mode 100644 index 0000000000..8e94752611 --- /dev/null +++ b/src/MacVim/MMPreferenceController.h @@ -0,0 +1,29 @@ +/* vi:set ts=8 sts=4 sw=4 ft=objc: + * + * VIM - Vi IMproved by Bram Moolenaar + * MacVim GUI port by Bjorn Winckler + * + * Do ":help uganda" in Vim to read copying and usage conditions. + * Do ":help credits" in Vim to see a list of people who contributed. + * See README.txt for an overview of the Vim source code. + */ + +#import + +@interface MMPreferenceController : NSWindowController { + IBOutlet id loginShellButton; + IBOutlet id openFilesInTabsButton; + IBOutlet id terminateAfterLastWindowClosedButton; + IBOutlet id translateCtrlClickButton; + IBOutlet id untitledWindowPopUp; +} + ++ (MMPreferenceController *)sharedPreferenceController; + +- (IBAction)loginShellDidChange:(id)sender; +- (IBAction)openFilesInTabsDidChange:(id)sender; +- (IBAction)terminateAfterLastWindowClosedDidChange:(id)sender; +- (IBAction)translateCtrlClickDidChange:(id)sender; +- (IBAction)untitledWindowDidChange:(id)sender; + +@end diff --git a/src/MacVim/MMPreferenceController.m b/src/MacVim/MMPreferenceController.m new file mode 100644 index 0000000000..ef8cde83a6 --- /dev/null +++ b/src/MacVim/MMPreferenceController.m @@ -0,0 +1,82 @@ +/* vi:set ts=8 sts=4 sw=4 ft=objc: + * + * VIM - Vi IMproved by Bram Moolenaar + * MacVim GUI port by Bjorn Winckler + * + * Do ":help uganda" in Vim to read copying and usage conditions. + * Do ":help credits" in Vim to see a list of people who contributed. + * See README.txt for an overview of the Vim source code. + */ + +#import "MMPreferenceController.h" +#import "MacVim.h" + + + +@implementation MMPreferenceController + ++ (MMPreferenceController *)sharedPreferenceController +{ + static MMPreferenceController *singleton = nil; + if (!singleton) + singleton = [[MMPreferenceController alloc] init]; + return singleton; +} + +- (id)init +{ + self = [super initWithWindowNibName:@"Preferences"]; + if (!self) return nil; + + [self setWindowFrameAutosaveName:@"Preferences"]; + return self; +} + +- (void)windowDidLoad +{ + NSUserDefaults *ud = [NSUserDefaults standardUserDefaults]; + + [loginShellButton setState:[ud boolForKey:MMLoginShellKey]]; + [openFilesInTabsButton setState:[ud boolForKey:MMOpenFilesInTabsKey]]; + [terminateAfterLastWindowClosedButton setState: + [ud boolForKey:MMTerminateAfterLastWindowClosedKey]]; + [translateCtrlClickButton setState:[ud boolForKey:MMTranslateCtrlClickKey]]; + + int tag = [[ud objectForKey:MMUntitledWindowKey] intValue]; + if (tag < 0) tag = 0; + else if (tag > 3) tag = 3; + [untitledWindowPopUp selectItemWithTag:tag]; +} + +- (IBAction)loginShellDidChange:(id)sender +{ + NSUserDefaults *ud = [NSUserDefaults standardUserDefaults]; + [ud setBool:[sender state] forKey:MMLoginShellKey]; +} + +- (IBAction)openFilesInTabsDidChange:(id)sender +{ + NSUserDefaults *ud = [NSUserDefaults standardUserDefaults]; + [ud setBool:[sender state] forKey:MMOpenFilesInTabsKey]; +} + +- (IBAction)terminateAfterLastWindowClosedDidChange:(id)sender +{ + NSUserDefaults *ud = [NSUserDefaults standardUserDefaults]; + [ud setBool:[sender state] forKey:MMTerminateAfterLastWindowClosedKey]; +} + +- (IBAction)translateCtrlClickDidChange:(id)sender +{ + NSUserDefaults *ud = [NSUserDefaults standardUserDefaults]; + [ud setBool:[sender state] forKey:MMTranslateCtrlClickKey]; +} + +- (IBAction)untitledWindowDidChange:(id)sender +{ + NSUserDefaults *ud = [NSUserDefaults standardUserDefaults]; + int tag = [[sender selectedItem] tag]; + [ud setInteger:tag forKey:MMUntitledWindowKey]; +} + +@end diff --git a/src/MacVim/MacVim.xcodeproj/project.pbxproj b/src/MacVim/MacVim.xcodeproj/project.pbxproj index 9d55b367e1..5903ce881b 100644 --- a/src/MacVim/MacVim.xcodeproj/project.pbxproj +++ b/src/MacVim/MacVim.xcodeproj/project.pbxproj @@ -43,6 +43,9 @@ 1DD703B90BA9D15D008679E9 /* vim_gloss.icns in Resources */ = {isa = PBXBuildFile; fileRef = 1DD703B80BA9D15D008679E9 /* vim_gloss.icns */; }; 1DD704310BA9F9C2008679E9 /* SpecialKeys.plist in Resources */ = {isa = PBXBuildFile; fileRef = 1DD704300BA9F9C2008679E9 /* SpecialKeys.plist */; }; 1DD9F5E50C85D60500E8D5A5 /* SystemColors.plist in Resources */ = {isa = PBXBuildFile; fileRef = 1DD9F5E40C85D60500E8D5A5 /* SystemColors.plist */; }; + 1DE3F8E70D50F80500052B9E /* Preferences.nib in Resources */ = {isa = PBXBuildFile; fileRef = 1DE3F8E50D50F80500052B9E /* Preferences.nib */; }; + 1DE3F8EA0D50F84600052B9E /* MMPreferenceController.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 1DE3F8E80D50F84600052B9E /* MMPreferenceController.h */; }; + 1DE3F8EB0D50F84600052B9E /* MMPreferenceController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1DE3F8E90D50F84600052B9E /* MMPreferenceController.m */; }; 1DE608B40C587FDA0055263D /* runtime in CopyFiles */ = {isa = PBXBuildFile; fileRef = 1DE602470C587FD10055263D /* runtime */; }; 1DE8CC620C5E2AAD003F56E3 /* Actions.plist in Resources */ = {isa = PBXBuildFile; fileRef = 1DE8CC610C5E2AAD003F56E3 /* Actions.plist */; }; 1DE9B94F0D341AB8008FEDD4 /* MMWindow.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 1DE9B94D0D341AB8008FEDD4 /* MMWindow.h */; }; @@ -103,6 +106,7 @@ 1D493D580C5247BF00AB718C /* Vim in CopyFiles */, 1D9918480D299F9900A96335 /* MMAtsuiTextView.h in CopyFiles */, 1DE9B94F0D341AB8008FEDD4 /* MMWindow.h in CopyFiles */, + 1DE3F8EA0D50F84600052B9E /* MMPreferenceController.h in CopyFiles */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -180,6 +184,9 @@ 1DD703B80BA9D15D008679E9 /* vim_gloss.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = vim_gloss.icns; sourceTree = ""; }; 1DD704300BA9F9C2008679E9 /* SpecialKeys.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = SpecialKeys.plist; sourceTree = ""; }; 1DD9F5E40C85D60500E8D5A5 /* SystemColors.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = SystemColors.plist; sourceTree = ""; }; + 1DE3F8E60D50F80500052B9E /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = English.lproj/Preferences.nib; sourceTree = ""; }; + 1DE3F8E80D50F84600052B9E /* MMPreferenceController.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = MMPreferenceController.h; sourceTree = ""; }; + 1DE3F8E90D50F84600052B9E /* MMPreferenceController.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = MMPreferenceController.m; sourceTree = ""; }; 1DE602470C587FD10055263D /* runtime */ = {isa = PBXFileReference; lastKnownFileType = folder; name = runtime; path = ../../runtime; sourceTree = SOURCE_ROOT; }; 1DE8CC610C5E2AAD003F56E3 /* Actions.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = Actions.plist; sourceTree = ""; }; 1DE9B94D0D341AB8008FEDD4 /* MMWindow.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = MMWindow.h; sourceTree = ""; }; @@ -232,6 +239,8 @@ 080E96DDFE201D6D7F000001 /* MacVim Source */ = { isa = PBXGroup; children = ( + 1DE3F8E80D50F84600052B9E /* MMPreferenceController.h */, + 1DE3F8E90D50F84600052B9E /* MMPreferenceController.m */, 1DE9B94D0D341AB8008FEDD4 /* MMWindow.h */, 1DE9B94E0D341AB8008FEDD4 /* MMWindow.m */, 1D9918460D299F9900A96335 /* MMAtsuiTextView.h */, @@ -378,6 +387,7 @@ 29B97317FDCFA39411CA2CEA /* Resources */ = { isa = PBXGroup; children = ( + 1DE3F8E50D50F80500052B9E /* Preferences.nib */, 1D3D190D0CA690FF0004A0A5 /* DejaVuSansMono-Bold.ttf */, 1D3D190E0CA690FF0004A0A5 /* DejaVuSansMono-BoldOblique.ttf */, 1D3D190F0CA690FF0004A0A5 /* DejaVuSansMono-Oblique.ttf */, @@ -513,6 +523,7 @@ 1D3D19120CA690FF0004A0A5 /* DejaVuSansMono-BoldOblique.ttf in Resources */, 1D3D19130CA690FF0004A0A5 /* DejaVuSansMono-Oblique.ttf in Resources */, 1D3D19140CA690FF0004A0A5 /* DejaVuSansMono.ttf in Resources */, + 1DE3F8E70D50F80500052B9E /* Preferences.nib in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -536,6 +547,7 @@ 1D80FBD60CBBD3B700102A1C /* MMVimView.m in Sources */, 1D9918490D299F9900A96335 /* MMAtsuiTextView.m in Sources */, 1DE9B9500D341AB8008FEDD4 /* MMWindow.m in Sources */, + 1DE3F8EB0D50F84600052B9E /* MMPreferenceController.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -558,6 +570,14 @@ name = InfoPlist.strings; sourceTree = ""; }; + 1DE3F8E50D50F80500052B9E /* Preferences.nib */ = { + isa = PBXVariantGroup; + children = ( + 1DE3F8E60D50F80500052B9E /* English */, + ); + name = Preferences.nib; + sourceTree = ""; + }; 29B97318FDCFA39411CA2CEA /* MainMenu.nib */ = { isa = PBXVariantGroup; children = ( From 2dbe83f70442d8a39484271ad4dbd048748e8e10 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Wed, 30 Jan 2008 22:05:55 +0100 Subject: [PATCH 0374/1156] Warn if multiple tabs or windows are open when quitting --- src/MacVim/MMAppController.m | 102 +++++++++++++++++++++++++---------- src/MacVim/MMVimController.h | 1 + src/MacVim/MMVimController.m | 12 +++++ 3 files changed, 86 insertions(+), 29 deletions(-) diff --git a/src/MacVim/MMAppController.m b/src/MacVim/MMAppController.m index 442b42df8a..cd27f6b1e0 100644 --- a/src/MacVim/MMAppController.m +++ b/src/MacVim/MMAppController.m @@ -333,8 +333,56 @@ - (NSApplicationTerminateReply)applicationShouldTerminate: reply = NSTerminateCancel; [alert release]; + } else { + // No unmodified buffers, but give a warning if there are multiple + // windows and/or tabs open. + int numWindows = [vimControllers count]; + int numTabs = 0; + + e = [vimControllers objectEnumerator]; + id vc; + while ((vc = [e nextObject])) { + NSString *eval = [vc evaluateVimExpression:@"tabpagenr('$')"]; + if (eval) { + int count = [eval intValue]; + if (count > 0 && count < INT_MAX) + numTabs += count; + } + } + + if (numWindows > 1 || numTabs > 1) { + NSAlert *alert = [[NSAlert alloc] init]; + [alert addButtonWithTitle:@"Quit"]; + [alert addButtonWithTitle:@"Cancel"]; + [alert setMessageText:@"Are you sure you want to quit MacVim?"]; + + NSString *info = nil; + if (numWindows > 1) { + if (numTabs > numWindows) + info = [NSString stringWithFormat:@"There are %d windows " + "open in MacVim, with a total of %d tabs. Do you want " + "to quit anyway?", numWindows, numTabs]; + else + info = [NSString stringWithFormat:@"There are %d windows " + "open in MacVim. Do you want to quit anyway?", + numWindows]; + + [alert setAlertStyle:NSWarningAlertStyle]; + } else { + info = [NSString stringWithFormat:@"There are %d tabs open " + "in MacVim. Do you want to quit anyway?", numTabs]; + } + + [alert setInformativeText:info]; + + if ([alert runModal] != NSAlertFirstButtonReturn) + reply = NSTerminateCancel; + + [alert release]; + } } + // Tell all Vim processes to terminate now (otherwise they'll leave swap // files behind). if (NSTerminateNow == reply) { @@ -824,36 +872,32 @@ - (NSArray *)filterOpenFiles:(NSArray *)filenames for (i = 0; i < count && [files count]; ++i) { MMVimController *controller = [vimControllers objectAtIndex:i]; - id proxy = [controller backendProxy]; - - @try { - // Query Vim for which files in the 'files' array are open. - NSString *eval = [proxy evaluateExpression:expr]; - NSIndexSet *idxSet = [NSIndexSet indexSetWithVimList:eval]; - if ([idxSet count]) { - if (!raiseFile) { - // Remember the file and which Vim that has it open so that - // we can raise it later on. - raiseController = controller; - raiseFile = [files objectAtIndex:[idxSet firstIndex]]; - [[raiseFile retain] autorelease]; - } - - // Pass (ODB/Xcode/Spotlight) arguments to this process. - [localArgs setObject:[files objectsAtIndexes:idxSet] - forKey:@"filenames"]; - [self passArguments:localArgs toVimController:controller]; - - // Remove all the files that were open in this Vim process and - // create a new expression to evaluate. - [files removeObjectsAtIndexes:idxSet]; - expr = [NSString stringWithFormat: - @"map([\"%@\"],\"bufloaded(v:val)\")", - [files componentsJoinedByString:@"\",\""]]; + + // Query Vim for which files in the 'files' array are open. + NSString *eval = [controller evaluateVimExpression:expr]; + if (!eval) continue; + + NSIndexSet *idxSet = [NSIndexSet indexSetWithVimList:eval]; + if ([idxSet count]) { + if (!raiseFile) { + // Remember the file and which Vim that has it open so that + // we can raise it later on. + raiseController = controller; + raiseFile = [files objectAtIndex:[idxSet firstIndex]]; + [[raiseFile retain] autorelease]; } - } - @catch (NSException *e) { - // Do nothing ... + + // Pass (ODB/Xcode/Spotlight) arguments to this process. + [localArgs setObject:[files objectsAtIndexes:idxSet] + forKey:@"filenames"]; + [self passArguments:localArgs toVimController:controller]; + + // Remove all the files that were open in this Vim process and + // create a new expression to evaluate. + [files removeObjectsAtIndexes:idxSet]; + expr = [NSString stringWithFormat: + @"map([\"%@\"],\"bufloaded(v:val)\")", + [files componentsJoinedByString:@"\",\""]]; } } diff --git a/src/MacVim/MMVimController.h b/src/MacVim/MMVimController.h index 65b60ff365..a4889de3fc 100644 --- a/src/MacVim/MMVimController.h +++ b/src/MacVim/MMVimController.h @@ -57,5 +57,6 @@ - (BOOL)sendMessageNow:(int)msgid data:(NSData *)data timeout:(NSTimeInterval)timeout; - (void)addVimInput:(NSString *)string; +- (NSString *)evaluateVimExpression:(NSString *)expr; - (void)updateMainMenu; @end diff --git a/src/MacVim/MMVimController.m b/src/MacVim/MMVimController.m index a0d4559dcf..5bdc08e334 100644 --- a/src/MacVim/MMVimController.m +++ b/src/MacVim/MMVimController.m @@ -348,6 +348,18 @@ - (void)addVimInput:(NSString *)string } } +- (NSString *)evaluateVimExpression:(NSString *)expr +{ + NSString *eval = nil; + + @try { + eval = [backendProxy evaluateExpression:expr]; + } + @catch (NSException *ex) { /* do nothing */ } + + return eval; +} + - (id)backendProxy { return backendProxy; From 3c18a3194952e40e3586bca6de292170bbbe6d1f Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Thu, 31 Jan 2008 16:11:18 +0100 Subject: [PATCH 0375/1156] Code cleanup --- src/MacVim/MMAppController.m | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/MacVim/MMAppController.m b/src/MacVim/MMAppController.m index cd27f6b1e0..64bfe7dbf2 100644 --- a/src/MacVim/MMAppController.m +++ b/src/MacVim/MMAppController.m @@ -322,12 +322,12 @@ - (NSApplicationTerminateReply)applicationShouldTerminate: if (modifiedBuffers) { NSAlert *alert = [[NSAlert alloc] init]; + [alert setAlertStyle:NSWarningAlertStyle]; [alert addButtonWithTitle:@"Quit"]; [alert addButtonWithTitle:@"Cancel"]; [alert setMessageText:@"Quit without saving?"]; [alert setInformativeText:@"There are modified buffers, " "if you quit now all changes will be lost. Quit anyway?"]; - [alert setAlertStyle:NSWarningAlertStyle]; if ([alert runModal] != NSAlertFirstButtonReturn) reply = NSTerminateCancel; @@ -339,6 +339,7 @@ - (NSApplicationTerminateReply)applicationShouldTerminate: int numWindows = [vimControllers count]; int numTabs = 0; + // Count the number of open tabs e = [vimControllers objectEnumerator]; id vc; while ((vc = [e nextObject])) { @@ -352,6 +353,7 @@ - (NSApplicationTerminateReply)applicationShouldTerminate: if (numWindows > 1 || numTabs > 1) { NSAlert *alert = [[NSAlert alloc] init]; + [alert setAlertStyle:NSWarningAlertStyle]; [alert addButtonWithTitle:@"Quit"]; [alert addButtonWithTitle:@"Cancel"]; [alert setMessageText:@"Are you sure you want to quit MacVim?"]; @@ -367,7 +369,6 @@ - (NSApplicationTerminateReply)applicationShouldTerminate: "open in MacVim. Do you want to quit anyway?", numWindows]; - [alert setAlertStyle:NSWarningAlertStyle]; } else { info = [NSString stringWithFormat:@"There are %d tabs open " "in MacVim. Do you want to quit anyway?", numTabs]; From f2740bd85834a2f942286c19b4f355e2b7d248b3 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Thu, 31 Jan 2008 16:19:00 +0100 Subject: [PATCH 0376/1156] Order window front when opening files Ensure that the window is ordered front when opening files in an already open window (otherwise a newly open filed may be in an obscured window). --- src/MacVim/MMAppController.m | 1 + 1 file changed, 1 insertion(+) diff --git a/src/MacVim/MMAppController.m b/src/MacVim/MMAppController.m index 64bfe7dbf2..7b26619214 100644 --- a/src/MacVim/MMAppController.m +++ b/src/MacVim/MMAppController.m @@ -255,6 +255,7 @@ - (void)application:(NSApplication *)sender openFiles:(NSArray *)filenames if ((openInTabs && (vc = [self topmostVimController])) || (vc = [self findUntitledWindow])) { // Open files in an already open window. + [[[vc windowController] window] makeKeyAndOrderFront:self]; [self passArguments:arguments toVimController:vc]; } else { // Open files in a launching Vim process or start a new process. From 3b98d9f0dc67370f400cddecbecc618a432a522d Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Thu, 31 Jan 2008 16:24:45 +0100 Subject: [PATCH 0377/1156] Decrease false positives on untitled window detection The detection algorithm is still dumb; it now thinks a window is untitled (i.e. good for opening new files in) when its title begins with "[No Name] - VIM". This means that it now rejects modified buffers which haven't been saved to a file. --- src/MacVim/MMAppController.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/MacVim/MMAppController.m b/src/MacVim/MMAppController.m index 7b26619214..b8ce17902b 100644 --- a/src/MacVim/MMAppController.m +++ b/src/MacVim/MMAppController.m @@ -967,7 +967,7 @@ - (MMVimController *)findUntitledWindow // TODO: This is a moronic test...should query the Vim process if there // are any open buffers or something like that instead. NSString *title = [[[vc windowController] window] title]; - if ([title hasPrefix:@"[No Name]"]) { + if ([title hasPrefix:@"[No Name] - VIM"]) { //NSLog(@"found untitled window"); return vc; } From b8a482ebf8e59aa1072475b74d98efb848f98dea Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Thu, 31 Jan 2008 19:45:22 +0100 Subject: [PATCH 0378/1156] Always detect ^C Sometimes Ctrl-keys are sent to the backend as text instead of as a command key, so we must look for ^C in both cases. This fixes a the ^W^C bug (Issue 48). --- src/MacVim/MMBackend.m | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/MacVim/MMBackend.m b/src/MacVim/MMBackend.m index 598272ab94..8b8f30f836 100644 --- a/src/MacVim/MMBackend.m +++ b/src/MacVim/MMBackend.m @@ -1662,6 +1662,12 @@ - (void)handleInsertText:(NSData *)data } #endif + if (len == 1 && ((str[0] == Ctrl_C && ctrl_c_interrupts) + || (str[0] == intr_char && intr_char != Ctrl_C))) { + trash_input_buf(); + got_int = TRUE; + } + for (i = 0; i < len; ++i) { add_to_input_buf(str+i, 1); if (CSI == str[i]) { From 39b2308db7ea7362996bc7ab5f234812e2ae59f5 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Thu, 31 Jan 2008 20:51:41 +0100 Subject: [PATCH 0379/1156] Use Cocoa bindings for preferences panel --- .../English.lproj/Preferences.nib/classes.nib | 14 ------ .../Preferences.nib/keyedobjects.nib | Bin 7505 -> 7787 bytes src/MacVim/MMPreferenceController.h | 11 ---- src/MacVim/MMPreferenceController.m | 47 ------------------ 4 files changed, 72 deletions(-) diff --git a/src/MacVim/English.lproj/Preferences.nib/classes.nib b/src/MacVim/English.lproj/Preferences.nib/classes.nib index 506294265c..5f3dcfc9e2 100644 --- a/src/MacVim/English.lproj/Preferences.nib/classes.nib +++ b/src/MacVim/English.lproj/Preferences.nib/classes.nib @@ -2,22 +2,8 @@ IBClasses = ( {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, { - ACTIONS = { - loginShellDidChange = id; - openFilesInTabsDidChange = id; - terminateAfterLastWindowClosedDidChange = id; - translateCtrlClickDidChange = id; - untitledWindowDidChange = id; - }; CLASS = MMPreferenceController; LANGUAGE = ObjC; - OUTLETS = { - loginShellButton = id; - openFilesInTabsButton = id; - terminateAfterLastWindowClosedButton = id; - translateCtrlClickButton = id; - untitledWindowPopUp = id; - }; SUPERCLASS = NSWindowController; } ); diff --git a/src/MacVim/English.lproj/Preferences.nib/keyedobjects.nib b/src/MacVim/English.lproj/Preferences.nib/keyedobjects.nib index 98e3fed998bf27b51f80c845119188d5b12469fb..085a76f2284462efc6a782908c0d01999801fa13 100644 GIT binary patch delta 5180 zcmb7H349aP_CDt(ne3UHnPg@_me3-bSX!30mc6C41zMJ_w3N^#rG=0{nz9Hb7Zd?O z0i!5B^$GY?P?Yxs6j2cYK@nvW+z^%LF3$y5e8Rg)*#zGI_kYRnH<`@6^WAg4bIy0q zJ(%%zzvcC9p9Cw|AO-qBD)fW?Fc`9-0LH;2mVx%Gj_qQ*bP%K9dE+XSd3*j4yWOC zoPo1(4l{Qf>%&97_l34VPNpTd9O<_K=VXYo0F5f9@Ld>fDAyZ8xy ziC^K5_!FKZK#&-Sk=TfxP$CnRXrwi{jLayNOBY#>jOr^!b0ck&O+B+n4*CbF4qA-vaHL5CHUs_N& zqN>{G_tG{6g#``OnGJ#3hQP$EU?AYD2?s+ZzEES!3$c+jK2%mvSQu;y)%aK&)|p*T z3G2kVFv~Hhgz?~o2~fpXuZ9}_^+6p>gnDR*F4K>SOy)DZe9R9?5P)Dg$7!mb-r$?j z$b1Y~m^FE+GJAGPYFc+sT6%ML&+MMP)4O|8(wmzvtbT2 z!(4~}gLyC?Zh;E!?gF?C7Q!M}%%3muQZepo_Ozzxc*8!qm6Y3W^f}g=?v?a-7Fa6^ z(Z?*Eo~aW=#OmmDV{Q3ic#dOl<)&|g7rc~mGwZ8DzS_J%W4J0%;~O7ivc?~K#5rs< zvyQCoAsE2lc?t6W2HW9f*a5G=PS%dKXCBspC9p&<_2lOlMGsoqj`dP!e*Va*zQE81 zzppVbP*hdj=%p?`9I6U5`m4getZ>MmL5%FYWy2=aH6WkHWFFa17pwE#$st>TsfX zLS4+HtJCv+_~3kcp5VFEgC)f?soS+O>E!uL`ixm4%*t*sv+G#*OX<=lo-V!qw{$rL zC$3Bv)`}@iVj{bdbz`krD=+OC3zerX7AsFfz!R>jj_xxjM%rIV*;NtMF0yvT(A7Nr z48NS`;SA>?mGz19ka8^^&bIInLF6o0SH0{*l^k50axsIw^ty{QTs?Xf6X-;#g$Z}? zF3#bKcr#{TUuedDToo0Vi~YGyhM)-tz$_eygK#irVipd;Y=~eE=3*WWgE~yce6E{y zI0`eP4_Vdd9&6UbO!*xD+&cK|Ac~SOf6zHLlx1_F)H!iEE0;`Q0y7)PvY2S5!;iq7 zu#7Lb99F80&T>v=8bSJjj>O!363ve6R^dB*r| z494#d!~NXoo;VX8fCpI~b2B-U}knr&NU|A9kFd)f}HSJi6YV61fHYuHo$W zjk}Etu(W(+xZW2kiSKRPZ@xL;BFKLPv+;IZf=fA{qgWv;VTteau*E32HUY~ob3YST z@<5Ef%;7QPMh5(|Ji$OD?#%xUb^j$Oo{JB2sG`fDin*ib!7lLe-Zd<{5ST|Uf#G^K zG@X@RhE-Nv;G6CXwM2UZW~{*s&P;5p!l!ZLW4ICj4o|_;uo0@GIpPhGXK>S_xCx$t zO|TiZKwsXej0#RIo|@Sd4hI8X+Og5+=dFmZwy0|2WqZ`0x5A3cCh>B)SeAdDb%b|F zqj`*ra4SBK+aQ@uV5v8=*^GREFX4848F%0-xD$8bZhRH@@Tl#@98TA3_&V;xH*i0` z2{m{C58|QdcjDcxXRvBk!>ZVHHj`Q7W%J!ko|Us$ZS*0UQqF4tk6~$1EDvJoA4`Mx zfVXfJyzq{5)jh#w&cbV{j;m}pt~$JhyQ+!8PvesCIernBgo$R>$m*kAo!7Ph8oxQ; z5Gh;&=He;*7tF`+@HqYei}7@{#@WF-i3Ry?*1%T?MVC1{$v@*S_$&U#4LO6q9U%mN1%>E%&7I{9VrhLt*f%^mDYfNu6R| z5QmI`%Z$t-e(VON+H!zkw%q=Jkim1I2ek_n`WRFfJ~OMIk`O!Sa?Hjm9` zx3F8;0(Ki)$QH51>~^+$%W0@>cPJj;5rv7(9dY ze)xj%H(z$&OnN^}-EoD>=7*15&T1Yc^PYSd=X@*V;8M=YaL&{SbjJ!Hu7TN{-L9PD zWKM~t6FGAqF&(%HgC89@_1QU6TJWke;^-;ardE}$)G1g2I zXd>-EGw1-?nGU4w=wRB38fZV-k!Dd39YVX%_VoG|A6|z1hgo9F{m#pLcr|_>ovZfl zyaV?Ti68U^kujXs1~P+0$;15U_B`23j*@?pvpS1T()>& z>V$e>iVzg03HJ(*3r`DMgzdsE;Zx_{t#$CpP#`lb$8vkYd)p*WiHEE_BOc|!Wrv9dZ zrd(5@sn}F%8f&UBRhqn}`KFbo4W{Q!`%Onp$4%duel-1I)|=a#yPGS`HRe0aE6op@ zH=B2vKQ^BN- zow8f(9(#ZLK>J{OB+H&{&#~v(>+JRRNp`<|ialtbW?y1IYCmrO!hXhKab%Y#YN3&z0W3l5d$12AYj!lkF z9j8U3D2l4sLF_K}5i`YHakN+{mWh?3SF93iBBD>6C^m?b#hK!*;%(w0@pkbE@j3B% z@dfcE@ql<-JRyE8o)mwk7AjMX7fE-TMAPUXn#s#zD9xqA=nOiG&Zf;YLg&$2=mNTs z-c5JVopd+dLtmr&=zjVZJxEVFZBB=iIwhyesW>%fYiAp0f-`c1Gue5QGuJuJIoTO@ z&T}qvZgIZi{J?q2`K|MN=V|9pQYR@x8X=WPwNglmNK2)a(pqVQv{l+By(n#$c1Sy= z-O?WEfOJSYB7H0UF6(5Q?387>joekfLB3J$A*aZ_*?d8WKd z-Vl+u%G=}@PzMpqA4imR8ak1NeJz%|@e=9=L0y8^Bm zt~st1uBhuC*S)S)t|whvT`#y^a_w;)aDC$X+V!hj?{>PoxKrHe?osXv_e}RZ_igS~ z?uXs$+#B6{+y~sJ+~2ytcb|6ui`w#ay1r?oQP>hOMu_`X5m6D(gR0bQu0%f7HSXrXnp)6BYC{g7e};>{s4W4l0M0x0PecyUP2@api>av2s%RRQVyI{Gpmvx7tSSr1nz# ztGQ~S>Qh7NY;}%0S6!$sQg2tI>dWdY>Mr$Fb+7um`iAGIRQ!D4unz(v@2A>4rB3y#c;2-c$_zJ#(Z{Y{{5q^eW z;3oVEx8ZjT7-K7TVizXZgEg$Z!tq}G3Vs#N<9&EPwjIE);n(rOeY;==#7v``>9cep zeUdJqTj?Uo({0pFr_(8P3$;>2Qq4@ukwDH4^aRR4eNjJ@iTa}fC<_fl*=P`T&`8>Z zwxmfko0idXT1l&E4b41*2BRTJLwP744MoFH(x|N5UPiUQ)K};)E%)VT<@PTuGRlT# z<>r>xR23W4NgL4!iqE5wXcQWa3eXrPU5JXQH`Msx_hY3^3T%mWU0k9xKaqrU{%qEWQ*FN|{;IAt5RhJd|jdXuiS$bJ%@x(gx^)Sz(b0L^Sx***Tz=R~WuNrDaBSU*F)u zqUt|GzmC2QL64`c9|!%Xd(dx&peF>Ox2lKUu`Z_`1)U*JeN0l_LDwG(J(0%KhBVBq z10`?udBePq@JfdmzP=J;YUoXNl`+<+sxnHKw8?pvGTVRA%Ic&IG%Rxks|KmZ1Z5gcRrmsn8kH zpbOHVD|BQ2_JE$u^K|INymrGAkb!1HU-JuT(y$acz;MfmAVfRSR8}o*X&UWDyPk$l zOgt0%!vM${QO`y-?N0mC9t_4nU)i+ia$j_g(JGjfr_m~gz6}gQYtUNS**xTqwB?1K zyO>wp$$^pJ-2h(HIpigbhNR&G{o{?QyijXnZgyqn3Q^7`D1u^$1cUaZy%~iWH1i^h zYtXYt`&C-+6^m#&<30T$KYA6A$o%n!FWOx04h#I>nyMet6b{pvralj8dSc{#hX*om zKY0YE`%KSxNY5;$rSE+$4H&WghGZF&jjFn^&V_j!VIIskFWMuc;8~D2fXo;QwozCF zi?_gHSb}z=J!mf~H2Zks1GTVhGb}^<(0+6Py@oooxszR9F{GldoC=7y#^*2fml-Ab zrM{B#DWTsU^fg!k&xML?5SLAEEJpXd7FAq!YMcnXBd#Pa1PGH z-{FFJ$D0%wO-B))j-&;7xznmyrH?Ew_xY>J%hJos%BxPpWjM`5K4n>Tflc)M@uhwv zGbyn{-KP_x1$BYC3MV(fN!0l))Z6(S{-@3kEuw`%3v626Q$E<3>aQ~pbI-!pK?^;T z9w@v9*EhlSP|Qy#VGj5XZfu4d@V$9M>4M=Wv$dKPfLrj}2KX)54+z5+iuPb*QblmC ztZNwaUGpJq7%FQY* zO21Ex&&S$ec~!(i%CQaZqU%g~1ydehK$?d-e4t+G!)HZy_AEPF#m>eRkgz|EvquYg znb2V-BwMe0GhTv?p^Pz-!Td^MWT&ttJexMFWSqyd z?YrfD^NT|!@e;fg*WzV(IX3YM{G9o#9xKqrbO~KbYw0q&+>C9|EO#ogk_6J6bRx}2 zJn2AUNfe1A?MV|7LlQ}25=~l?)}$k8N+L-LX;tUzJ1A#8&8&Mq@{q6Zhn~%q4cf&Y zh9g+Q(KrofF>(!D&A_a|d)Pl9NAW5A8UD?}TNF#ACC<{!{INmfK#pa!WsIfBGTk!U zve>fHvevTGa=>!Ta?*0ia@lgl@|EQ~%kLcKTwE;Igloz*=UQ?JTq2jmwc*-v9k>)O zmCNLYafRFju8i|>6!ZgID{Ke)SA zur{>j2CRm4s&%fl*1Fod&3e#!+vTLvFUDp}cKU_Bjhu{(vK@-A-2q8*{5gH3kh2}ylAyG&Y+6e80_CiM? zL+B^;7qWzWAy6n33uQvJFh^J-ye%9Tt_oiZ-wU@zUUZ9%#8@$2Y$di4JBppe&SDp_ zo7h847ki62;%IS)d)6CPt)6-Mznc|t{nd6z~S>RddS?pQrS>f5|Ip+DB z=aT1Z&rQ!Q&uz~ip1U&0c3G8U<(6^>IYsUv_mM})qvQg)P%f4y%d_OU@_c!jyh`2~ zkPpc3$|vND@(=QDFZMR{#(8^sGrif~V($d+bngsr!27g!mUo?Zi+8v8eeZei1@A@g zW$zWmse~&LN|X|#G*-GP*-DNwSjkg{DpQpC%CpKMWrriQB#YLptIHdf=*W@-yHUTvkeR+H7XYJ0V- zI!qm*j#3NMLbX^m)NyL5I#HdZmaCO&wOXUjR9{e6t83L4)tA(b>dWdDb(^|F-KFkP zUs3m|2h_LK|5nebSJi9kEsfVaT7=d@OVT=Nsaje<>#gAY^&ow}e)I?-ia(KWq+-cWC(N9xgftlmU#syEkL>Ir(Ho}{ @interface MMPreferenceController : NSWindowController { - IBOutlet id loginShellButton; - IBOutlet id openFilesInTabsButton; - IBOutlet id terminateAfterLastWindowClosedButton; - IBOutlet id translateCtrlClickButton; - IBOutlet id untitledWindowPopUp; } + (MMPreferenceController *)sharedPreferenceController; -- (IBAction)loginShellDidChange:(id)sender; -- (IBAction)openFilesInTabsDidChange:(id)sender; -- (IBAction)terminateAfterLastWindowClosedDidChange:(id)sender; -- (IBAction)translateCtrlClickDidChange:(id)sender; -- (IBAction)untitledWindowDidChange:(id)sender; - @end diff --git a/src/MacVim/MMPreferenceController.m b/src/MacVim/MMPreferenceController.m index ef8cde83a6..1f3b9fcb67 100644 --- a/src/MacVim/MMPreferenceController.m +++ b/src/MacVim/MMPreferenceController.m @@ -32,51 +32,4 @@ - (id)init return self; } -- (void)windowDidLoad -{ - NSUserDefaults *ud = [NSUserDefaults standardUserDefaults]; - - [loginShellButton setState:[ud boolForKey:MMLoginShellKey]]; - [openFilesInTabsButton setState:[ud boolForKey:MMOpenFilesInTabsKey]]; - [terminateAfterLastWindowClosedButton setState: - [ud boolForKey:MMTerminateAfterLastWindowClosedKey]]; - [translateCtrlClickButton setState:[ud boolForKey:MMTranslateCtrlClickKey]]; - - int tag = [[ud objectForKey:MMUntitledWindowKey] intValue]; - if (tag < 0) tag = 0; - else if (tag > 3) tag = 3; - [untitledWindowPopUp selectItemWithTag:tag]; -} - -- (IBAction)loginShellDidChange:(id)sender -{ - NSUserDefaults *ud = [NSUserDefaults standardUserDefaults]; - [ud setBool:[sender state] forKey:MMLoginShellKey]; -} - -- (IBAction)openFilesInTabsDidChange:(id)sender -{ - NSUserDefaults *ud = [NSUserDefaults standardUserDefaults]; - [ud setBool:[sender state] forKey:MMOpenFilesInTabsKey]; -} - -- (IBAction)terminateAfterLastWindowClosedDidChange:(id)sender -{ - NSUserDefaults *ud = [NSUserDefaults standardUserDefaults]; - [ud setBool:[sender state] forKey:MMTerminateAfterLastWindowClosedKey]; -} - -- (IBAction)translateCtrlClickDidChange:(id)sender -{ - NSUserDefaults *ud = [NSUserDefaults standardUserDefaults]; - [ud setBool:[sender state] forKey:MMTranslateCtrlClickKey]; -} - -- (IBAction)untitledWindowDidChange:(id)sender -{ - NSUserDefaults *ud = [NSUserDefaults standardUserDefaults]; - int tag = [[sender selectedItem] tag]; - [ud setInteger:tag forKey:MMUntitledWindowKey]; -} - @end From 90acffb41f67f6963b20e898f471ea095ee51c39 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Fri, 1 Feb 2008 22:09:42 +0100 Subject: [PATCH 0380/1156] Clean up object deallocation code --- src/MacVim/MMAppController.m | 3 --- src/MacVim/MMFullscreenWindow.m | 4 ++-- src/MacVim/MMTextStorage.m | 40 ++++++++++++++++----------------- src/MacVim/MMTextView.m | 15 +++++++------ src/MacVim/MMVimController.m | 14 +++++------- src/MacVim/MMVimView.m | 8 +++---- src/MacVim/MMWindow.m | 5 ++++- 7 files changed, 42 insertions(+), 47 deletions(-) diff --git a/src/MacVim/MMAppController.m b/src/MacVim/MMAppController.m index b8ce17902b..ea3e2f16de 100644 --- a/src/MacVim/MMAppController.m +++ b/src/MacVim/MMAppController.m @@ -425,10 +425,7 @@ - (void)applicationWillTerminate:(NSNotification *)notification fontContainerRef = 0; } - // TODO: Is this a correct way of releasing the MMAppController? - // (It doesn't seem like dealloc is ever called.) [NSApp setDelegate:nil]; - [self autorelease]; } - (void)removeVimController:(id)controller diff --git a/src/MacVim/MMFullscreenWindow.m b/src/MacVim/MMFullscreenWindow.m index e1caa370b4..f4b0e5c9c1 100644 --- a/src/MacVim/MMFullscreenWindow.m +++ b/src/MacVim/MMFullscreenWindow.m @@ -76,8 +76,8 @@ - (MMFullscreenWindow *)initWithWindow:(NSWindow *)t view:(MMVimView *)v - (void)dealloc { - [target release]; - [view release]; + [target release]; target = nil; + [view release]; view = nil; [super dealloc]; } diff --git a/src/MacVim/MMTextStorage.m b/src/MacVim/MMTextStorage.m index 9cfa4f77bc..284cefcad8 100644 --- a/src/MacVim/MMTextStorage.m +++ b/src/MacVim/MMTextStorage.m @@ -91,18 +91,18 @@ - (void)dealloc rowCache = NULL; } #endif - [emptyRowString release]; - [boldItalicFontWide release]; - [italicFontWide release]; - [boldFontWide release]; - [fontWide release]; - [boldItalicFont release]; - [italicFont release]; - [boldFont release]; - [font release]; - [defaultBackgroundColor release]; - [defaultForegroundColor release]; - [attribString release]; + [emptyRowString release]; emptyRowString = nil; + [boldItalicFontWide release]; boldItalicFontWide = nil; + [italicFontWide release]; italicFontWide = nil; + [boldFontWide release]; boldFontWide = nil; + [fontWide release]; fontWide = nil; + [boldItalicFont release]; boldItalicFont = nil; + [italicFont release]; italicFont = nil; + [boldFont release]; boldFont = nil; + [font release]; font = nil; + [defaultBackgroundColor release]; defaultBackgroundColor = nil; + [defaultForegroundColor release]; defaultForegroundColor = nil; + [attribString release]; attribString = nil; [super dealloc]; } @@ -631,10 +631,10 @@ - (void)setDefaultColorsBackground:(NSColor *)bgColor - (void)setFont:(NSFont*)newFont { if (newFont && font != newFont) { - [boldItalicFont release]; - [italicFont release]; - [boldFont release]; - [font release]; + [boldItalicFont release]; boldItalicFont = nil; + [italicFont release]; italicFont = nil; + [boldFont release]; boldFont = nil; + [font release]; font = nil; // NOTE! When setting a new font we make sure that the advancement of // each glyph is fixed. @@ -696,10 +696,10 @@ - (void)setWideFont:(NSFont *)newFont // very well include wide characters.) if (font) [self setWideFont:font]; } else if (newFont != fontWide) { - [boldItalicFontWide release]; - [italicFontWide release]; - [boldFontWide release]; - [fontWide release]; + [boldItalicFontWide release]; boldItalicFontWide = nil; + [italicFontWide release]; italicFontWide = nil; + [boldFontWide release]; boldFontWide = nil; + [fontWide release]; fontWide = nil; float pointSize = [newFont pointSize]; NSFontDescriptor *desc = [newFont fontDescriptor]; diff --git a/src/MacVim/MMTextView.m b/src/MacVim/MMTextView.m index 3d7df765c0..70ef1185fc 100644 --- a/src/MacVim/MMTextView.m +++ b/src/MacVim/MMTextView.m @@ -98,8 +98,8 @@ - (id)initWithFrame:(NSRect)frame // The text storage retains the layout manager which in turn retains // the text container. - [tc release]; - [lm release]; + [tc autorelease]; + [lm autorelease]; // NOTE: This will make the text storage the principal owner of the text // system. Releasing the text storage will in turn release the layout @@ -129,7 +129,7 @@ - (void)dealloc markedTextField = nil; } - [lastMouseDownEvent release]; + [lastMouseDownEvent release]; lastMouseDownEvent = nil; [super dealloc]; } @@ -249,10 +249,8 @@ - (void)performBatchDrawWithData:(NSData *)data int flags = *((int*)bytes); bytes += sizeof(int); int len = *((int*)bytes); bytes += sizeof(int); NSString *string = [[NSString alloc] - initWithBytesNoCopy:(void*)bytes - length:len - encoding:NSUTF8StringEncoding - freeWhenDone:NO]; + initWithBytes:(void*)bytes length:len + encoding:NSUTF8StringEncoding]; bytes += len; #if MM_DEBUG_DRAWING @@ -703,6 +701,9 @@ - (void)setMarkedText:(id)text selectedRange:(NSRange)range [markedTextField setBezeled:NO]; [markedTextField setBordered:YES]; + // NOTE: The panel that holds the marked text field is allocated here + // and released in dealloc. No pointer to the panel is kept, instead + // [markedTextField window] is used to access the panel. NSPanel *panel = [[NSPanel alloc] initWithContentRect:cellRect styleMask:NSBorderlessWindowMask|NSUtilityWindowMask diff --git a/src/MacVim/MMVimController.m b/src/MacVim/MMVimController.m index 5bdc08e334..1964cc38c8 100644 --- a/src/MacVim/MMVimController.m +++ b/src/MacVim/MMVimController.m @@ -833,10 +833,8 @@ - (void)handleMessage:(int)msgid data:(NSData *)data const void *bytes = [data bytes]; int len = *((int*)bytes); bytes += sizeof(int); NSString *actionName = [[NSString alloc] - initWithBytesNoCopy:(void*)bytes - length:len - encoding:NSUTF8StringEncoding - freeWhenDone:NO]; + initWithBytes:(void*)bytes length:len + encoding:NSUTF8StringEncoding]; SEL sel = NSSelectorFromString(actionName); [NSApp sendAction:sel to:nil from:self]; @@ -848,10 +846,8 @@ - (void)handleMessage:(int)msgid data:(NSData *)data int col = *((int*)bytes); bytes += sizeof(int); int len = *((int*)bytes); bytes += sizeof(int); NSString *title = [[NSString alloc] - initWithBytesNoCopy:(void*)bytes - length:len - encoding:NSUTF8StringEncoding - freeWhenDone:NO]; + initWithBytes:(void*)bytes length:len + encoding:NSUTF8StringEncoding]; NSMenu *menu = [self topLevelMenuForTitle:title]; if (menu) { @@ -1222,7 +1218,7 @@ - (void)resendTimerFired:(NSTimer *)timer @implementation MMAlert - (void)dealloc { - [textField release]; + [textField release]; textField = nil; [super dealloc]; } diff --git a/src/MacVim/MMVimView.m b/src/MacVim/MMVimView.m index e925239a65..18c904bbf3 100644 --- a/src/MacVim/MMVimView.m +++ b/src/MacVim/MMVimView.m @@ -287,10 +287,8 @@ - (void)updateTabsWithData:(NSData *)data int length = *((int*)p); p += sizeof(int); NSString *label = [[NSString alloc] - initWithBytesNoCopy:(void*)p - length:length - encoding:NSUTF8StringEncoding - freeWhenDone:NO]; + initWithBytes:(void*)p length:length + encoding:NSUTF8StringEncoding]; p += length; // Set the label of the tab; add a new tab when needed. @@ -356,7 +354,7 @@ - (NSTabViewItem *)addNewTabViewItem [[self tabView] addTabViewItem:tvi]; vimTaskSelectedTab = NO; - [tvi release]; + [tvi autorelease]; return tvi; } diff --git a/src/MacVim/MMWindow.m b/src/MacVim/MMWindow.m index 70a9fd2ef7..dae9087a56 100644 --- a/src/MacVim/MMWindow.m +++ b/src/MacVim/MMWindow.m @@ -45,6 +45,8 @@ - (id)initWithContentRect:(NSRect)rect defer:flag]; if (!self) return nil; + [self setReleasedWhenClosed:NO]; + NSRect tabSepRect = { 0, rect.size.height - 1, rect.size.width, 1 }; tablineSeparator = [[NSBox alloc] initWithFrame:tabSepRect]; @@ -61,7 +63,8 @@ - (id)initWithContentRect:(NSRect)rect - (void)dealloc { - [tablineSeparator removeFromSuperviewWithoutNeedingDisplay]; + // TODO: Is there any reason why we would want the following call? + //[tablineSeparator removeFromSuperviewWithoutNeedingDisplay]; [tablineSeparator release]; tablineSeparator = nil; [super dealloc]; } From fdf5c7cf04625a2e9e2dfeb6abc79f74ac9283ca Mon Sep 17 00:00:00 2001 From: Nico Weber Date: Sun, 3 Feb 2008 14:38:14 +0100 Subject: [PATCH 0381/1156] Sparkle support for automatic updates With this commit the versioning scheme of MacVim has also changed; CFBundleVersion is now a number (indicating the build), and CFBundleShortVersionString contains the version number (e.g. 7.1). --- .../English.lproj/MainMenu.nib/classes.nib | 93 +++++++++++------ .../English.lproj/MainMenu.nib/info.nib | 21 ++-- .../MainMenu.nib/keyedobjects.nib | Bin 7564 -> 9287 bytes src/MacVim/Info.plist | 8 +- src/MacVim/MacVim.xcodeproj/project.pbxproj | 20 ++++ src/MacVim/Sparkle.framework/Headers | 1 + src/MacVim/Sparkle.framework/Resources | 1 + src/MacVim/Sparkle.framework/Sparkle | 1 + .../A/Headers/NSApplication+AppCopies.h | 13 +++ .../A/Headers/NSFileManager+Authentication.h | 11 ++ .../A/Headers/NSFileManager+Verification.h | 15 +++ .../Versions/A/Headers/NSString+extras.h | 61 +++++++++++ .../Versions/A/Headers/RSS.h | 98 ++++++++++++++++++ .../Versions/A/Headers/SUAppcast.h | 27 +++++ .../Versions/A/Headers/SUAppcastItem.h | 57 ++++++++++ .../A/Headers/SUAutomaticUpdateAlert.h | 21 ++++ .../Versions/A/Headers/SUConstants.h | 20 ++++ .../Versions/A/Headers/SUStatusChecker.h | 26 +++++ .../Versions/A/Headers/SUStatusController.h | 33 ++++++ .../Versions/A/Headers/SUUnarchiver.h | 25 +++++ .../Versions/A/Headers/SUUpdateAlert.h | 40 +++++++ .../Versions/A/Headers/SUUpdater.h | 55 ++++++++++ .../Versions/A/Headers/SUUtilities.h | 20 ++++ .../Versions/A/Headers/Sparkle.h | 22 ++++ .../Versions/A/Resources/Info.plist | 22 ++++ .../A/Resources/SUStatus.nib/classes.nib | 12 +++ .../A/Resources/SUStatus.nib/info.nib | 16 +++ .../A/Resources/SUStatus.nib/keyedobjects.nib | Bin 0 -> 6873 bytes .../SUAutomaticUpdateAlert.nib/classes.nib | 12 +++ .../SUAutomaticUpdateAlert.nib/info.nib | 16 +++ .../keyedobjects.nib | Bin 0 -> 6571 bytes .../en.lproj/SUUpdateAlert.nib/classes.nib | 21 ++++ .../en.lproj/SUUpdateAlert.nib/info.nib | 16 +++ .../SUUpdateAlert.nib/keyedobjects.nib | Bin 0 -> 10634 bytes .../A/Resources/en.lproj/Sparkle.strings | Bin 0 -> 6908 bytes .../Sparkle.framework/Versions/A/Sparkle | Bin 0 -> 197376 bytes src/MacVim/Sparkle.framework/Versions/Current | 1 + 37 files changed, 762 insertions(+), 43 deletions(-) create mode 120000 src/MacVim/Sparkle.framework/Headers create mode 120000 src/MacVim/Sparkle.framework/Resources create mode 120000 src/MacVim/Sparkle.framework/Sparkle create mode 100644 src/MacVim/Sparkle.framework/Versions/A/Headers/NSApplication+AppCopies.h create mode 100644 src/MacVim/Sparkle.framework/Versions/A/Headers/NSFileManager+Authentication.h create mode 100644 src/MacVim/Sparkle.framework/Versions/A/Headers/NSFileManager+Verification.h create mode 100755 src/MacVim/Sparkle.framework/Versions/A/Headers/NSString+extras.h create mode 100755 src/MacVim/Sparkle.framework/Versions/A/Headers/RSS.h create mode 100644 src/MacVim/Sparkle.framework/Versions/A/Headers/SUAppcast.h create mode 100644 src/MacVim/Sparkle.framework/Versions/A/Headers/SUAppcastItem.h create mode 100644 src/MacVim/Sparkle.framework/Versions/A/Headers/SUAutomaticUpdateAlert.h create mode 100644 src/MacVim/Sparkle.framework/Versions/A/Headers/SUConstants.h create mode 100644 src/MacVim/Sparkle.framework/Versions/A/Headers/SUStatusChecker.h create mode 100644 src/MacVim/Sparkle.framework/Versions/A/Headers/SUStatusController.h create mode 100644 src/MacVim/Sparkle.framework/Versions/A/Headers/SUUnarchiver.h create mode 100644 src/MacVim/Sparkle.framework/Versions/A/Headers/SUUpdateAlert.h create mode 100644 src/MacVim/Sparkle.framework/Versions/A/Headers/SUUpdater.h create mode 100644 src/MacVim/Sparkle.framework/Versions/A/Headers/SUUtilities.h create mode 100644 src/MacVim/Sparkle.framework/Versions/A/Headers/Sparkle.h create mode 100644 src/MacVim/Sparkle.framework/Versions/A/Resources/Info.plist create mode 100644 src/MacVim/Sparkle.framework/Versions/A/Resources/SUStatus.nib/classes.nib create mode 100644 src/MacVim/Sparkle.framework/Versions/A/Resources/SUStatus.nib/info.nib create mode 100644 src/MacVim/Sparkle.framework/Versions/A/Resources/SUStatus.nib/keyedobjects.nib create mode 100644 src/MacVim/Sparkle.framework/Versions/A/Resources/en.lproj/SUAutomaticUpdateAlert.nib/classes.nib create mode 100644 src/MacVim/Sparkle.framework/Versions/A/Resources/en.lproj/SUAutomaticUpdateAlert.nib/info.nib create mode 100644 src/MacVim/Sparkle.framework/Versions/A/Resources/en.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib create mode 100644 src/MacVim/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdateAlert.nib/classes.nib create mode 100644 src/MacVim/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdateAlert.nib/info.nib create mode 100644 src/MacVim/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdateAlert.nib/keyedobjects.nib create mode 100644 src/MacVim/Sparkle.framework/Versions/A/Resources/en.lproj/Sparkle.strings create mode 100755 src/MacVim/Sparkle.framework/Versions/A/Sparkle create mode 120000 src/MacVim/Sparkle.framework/Versions/Current diff --git a/src/MacVim/English.lproj/MainMenu.nib/classes.nib b/src/MacVim/English.lproj/MainMenu.nib/classes.nib index 09e79c993f..1dbd06362c 100644 --- a/src/MacVim/English.lproj/MainMenu.nib/classes.nib +++ b/src/MacVim/English.lproj/MainMenu.nib/classes.nib @@ -1,31 +1,62 @@ -{ - IBClasses = ( - { - ACTIONS = {newVimWindow = id; }; - CLASS = AppController; - LANGUAGE = ObjC; - SUPERCLASS = NSObject; - }, - { - ACTIONS = {addNewTab = id; }; - CLASS = FirstResponder; - LANGUAGE = ObjC; - SUPERCLASS = NSObject; - }, - { - ACTIONS = { - fileOpen = id; - fontSizeDown = id; - fontSizeUp = id; - newWindow = id; - orderFrontPreferencePanel = id; - selectNextWindow = id; - selectPreviousWindow = id; - }; - CLASS = MMAppController; - LANGUAGE = ObjC; - SUPERCLASS = NSObject; - } - ); - IBVersion = 1; -} \ No newline at end of file + + + + + IBClasses + + + ACTIONS + + fileOpen + id + fontSizeDown + id + fontSizeUp + id + newWindow + id + orderFrontPreferencePanel + id + selectNextWindow + id + selectPreviousWindow + id + + CLASS + MMAppController + LANGUAGE + ObjC + SUPERCLASS + NSObject + + + ACTIONS + + addNewTab + id + + CLASS + FirstResponder + LANGUAGE + ObjC + SUPERCLASS + NSObject + + + ACTIONS + + checkForUpdates + id + + CLASS + SUUpdater + LANGUAGE + ObjC + SUPERCLASS + NSObject + + + IBVersion + 1 + + diff --git a/src/MacVim/English.lproj/MainMenu.nib/info.nib b/src/MacVim/English.lproj/MainMenu.nib/info.nib index 0384cf233e..0fe119084e 100644 --- a/src/MacVim/English.lproj/MainMenu.nib/info.nib +++ b/src/MacVim/English.lproj/MainMenu.nib/info.nib @@ -1,21 +1,20 @@ - + - IBDocumentLocation - 68 69 356 240 0 0 1024 746 - IBEditorPositions - - 29 - 130 475 458 44 0 0 1024 746 - IBFramework Version - 489.0 + 629 + IBLastKnownRelativeProjectPath + ../../MacVim.xcodeproj + IBOldestOS + 5 IBOpenObjects - 29 + 57 IBSystem Version - 8S165 + 9B18 + targetFramework + IBCocoaFramework diff --git a/src/MacVim/English.lproj/MainMenu.nib/keyedobjects.nib b/src/MacVim/English.lproj/MainMenu.nib/keyedobjects.nib index 66cb63120915824e42eaee161b112b69a833923e..f58db777c012b9552a5310329c93c38c2a075b1a 100644 GIT binary patch literal 9287 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 literal 7564 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 diff --git a/src/MacVim/Info.plist b/src/MacVim/Info.plist index 1d24daeb97..d9a0d3d9c6 100644 --- a/src/MacVim/Info.plist +++ b/src/MacVim/Info.plist @@ -538,10 +538,12 @@ ${PRODUCT_NAME} CFBundlePackageType APPL + CFBundleShortVersionString + 7.1 CFBundleSignature VIMM CFBundleVersion - (first snapshot) + 20 NSMainNibFile MainMenu NSPrincipalClass @@ -598,5 +600,9 @@ Window + New item + + SUFeedURL + http://bjorn.winckler.googlepages.com/macvim_latest.xml diff --git a/src/MacVim/MacVim.xcodeproj/project.pbxproj b/src/MacVim/MacVim.xcodeproj/project.pbxproj index 5903ce881b..8222cd6d70 100644 --- a/src/MacVim/MacVim.xcodeproj/project.pbxproj +++ b/src/MacVim/MacVim.xcodeproj/project.pbxproj @@ -7,6 +7,8 @@ objects = { /* Begin PBXBuildFile section */ + 031AD5D40D4DE1F60026C5D7 /* Sparkle.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 031AD5D30D4DE1F60026C5D7 /* Sparkle.framework */; }; + 031AD5EE0D4DE2490026C5D7 /* Sparkle.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 031AD5D30D4DE1F60026C5D7 /* Sparkle.framework */; }; 1D09AB420C6A4D520045497E /* MMTypesetter.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D09AB400C6A4D520045497E /* MMTypesetter.m */; }; 1D0E051C0BA5F83800B6049E /* Colors.plist in Resources */ = {isa = PBXBuildFile; fileRef = 1D0E051B0BA5F83800B6049E /* Colors.plist */; }; 1D1474980C56703C0038FA2B /* MacVim.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D1474960C56703C0038FA2B /* MacVim.m */; }; @@ -97,6 +99,16 @@ /* End PBXContainerItemProxy section */ /* Begin PBXCopyFilesBuildPhase section */ + 031AD5ED0D4DE2360026C5D7 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 031AD5EE0D4DE2490026C5D7 /* Sparkle.framework in CopyFiles */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 1D0DCAD80BA3604D00B6CCFA /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; @@ -135,6 +147,7 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 031AD5D30D4DE1F60026C5D7 /* Sparkle.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Sparkle.framework; sourceTree = ""; }; 089C165DFE840E0CC02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = ""; }; 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = ""; }; 13E42FB307B3F0F600E4EEF1 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = /System/Library/Frameworks/CoreData.framework; sourceTree = ""; }; @@ -230,6 +243,7 @@ 1DFE25A50C527BC4003000F7 /* PSMTabBarControl.framework in Frameworks */, 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */, 1D80FBE40CBBD6F200102A1C /* Carbon.framework in Frameworks */, + 031AD5D40D4DE1F60026C5D7 /* Sparkle.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -274,6 +288,7 @@ 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */ = { isa = PBXGroup; children = ( + 031AD5D30D4DE1F60026C5D7 /* Sparkle.framework */, 1D80FBE30CBBD6F200102A1C /* Carbon.framework */, 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */, ); @@ -429,6 +444,7 @@ 1D0DCAD80BA3604D00B6CCFA /* CopyFiles */, 1D9EB2840C366D7B0074B739 /* CopyFiles */, 1DE608B80C58807F0055263D /* CopyFiles */, + 031AD5ED0D4DE2360026C5D7 /* CopyFiles */, ); buildRules = ( ); @@ -600,8 +616,10 @@ "$(FRAMEWORK_SEARCH_PATHS_QUOTED_2)", "$(FRAMEWORK_SEARCH_PATHS_QUOTED_3)", "$(FRAMEWORK_SEARCH_PATHS_QUOTED_2)", + "$(FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_1)", ); FRAMEWORK_SEARCH_PATHS_QUOTED_2 = "\"$(SYSTEM_DEVELOPER_DIR)/SDKs/MacOSX10.4u.sdk/System/Library/Frameworks\""; + FRAMEWORK_SEARCH_PATHS_QUOTED_FOR_TARGET_1 = "\"$(SRCROOT)\""; GCC_DYNAMIC_NO_PIC = NO; GCC_ENABLE_FIX_AND_CONTINUE = YES; GCC_ENABLE_OBJC_EXCEPTIONS = YES; @@ -627,7 +645,9 @@ "$(FRAMEWORK_SEARCH_PATHS_QUOTED_2)", "$(FRAMEWORK_SEARCH_PATHS_QUOTED_3)", "$(FRAMEWORK_SEARCH_PATHS_QUOTED_2)", + "$(FRAMEWORK_SEARCH_PATHS_QUOTED_1)", ); + FRAMEWORK_SEARCH_PATHS_QUOTED_1 = "\"$(SRCROOT)\""; FRAMEWORK_SEARCH_PATHS_QUOTED_2 = "\"$(SYSTEM_DEVELOPER_DIR)/SDKs/MacOSX10.4u.sdk/System/Library/Frameworks\""; GCC_DYNAMIC_NO_PIC = YES; GCC_ENABLE_OBJC_EXCEPTIONS = YES; diff --git a/src/MacVim/Sparkle.framework/Headers b/src/MacVim/Sparkle.framework/Headers new file mode 120000 index 0000000000..a177d2a6b9 --- /dev/null +++ b/src/MacVim/Sparkle.framework/Headers @@ -0,0 +1 @@ +Versions/Current/Headers \ No newline at end of file diff --git a/src/MacVim/Sparkle.framework/Resources b/src/MacVim/Sparkle.framework/Resources new file mode 120000 index 0000000000..953ee36f3b --- /dev/null +++ b/src/MacVim/Sparkle.framework/Resources @@ -0,0 +1 @@ +Versions/Current/Resources \ No newline at end of file diff --git a/src/MacVim/Sparkle.framework/Sparkle b/src/MacVim/Sparkle.framework/Sparkle new file mode 120000 index 0000000000..b2c52731ea --- /dev/null +++ b/src/MacVim/Sparkle.framework/Sparkle @@ -0,0 +1 @@ +Versions/Current/Sparkle \ No newline at end of file diff --git a/src/MacVim/Sparkle.framework/Versions/A/Headers/NSApplication+AppCopies.h b/src/MacVim/Sparkle.framework/Versions/A/Headers/NSApplication+AppCopies.h new file mode 100644 index 0000000000..ee901e6854 --- /dev/null +++ b/src/MacVim/Sparkle.framework/Versions/A/Headers/NSApplication+AppCopies.h @@ -0,0 +1,13 @@ +// +// NSApplication+AppCopies.h +// Sparkle +// +// Created by Andy Matuschak on 3/16/06. +// Copyright 2006 Andy Matuschak. All rights reserved. +// + +#import + +@interface NSApplication (SUAppCopies) +- (int)copiesRunning; +@end diff --git a/src/MacVim/Sparkle.framework/Versions/A/Headers/NSFileManager+Authentication.h b/src/MacVim/Sparkle.framework/Versions/A/Headers/NSFileManager+Authentication.h new file mode 100644 index 0000000000..c995911ca4 --- /dev/null +++ b/src/MacVim/Sparkle.framework/Versions/A/Headers/NSFileManager+Authentication.h @@ -0,0 +1,11 @@ +// +// NSFileManager+Authentication.m +// Sparkle +// +// Created by Andy Matuschak on 3/9/06. +// Copyright 2006 Andy Matuschak. All rights reserved. +// + +@interface NSFileManager (SUAuthenticationAdditions) +- (BOOL)movePathWithAuthentication:(NSString *)src toPath:(NSString *)dst; +@end diff --git a/src/MacVim/Sparkle.framework/Versions/A/Headers/NSFileManager+Verification.h b/src/MacVim/Sparkle.framework/Versions/A/Headers/NSFileManager+Verification.h new file mode 100644 index 0000000000..f0ce7c20c0 --- /dev/null +++ b/src/MacVim/Sparkle.framework/Versions/A/Headers/NSFileManager+Verification.h @@ -0,0 +1,15 @@ +// +// NSFileManager+Verification.h +// Sparkle +// +// Created by Andy Matuschak on 3/16/06. +// Copyright 2006 Andy Matuschak. All rights reserved. +// + +#import + +// For the paranoid folks! +@interface NSFileManager (SUVerification) +- (BOOL)validatePath:(NSString *)path withMD5Hash:(NSString *)hash; +- (BOOL)validatePath:(NSString *)path withEncodedDSASignature:(NSString *)encodedSignature; +@end diff --git a/src/MacVim/Sparkle.framework/Versions/A/Headers/NSString+extras.h b/src/MacVim/Sparkle.framework/Versions/A/Headers/NSString+extras.h new file mode 100755 index 0000000000..498e4d01c9 --- /dev/null +++ b/src/MacVim/Sparkle.framework/Versions/A/Headers/NSString+extras.h @@ -0,0 +1,61 @@ +/* + +BSD License + +Copyright (c) 2002, Brent Simmons +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. +* Neither the name of ranchero.com or Brent Simmons nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS +BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, +OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +*/ + + +/* + NSString+extras.h + NetNewsWire + + Created by Brent Simmons on Fri Jun 14 2002. + Copyright (c) 2002 Brent Simmons. All rights reserved. +*/ + + +#import +#import + + +@interface NSString (extras) + +- (NSString *)stringWithSubstitute:(NSString *)subs forCharactersFromSet:(NSCharacterSet *)set; + +- (NSString *) trimWhiteSpace; + +- (NSString *) stripHTML; + +- (NSString *) ellipsizeAfterNWords: (int) n; + ++ (BOOL) stringIsEmpty: (NSString *) s; + + +@end diff --git a/src/MacVim/Sparkle.framework/Versions/A/Headers/RSS.h b/src/MacVim/Sparkle.framework/Versions/A/Headers/RSS.h new file mode 100755 index 0000000000..82da04a443 --- /dev/null +++ b/src/MacVim/Sparkle.framework/Versions/A/Headers/RSS.h @@ -0,0 +1,98 @@ +/* + +BSD License + +Copyright (c) 2002, Brent Simmons +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. +* Neither the name of ranchero.com or Brent Simmons nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS +BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, +OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +*/ + +/* + RSS.h + A class for reading RSS feeds. + + Created by Brent Simmons on Wed Apr 17 2002. + Copyright (c) 2002 Brent Simmons. All rights reserved. +*/ + + +#import +#import +#import "NSString+extras.h" + + +@interface RSS : NSObject { + + NSDictionary *headerItems; + NSMutableArray *newsItems; + NSString *version; + + BOOL flRdf; + BOOL normalize; + } + + +/*Public*/ + +- (RSS *) initWithTitle: (NSString *) title andDescription: (NSString *) description; + +- (RSS *) initWithData: (NSData *) rssData normalize: (BOOL) fl; + +- (RSS *) initWithURL: (NSURL *) url normalize: (BOOL) fl; +- (RSS *) initWithURL: (NSURL *) url normalize: (BOOL) fl userAgent:(NSString *)userAgent; + +- (NSDictionary *) headerItems; + +- (NSMutableArray *) newsItems; + +- (NSString *) version; + +// AMM's extensions for Sparkle +- (NSDictionary *)newestItem; + + +/*Private*/ + +- (void) createheaderdictionary: (CFXMLTreeRef) tree; + +- (void) createitemsarray: (CFXMLTreeRef) tree; + +- (void) setversionstring: (CFXMLTreeRef) tree; + +- (void) flattenimagechildren: (CFXMLTreeRef) tree into: (NSMutableDictionary *) dictionary; + +- (void) flattensourceattributes: (CFXMLNodeRef) node into: (NSMutableDictionary *) dictionary; + +- (CFXMLTreeRef) getchanneltree: (CFXMLTreeRef) tree; + +- (CFXMLTreeRef) getnamedtree: (CFXMLTreeRef) currentTree name: (NSString *) name; + +- (void) normalizeRSSItem: (NSMutableDictionary *) rssItem; + +- (NSString *) getelementvalue: (CFXMLTreeRef) tree; + +@end diff --git a/src/MacVim/Sparkle.framework/Versions/A/Headers/SUAppcast.h b/src/MacVim/Sparkle.framework/Versions/A/Headers/SUAppcast.h new file mode 100644 index 0000000000..209fe20614 --- /dev/null +++ b/src/MacVim/Sparkle.framework/Versions/A/Headers/SUAppcast.h @@ -0,0 +1,27 @@ +// +// SUAppcast.h +// Sparkle +// +// Created by Andy Matuschak on 3/12/06. +// Copyright 2006 Andy Matuschak. All rights reserved. +// + +#import + +@class RSS, SUAppcastItem; +@interface SUAppcast : NSObject { + NSArray *items; + id delegate; +} + +- (void)fetchAppcastFromURL:(NSURL *)url; +- (void)setDelegate:delegate; + +- (SUAppcastItem *)newestItem; +- (NSArray *)items; + +@end + +@interface NSObject (SUAppcastDelegate) +- appcastDidFinishLoading:(SUAppcast *)appcast; +@end \ No newline at end of file diff --git a/src/MacVim/Sparkle.framework/Versions/A/Headers/SUAppcastItem.h b/src/MacVim/Sparkle.framework/Versions/A/Headers/SUAppcastItem.h new file mode 100644 index 0000000000..c0202e3d9e --- /dev/null +++ b/src/MacVim/Sparkle.framework/Versions/A/Headers/SUAppcastItem.h @@ -0,0 +1,57 @@ +// +// SUAppcastItem.h +// Sparkle +// +// Created by Andy Matuschak on 3/12/06. +// Copyright 2006 Andy Matuschak. All rights reserved. +// + +#import + + +@interface SUAppcastItem : NSObject { + NSString *title; + NSDate *date; + NSString *description; + + NSURL *releaseNotesURL; + + NSString *DSASignature; + NSString *MD5Sum; + + NSURL *fileURL; + NSString *fileVersion; + NSString *versionString; +} + +// Initializes with data from a dictionary provided by the RSS class. +- initWithDictionary:(NSDictionary *)dict; + +- (NSString *)title; +- (void)setTitle:(NSString *)aTitle; + +- (NSDate *)date; +- (void)setDate:(NSDate *)aDate; + +- (NSString *)description; +- (void)setDescription:(NSString *)aDescription; + +- (NSURL *)releaseNotesURL; +- (void)setReleaseNotesURL:(NSURL *)aReleaseNotesURL; + +- (NSString *)DSASignature; +- (void)setDSASignature:(NSString *)aDSASignature; + +- (NSString *)MD5Sum; +- (void)setMD5Sum:(NSString *)aMd5Sum; + +- (NSURL *)fileURL; +- (void)setFileURL:(NSURL *)aFileURL; + +- (NSString *)fileVersion; +- (void)setFileVersion:(NSString *)aFileVersion; + +- (NSString *)versionString; +- (void)setVersionString:(NSString *)versionString; + +@end diff --git a/src/MacVim/Sparkle.framework/Versions/A/Headers/SUAutomaticUpdateAlert.h b/src/MacVim/Sparkle.framework/Versions/A/Headers/SUAutomaticUpdateAlert.h new file mode 100644 index 0000000000..fc0ac9fd06 --- /dev/null +++ b/src/MacVim/Sparkle.framework/Versions/A/Headers/SUAutomaticUpdateAlert.h @@ -0,0 +1,21 @@ +// +// SUAutomaticUpdateAlert.h +// Sparkle +// +// Created by Andy Matuschak on 3/18/06. +// Copyright 2006 Andy Matuschak. All rights reserved. +// + +#import + +@class SUAppcastItem; +@interface SUAutomaticUpdateAlert : NSWindowController { + SUAppcastItem *updateItem; +} + +- initWithAppcastItem:(SUAppcastItem *)item; + +- (IBAction)relaunchNow:sender; +- (IBAction)relaunchLater:sender; + +@end diff --git a/src/MacVim/Sparkle.framework/Versions/A/Headers/SUConstants.h b/src/MacVim/Sparkle.framework/Versions/A/Headers/SUConstants.h new file mode 100644 index 0000000000..bfbe625bb3 --- /dev/null +++ b/src/MacVim/Sparkle.framework/Versions/A/Headers/SUConstants.h @@ -0,0 +1,20 @@ +// +// SUConstants.h +// Sparkle +// +// Created by Andy Matuschak on 3/16/06. +// Copyright 2006 Andy Matuschak. All rights reserved. +// + +extern NSString *SUUpdaterWillRestartNotification; + +extern NSString *SUCheckAtStartupKey; +extern NSString *SUFeedURLKey; +extern NSString *SUShowReleaseNotesKey; +extern NSString *SUSkippedVersionKey; +extern NSString *SUScheduledCheckIntervalKey; +extern NSString *SULastCheckTimeKey; +extern NSString *SUExpectsDSASignatureKey; +extern NSString *SUPublicDSAKeyKey; +extern NSString *SUAutomaticallyUpdateKey; +extern NSString *SUAllowsAutomaticUpdatesKey; \ No newline at end of file diff --git a/src/MacVim/Sparkle.framework/Versions/A/Headers/SUStatusChecker.h b/src/MacVim/Sparkle.framework/Versions/A/Headers/SUStatusChecker.h new file mode 100644 index 0000000000..e83d15206e --- /dev/null +++ b/src/MacVim/Sparkle.framework/Versions/A/Headers/SUStatusChecker.h @@ -0,0 +1,26 @@ +// +// SUStatusChecker.h +// Sparkle +// +// Created by Evan Schoenberg on 7/6/06. +// + +#import +#import + +@class SUStatusChecker; + +@protocol SUStatusCheckerDelegate +//versionString will be nil and isNewVersion will be NO if version checking fails. +- (void)statusChecker:(SUStatusChecker *)statusChecker foundVersion:(NSString *)versionString isNewVersion:(BOOL)isNewVersion; +@end + +@interface SUStatusChecker : SUUpdater { + id scDelegate; +} + +// Create a status checker which will notifiy delegate once the appcast version is determined. +// Notification occurs via the method defined in the SUStatusCheckerDelegate informal protocol. ++ (SUStatusChecker *)statusCheckerForDelegate:(id)delegate; + +@end diff --git a/src/MacVim/Sparkle.framework/Versions/A/Headers/SUStatusController.h b/src/MacVim/Sparkle.framework/Versions/A/Headers/SUStatusController.h new file mode 100644 index 0000000000..19a3f89ecf --- /dev/null +++ b/src/MacVim/Sparkle.framework/Versions/A/Headers/SUStatusController.h @@ -0,0 +1,33 @@ +// +// SUStatusController.h +// Sparkle +// +// Created by Andy Matuschak on 3/14/06. +// Copyright 2006 Andy Matuschak. All rights reserved. +// + +#import + + +@interface SUStatusController : NSWindowController { + double progressValue, maxProgressValue; + NSString *title, *statusText, *buttonTitle; + IBOutlet NSButton *actionButton; +} + +// Pass 0 for the max progress value to get an indeterminate progress bar. +// Pass nil for the status text to not show it. +- (void)beginActionWithTitle:(NSString *)title maxProgressValue:(double)maxProgressValue statusText:(NSString *)statusText; + +// If isDefault is YES, the button's key equivalent will be \r. +- (void)setButtonTitle:(NSString *)buttonTitle target:target action:(SEL)action isDefault:(BOOL)isDefault; +- (void)setButtonEnabled:(BOOL)enabled; + +- (double)progressValue; +- (void)setProgressValue:(double)value; +- (double)maxProgressValue; +- (void)setMaxProgressValue:(double)value; + +- (void)setStatusText:(NSString *)statusText; + +@end diff --git a/src/MacVim/Sparkle.framework/Versions/A/Headers/SUUnarchiver.h b/src/MacVim/Sparkle.framework/Versions/A/Headers/SUUnarchiver.h new file mode 100644 index 0000000000..da111c1580 --- /dev/null +++ b/src/MacVim/Sparkle.framework/Versions/A/Headers/SUUnarchiver.h @@ -0,0 +1,25 @@ +// +// SUUnarchiver.h +// Sparkle +// +// Created by Andy Matuschak on 3/16/06. +// Copyright 2006 Andy Matuschak. All rights reserved. +// + +#import + + +@interface SUUnarchiver : NSObject { + id delegate; +} + +- (void)unarchivePath:(NSString *)path; +- (void)setDelegate:delegate; + +@end + +@interface NSObject (SUUnarchiverDelegate) +- (void)unarchiver:(SUUnarchiver *)unarchiver extractedLength:(long)length; +- (void)unarchiverDidFinish:(SUUnarchiver *)unarchiver; +- (void)unarchiverDidFail:(SUUnarchiver *)unarchiver; +@end \ No newline at end of file diff --git a/src/MacVim/Sparkle.framework/Versions/A/Headers/SUUpdateAlert.h b/src/MacVim/Sparkle.framework/Versions/A/Headers/SUUpdateAlert.h new file mode 100644 index 0000000000..69c2817498 --- /dev/null +++ b/src/MacVim/Sparkle.framework/Versions/A/Headers/SUUpdateAlert.h @@ -0,0 +1,40 @@ +// +// SUUpdateAlert.h +// Sparkle +// +// Created by Andy Matuschak on 3/12/06. +// Copyright 2006 Andy Matuschak. All rights reserved. +// + +#import + +typedef enum +{ + SUInstallUpdateChoice, + SURemindMeLaterChoice, + SUSkipThisVersionChoice +} SUUpdateAlertChoice; + +@class WebView, SUAppcastItem; +@interface SUUpdateAlert : NSWindowController { + SUAppcastItem *updateItem; + id delegate; + + IBOutlet WebView *releaseNotesView; + IBOutlet NSTextField *description; + NSProgressIndicator *releaseNotesSpinner; + BOOL webViewFinishedLoading; +} + +- initWithAppcastItem:(SUAppcastItem *)item; +- (void)setDelegate:delegate; + +- (IBAction)installUpdate:sender; +- (IBAction)skipThisVersion:sender; +- (IBAction)remindMeLater:sender; + +@end + +@interface NSObject (SUUpdateAlertDelegate) +- (void)updateAlert:(SUUpdateAlert *)updateAlert finishedWithChoice:(SUUpdateAlertChoice)updateChoice; +@end diff --git a/src/MacVim/Sparkle.framework/Versions/A/Headers/SUUpdater.h b/src/MacVim/Sparkle.framework/Versions/A/Headers/SUUpdater.h new file mode 100644 index 0000000000..5f82914bc1 --- /dev/null +++ b/src/MacVim/Sparkle.framework/Versions/A/Headers/SUUpdater.h @@ -0,0 +1,55 @@ +// +// SUUpdater.h +// Sparkle +// +// Created by Andy Matuschak on 1/4/06. +// Copyright 2006 Andy Matuschak. All rights reserved. +// + +#import + +// Before you use Sparkle in your app, you must set SUFeedURL in Info.plist to the +// address of the appcast on your webserver. If you don't already have an +// appcast, please see the Sparkle documentation to learn about how to set one up. + +// .zip, .dmg, .tar, .tbz, .tgz archives are supported at this time. + +// By default, Sparkle offers to show the user the release notes of the build they'll be +// getting, which it assumes are in the description (or body) field of the relevant RSS item. +// Set SUShowReleaseNotes to in Info.plist to hide the button. + +@class SUAppcastItem, SUUpdateAlert, SUStatusController; +@interface SUUpdater : NSObject { + SUAppcastItem *updateItem; + + SUStatusController *statusController; + SUUpdateAlert *updateAlert; + + NSURLDownload *downloader; + NSString *downloadPath; + + NSTimer *checkTimer; + NSTimeInterval checkInterval; + + BOOL verbose; + BOOL updateInProgress; +} + +// This IBAction is meant for a main menu item. Hook up any menu item to this action, +// and Sparkle will check for updates and report back its findings verbosely. +- (IBAction)checkForUpdates:sender; + +// This method is similar to the above, but it's intended for updates initiated by +// the computer instead of by the user. It does not alert the user when he is up to date, +// and it remains silent about network errors in fetching the feed. This is what you +// want to call to update programmatically; only use checkForUpdates: with buttons and menu items. +- (void)checkForUpdatesInBackground; + +// This method allows you to schedule a check to run every time interval. You can +// pass 0 to this method to cancel a previously scheduled timer. You probably don't want +// to call this directly: if you set a SUScheduledCheckInterval key in Info.plist or +// the user defaults, Sparkle will set this up for you automatically on startup. You might +// just want to call this every time the user changes the setting in the preferences. +- (void)scheduleCheckWithInterval:(NSTimeInterval)interval; + +@end \ No newline at end of file diff --git a/src/MacVim/Sparkle.framework/Versions/A/Headers/SUUtilities.h b/src/MacVim/Sparkle.framework/Versions/A/Headers/SUUtilities.h new file mode 100644 index 0000000000..5af355083b --- /dev/null +++ b/src/MacVim/Sparkle.framework/Versions/A/Headers/SUUtilities.h @@ -0,0 +1,20 @@ +// +// SUUtilities.h +// Sparkle +// +// Created by Andy Matuschak on 3/12/06. +// Copyright 2006 Andy Matuschak. All rights reserved. +// + +#import + +id SUInfoValueForKey(NSString *key); +NSString *SUHostAppName(); +NSString *SUHostAppDisplayName(); +NSString *SUHostAppVersion(); +NSString *SUHostAppVersionString(); + +NSComparisonResult SUStandardVersionComparison(NSString * versionA, NSString * versionB); + +// If running make localizable-strings for genstrings, ignore the error on this line. +NSString *SULocalizedString(NSString *key, NSString *comment); diff --git a/src/MacVim/Sparkle.framework/Versions/A/Headers/Sparkle.h b/src/MacVim/Sparkle.framework/Versions/A/Headers/Sparkle.h new file mode 100644 index 0000000000..13e9b2156f --- /dev/null +++ b/src/MacVim/Sparkle.framework/Versions/A/Headers/Sparkle.h @@ -0,0 +1,22 @@ +// +// Sparkle.h +// Sparkle +// +// Created by Andy Matuschak on 3/16/06. +// Copyright 2006 Andy Matuschak. All rights reserved. +// + +#import "SUUpdater.h" +#import "SUUtilities.h" +#import "SUConstants.h" +#import "SUAppcast.h" +#import "SUAppcastItem.h" +#import "SUUpdateAlert.h" +#import "SUAutomaticUpdateAlert.h" +#import "SUStatusController.h" +#import "SUUnarchiver.h" +#import "SUStatusChecker.h" + +#import "NSApplication+AppCopies.h" +#import "NSFileManager+Authentication.h" +#import "NSFileManager+Verification.h" \ No newline at end of file diff --git a/src/MacVim/Sparkle.framework/Versions/A/Resources/Info.plist b/src/MacVim/Sparkle.framework/Versions/A/Resources/Info.plist new file mode 100644 index 0000000000..c154cb61e1 --- /dev/null +++ b/src/MacVim/Sparkle.framework/Versions/A/Resources/Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + Sparkle + CFBundleIdentifier + org.andymatuschak.Sparkle + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + Sparkle + CFBundlePackageType + FMWK + CFBundleSignature + ???? + CFBundleVersion + 1.1 + + diff --git a/src/MacVim/Sparkle.framework/Versions/A/Resources/SUStatus.nib/classes.nib b/src/MacVim/Sparkle.framework/Versions/A/Resources/SUStatus.nib/classes.nib new file mode 100644 index 0000000000..ff40c9ddf7 --- /dev/null +++ b/src/MacVim/Sparkle.framework/Versions/A/Resources/SUStatus.nib/classes.nib @@ -0,0 +1,12 @@ +{ + IBClasses = ( + {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, + { + CLASS = SUStatusController; + LANGUAGE = ObjC; + OUTLETS = {actionButton = id; }; + SUPERCLASS = NSWindowController; + } + ); + IBVersion = 1; +} \ No newline at end of file diff --git a/src/MacVim/Sparkle.framework/Versions/A/Resources/SUStatus.nib/info.nib b/src/MacVim/Sparkle.framework/Versions/A/Resources/SUStatus.nib/info.nib new file mode 100644 index 0000000000..99183444cb --- /dev/null +++ b/src/MacVim/Sparkle.framework/Versions/A/Resources/SUStatus.nib/info.nib @@ -0,0 +1,16 @@ + + + + + IBDocumentLocation + 69 10 356 240 0 0 1280 832 + IBFramework Version + 443.0 + IBOpenObjects + + 5 + + IBSystem Version + 8H14 + + diff --git a/src/MacVim/Sparkle.framework/Versions/A/Resources/SUStatus.nib/keyedobjects.nib b/src/MacVim/Sparkle.framework/Versions/A/Resources/SUStatus.nib/keyedobjects.nib new file mode 100644 index 0000000000000000000000000000000000000000..378b22f2a6e3c51f385cd62f3c93f35a69cedf27 GIT binary patch literal 6873 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 + + + + IBDocumentLocation + 188 142 356 240 0 0 1280 1002 + IBFramework Version + 443.0 + IBOpenObjects + + 5 + + IBSystem Version + 8H14 + + diff --git a/src/MacVim/Sparkle.framework/Versions/A/Resources/en.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib b/src/MacVim/Sparkle.framework/Versions/A/Resources/en.lproj/SUAutomaticUpdateAlert.nib/keyedobjects.nib new file mode 100644 index 0000000000000000000000000000000000000000..c4201cf26aa4490d0092bd8c36f61259550aa224 GIT binary patch literal 6571 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 Zr5sj{Vqu9tM%(ey&U1`&=fCpCKLLTjt6~5E literal 0 HcmV?d00001 diff --git a/src/MacVim/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdateAlert.nib/classes.nib b/src/MacVim/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdateAlert.nib/classes.nib new file mode 100644 index 0000000000..0071ac0776 --- /dev/null +++ b/src/MacVim/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdateAlert.nib/classes.nib @@ -0,0 +1,21 @@ +{ + IBClasses = ( + {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, + {CLASS = NSObject; LANGUAGE = ObjC; }, + { + ACTIONS = {installUpdate = id; remindMeLater = id; skipThisVersion = id; }; + CLASS = SUUpdateAlert; + LANGUAGE = ObjC; + OUTLETS = {description = NSTextField; releaseNotesView = WebView; }; + SUPERCLASS = NSWindowController; + }, + { + ACTIONS = {installUpdate = id; remindMeLater = id; skipThisVersion = id; }; + CLASS = SUUpdateAlertController; + LANGUAGE = ObjC; + OUTLETS = {releaseNotesView = id; }; + SUPERCLASS = NSWindowController; + } + ); + IBVersion = 1; +} \ No newline at end of file diff --git a/src/MacVim/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdateAlert.nib/info.nib b/src/MacVim/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdateAlert.nib/info.nib new file mode 100644 index 0000000000..2b25ad033c --- /dev/null +++ b/src/MacVim/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdateAlert.nib/info.nib @@ -0,0 +1,16 @@ + + + + + IBDocumentLocation + 425 40 356 240 0 0 1280 832 + IBFramework Version + 446.1 + IBOpenObjects + + 5 + + IBSystem Version + 8I127 + + diff --git a/src/MacVim/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdateAlert.nib/keyedobjects.nib b/src/MacVim/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdateAlert.nib/keyedobjects.nib new file mode 100644 index 0000000000000000000000000000000000000000..be3dbd9069137fd7dfa8bbde36f0a264de1c690c GIT binary patch literal 10634 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

( zpR+I6QFe@d%YI-#vE%Fn`;GmkWy#}`FHf#djwjDczAkw|^1|dr$%~WkNPaN+vE)t3k0(Ewye)Zm@}cBUlYcQK znWll7T9jH-Dg{C+hlv%_PXs| z+dd!Ssln74sST--)GJeCsZFV~Qs<;Lr_N2iHub*L z$5KB`{VDZinkTI=Z9-Zs?bfulX-}rTnD%6 zl4L?Bvr4H_N2!z4S?VfvmwHI~QlZpS>Miw^ilzS27^zm8E8Qc#A{|aoNpGKCoL-TB zUHbLucckB$epmY4>C4kw($}ZInEp=sf%Fg3kEI_^KV>)CQ|*eqi#^{y)IP~R#Xikm zX%E=1v2*);`}Ot(_C@xa?EkT^v43Fy&i;=h)zRLO?-=Nq zqK>#@j$^Uo0mlkQi(`%BamQB2YmPS@yB!A|#~jBUCo_^V92rVRmyDhn12V>BOwI^o z%*nVZ<3Aa|9mO?6eeu6AAH;;#9w>s$+5 zH@H@~4!91w4!J&b9d>=<`pk92b=-Br-PzsCJ=9&{p6(90XS!#*uX11QzQ)bn^WE3G z7r1Y5-{`)>z0|$Tz1-d6UgKWtUhjU%{ib`j`y2Pqo>Y(Iv3oK+PLJEu+0)h2-P6M} z$TQe8)N`3XU)u-m-Rr_6It7`Ue4N|bvWyXte>)uXPwCU zHS1KiFZ;smF4^6(bF=fZ3$lx{du5N!o|N5?eO30{>}#{&n&WAaF`7(X&d>wtAd|iCqe7U~izLCCBzA?UX-#Fg{U!!lnZ;5ZIZ<%ko z?_S?p-zMKq-!9)C-#*^~-$CCY--o`#zE6Cg`HuL$^d0pb^L^_(;rqi+{eHjVZ}0Eu z@8s|7@9OXF@8Qq)7y5hpd;9zPi~armgZ#XpM0v-o2l=)bMs%2WRb8qh0> literal 0 HcmV?d00001 diff --git a/src/MacVim/Sparkle.framework/Versions/A/Resources/en.lproj/Sparkle.strings b/src/MacVim/Sparkle.framework/Versions/A/Resources/en.lproj/Sparkle.strings new file mode 100644 index 0000000000000000000000000000000000000000..6bf42f79b03ffd17af6b43ea71a0ba4eda2c5f7e GIT binary patch literal 6908 zcmeHM+iuf95S{0Kg&Tni6$-aUgdi$?sE`V(gis&d*hwwYIEs^o{5){ZOqN|YQR;?l zf&{7@d+)PnX3xw{fBcl^ax96QONrkuesA!X%TOjLk7SIRTPY+%U51(~nd6u3ebf%| zm7`A^b;p?LKw9z`r57@go_s@XiFZ<~YoYuW4|~3pM=N{3s@1pT4Q4)wAnALRjlb8D zN`?28?r4ZF?ydp~DfTizEq9-yj_(;-S!?|hAdsUiQ*0)R

9bv=gE4isb}jh%C|I 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�J$G{!-et`Tr@b@`Bj`i;SRN#*Bem?`aqrLaD zfjj#9zIzy61l*w??{y9lE5ViT#~>g30#uE zB?(-Tz$FP>lE5ViT#~^5UnPKh@8@v#^lS)M$>}Nt?6sf6{`=Vq(7F&mf;jg3SwX~s zlb)4^cr)U~*rvO*9PZ8!0{^)Ozo^s*c+AB8C4fE1i#EzTH81YkUqO_4zgK`b&Nmp} zov-QO>sU8Jt7YwpXuGKM*%pMo2nP^)5PA`?w}18=@{sRLglq)V_goo5(6Tz~5l}~G zGXlzWqCe~t`^dg`_9L7`IBi)!NVBXil>ZUvKgdAHLO@+VC;~klp#W)pz}F!J5m0Ye z3TRQpTL5za_aL+(97I4pKV*6t0`MR0M?k(G<|5=Hfd0b}0?Pl8bd>uc@^z8ci*OX- zW5_iXAsxYOWPA|m2a*3^4+8QWJc)4DvR+2Mm%;bTIS8o#i)E%K~cs1bqLb5pnR^orQotbr+yb!U}{|gbsv0BPfUZUq#xX0fbYC zqm5Tl$E&R400PR2-mU`-A@m@$AfS$)An#kq`<4&!vw-yoXydI`gieHm2&nTHdl5Pi zK>G#S{6#;)Nz3|WKHwR^R0Qze-;01U{pps)^Yi|CgaZhf2yF;02o(t6sUPY8o`Qg~ z|2_=?<^LV|{yiJPjr0M)BFj1&0!03Q_aUIZqk93P2r-0K;EW$c=tp3gk1gw0$tZss zFbyFC0d@Wgb^gkOP=Yd9=r79tYCS>-p&0@7{;CV%D8fmEv&e_?zXty669}mHT?+yH zzKc5FMV;@W&UaDYG4$gYXvZ=U_FL9_$ludrS-(MgPX}Nrf)Ak{A%@U~!1MuxbI6Z& z-g6;%5Rk8@1#rD(y^r{Bg9v*uug_u*fzK|K??M}0T?oCnXDpWC5h@VE2#pBM2zwCrBOJh(PQ&=+1ES0?+!$N5|4s*ZI%8P_ z7DAepG_DwVa!fvua8{2n%}ScwZ6%FI{loqxjYB)k{~CCdf6SkS{O7Es3Asv3fTVHY zL-M1X{A2!9D=95#B~9#9S^^}E17pljUgaP2Cu{tCkd%^Y^0Tkqs_eqlgl2U@2-MXZ#2DnBm*0#n@{9^w^7myww-%p#rQEU8^`Qzi8$e%Pm`+Tl!e&XYs$bWujP?&$n_HkCkaTyaS}4&kWGWpRd#C!0JF@|^_;;bU`k!v;kR6Y&yOcP%Z{4m;j2|WE%oAD*c*FWVVe$wRm z#}kMjHT>Rk7V#cKzXkbd`&sABLB!G4OQ5aILc9WT@LLK#dQcbZU%dzMX&U#K^_XQ> zgU44-nf!}05$`i~E(X8$SQQn3jyA|!VJYIx z8c#($hx%lsQ_d<>QgbYi_hevWIPBQZ{aJ&AS#+3<5vQu2cr`cV?s z>aYgIdD@OReG;ZOb{U_7bvK3)M_+}GJP@O_x$P+E2Mm21^3acC{%yISw;B2!$V0!9 z^gH%|-lBBmq2Eb*!^fbbpRB)uc}^?66mg`JUXMKVk(j@}3-t9$M;`iiLZ1dY@-Y8a z085)S+kj=wLO;kHzgsLdvjsSQ08sa)7*+Ua!|*b)8W&cF?D=9hB(HU^?e)p zj~>-{2I4)4hw%Ic=|?-wSVs#GM;+9Yrh|w_HC}=^Xw{y?}LBJZXbAgAMG;U+Lw^?qi9q9C1c*7 zHR+G;>N1dxyFeSzIQX)l5AnXEo;WYrnEQJ$*UlkNj%oXCw8?J_-id&I6miu5P6g^JLOdS< zb;%s+Kpb_+JY$^YJ=!M9yc^Rv%DfxZcmd*J%&lJJXMNC&I4{Wtck;>f-y*NbEeq*r zo3eNwe(%(_1pWeQn%bGbUpoT4CxQ1t=ce{2@LxbLr=CdQzbpfOCV}^3&%w_c?DpQl zp5=11Yvb>>0(T|wWBI^y9C#n_f&@O04!k6RzrPoFSpxs-AD0ow zFGVg%;F1I`N#K$ME=k~$1TIP7k_0YE;F1I`N#Or=37kL+Nd?&Nq$y0r)|_~XLXXn1 zHx+t;!hEG;Un}%ng*i&cUP|cLqYBJax=V5FeMp~Nk54EFu?J2g#GX&+K?A4s;geF( zr}P?p>H&Nv4<0_m-U|7w4}lA8RoG(kjcLZGq9`{eicbIuQ9tV)qxEy|_*vlNN)3Hn ziNaz7Culz=WGk-yn4tZbp#7Mj{g{w$i5w?P)BI@)Q6c2ReZ0) zJxY%$-lDKs=~2Za3LBMPuXtEtNa;bvD-`;aUZ(hZ11Ep1@QlJ!3QsB=P^fa6+^@LG zXYvunRW4JIU-VA%PwmF1D+QKy3XuAC3UU$Hs?hY)I@PGS;oCa3Uh!gu`3kcYW++TG z@b~8wo>n-ZuuoyP!UGCh6}BjBR2WpaUSYAqe1+KxGZdy8_@Cz#o>n-ZuuoyP!UGCh z6}BjBR2WpaUSYAqe1+KxGZdy8_~AK)rxgw;>@)BT#xu15^Z207?=GF+`z1YTOq;@1 zo!?P|kBca5G;rbpqel}}uP18xi6~EdI1%M(FDC9)xJT)#*ArWmu6jLD+nK2COhh|U zPrc>~D^$In7*t&KdZJJBmnnU{!gWe7RlG!DvC=(?7bz@IdcNXrg}F-4Q9N5=meMm7 zcPY$Jdb;A%6s9RXRq+&s$x62jKH;3gvxYw5W5v%XJgxLoil0HUiL zDeP7H5yg8Hb}Rj$;#~?mm3~0+4u$)b-llk~!o5o0qj*eVi_)7Fk1C8Py;1Rcg<++K z6b~w_P`Xd?GKK4vzE1H{g(XTaR@|eoNa+QN=Np)&^`>dPXJ)|aOBq-i}^gGKMt z?DDya=P1lln5i&BVYW#*s8EaVWYyJ!u1M^73M3P}pbS8PH)Ttuv4_?WLvqXQ}>K zLCKe7RT#aoR8OojrLR}I>WiiNGPzm(w5Z9)Gj`g^Dd0!e%d-Zb3V!IP{jpJS>yO&r z81N&0*-5qAM@{}Q{R+Xq_+?!NAJ?hyfPoXyj@VUgXX3|7Kcn>1ilZH|-)KkjpHLip z3H_MTwf%|O{zSAd`Fl0r5rsWU?^gVvfoaia+#W4Z^e&}$Dm{DpkwN4*U z+|+NKZc)5ZVNl_Eg~bZ<6=n-e8e6aPC9Lzsr}Q#~D9`zxQe^Oy0)?iYq)Ctq^?%Y4 zL!YGbnbfWHgGyI9O@f>x{{f||ye2_jLT^)gt3t?4=zA1b`Auq3db84_3L{EyR2==I zTqmJ_Qcprf!S81ZEbF6UNw+>S?OPw2_NFX6=r?6D%C5jg-^eDYZaq!B1Uxt22{o2pV za+RK=^lZhm6hf|&-=(jfrRdrW_=nBpdXl7;?K{+9OFikS4t zs8`PQ_9~9@9QUcHPx#k5BQUMDhz&kvGF_q zlp(nFr#^+<3Qc+IPpyi#C~Q<1RJdMYvBG?X*#`3W4C!C<_Y4JQDs(B#P?)Z8n!+@N zsR~mRCJRg&drar+QJt?xq`joEJqo*ZzN&mu+6+CV)xgV682Mc`pg8K2d4~FAe)KEe zr?6M)+RkO#&Shvv@*mWET?#P{LO-B*heGfpbmiwVo1eW(-=q0r3R{%ktawymMCpx+ z*Bdwm^{^jPw4SL*mvPth%hwzIKLdz-)|q03`3kcYW++TG@W0L}Jgsm*VV}Zog$ES2 zDr`~Ms4%E-y~1LJ`3kcYW++TG@K5Iyo>n*@Flk(h(Svcxss|q%`q(oHkzf3VqXtjW zaZTwn_~aZT$I01>XDQ57x=V4xPtxRcrB73On!;42gCEL&GWZc_8Tw_0|D?;#8v146 zQ}jUjybOHGxOFJpZ{XAx9lvISUmn!)J0Q4qrd1*G$#^y@L_XFx&aLvvHS!sUehFRs z#kW65CH=Y?vz7*wqe2L+Ae6gXA_ZT?2!q6xC6faY_Ug_%;FIA}ZOxAiP z+w~M_{sPUHZ{U=J3cC!P+N$!{`~S3e{^3zwWgfp1Cj4j!gpvXUN~dkwhL%!j1I0*N zLWU655b`iXixr(r=H6tc%r9r|kWjIUYuv4tM^W==cV#Q9ai#mTE83`7(Z(8Av}kFK zii&Hx4I0}(qeexGcE9gA-Ggp6~zmMf{MtwKN zPLjukj~T;=U)&0!{1m&%{bWB0e-)4ODdK#JN6E*@BV;dmm^?%xU+TCX@*sJD93@A{ zVRDE(L!KrF$x|e*Po;l?9MC*lMS94k(JlQYTL zWCdACE+Utb9>~G(`^j$dA@TruknABJArFy<$zJjZ`8au$>?4nn z$H{(jfILB-Bu|lp&W%w2GUD5l1*d_=_hxRyU143B*Tiv?BC3hrG+t!^OrA}gR3%(Az1ke zh9f`an@pGNfm(bFx-CyX+%E3wQ+@y$<){1;`?C^UDN`qPEH(2s6y_vcd=labYsW!$haF5FWG$)tN zoau9>tMFa;+2INuF27YXXQkHFQRto270~a}`bH1*Q}ka1{d28lpZ1*JYc2b<=gy&q z&)jOQWuNxkyS0{m+H*~tU&YuTq=QAd3WI-s@e)2?_>>zhwPf13IL^cS_3{n-^SXuS*9Uh!M4Wq#zht~IAfKF0B1bt9z*`Gb{3tG$m?0G-aTJ~pOK1*xapMCje>PF~y zYTdjZ`r}$}9foH4Y{h-Noar=;Kwr>4vOjzN_0%h%H)t*Uv**7}YuTSYe;@Ts=+9~` z`?Ket)LQmu&p)rV?9Z;eg1QR&c50MW--Uu*g8qbvSHYx(V?D_+rB_HHj=9h1G=3$9@}%5A}$sBygunyHb`1z~Cf z`U6_a?+`3FuC?snUhqS$W&id9mZ9w5Ubv9q@L9M{YuUfOkoQ{lZ!b(SyaxJVt!4lA zLYAlO-(L7M!^P)Ct!4lA!q=(cv#5&N54}li*}uK0ow^VDz0~5vvhAvbeo}{biqH3{ zZRoRFr%@lSyiDu&*FdvvK6D8BJvv$dI-NPOW=A zNQ~i7_`#96YV5nd5&A)`Z`cX_0fx_nJ|rtF{c+u!r=!~ErXl>K`{$kTnYE5Cz0uLr zU(^24quAp6Rjp%v(9dffNB*b3q;+Zxlm^$>tjy(v!0|s z@;~bt>JjL$<5T*0p1$AFmmSppAASU7>(2{+pAJ8G80DGD3tu}|N=ChRYQ`MuO5}45 zHR{HU?bJ)5yQy(4Wm~Cd<9Z*Yu7>_7wUomX)K$=%sol^fHO^l8K_@?@8y!9S9!HlQ zE;n4)NKSE&PCDB4prdEq?C5D{9qsy5o_@;FWluZW^@5|Pz3%9;pF7(1s-sKhI@;)W zbV-e)-OKW{*U=?!b+r2(j-GYe(Z-98E_=<o1Njz0A=w_mmqYE_n|a+U&zh<6U6TpVRt%=tC}hwA^sJBWmQV!9cJi%K2mN>cgefSP;VvA#;4Ug+)AbXxa1vc2>+>s>-W8tj%h9Le4G6l zbu8X*2A_-KFYjGL_<#yzh~7>G$Fps2eClyyFi2 z$&->Fc|RSrt^;^C9kkScm%O_U`j6V@1Ba33Jgpy|iTtZ;l=tKzeX0LQ=e?~6uh;s6 z8{mIVoeS@@L*7t6I4|Bk2fa<}w-3PwbpYXbpB*&H78>uygGN6f;mx@3vt}rbcjQ5r zD~)&ML0_T6m$yP+rS%Q{$j@V1S06??w<(SH?7`=HrSTp;{0PH4vEY3X_7ZFuHd11^ zZilUb-3|LYm=6X&S3hh3b^`V+>;>45VLyS5Vd?yQiBYl~whFcyhBQj1D9Buyxan>FZ&4!8X8JVfW86%3epC?7;Qy zhy4TWUtot}pMiZ2_G_fq>@rFdu&)*h=-EXbans zmHj0~X$`Sn3qF&sGb@aQjcdE~DU5oa3wwLT7 zyER7`Kf?GC#*bv^M104w3_!ulPwXSwmKlm84tq z<#BSD93%(GKC+kWA-hSNG)X_{C2PnkvXXRb{(77oCI`s@vXAT~d&q9mCQZ^$ddV8H zimW8vnj_=nFgZvLXue{TCfThy%5+BE3}-s84D&nFd1Zj#`^a9hM{|_^qx2u8|0w-O z=|7tF@8)qfX_9`@OV*H8n&%jPj^XFB;gyVc(|=s^Jinjg_jAMa8zcwFKC+kWA-hSN zG)cea`AU-MobTgzrgOfB-FC>?Uo}B>kk9tRbt&O46-)ew-X82Q|lf$sV$sv`Lf9`Va7XpQdXC#xM-9 zE{yZC5Om!R!`SA+n!)9PVXSkNz_6rnT@AYqhT*|g3c~@eyKxZ4HW!{9yKaTu0>h6w zxmLke!&bsDez}&wHo!23xZVs~4_kv{FTyY`xoW}Jz-riCusYaHuqxO(*qtz$yI?ge zKMdS4#)UbL{BWP^3UCmHIhN~k@Oc=q?(m@BBym&vb^n4752PspE=C&<&}x5=-Nn0Kg;+%x&$o~e)A6Zy#fk`L~m`V5d? zBcCC^PCiXy-l{&|C;LgQrL9Z4A|8$59}J)bucs`*X`il zIQAYahhZsTJO?`k`vweCf7dNY zVRh8tfv%@YgI?HS8wX8rV8mE$q#(^{_i(cfso5|KG6R z!2SzqJOleC49gJXTd?y8zW~3P;P>$TyD%(GjPJnyg0R0LZWin^SQ%_KtQ>|XhpxG> z3fNUJd7_8qjByh7GwA<;orPgp<5~>69(DulM%Z%LTG$3w8y-_pJo{5J7(L`c*CTWD)V}Z1tX$!PP;$|e?5eQq+q?Iz1 zW3h-pAQqNnB5iODns5!o%r${vGHJz4t=n<(bXaT22b2{HCHERD6K(g00->O7btF=I z1My(Y3N-tCc1licb=j$4I_nb+rqfx6trKnB3ry{X?!x7s`CxanN zile@vJ`qpb!MLqG>LvZ{R=bt5;^Lt)7E5>d)J5cfL+PX}d-7Sg`+PZ%`zHM#yTcM&cI1U9KN33KL#lPK(TER3*y1v1m zvaHRPT_27_%{qHa+_bt1gXkPnBx-F9#)BQjQ*2Jyk@g63i#t_s#iuxLb0*eS{P>nsB4nl0a({}Q-5-e+KMqx- zm_LHOiOzU55j3ZWzC?xGk+!l$UbHRVn@H`}eZr(h=-W}3OooERDmtPvb|Qun3h6sj zhe}eU+WU6+?4X@VqvqSGL=;YwuK+g}O)eCU?3p4~-Fkfjsgy}nsAk_r%Ti=@+MbCw zB@)T4s_HiT{6dJoXl0vIQ_bZ{f^4M;L_J*R? zHdIVi5sUyX8kM*+U2y5?w^%qbuS9~;=w4kajHwS>q1|=pXM-s_lVsqgt|ZQy_WJ64 zk&ZYDDP=LH!Lm%;bAD?~q-|WYH-Z5xxVIStgq)0__gJa4>P`wnvfY4hht$G*g3*lC zkVrAfCfrk%C#i|qFtkn?8?#+9&fyD%Ei)6fOy#>p+QFV+l>WZm5sYspGms6$aAF2i z+0c457DUq0-{qR{y^&~iJ9BKd59n@0^|u9qo4TwJM!|a{cDN-K*@HUUVHFbsb8q_D08_)JB6N2Q~GB4j)_R1 zGl&A1)CZuwp`oYrP}P!1M2orj!*Z_4F}V&zW&(M&R#oCjr$P;}BT0n^D^c)+vY~w8y6}LKN zZWw6GpcSBVVAQ62S_0k(ss~1Wsi@9(-P7ohmbYwrE9#2e@Vo$BKja7%k2B~n<{<4RnXFGF(x|noSFKpR{7&_MlvuGfT5W@lP1b_9 z;R%;M>bB)~-h_bLm+P;$FTb;0`(d%yxpH+4{tcm8h9&i647V?6u3Wu#?ONlOw`EsY z)p~`s+=EUql5F&EZF+mLSSuQhB-0oi>)J5}He-rlrfZ9OA{o8R^2su*sEeE`-XV9+ zmuXAe5gQ{wZF?eB9}cF1A*7#HHPW(ihMSA$G~Tf#y(yNo_o_@_+2uhULv@bf{$hmA zSh?_cA{A4^I-H~v&PCt=S!mj4pprvWEVR$lbhPh z!8m=vp%deaCGL3C@;sK=WW_t|!dzr?DHn>#yM^_H+>CAQZ{Tf(A}0D3KH28-xv(-?nvQzj5#qsd0ml{Hf~&Y(&N;DARae{ zC)a{BP9+0)y<}ULj9zo;=Pd>Kn$o+#Px>v%s9qKGu}8I9uNGUlEXOQjkJS>i!;%A8 z#5k*)T00>T>I8pta)JExa5F-d`G1gVD3ikAV$0)=ZJqISE?c=ZhbPc(VR49=q&&iq zF;zNvea9H+QNzu|pu#>l>pJ1)W&<&rc`@#Gpq&(?T>RWOOQ)V)FykQMeIdNNz&SdNW4e!^8}Q;^<{sT4WB-HDy@=t*U)l9nS8 zQ}n2<-Zj3Ao|xqBojOQI6g?*Yp-GX9=0_JjK7UbHJjYz|s%76)IWHW-CuZMt2Kb_R zz}Qq!Y1CEAW6q-fdgd@W3Ny&;V8Lps(#g(NoTU;AO814T^Yu)wzxlD9R@*%htFso% zR*aA>3G`!oQAwMFdm^auGFGYCSZzu_4zF!b$v`RIGLSVzFn-3ZiPH>y+FZif`GkyS zNV!2Jpf52$BY8#X#~fg?gDQjKQ9-Bw-4aT~Cm-9Xo(5p4pNX3F@=T>jIR!g|yVb+; z=1AM*6l4NA`KjP!KN+C$7Z&x@UsbHhE~b9UcWI{y!*h|`rtxUbAC9Caw&eT*<(yFm z6-fb4kfih1OJv;3A}$j;qKRqi>2zLY7TZ3KM2RrIX=2Wh+ z0zX~8#ZLP-C5M%xdYGinIdxhaGq#k^WE(?lLZJipv8uGrxaVMOHW$d4psyvNQ(ODkh-*jJk5&>NR()Qd1<<+U#^q zrbyXmRLeaf^{fhiM2I`{(A?UlSV!ta=2kFylaw7!bl{ERx$N<7-OT!te=sBO+tM<1 zq<`ammx$basmQwRQy*EU|7fGGDj7+lTx7lFPsr>AYe^m`&yNfLP=skrZuRSQ+eJNX z8Q$K&r)ae)4#=yp&sZlto36S*DD<&jLNjp~O2YfC;O> zNxs=C==c|`7$zQ3tgZ3Hl0l5Dd9zfRgHAj=t@~wt#6)NH4 Date: Sun, 3 Feb 2008 14:48:34 +0100 Subject: [PATCH 0382/1156] Add 'Check for updates' option to preferences --- .../Preferences.nib/keyedobjects.nib | Bin 7787 -> 8113 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/src/MacVim/English.lproj/Preferences.nib/keyedobjects.nib b/src/MacVim/English.lproj/Preferences.nib/keyedobjects.nib index 085a76f2284462efc6a782908c0d01999801fa13..2b3903c0a6e38ba107de2850d1554982e5cc22e5 100644 GIT binary patch delta 5431 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 delta 4980 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 qYONYj8`W7VRp+Y<)J0v@ Date: Sun, 3 Feb 2008 16:13:06 +0100 Subject: [PATCH 0383/1156] Update Xcode project file - add 'Universal' configuration (builds a universal binary) - use 'apple-generic' versioning (agvtool) --- src/MacVim/MacVim.xcodeproj/project.pbxproj | 68 ++++++++++++++----- .../project.pbxproj | 56 +++++++++++++++ .../PSMTabBarControl.xcodeproj/winckler.mode1 | 6 +- .../winckler.pbxuser | 4 +- 4 files changed, 112 insertions(+), 22 deletions(-) diff --git a/src/MacVim/MacVim.xcodeproj/project.pbxproj b/src/MacVim/MacVim.xcodeproj/project.pbxproj index 8222cd6d70..f3c71259b5 100644 --- a/src/MacVim/MacVim.xcodeproj/project.pbxproj +++ b/src/MacVim/MacVim.xcodeproj/project.pbxproj @@ -37,7 +37,6 @@ 1D80FBD40CBBD3B700102A1C /* MMFullscreenWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D80FBD00CBBD3B700102A1C /* MMFullscreenWindow.m */; }; 1D80FBD60CBBD3B700102A1C /* MMVimView.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D80FBD20CBBD3B700102A1C /* MMVimView.m */; }; 1D80FBE40CBBD6F200102A1C /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D80FBE30CBBD6F200102A1C /* Carbon.framework */; }; - 1D9918480D299F9900A96335 /* MMAtsuiTextView.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 1D9918460D299F9900A96335 /* MMAtsuiTextView.h */; }; 1D9918490D299F9900A96335 /* MMAtsuiTextView.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D9918470D299F9900A96335 /* MMAtsuiTextView.m */; }; 1DD04DEC0C529C5E006CDC2B /* Credits.rtf in Resources */ = {isa = PBXBuildFile; fileRef = 1DD04DEB0C529C5E006CDC2B /* Credits.rtf */; }; 1DD0C20C0C60FFB4008CD84A /* gvimrc in CopyFiles */ = {isa = PBXBuildFile; fileRef = 1DD0C20A0C60FF9A008CD84A /* gvimrc */; }; @@ -46,11 +45,9 @@ 1DD704310BA9F9C2008679E9 /* SpecialKeys.plist in Resources */ = {isa = PBXBuildFile; fileRef = 1DD704300BA9F9C2008679E9 /* SpecialKeys.plist */; }; 1DD9F5E50C85D60500E8D5A5 /* SystemColors.plist in Resources */ = {isa = PBXBuildFile; fileRef = 1DD9F5E40C85D60500E8D5A5 /* SystemColors.plist */; }; 1DE3F8E70D50F80500052B9E /* Preferences.nib in Resources */ = {isa = PBXBuildFile; fileRef = 1DE3F8E50D50F80500052B9E /* Preferences.nib */; }; - 1DE3F8EA0D50F84600052B9E /* MMPreferenceController.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 1DE3F8E80D50F84600052B9E /* MMPreferenceController.h */; }; 1DE3F8EB0D50F84600052B9E /* MMPreferenceController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1DE3F8E90D50F84600052B9E /* MMPreferenceController.m */; }; 1DE608B40C587FDA0055263D /* runtime in CopyFiles */ = {isa = PBXBuildFile; fileRef = 1DE602470C587FD10055263D /* runtime */; }; 1DE8CC620C5E2AAD003F56E3 /* Actions.plist in Resources */ = {isa = PBXBuildFile; fileRef = 1DE8CC610C5E2AAD003F56E3 /* Actions.plist */; }; - 1DE9B94F0D341AB8008FEDD4 /* MMWindow.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 1DE9B94D0D341AB8008FEDD4 /* MMWindow.h */; }; 1DE9B9500D341AB8008FEDD4 /* MMWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = 1DE9B94E0D341AB8008FEDD4 /* MMWindow.m */; }; 1DED78600C6DE43D0079945F /* vimrc in CopyFiles */ = {isa = PBXBuildFile; fileRef = 1DED785F0C6DE43D0079945F /* vimrc */; }; 1DEE0D9F0C4E150B008E82B2 /* Attention.png in Resources */ = {isa = PBXBuildFile; fileRef = 1DEE0D8A0C4E150B008E82B2 /* Attention.png */; }; @@ -99,16 +96,6 @@ /* End PBXContainerItemProxy section */ /* Begin PBXCopyFilesBuildPhase section */ - 031AD5ED0D4DE2360026C5D7 /* CopyFiles */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 10; - files = ( - 031AD5EE0D4DE2490026C5D7 /* Sparkle.framework in CopyFiles */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; 1D0DCAD80BA3604D00B6CCFA /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; @@ -116,9 +103,6 @@ dstSubfolderSpec = 6; files = ( 1D493D580C5247BF00AB718C /* Vim in CopyFiles */, - 1D9918480D299F9900A96335 /* MMAtsuiTextView.h in CopyFiles */, - 1DE9B94F0D341AB8008FEDD4 /* MMWindow.h in CopyFiles */, - 1DE3F8EA0D50F84600052B9E /* MMPreferenceController.h in CopyFiles */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -128,6 +112,7 @@ dstPath = ""; dstSubfolderSpec = 10; files = ( + 031AD5EE0D4DE2490026C5D7 /* Sparkle.framework in CopyFiles */, 1D493DBA0C52534300AB718C /* PSMTabBarControl.framework in CopyFiles */, ); runOnlyForDeploymentPostprocessing = 0; @@ -444,7 +429,6 @@ 1D0DCAD80BA3604D00B6CCFA /* CopyFiles */, 1D9EB2840C366D7B0074B739 /* CopyFiles */, 1DE608B80C58807F0055263D /* CopyFiles */, - 031AD5ED0D4DE2360026C5D7 /* CopyFiles */, ); buildRules = ( ); @@ -605,11 +589,56 @@ /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ + 1D13D1610D560D9D0084F3AB /* Universal */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = ( + ppc, + i386, + ); + COPY_PHASE_STRIP = YES; + CURRENT_PROJECT_VERSION = 20; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(FRAMEWORK_SEARCH_PATHS_QUOTED_1)", + "$(FRAMEWORK_SEARCH_PATHS_QUOTED_2)", + "$(FRAMEWORK_SEARCH_PATHS_QUOTED_3)", + "$(FRAMEWORK_SEARCH_PATHS_QUOTED_2)", + "$(FRAMEWORK_SEARCH_PATHS_QUOTED_1)", + ); + FRAMEWORK_SEARCH_PATHS_QUOTED_1 = "\"$(SRCROOT)\""; + FRAMEWORK_SEARCH_PATHS_QUOTED_2 = "\"$(SYSTEM_DEVELOPER_DIR)/SDKs/MacOSX10.4u.sdk/System/Library/Frameworks\""; + GCC_DYNAMIC_NO_PIC = YES; + GCC_ENABLE_OBJC_EXCEPTIONS = YES; + GCC_GENERATE_DEBUGGING_SYMBOLS = NO; + GCC_MODEL_TUNING = G5; + GCC_OPTIMIZATION_LEVEL = s; + HEADER_SEARCH_PATHS = PSMTabBarControl/source/; + INFOPLIST_FILE = Info.plist; + INSTALL_PATH = "$(HOME)/Applications"; + PRODUCT_NAME = MacVim; + VERSIONING_SYSTEM = "apple-generic"; + WRAPPER_EXTENSION = app; + ZERO_LINK = NO; + }; + name = Universal; + }; + 1D13D1620D560D9D0084F3AB /* Universal */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + PREBINDING = NO; + SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk; + }; + name = Universal; + }; C01FCF4B08A954540054247B /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = "$(NATIVE_ARCH)"; COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 20; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "$(FRAMEWORK_SEARCH_PATHS_QUOTED_1)", @@ -629,6 +658,7 @@ INFOPLIST_FILE = Info.plist; INSTALL_PATH = "$(HOME)/Applications"; PRODUCT_NAME = MacVim; + VERSIONING_SYSTEM = "apple-generic"; WRAPPER_EXTENSION = app; ZERO_LINK = NO; }; @@ -639,6 +669,7 @@ buildSettings = { ARCHS = "$(NATIVE_ARCH)"; COPY_PHASE_STRIP = YES; + CURRENT_PROJECT_VERSION = 20; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "$(FRAMEWORK_SEARCH_PATHS_QUOTED_1)", @@ -658,6 +689,7 @@ INFOPLIST_FILE = Info.plist; INSTALL_PATH = "$(HOME)/Applications"; PRODUCT_NAME = MacVim; + VERSIONING_SYSTEM = "apple-generic"; WRAPPER_EXTENSION = app; ZERO_LINK = NO; }; @@ -691,6 +723,7 @@ buildConfigurations = ( C01FCF4B08A954540054247B /* Debug */, C01FCF4C08A954540054247B /* Release */, + 1D13D1610D560D9D0084F3AB /* Universal */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -700,6 +733,7 @@ buildConfigurations = ( C01FCF4F08A954540054247B /* Debug */, C01FCF5008A954540054247B /* Release */, + 1D13D1620D560D9D0084F3AB /* Universal */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; diff --git a/src/MacVim/PSMTabBarControl/PSMTabBarControl.xcodeproj/project.pbxproj b/src/MacVim/PSMTabBarControl/PSMTabBarControl.xcodeproj/project.pbxproj index 15efd2030f..2b8b1d509f 100644 --- a/src/MacVim/PSMTabBarControl/PSMTabBarControl.xcodeproj/project.pbxproj +++ b/src/MacVim/PSMTabBarControl/PSMTabBarControl.xcodeproj/project.pbxproj @@ -531,6 +531,59 @@ /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ + 1D13D16D0D560DDA0084F3AB /* Universal */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = ( + ppc, + i386, + ); + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + FRAMEWORK_VERSION = A; + GCC_GENERATE_DEBUGGING_SYMBOLS = NO; + GCC_MODEL_TUNING = G5; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/AppKit.framework/Headers/AppKit.h"; + INFOPLIST_FILE = "PSMTabBarControlFramework-Info.plist"; + INSTALL_PATH = "@executable_path/../Frameworks"; + OTHER_LDFLAGS = ( + "-seg1addr", + 0xc0000000, + ); + PRODUCT_NAME = PSMTabBarControl; + SYMROOT = ../build; + }; + name = Universal; + }; + 1D13D16E0D560DDA0084F3AB /* Universal */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = ( + ppc, + i386, + ); + GCC_GENERATE_DEBUGGING_SYMBOLS = NO; + GCC_MODEL_TUNING = G5; + PRODUCT_NAME = All; + WARNING_CFLAGS = ( + "-Wmost", + "-Wno-four-char-constants", + "-Wno-unknown-pragmas", + ); + }; + name = Universal; + }; + 1D13D16F0D560DDA0084F3AB /* Universal */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + PREBINDING = NO; + SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk; + }; + name = Universal; + }; C056398008A954F8003078D8 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -643,6 +696,7 @@ buildConfigurations = ( C056398008A954F8003078D8 /* Debug */, C056398108A954F8003078D8 /* Release */, + 1D13D16D0D560DDA0084F3AB /* Universal */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -652,6 +706,7 @@ buildConfigurations = ( C056398808A954F8003078D8 /* Debug */, C056398908A954F8003078D8 /* Release */, + 1D13D16E0D560DDA0084F3AB /* Universal */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -661,6 +716,7 @@ buildConfigurations = ( C056398C08A954F8003078D8 /* Debug */, C056398D08A954F8003078D8 /* Release */, + 1D13D16F0D560DDA0084F3AB /* Universal */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; diff --git a/src/MacVim/PSMTabBarControl/PSMTabBarControl.xcodeproj/winckler.mode1 b/src/MacVim/PSMTabBarControl/PSMTabBarControl.xcodeproj/winckler.mode1 index 524ae0f825..3929945b02 100644 --- a/src/MacVim/PSMTabBarControl/PSMTabBarControl.xcodeproj/winckler.mode1 +++ b/src/MacVim/PSMTabBarControl/PSMTabBarControl.xcodeproj/winckler.mode1 @@ -367,9 +367,9 @@ TableOfContents - 1DC70EA20C57D2650079D3C6 + 1D13D16B0D560DDA0084F3AB 1CE0B1FE06471DED0097A5F4 - 1DC70EA30C57D2650079D3C6 + 1D13D16C0D560DDA0084F3AB 1CE0B20306471E060097A5F4 1CE0B20506471E060097A5F4 @@ -503,7 +503,7 @@ 5 WindowOrderList - /Users/winckler/Projects/vim7/src/MacVim/PSMTabBarControl/PSMTabBarControl.xcodeproj + /Users/winckler/macvim/src/MacVim/PSMTabBarControl/PSMTabBarControl.xcodeproj WindowString 160 82 690 397 0 0 1024 746 diff --git a/src/MacVim/PSMTabBarControl/PSMTabBarControl.xcodeproj/winckler.pbxuser b/src/MacVim/PSMTabBarControl/PSMTabBarControl.xcodeproj/winckler.pbxuser index 1acc84889c..7135822736 100644 --- a/src/MacVim/PSMTabBarControl/PSMTabBarControl.xcodeproj/winckler.pbxuser +++ b/src/MacVim/PSMTabBarControl/PSMTabBarControl.xcodeproj/winckler.pbxuser @@ -49,8 +49,8 @@ PBXFileDataSource_Warnings_ColumnID, ); }; - PBXPerProjectTemplateStateSaveDate = 207082065; - PBXWorkspaceStateSaveDate = 207082065; + PBXPerProjectTemplateStateSaveDate = 223743414; + PBXWorkspaceStateSaveDate = 223743414; }; sourceControlManager = 1D82C6100AC093AF00AAD418 /* Source Control */; userBuildSettings = { From 24df7535532749e583d133dd49814e9e41f72f03 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sun, 3 Feb 2008 17:34:58 +0100 Subject: [PATCH 0384/1156] Added MacVim Appcast file --- src/MacVim/macvim_latest.xml | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 src/MacVim/macvim_latest.xml diff --git a/src/MacVim/macvim_latest.xml b/src/MacVim/macvim_latest.xml new file mode 100644 index 0000000000..97a589618f --- /dev/null +++ b/src/MacVim/macvim_latest.xml @@ -0,0 +1,30 @@ + + + + MacVim Cutting Edge + http://bjorn.winckler.googlepages.com/macvim_latest.xml + Most recent changes with links to updates. + + + Snapshot 20 released + MacVim snapshot 20 released +

+ ]]> + Sun, 03 Feb 2008 16:39 CET + + + + From 867d7e7d52fea625a4fc0ecf940d663e348db2a1 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sun, 3 Feb 2008 21:05:02 +0100 Subject: [PATCH 0385/1156] Removed stray entry in Info.plist dictionary --- src/MacVim/Info.plist | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/MacVim/Info.plist b/src/MacVim/Info.plist index d9a0d3d9c6..494d5aeedc 100644 --- a/src/MacVim/Info.plist +++ b/src/MacVim/Info.plist @@ -600,8 +600,6 @@ Window - New item - SUFeedURL http://bjorn.winckler.googlepages.com/macvim_latest.xml From 2e2af8ad40194e547920c71d66b5d5946bc19f2d Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Tue, 5 Feb 2008 20:02:55 +0100 Subject: [PATCH 0386/1156] Update preferences panel Some esoteric options were removed; added descriptions to some options. --- .../English.lproj/Preferences.nib/info.nib | 15 +++++++++++ .../Preferences.nib/keyedobjects.nib | Bin 8113 -> 13913 bytes src/MacVim/MacVim.xcodeproj/project.pbxproj | 24 ++++++++++++------ 3 files changed, 31 insertions(+), 8 deletions(-) diff --git a/src/MacVim/English.lproj/Preferences.nib/info.nib b/src/MacVim/English.lproj/Preferences.nib/info.nib index a38ba92bac..67b03c910d 100644 --- a/src/MacVim/English.lproj/Preferences.nib/info.nib +++ b/src/MacVim/English.lproj/Preferences.nib/info.nib @@ -6,6 +6,21 @@ 69 14 356 240 0 0 1024 746 IBFramework Version 489.0 + IBGroupedObjects + + 0 + + 79 + 40 + + 2 + + 71 + 37 + + + IBLastGroupID + 3 IBOpenObjects 5 diff --git a/src/MacVim/English.lproj/Preferences.nib/keyedobjects.nib b/src/MacVim/English.lproj/Preferences.nib/keyedobjects.nib index 2b3903c0a6e38ba107de2850d1554982e5cc22e5..0b0ac715c3d83ab61a7df26293499aeb4b4f65da 100644 GIT binary patch literal 13913 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 literal 8113 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 Date: Tue, 5 Feb 2008 20:03:55 +0100 Subject: [PATCH 0387/1156] Added help on preferences --- runtime/doc/gui_mac.txt | 76 +++++++++++++++++++++++++++++++---------- 1 file changed, 58 insertions(+), 18 deletions(-) diff --git a/runtime/doc/gui_mac.txt b/runtime/doc/gui_mac.txt index 3240b4860b..e30bbe35e0 100644 --- a/runtime/doc/gui_mac.txt +++ b/runtime/doc/gui_mac.txt @@ -1,4 +1,4 @@ -*gui_mac.txt* For Vim version 7.1. Last change: 2007 Nov 11 +*gui_mac.txt* For Vim version 7.1. Last change: 2008 Feb 05 VIM REFERENCE MANUAL by Bjorn Winckler @@ -6,16 +6,17 @@ The MacVim Graphical User Interface *macvim* *gui-macvim* -0. Important! |macvim-important| -1. MacVim differences |macvim-differences| -2. Starting MacVim |macvim-start| -3. Special colors |macvim-colors| -4. Menus |macvim-menus| -5. Toolbar |macvim-toolbar| -6. Dialogs |macvim-dialogs| -7. System services |macvim-services| -8. Known bugs/missing features |macvim-todo| -9. Hints |macvim-hints| + 0. Important! |macvim-important| + 1. MacVim differences |macvim-differences| + 2. Starting MacVim |macvim-start| + 3. Preferences |macvim-preferences| + 4. Special colors |macvim-colors| + 5. Menus |macvim-menus| + 6. Toolbar |macvim-toolbar| + 7. Dialogs |macvim-dialogs| + 8. System services |macvim-services| + 9. Known bugs/missing features |macvim-todo| +10. Hints |macvim-hints| Other relevant documentation: |gui.txt| For generic items of the GUI. @@ -185,7 +186,46 @@ at the moment though). In the modified and closed events the Tokn parameter is sent back to the server application. ============================================================================== -3. Special colors *macvim-colors* +3. Preferences *macvim-prefs* *macvim-preferences* + +Some settings are global to the MacVim application and would not make sense as +Vim options. These settings are stored in a user default database and can be +accessed via the "MacVim/Preferences..." menu item. + +Not all entries in the user defaults database are exposed via the preference +panel, usually because they should not be changed by the user under normal +circumstances. These options can still be changed with the "defaults" command +by opening Terminal and typing > + defaults write org.vim.MacVim KEY VALUE +Check the man page on "defaults" for more information on this command as well +as general information regarding Mac OS X user defaults. + +Here is a list of relevant dictionary entries: + +KEY VALUE ~ +MMCellWidthMultiplier width of a normal glyph in em units [float] +MMNoFontSubstitution disable automatic font substitution [bool] +MMTabMaxWidth maximum width of a tab [int] +MMTabMinWidth minimum width of a tab [int] +MMTabOptimumWidth default width of a tab [int] +MMTextInsetBottom text area offset in pixels [int] +MMTextInsetLeft text area offset in pixels [int] +MMTextInsetRight text area offset in pixels [int] +MMTextInsetTop text area offset in pixels [int] +MMTexturedWindow use brushed metal window (Tiger only) [bool] +MMTranslateCtrlClick interpret ctrl-click as right-click [bool] + +As an example, if you have more than one mouse button and would wish to free +up Ctrl-click so you can bind it to something else, then the appropriate +command is: > + defaults write org.vim.MacVim MMTranslateCtrlClick 0 + +If you wish to restore all user defaults to their starting values, open +Terminal and type: > + defaults delete org.vim.MacVim + +============================================================================== +4. Special colors *macvim-colors* The colors in MacVim are defined in two dictionaries inside the "Resources" folder of the application bundle (MacVim.app/Contents/Resources). It is @@ -230,7 +270,7 @@ If you have any comments regarding this colors cheme (is it better or worse than the default?) then post them to |vim_mac|. ============================================================================== -4. Menus *macvim-menus* +5. Menus *macvim-menus* *:macm* *:macmenukey* MacVim has a special way of binding keys to menu items that differs from other @@ -305,7 +345,7 @@ following line to "~/.gvimrc": > (Note that key equivalents must contain the 'D' flag.) ============================================================================== -5. Toolbar *macvim-toolbar* +6. Toolbar *macvim-toolbar* The toolbar in MacVim works just like in the other GUIs (see |gui-toolbar|), with the addition of two separator items (see |menu-separator|). You can use @@ -329,7 +369,7 @@ Note: Only a subset of the builtin toolbar items presently have icons. If no icon can be found a warning triangle is displayed instead. ============================================================================== -6. Dialogs *macvim-dialogs* +7. Dialogs *macvim-dialogs* Dialogs can be controlled with the keyboard in two ways. By default each button in a dialog is bound to a key. The button that is highlighted by blue @@ -347,7 +387,7 @@ select the current button. The current button is indicated with a blue outline. ============================================================================== -7. System services *macvim-services* +8. System services *macvim-services* MacVim supports a few system services. These can be accessed from the MacVim submenu in the Services menu. For services to work, MacVim.app should be @@ -365,7 +405,7 @@ These are the currently supported services: window. ============================================================================== -8. Known bugs/missing features *macvim-todo* +9. Known bugs/missing features *macvim-todo* Here are some of the bigger bugs in MacVim. Of course there are others, but these are ones that are know and/or which were judged major. @@ -387,7 +427,7 @@ might be simple to implement, but unless somebody asks for a particular feature then there is little incentive to add it. ============================================================================== -9. Hints *macvim-hints* +10. Hints *macvim-hints* In this section some general (not necessarily MacVim specific) hints are given. From 72af81b0f656aa7acc8ddd3a222692e81641b503 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Tue, 5 Feb 2008 20:22:35 +0100 Subject: [PATCH 0388/1156] Sparkle credits in About dialog --- src/MacVim/Credits.rtf | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/MacVim/Credits.rtf b/src/MacVim/Credits.rtf index dd3a6d939f..ebcfb4fbf6 100644 --- a/src/MacVim/Credits.rtf +++ b/src/MacVim/Credits.rtf @@ -2,7 +2,7 @@ {\fonttbl\f0\fswiss\fcharset77 Helvetica-Bold;\f1\fswiss\fcharset77 Helvetica;\f2\fswiss\fcharset77 Helvetica-Oblique; } {\colortbl;\red255\green255\blue255;} -\paperw11900\paperh16840\margl1440\margr1440\vieww9360\viewh8400\viewkind0 +\vieww9000\viewh8400\viewkind0 \pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\ql\qnatural\pardirnatural \f0\b\fs24 \cf0 VIM - Vi IMproved @@ -19,7 +19,7 @@ \f1\i0 \ with the help of:\ -\f2\i Nico Weber (full-screen editing, ...)\ +\f2\i Nico Weber (full-screen editing, Sparkle support, ...)\ George Harker (transparency, ...)\ Jjgod Jiang\ Tim Allen\ @@ -35,4 +35,6 @@ Toolbar icons from {\field{\*\fldinst{HYPERLINK "http://svn.gnome.org/viewvc/gno \ Vim icons made by {\field{\*\fldinst{HYPERLINK "http://www.cs.princeton.edu/~mtwebb/vim_icon/vim_icons.html"}}{\fldrslt Matthew Webb}}.\ \ -The default font in MacVim, DejaVu Sans Mono, is based on the Bitstream Vera\'aa and Arev fonts. Bitstream Vera\'aa is \'a9 2003 by Bitstream, Inc. Arev is \'a9 2006 by Tavmjong Bah. The DejaVu changes to these fonts are in the public domain.} \ No newline at end of file +The default font in MacVim, DejaVu Sans Mono, is based on the Bitstream Vera\'aa and Arev fonts. Bitstream Vera\'aa is \'a9 2003 by Bitstream, Inc. Arev is \'a9 2006 by Tavmjong Bah. The DejaVu changes to these fonts are in the public domain.\ +\ +Thanks to Andy Matuschak for {\field{\*\fldinst{HYPERLINK "http://sparkle.andymatuschak.org/"}}{\fldrslt Sparkle}}.} \ No newline at end of file From b775f355e5ff5f13a4f110ec506a71b721508ba9 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Tue, 5 Feb 2008 20:29:16 +0100 Subject: [PATCH 0389/1156] Add howto comment to appcast file --- src/MacVim/macvim_latest.xml | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/src/MacVim/macvim_latest.xml b/src/MacVim/macvim_latest.xml index 97a589618f..8a3c85bbcb 100644 --- a/src/MacVim/macvim_latest.xml +++ b/src/MacVim/macvim_latest.xml @@ -5,6 +5,41 @@ http://bjorn.winckler.googlepages.com/macvim_latest.xml Most recent changes with links to updates. + + Snapshot 20 released Date: Wed, 6 Feb 2008 18:09:31 +0100 Subject: [PATCH 0390/1156] Don't hide prefs panel on deactivate The preferences panel no longer hides when MacVim loses focus. Also, some space has been added between buttons in the preferences panel. --- .../Preferences.nib/keyedobjects.nib | Bin 13913 -> 13913 bytes src/MacVim/MMPreferenceController.m | 2 ++ src/MacVim/MacVim.xcodeproj/project.pbxproj | 2 +- 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/MacVim/English.lproj/Preferences.nib/keyedobjects.nib b/src/MacVim/English.lproj/Preferences.nib/keyedobjects.nib index 0b0ac715c3d83ab61a7df26293499aeb4b4f65da..7bf3f592937c92f1b5dcc369695701bc5f57248a 100644 GIT binary patch delta 605 zcmcbab2DedOhz@P9gN$Vb~5c^+Re0wX)mJ((>|vCOb3__G96+%%yfk5DAO^f1ej7$~=n|ryoGxD0&>L^s38XM{;7+Dxh4&>R%WMaIThc}9u z*~q|XbEbf>6rmW7KBUWSqjN#SqF6%{Z0eIb$cI z4#QuD=jjR0Cd zd7_?GeUx9YQ)x*_ex8X@j9+j_YDI}#W@=6f3dazk$RyG)*f+7HD6_&aUVuM1Be5to zMZqOCEwMDGq!=g%H4CA^IL0kACsn;z!M{8&wI~+J3PZ!N@JyDxl>G9^e)=jQK)1RB zgHMye3+U-Hz(7o9>;wiR(DjVk3?9JXoyy?J-~$X8Z(#6o0t3^d!3Y=x%D^Dy1_mb= zI6$)-lz@R9)}YnU0Q6(cCa3k4TaBpOY15;B>Yq0n4pI;90I zy&x_`T$HH`{{}&XS=9QfuT~dX2`;*E;U+70u7rRmW5jZ~=iUqVeCPLl`?dYr^Cu91 z48Fi^dr(g-t^cLTrvT;S_9&oR|?okr$dsiGDF6Zi_|HC;TEKisI&1HqH)V7Mjmk1tfPz zNTJO-wYxx~zMQ*}swO)1-^!6j%oUk~=2Mc0uvQ0y00`qR1T`ZebO07z0C&8-5l*dN z(+d~NR>NFXN@=rZj4t`|D|MqWs~65LTh>B7s?A(6>(zyol3pkpt5(`HYE||6frp~p z;6sJ^a>Jn$<*=NP&)FNXFMj~A&9!>~ diff --git a/src/MacVim/MMPreferenceController.m b/src/MacVim/MMPreferenceController.m index 1f3b9fcb67..6c6fe73e0d 100644 --- a/src/MacVim/MMPreferenceController.m +++ b/src/MacVim/MMPreferenceController.m @@ -29,6 +29,8 @@ - (id)init if (!self) return nil; [self setWindowFrameAutosaveName:@"Preferences"]; + [[self window] setHidesOnDeactivate:NO]; + return self; } diff --git a/src/MacVim/MacVim.xcodeproj/project.pbxproj b/src/MacVim/MacVim.xcodeproj/project.pbxproj index fb3a2e8e4e..9d1ad5933d 100644 --- a/src/MacVim/MacVim.xcodeproj/project.pbxproj +++ b/src/MacVim/MacVim.xcodeproj/project.pbxproj @@ -217,7 +217,7 @@ 29B97325FDCFA39411CA2CEA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = ""; }; 32CA4F630368D1EE00C91783 /* MacVim_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MacVim_Prefix.pch; sourceTree = ""; }; 8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; - 8D1107320486CEB800E47090 /* MacVim.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = MacVim.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 8D1107320486CEB800E47090 /* MacVim.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = MacVim.app; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ From c0447dd6ed12f9b1e852b6a295b5fb9330d43aa2 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Wed, 6 Feb 2008 20:40:35 +0100 Subject: [PATCH 0391/1156] Track pad scrolling is force sensitive When scrolling with the track pad, check the force the user is scrolling with and adjust the number of lines scrolled accordingly. Previously each track pad event scrolled three lines indepent of how forceful the scroll movement was. --- src/MacVim/MMBackend.m | 8 ++++++++ src/feature.h | 7 +++++++ src/gui.h | 4 ++++ src/normal.c | 17 +++++++++++++++++ 4 files changed, 36 insertions(+) diff --git a/src/MacVim/MMBackend.m b/src/MacVim/MMBackend.m index 8b8f30f836..5e4272aff9 100644 --- a/src/MacVim/MMBackend.m +++ b/src/MacVim/MMBackend.m @@ -1117,6 +1117,14 @@ - (oneway void)processInput:(int)msgid data:(in bycopy NSData *)data flags = eventModifierFlagsToVimMouseModMask(flags); + int numLines = (int)round(dy); + if (numLines < 0) numLines = -numLines; + if (numLines == 0) numLines = 1; + +#ifdef FEAT_GUI_SCROLL_WHEEL_FORCE + gui.scroll_wheel_force = numLines; +#endif + gui_send_mouse_event(button, col, row, NO, flags); } else if (MouseDownMsgID == msgid) { if (!data) return; diff --git a/src/feature.h b/src/feature.h index f263cf091f..6f11753830 100644 --- a/src/feature.h +++ b/src/feature.h @@ -1289,3 +1289,10 @@ #ifdef FEAT_GUI_MACVIM # define FEAT_ODB_EDITOR #endif + +/* + * Scroll wheel supports a 'force' attribute (how many lines to scroll) + */ +#ifdef FEAT_GUI_MACVIM +#define FEAT_GUI_SCROLL_WHEEL_FORCE +#endif diff --git a/src/gui.h b/src/gui.h index 3bf4da8619..bbb1bca923 100644 --- a/src/gui.h +++ b/src/gui.h @@ -493,6 +493,10 @@ typedef struct Gui char *rsrc_input_method; char *rsrc_preedit_type_name; #endif + +#ifdef FEAT_GUI_SCROLL_WHEEL_FORCE + int scroll_wheel_force; +#endif } gui_T; extern gui_T gui; /* this is defined in gui.c */ diff --git a/src/normal.c b/src/normal.c index 6bcb2e3f15..c509d774a2 100644 --- a/src/normal.c +++ b/src/normal.c @@ -4426,6 +4426,9 @@ nv_screengo(oap, dir, dist) nv_mousescroll(cap) cmdarg_T *cap; { +# ifdef FEAT_GUI_SCROLL_WHEEL_FORCE + int scroll_wheel_force = 0; +# endif # if defined(FEAT_GUI) && defined(FEAT_WINDOWS) win_T *old_curwin = curwin; @@ -4449,8 +4452,22 @@ nv_mousescroll(cap) } else { +# ifdef FEAT_GUI_SCROLL_WHEEL_FORCE + if (gui.in_use && gui.scroll_wheel_force >= 1) { + scroll_wheel_force = gui.scroll_wheel_force; + if (scroll_wheel_force > 1000) + scroll_wheel_force = 1000; + + cap->count1 = scroll_wheel_force; + cap->count0 = scroll_wheel_force; + } else { + cap->count1 = 3; + cap->count0 = 3; + } +# else cap->count1 = 3; cap->count0 = 3; +# endif nv_scroll_line(cap); } From 6269aa03e0f7d25f15a5b57c8791fea025df177d Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sat, 9 Feb 2008 22:24:25 +0100 Subject: [PATCH 0392/1156] Vim search patterns are put on the OS X Find Pasteboard By adding search patterns to the Find Pasteboard other apps can access Vim search patterns. For example, if the user types /neat in MacVim and then switches to Safari and hits , then Safari will search for the string "neat". --- src/MacVim/gui_macvim.m | 25 +++++++++++++++++++++++++ src/normal.c | 4 ++++ src/proto/gui_macvim.pro | 1 + 3 files changed, 30 insertions(+) diff --git a/src/MacVim/gui_macvim.m b/src/MacVim/gui_macvim.m index 3ad3dbddd0..d4b97dc7a9 100644 --- a/src/MacVim/gui_macvim.m +++ b/src/MacVim/gui_macvim.m @@ -1516,6 +1516,31 @@ [[MMBackend sharedInstance] updateModifiedFlag]; } +/* + * Add search pattern 'pat' to the OS X find pasteboard. This allows other + * apps access the last pattern searched for (hitting in another app will + * initiate a search for the same pattern). + */ + void +gui_macvim_add_to_find_pboard(char_u *pat) +{ + if (!pat) return; + +#ifdef FEAT_MBYTE + pat = CONVERT_TO_UTF8(pat); +#endif + NSString *s = [NSString stringWithUTF8String:(char*)pat]; +#ifdef FEAT_MBYTE + CONVERT_TO_UTF8_FREE(pat); +#endif + + if (!s) return; + + NSPasteboard *pb = [NSPasteboard pasteboardWithName:NSFindPboard]; + [pb declareTypes:[NSArray arrayWithObject:NSStringPboardType] owner:nil]; + [pb setString:s forType:NSStringPboardType]; +} + diff --git a/src/normal.c b/src/normal.c index c509d774a2..acf58f87bb 100644 --- a/src/normal.c +++ b/src/normal.c @@ -6111,6 +6111,10 @@ normal_search(cap, dir, pat, opt) cap->oap->use_reg_one = TRUE; curwin->w_set_curswant = TRUE; +#if FEAT_GUI_MACVIM + gui_macvim_add_to_find_pboard(pat); +#endif + i = do_search(cap->oap, dir, pat, cap->count1, opt | SEARCH_OPT | SEARCH_ECHO | SEARCH_MSG, NULL); if (i == 0) diff --git a/src/proto/gui_macvim.pro b/src/proto/gui_macvim.pro index 0b9437e412..12fab1319c 100644 --- a/src/proto/gui_macvim.pro +++ b/src/proto/gui_macvim.pro @@ -194,6 +194,7 @@ void gui_mch_enter_fullscreen(void); void gui_mch_leave_fullscreen(void); void gui_macvim_update_modified_flag(); +void gui_macvim_add_to_find_pboard(char_u *pat); OSErr odb_buffer_close(buf_T *buf); OSErr odb_post_buffer_write(buf_T *buf); From e7d7b1f6022d9b9cec05a66e1cc1d989ab5fd546 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Mon, 11 Feb 2008 20:31:19 +0100 Subject: [PATCH 0393/1156] Find Next/Previous and Use Selection for Find menus Implemented "Find Next", "Find Previous" and "Use Selection for Find" menus. In the process the Edit->Find menu has been restructured. To accomodate these changes the code changed so that the Find Pasteboard is updated also when :set @/ = ... is called (previously the Find Pasteboard was only updated when an actual search was executed). --- src/MacVim/Actions.plist | 4 +++ src/MacVim/MMWindowController.h | 2 ++ src/MacVim/MMWindowController.m | 46 +++++++++++++++++++++++++++++++++ src/MacVim/gvimrc | 21 ++++++++++++++- src/normal.c | 4 --- src/search.c | 7 +++++ 6 files changed, 79 insertions(+), 5 deletions(-) diff --git a/src/MacVim/Actions.plist b/src/MacVim/Actions.plist index b555ae9f98..82a212f52b 100644 --- a/src/MacVim/Actions.plist +++ b/src/MacVim/Actions.plist @@ -8,6 +8,10 @@ fileOpen: + findNext: + + findPrevious: + fontSizeDown: fontSizeUp: diff --git a/src/MacVim/MMWindowController.h b/src/MacVim/MMWindowController.h index f42fde41ef..8e8d2970d6 100644 --- a/src/MacVim/MMWindowController.h +++ b/src/MacVim/MMWindowController.h @@ -66,5 +66,7 @@ - (IBAction)addNewTab:(id)sender; - (IBAction)toggleToolbar:(id)sender; - (IBAction)performClose:(id)sender; +- (IBAction)findNext:(id)sender; +- (IBAction)findPrevious:(id)sender; @end diff --git a/src/MacVim/MMWindowController.m b/src/MacVim/MMWindowController.m index 9f6fe0fd09..3a284936b8 100644 --- a/src/MacVim/MMWindowController.m +++ b/src/MacVim/MMWindowController.m @@ -79,6 +79,7 @@ - (NSTabViewItem *)addNewTabViewItem; - (IBAction)vimMenuItemAction:(id)sender; - (BOOL)askBackendForStarRegister:(NSPasteboard *)pb; - (void)hideTablineSeparator:(BOOL)hide; +- (void)doFindNext:(BOOL)next; @end @@ -615,6 +616,16 @@ - (IBAction)performClose:(id)sender [vimController addVimInput:@":conf q"]; } +- (IBAction)findNext:(id)sender +{ + [self doFindNext:YES]; +} + +- (IBAction)findPrevious:(id)sender +{ + [self doFindNext:NO]; +} + // -- NSWindow delegate ------------------------------------------------------ @@ -807,4 +818,39 @@ - (void)hideTablineSeparator:(BOOL)hide } } +- (void)doFindNext:(BOOL)next +{ + NSString *query = nil; + +#if 0 + // Use current query if the search field is selected. + id searchField = [[self searchFieldItem] view]; + if (searchField && [[searchField stringValue] length] > 0 && + [decoratedWindow firstResponder] == [searchField currentEditor]) + query = [searchField stringValue]; +#endif + + if (!query) { + // Use find pasteboard for next query. + NSPasteboard *pb = [NSPasteboard pasteboardWithName:NSFindPboard]; + NSArray *types = [NSArray arrayWithObject:NSStringPboardType]; + if ([pb availableTypeFromArray:types]) + query = [pb stringForType:NSStringPboardType]; + } + + NSString *input = nil; + if (query) { + // NOTE: The '/' register holds the last search string. By setting it + // (using the '@/' syntax) we fool Vim into thinking that it has + // already searched for that string and then we can simply use 'n' or + // 'N' to find the next/previous match. + input = [NSString stringWithFormat:@":let @/='%@'%c", + query, next ? 'n' : 'N']; + } else { + input = next ? @"n" : @"N"; + } + + [vimController addVimInput:input]; +} + @end // MMWindowController (Private) diff --git a/src/MacVim/gvimrc b/src/MacVim/gvimrc index 433fb90ccc..d47804895f 100644 --- a/src/MacVim/gvimrc +++ b/src/MacVim/gvimrc @@ -1,7 +1,7 @@ " System gvimrc file for MacVim " " Maintainer: Bjorn Winckler -" Last Change: Mon Oct 27 2007 +" Last Change: Mon Feb 11 2008 " " This is a work in progress. If you feel so inclined, please help me improve " this file. @@ -50,6 +50,21 @@ an 10.330 File.Close\ Window:qa :confirm qa an 10.331 File.Close :maca performClose: "an 10.331 File.Close\ Tab :tabclose + +" Edit menu + +aunmenu Edit.Find +aunmenu Edit.Find\ and\ Replace + +an 20.410.10 Edit.Find.Find\.\.\./ / +an 20.410.20 Edit.Find.Find\ Next :maca findNext: +an 20.410.30 Edit.Find.Find\ Previous :maca findPrevious: +vmenu 20.410.35 Edit.Find.Use\ Selection\ for\ Find y:let @/=@"n +an 20.410.40 Edit.Find.-SEP1- +an 20.410.50 Edit.Find.Find\ and\ Replace\.\.\.:%s :%s/ +vunmenu Edit.Find.Find\ and\ Replace\.\.\.:%s +vnoremenu Edit.Find.Find\ and\ Replace\.\.\.:s :s/ + an 20.460 Edit.-SEP4- an 20.465.10 Edit.Font.Show\ Fonts :maca orderFrontFontPanel: an 20.465.20 Edit.Font.-SEP5- @@ -189,6 +204,10 @@ macmenukey Edit.Cut macmenukey Edit.Copy macmenukey Edit.Paste macmenukey Edit.Select\ All +macmenukey Edit.Find.Find\.\.\. +macmenukey Edit.Find.Find\ Next +macmenukey Edit.Find.Find\ Previous +macmenukey Edit.Find.Use\ Selection\ for\ Find macmenukey Edit.Special\ Characters\.\.\. macmenukey Edit.Font.Bigger macmenukey Edit.Font.Smaller diff --git a/src/normal.c b/src/normal.c index acf58f87bb..c509d774a2 100644 --- a/src/normal.c +++ b/src/normal.c @@ -6111,10 +6111,6 @@ normal_search(cap, dir, pat, opt) cap->oap->use_reg_one = TRUE; curwin->w_set_curswant = TRUE; -#if FEAT_GUI_MACVIM - gui_macvim_add_to_find_pboard(pat); -#endif - i = do_search(cap->oap, dir, pat, cap->count1, opt | SEARCH_OPT | SEARCH_ECHO | SEARCH_MSG, NULL); if (i == 0) diff --git a/src/search.c b/src/search.c index 1ad1df31f3..73de100bef 100644 --- a/src/search.c +++ b/src/search.c @@ -279,6 +279,9 @@ save_re_pat(idx, pat, magic) { if (spats[idx].pat != pat) { +#if FEAT_GUI_MACVIM + gui_macvim_add_to_find_pboard(pat); +#endif vim_free(spats[idx].pat); spats[idx].pat = vim_strsave(pat); spats[idx].magic = magic; @@ -422,6 +425,10 @@ set_last_search_pat(s, idx, magic, setlast) int magic; int setlast; { +#if FEAT_GUI_MACVIM + gui_macvim_add_to_find_pboard(s); +#endif + vim_free(spats[idx].pat); /* An empty string means that nothing should be matched. */ if (*s == NUL) From 4630903d9d6bdc6f422eff5f13abcc50c0f9e5a8 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Mon, 11 Feb 2008 20:44:51 +0100 Subject: [PATCH 0394/1156] Remove plist/dict from registered file types The .plist and .dict entries were removed from Info.plist since files of this type may be in binary format. --- src/MacVim/Info.plist | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/src/MacVim/Info.plist b/src/MacVim/Info.plist index 494d5aeedc..46d2e8b398 100644 --- a/src/MacVim/Info.plist +++ b/src/MacVim/Info.plist @@ -498,19 +498,6 @@ public.strings-text - - CFBundleTypeExtensions - - plist - dict - - CFBundleTypeName - Propery List File - CFBundleTypeRole - Editor - LSIsAppleDefaultForType - - CFBundleTypeExtensions From ddfeb8cac3ca64375b98f5c17d270b2753bd1a5f Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Mon, 11 Feb 2008 20:50:48 +0100 Subject: [PATCH 0395/1156] Implement bell The bell uses NSBeep() and can hence be changed in the System Preferences. Note that the visual bell is not yet implemented. --- src/MacVim/gui_macvim.m | 1 + 1 file changed, 1 insertion(+) diff --git a/src/MacVim/gui_macvim.m b/src/MacVim/gui_macvim.m index d4b97dc7a9..2e8782684b 100644 --- a/src/MacVim/gui_macvim.m +++ b/src/MacVim/gui_macvim.m @@ -1193,6 +1193,7 @@ void gui_mch_beep(void) { + NSBeep(); } From 1f5a9fa89b29e380f71de08e7340f5dd41e0efee Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Mon, 11 Feb 2008 20:52:48 +0100 Subject: [PATCH 0396/1156] Send cursor position on each batch draw The cursor position is used to set the selected range in the MMTextView. This provides some support for voice over (enable with Mac+F5). --- src/MacVim/MMBackend.m | 5 +++++ src/MacVim/MMTextView.m | 13 +++++++++++++ src/MacVim/MacVim.h | 3 ++- 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/MacVim/MMBackend.m b/src/MacVim/MMBackend.m index 5e4272aff9..5fea7e73d3 100644 --- a/src/MacVim/MMBackend.m +++ b/src/MacVim/MMBackend.m @@ -441,6 +441,11 @@ - (void)flushQueue:(BOOL)force [self setWideFont:oldWideFont]; } + int type = SetCursorPosDrawType; + [drawData appendBytes:&type length:sizeof(type)]; + [drawData appendBytes:&gui.row length:sizeof(gui.row)]; + [drawData appendBytes:&gui.col length:sizeof(gui.col)]; + [self queueMessage:BatchDrawMsgID data:[drawData copy]]; [drawData setLength:0]; } diff --git a/src/MacVim/MMTextView.m b/src/MacVim/MMTextView.m index 70ef1185fc..08fd5944cd 100644 --- a/src/MacVim/MMTextView.m +++ b/src/MacVim/MMTextView.m @@ -195,6 +195,7 @@ - (void)performBatchDrawWithData:(NSData *)data const void *bytes = [data bytes]; const void *end = bytes + [data length]; + int cursorRow = -1, cursorCol = 0; #if MM_DEBUG_DRAWING NSLog(@"====> BEGIN %s", _cmd); @@ -304,6 +305,9 @@ - (void)performBatchDrawWithData:(NSData *)data [self drawInsertionPointAtRow:row column:col shape:shape fraction:percent color:[NSColor colorWithRgbInt:color]]; + } else if (SetCursorPosDrawType == type) { + cursorRow = *((int*)bytes); bytes += sizeof(int); + cursorCol = *((int*)bytes); bytes += sizeof(int); } else { NSLog(@"WARNING: Unknown draw type (type=%d)", type); } @@ -311,6 +315,15 @@ - (void)performBatchDrawWithData:(NSData *)data [textStorage endEditing]; + if (cursorRow >= 0) { + unsigned off = [textStorage characterIndexForRow:cursorRow + column:cursorCol]; + unsigned maxoff = [[textStorage string] length]; + if (off > maxoff) off = maxoff; + + [self setSelectedRange:NSMakeRange(off, 0)]; + } + // NOTE: During resizing, Cocoa only sends draw messages before Vim's rows // and columns are changed (due to ipc delays). Force a redraw here. [self displayIfNeeded]; diff --git a/src/MacVim/MacVim.h b/src/MacVim/MacVim.h index 98aee7036d..4fc596ae52 100644 --- a/src/MacVim/MacVim.h +++ b/src/MacVim/MacVim.h @@ -171,7 +171,8 @@ enum { DeleteLinesDrawType, DrawStringDrawType, InsertLinesDrawType, - DrawCursorDrawType + DrawCursorDrawType, + SetCursorPosDrawType, }; enum { From 566dae45c7b330d244fea51e5f7178c61d1fdcc9 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Mon, 11 Feb 2008 21:47:43 +0100 Subject: [PATCH 0397/1156] Change LineNr highlight group in macvim color scheme This color change affects ':set number' when bg=dark. --- runtime/colors/macvim.vim | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/runtime/colors/macvim.vim b/runtime/colors/macvim.vim index 516dbf55be..d996b5f21e 100644 --- a/runtime/colors/macvim.vim +++ b/runtime/colors/macvim.vim @@ -29,7 +29,6 @@ hi ErrorMsg guibg=Firebrick2 guifg=White hi FoldColumn guibg=Grey guifg=DarkBlue hi Folded guibg=#E6E6E6 guifg=DarkBlue hi IncSearch gui=reverse -hi LineNr guifg=#888888 guibg=#E6E6E6 hi ModeMsg gui=bold hi MoreMsg gui=bold guifg=SeaGreen4 hi NonText gui=bold guifg=Blue @@ -80,6 +79,7 @@ if &background == "dark" hi DiffChange guibg=MediumPurple4 hi DiffDelete gui=bold guifg=White guibg=SlateBlue hi DiffText gui=NONE guifg=White guibg=SteelBlue + hi LineNr guifg=#350A5B guibg=Grey5 hi MatchParen guifg=White guibg=Magenta hi Normal guifg=Grey50 guibg=Grey10 hi Search guibg=Blue4 guifg=NONE @@ -99,6 +99,7 @@ else hi DiffChange guibg=DeepSkyBlue hi DiffDelete gui=bold guifg=Black guibg=SlateBlue hi DiffText gui=NONE guibg=Gold + hi LineNr guifg=#888888 guibg=#E6E6E6 hi MatchParen guifg=White guibg=MediumPurple1 hi Normal gui=NONE guifg=MacTextColor guibg=MacTextBackgroundColor hi Search guibg=CadetBlue1 guifg=NONE From 73708d6ff29f88c29c1afbf34c1970f9eb31fd0e Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Mon, 11 Feb 2008 22:20:22 +0100 Subject: [PATCH 0398/1156] Snapshot 21 --- src/MacVim/Info.plist | 2 +- src/MacVim/MacVim.xcodeproj/project.pbxproj | 6 ++--- src/MacVim/macvim_latest.xml | 30 +++++++++++++++++++++ 3 files changed, 34 insertions(+), 4 deletions(-) diff --git a/src/MacVim/Info.plist b/src/MacVim/Info.plist index 46d2e8b398..521fe991e2 100644 --- a/src/MacVim/Info.plist +++ b/src/MacVim/Info.plist @@ -530,7 +530,7 @@ CFBundleSignature VIMM CFBundleVersion - 20 + 21 NSMainNibFile MainMenu NSPrincipalClass diff --git a/src/MacVim/MacVim.xcodeproj/project.pbxproj b/src/MacVim/MacVim.xcodeproj/project.pbxproj index 9d1ad5933d..b1a2b44287 100644 --- a/src/MacVim/MacVim.xcodeproj/project.pbxproj +++ b/src/MacVim/MacVim.xcodeproj/project.pbxproj @@ -605,7 +605,7 @@ i386, ); COPY_PHASE_STRIP = YES; - CURRENT_PROJECT_VERSION = 20; + CURRENT_PROJECT_VERSION = 21; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "$(FRAMEWORK_SEARCH_PATHS_QUOTED_1)", @@ -646,7 +646,7 @@ buildSettings = { ARCHS = "$(NATIVE_ARCH)"; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 20; + CURRENT_PROJECT_VERSION = 21; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "$(FRAMEWORK_SEARCH_PATHS_QUOTED_1)", @@ -677,7 +677,7 @@ buildSettings = { ARCHS = "$(NATIVE_ARCH)"; COPY_PHASE_STRIP = YES; - CURRENT_PROJECT_VERSION = 20; + CURRENT_PROJECT_VERSION = 21; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "$(FRAMEWORK_SEARCH_PATHS_QUOTED_1)", diff --git a/src/MacVim/macvim_latest.xml b/src/MacVim/macvim_latest.xml index 8a3c85bbcb..914958f927 100644 --- a/src/MacVim/macvim_latest.xml +++ b/src/MacVim/macvim_latest.xml @@ -40,6 +40,36 @@ Sparkle supports updates in zip, tar, tbz, tgz, or dmg format. --> + + Snapshot 21 released + MacVim snapshot 21 released +
    +
  • The macvim color scheme changed so that line numbers look better when + the background is dark (enable line numbers with :set number, set dark + background with :set bg=dark)
  • +
  • Improved support for Voice Over (enable with )
  • +
  • System bell support (see :h 'vb' on how to turn it off)
  • +
  • MacVim no longer associates to .plist and .dict since these may well be + in binary format
  • +
  • Added Find Next , Find Previous and Use Selection for Find + menu items
  • +
  • Track pad scrolling is now force sensitive
  • +
  • Added help section on preferences
  • +
  • Preferences panel updated (also no longer hides when MacVim loses focus) +
  • +
+ ]]>
+ Mon, 11 Feb 2008 22:17 CET + +
+ + Snapshot 20 released Date: Mon, 11 Feb 2008 22:32:43 +0100 Subject: [PATCH 0399/1156] Update Appcast Replaced '<' and '>' with '<' and '>' where necessary. --- src/MacVim/macvim_latest.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/MacVim/macvim_latest.xml b/src/MacVim/macvim_latest.xml index 914958f927..96d7ec2440 100644 --- a/src/MacVim/macvim_latest.xml +++ b/src/MacVim/macvim_latest.xml @@ -46,14 +46,14 @@

MacVim snapshot 21 released

]]> - Sun, 11 May 2008 16:36 CET + Mon, 12 May 2008 22:05 CET From 030d0d07ec6e382c314be6c40f6fa3c8205913fe Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Mon, 19 May 2008 17:40:02 +0200 Subject: [PATCH 0466/1156] Update help which referred to Carbon version In particular, state that MacVim does not source $VIMRUNTIME/macmap.vim. --- runtime/doc/os_mac.txt | 10 +++++++--- runtime/doc/starting.txt | 3 ++- runtime/doc/version7.txt | 2 ++ 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/runtime/doc/os_mac.txt b/runtime/doc/os_mac.txt index d0cc780377..932db98f4e 100644 --- a/runtime/doc/os_mac.txt +++ b/runtime/doc/os_mac.txt @@ -1,4 +1,4 @@ -*os_mac.txt* For Vim version 7.1. Last change: 2006 Apr 30 +*os_mac.txt* For Vim version 7.1. Last change: 2008 May 19 VIM REFERENCE MANUAL by Bram Moolenaar et al. @@ -6,9 +6,13 @@ *mac* *Mac* *macintosh* *Macintosh* -This file documents the particularities of the Macintosh version of Vim. +This file documents the particularities of the Mac version of Vim. It was +written with the older Carbon version of Vim in mind. If you are using the +newer MacVim.app then please go to |macvim|. Some of the information here +does not apply to MacVim.app. -NOTE: This file is a bit outdated. You might find more useful info here: +NOTE: This file is a bit outdated. You might find more useful info on the old +Carbon version of Vim here: http://macvim.org/ 1. Filename Convention |mac-filename| diff --git a/runtime/doc/starting.txt b/runtime/doc/starting.txt index b58dade4ae..b276f2bfa1 100644 --- a/runtime/doc/starting.txt +++ b/runtime/doc/starting.txt @@ -766,7 +766,8 @@ accordingly. Vim proceeds in this order: Note that this file is ALWAYS read in 'compatible' mode, since the automatic resetting of 'compatible' is only done later. Add a ":set nocp" command if you like. - For the Macintosh the $VIMRUNTIME/macmap.vim is read. + For the Macintosh the $VIMRUNTIME/macmap.vim is read (not on + MacVim.app, this only applies to the older Carbon version). *VIMINIT* *.vimrc* *_vimrc* *EXINIT* *.exrc* *_exrc* c. Four places are searched for initializations. The first that exists diff --git a/runtime/doc/version7.txt b/runtime/doc/version7.txt index 589e59aff2..61599d7dfe 100644 --- a/runtime/doc/version7.txt +++ b/runtime/doc/version7.txt @@ -1177,6 +1177,8 @@ goes from 2.2 to 2.3. (Gordon Prieur) Mac: When starting up Vim will load the $VIMRUNTIME/macmap.vim script to define default command-key mappings. (mostly by Benji Fisher) +This only applies to the older Carbon version of Vim, MacVim.app does not +source this file. Mac: Add the selection type to the clipboard, so that Block, line and character selections can be used between two Vims. (Eckehard Berns) From 9c7523e9441e4fa1cab31af8de00bd77b7f17d82 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Mon, 19 May 2008 19:09:05 +0200 Subject: [PATCH 0467/1156] Change ":macmenukey" to ":macmenu" The new command allows better control over menus with ability to specify key equivalent, action, and wheter menu item is an alternate. These are specified as "key=value" pairs to allow future expansion. The help files have also been rewritten to reflect this change. --- runtime/doc/gui_mac.txt | 125 +++++----- runtime/doc/index.txt | 2 +- src/MacVim/MMBackend.h | 3 +- src/MacVim/MMBackend.m | 8 +- src/MacVim/MMVimController.m | 11 +- src/MacVim/gui_macvim.m | 60 +++-- src/MacVim/gvimrc | 128 +++++----- src/ex_cmds.h | 4 +- src/ex_docmd.c | 4 +- src/menu.c | 438 +++++++++++++++++++++++++++-------- src/proto/gui_macvim.pro | 1 + src/proto/menu.pro | 1 + src/structs.h | 8 +- 13 files changed, 537 insertions(+), 256 deletions(-) diff --git a/runtime/doc/gui_mac.txt b/runtime/doc/gui_mac.txt index b625e9164e..a2b44c75bf 100644 --- a/runtime/doc/gui_mac.txt +++ b/runtime/doc/gui_mac.txt @@ -1,4 +1,4 @@ -*gui_mac.txt* For Vim version 7.1. Last change: 2008 Mar 16 +*gui_mac.txt* For Vim version 7.1. Last change: 2008 May 19 VIM REFERENCE MANUAL by Bjorn Winckler @@ -310,50 +310,79 @@ than the default?) then post them to |vim_mac|. ============================================================================== 5. Menus *macvim-menus* - *:macm* *:macmenukey* -MacVim has a special way of binding keys to menu items that differs from other -Vim GUI ports. A menu binding is called a "key equivalent" in Mac OS X -terminology, this is displayed on the right side of a menu item. The -":macmenukey" command is used to set the key equivalent of a menu item. This -command takes two parameters, the first names the menu item to bind to, the -second gives the key combination. For example: > - :macmenukey File.New\ Tab -This sets the key equivalent of the "New Tab" menu item under the "File" menu -to Cmd+t. - -Note that key equivalents: - * must contain the Cmd modifier flag () - * take precedence over normal mappings made with ":map" - * can only be modified during startup (e.g. in .gvimrc) - -It is possible to reset a key equivalent by calling :macmenukey with a menu -name but no key. This is so that the default key equivalents can be reset in -"~/.gvimrc". For example, if you would like to free up (which is the -key equivalent of "File.Save") then add the following line to "~/.gvimrc": > - macmenukey File.Save -Now you can use :map to bind to whatever you like. - -It is not necessary to reset a key equivalent if all you want to do is to -change the key equivalent of a menu item. For example, say you want to use - as the key equivalent for "Next Tab", then add the following line -to "~/.gvimrc": > - macmenukey Window.Next\ Tab -< - *:maca* *:macaction* -It is typical for menu items in Cocoa applications to bind to Objective-C -selectors. To support this, MacVim introduces the |:macaction| command. This -command takes the name of an action message as its only parameter. (An action -message is an Objective-C message with "void" return type and a single -parameter of type "id".) For example, the "New Window" menu item on the -"File" menu is created in the following manner: > - :an 10.290 File.New\ Window :macaction newWindow: - -Note 1: A menu item which is bound to |:macaction| will automatically be bound -to that action in all modes (as if ":an" was used). It is not possible to -bind to |:macaction| in one mode only. -Note 2: The action is "nil-targeted", which means it is passed down the first -responder chain. +Menus in Mac OS X behave slightly different from other platforms. For that +reason two new commands have been added to Vim. To understand what these +commands do you must first understand how menus work on OS X. + +Each entry in a menu is called a "menu item". With each menu item is +associated: a title, a key equivalent and an action message. When a menu is +displayed the title is shown on the left and the key equivalent (if any) is +shown on the right. Key equivalents enable you to access a menu item using +the keyboard instead of having to use the mouse. When a menu item is clicked +it will send it's associated action message. Actions can be used to instruct +MacVim to paste some text (paste:), open a new window (newWindow:), etc. +Certain actions are standard throughout OS X which is why MacVim must be able +to set these for each menu item. (E.g. the menu item "Edit.Paste" must be +bound to the action "paste:" otherwise pasting won't work in dialogs since +that is the action that instructs them to paste something.) + +Menus are configured using the |:macmenu| command and the |:macaction| command +can be used to send action messages. + *:maca* *:macaction* +:maca[ction] {action:} Send the message "action:" to the first responder. + The list of allowed actions can be seen by typing + :maca + An attempt to send an action not listed here will + result in an error. This list is specified in a + property list file called |Actions.plist|. + + *:macm* *:macmenu* +:mac[menu] {menu} {key}={arg} ... + Set Mac specific properties for {menu}. The + properties that can be set are: + action the action this menu sends + alt "yes" if alternate of previous menu + key the key equivalent of this menu + This command must be used in a startup file, for + example in "~/.gvimrc". It has no effect otherwise. + + For convenience, a menu with "action=name:" which is + bound to will act as if bound to + ":maca name:". Thus, if "Menu.Item" is given by + :an Menu.Item + :macm Menu.Item action=name: + then ":emenu Menu.Item" is equivalent to + ":maca name:". + + The key equivalent is specified with the + syntax. Note that key equivalents must contain the + Cmd modifier flag (), and they take precedence + over normal mappings. + Use the syntax "key=" to clear the key equivalent + of a menu. This can be used to free up a key + combination that is set in the system gvimrc so that + it may be mapped to using ":map". + + Recognised values of "alt" are "0", "no", "1", and + "yes". The default is "no". An alternate menu must + have the same key equivalent as the previous menu, + except the modifier flags must differ. The alternate + menu is by default hidden and only shows up when the + modifier is held down. + +Here are some examples on how to use these commands: + +1. Create a menu item with title "New Window" under the "File" menu, with key +equivalent Cmd-n, which opens a new window when selected: > + :an 10.290 File.New\ Window + :macm File.New\ Window action=newWindow: key= +2. Change the key equivalent to cycle through tabs to Cmd-Left/Right: > + :macm Window.Previous\ Tab key= + :macm Window.Next\ Tab key= +3. Create a mapping in normal mode which closes the current tab/window: > + :map :maca performClose: +> *Actions.plist* Some action messages would not be suitable to call from within Vim, so there is a dictionary called "Actions.plist" (in the Resources folder of the @@ -381,14 +410,6 @@ performZoom: Zoom window (same as clicking the green blob) selectNextWindow: Select next window (similar to ) selectPreviousWindow: Select previous window (similar to ) -As an example, to map to performZoom: you could do something like this: > - :map :macaction performZoom: -A better way to map to performZoom: would be to set the key equivalent of the -menu item "Window.Zoom" to the above action. This can be done by adding the -following line to "~/.gvimrc": > - macmenukey Window.Zoom -(Note that key equivalents must contain the 'D' flag.) - ============================================================================== 6. Toolbar *macvim-toolbar* diff --git a/runtime/doc/index.txt b/runtime/doc/index.txt index b9b0eab78c..0b0a15664d 100644 --- a/runtime/doc/index.txt +++ b/runtime/doc/index.txt @@ -1289,7 +1289,7 @@ The commands are sorted on the non-optional part of their name. |:move| :m[ove] move lines |:mark| :ma[rk] set a mark |:macation| :maca[ction] send action message -|:macmenukey| :macm[eyequiv] set key equivalent for menu item +|:macmenu| :macm[enu] set Mac specific properties for menu item |:make| :mak[e] execute external command 'makeprg' and parse error messages |:map| :map show or enter a mapping diff --git a/src/MacVim/MMBackend.h b/src/MacVim/MMBackend.h index 058e88eebb..df754a66b1 100644 --- a/src/MacVim/MMBackend.h +++ b/src/MacVim/MMBackend.h @@ -89,7 +89,8 @@ - (void)addMenuItemWithTag:(int)tag parent:(int)parentTag name:(char *)name tip:(char *)tip icon:(char *)icon keyEquivalent:(int)key modifiers:(int)mods - action:(NSString *)action atIndex:(int)index; + action:(char *)action isAlternate:(int)isAlt + atIndex:(int)index; - (void)removeMenuItemWithTag:(int)tag; - (void)enableMenuItemWithTag:(int)tag state:(int)enabled; - (void)showPopupMenuWithName:(char *)name atMouseLocation:(BOOL)mouse; diff --git a/src/MacVim/MMBackend.m b/src/MacVim/MMBackend.m index 0eed0ac662..2bde88c057 100644 --- a/src/MacVim/MMBackend.m +++ b/src/MacVim/MMBackend.m @@ -755,7 +755,8 @@ - (void)addMenuWithTag:(int)tag parent:(int)parentTag name:(char *)name - (void)addMenuItemWithTag:(int)tag parent:(int)parentTag name:(char *)name tip:(char *)tip icon:(char *)icon keyEquivalent:(int)key modifiers:(int)mods - action:(NSString *)action atIndex:(int)index + action:(char *)action isAlternate:(int)isAlt + atIndex:(int)index { //NSLog(@"addMenuItemWithTag:%d parent:%d name:%s tip:%s atIndex:%d", tag, // parentTag, name, tip, index); @@ -764,7 +765,7 @@ - (void)addMenuItemWithTag:(int)tag parent:(int)parentTag name:(char *)name int tiplen = tip ? strlen(tip) : 0; int iconlen = icon ? strlen(icon) : 0; int eventFlags = vimModMaskToEventModifierFlags(mods); - int actionlen = [action lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; + int actionlen = action ? strlen(action) : 0; NSMutableData *data = [NSMutableData data]; key = specialKeyToNSKey(key); @@ -778,10 +779,11 @@ - (void)addMenuItemWithTag:(int)tag parent:(int)parentTag name:(char *)name [data appendBytes:&iconlen length:sizeof(int)]; if (iconlen > 0) [data appendBytes:icon length:iconlen]; [data appendBytes:&actionlen length:sizeof(int)]; - if (actionlen > 0) [data appendBytes:[action UTF8String] length:actionlen]; + if (actionlen > 0) [data appendBytes:action length:actionlen]; [data appendBytes:&index length:sizeof(int)]; [data appendBytes:&key length:sizeof(int)]; [data appendBytes:&eventFlags length:sizeof(int)]; + [data appendBytes:&isAlt length:sizeof(int)]; [self queueMessage:AddMenuItemMsgID data:data]; } diff --git a/src/MacVim/MMVimController.m b/src/MacVim/MMVimController.m index fb5d00aa72..4385ac7d33 100644 --- a/src/MacVim/MMVimController.m +++ b/src/MacVim/MMVimController.m @@ -70,7 +70,8 @@ - (void)addMenuWithTag:(int)tag parent:(int)parentTag title:(NSString *)title - (void)addMenuItemWithTag:(int)tag parent:(NSMenu *)parent title:(NSString *)title tip:(NSString *)tip keyEquivalent:(int)key modifiers:(int)mask - action:(NSString *)action atIndex:(int)idx; + action:(NSString *)action isAlternate:(int)isAlt + atIndex:(int)idx; - (NSToolbarItem *)toolbarItemForTag:(int)tag index:(int *)index; - (void)addToolbarItemToDictionaryWithTag:(int)tag label:(NSString *)title toolTip:(NSString *)tip icon:(NSString *)icon; @@ -705,6 +706,7 @@ - (void)handleMessage:(int)msgid data:(NSData *)data if (idx < 0) idx = 0; int key = *((int*)bytes); bytes += sizeof(int); int mask = *((int*)bytes); bytes += sizeof(int); + int isalt = *((int*)bytes); bytes += sizeof(int); NSString *ident = [NSString stringWithFormat:@"%d.%d", (int)self, parentTag]; @@ -715,7 +717,7 @@ - (void)handleMessage:(int)msgid data:(NSData *)data NSMenu *parent = [self menuForTag:parentTag]; [self addMenuItemWithTag:tag parent:parent title:title tip:tip keyEquivalent:key modifiers:mask action:action - atIndex:idx]; + isAlternate:isalt atIndex:idx]; } [title release]; @@ -1086,7 +1088,8 @@ - (void)addMenuWithTag:(int)tag parent:(int)parentTag title:(NSString *)title - (void)addMenuItemWithTag:(int)tag parent:(NSMenu *)parent title:(NSString *)title tip:(NSString *)tip keyEquivalent:(int)key modifiers:(int)mask - action:(NSString *)action atIndex:(int)idx + action:(NSString *)action isAlternate:(int)isAlt + atIndex:(int)idx { if (parent) { NSMenuItem *item = nil; @@ -1117,6 +1120,8 @@ - (void)addMenuItemWithTag:(int)tag parent:(NSMenu *)parent [item setKeyEquivalent:keyString]; [item setKeyEquivalentModifierMask:mask]; } + + if (isAlt) [item setAlternate:YES]; } } diff --git a/src/MacVim/gui_macvim.m b/src/MacVim/gui_macvim.m index f49c3ac709..701712d835 100644 --- a/src/MacVim/gui_macvim.m +++ b/src/MacVim/gui_macvim.m @@ -32,7 +32,6 @@ static NSFont *gui_macvim_font_with_name(char_u *name); -static BOOL gui_macvim_is_valid_action(NSString *action); @@ -655,33 +654,16 @@ char_u *tip = menu->strings[MENU_INDEX_TIP] ? menu->strings[MENU_INDEX_TIP] : menu->actext; char_u *map_str = menu->strings[MENU_INDEX_NORMAL]; + char_u *mac_action = menu->mac_action; #ifdef FEAT_MBYTE icon = CONVERT_TO_UTF8(icon); name = CONVERT_TO_UTF8(name); tip = CONVERT_TO_UTF8(tip); map_str = CONVERT_TO_UTF8(map_str); + mac_action = CONVERT_TO_UTF8(mac_action); #endif - // HACK! Check if menu is mapped to ':macaction actionName:'; if so, pass - // the action along so that MacVim can bind the menu item to this action. - // This means that if a menu item maps to an action in normal mode, then - // all other modes will also use the same action. - NSString *action = nil; - if (map_str) { - NSString *mapping = [NSString stringWithCString:(char*)map_str - encoding:NSUTF8StringEncoding]; - NSArray *parts = [mapping componentsSeparatedByString:@" "]; - if ([parts count] >=2 - && [[parts objectAtIndex:0] hasPrefix:@":maca"]) { - action = [parts objectAtIndex:1]; - action = [action stringByTrimmingCharactersInSet: - [NSCharacterSet whitespaceAndNewlineCharacterSet]]; - if (!gui_macvim_is_valid_action(action)) - action = nil; - } - } - [[MMBackend sharedInstance] addMenuItemWithTag:(int)menu parent:(int)menu->parent @@ -690,7 +672,8 @@ icon:(char*)icon keyEquivalent:menu->mac_key modifiers:menu->mac_mods - action:action + action:(char*)mac_action + isAlternate:menu->mac_alternate atIndex:idx]; #ifdef FEAT_MBYTE @@ -698,6 +681,7 @@ CONVERT_TO_UTF8_FREE(name); CONVERT_TO_UTF8_FREE(tip); CONVERT_TO_UTF8_FREE(map_str); + CONVERT_TO_UTF8_FREE(mac_action); #endif } @@ -1203,12 +1187,12 @@ arg = CONVERT_TO_UTF8(arg); #endif - NSString *name = [NSString stringWithCString:(char*)arg - encoding:NSUTF8StringEncoding]; - if (gui_macvim_is_valid_action(name)) { + NSDictionary *actionDict = [[MMBackend sharedInstance] actionDict]; + NSString *name = [NSString stringWithUTF8String:(char*)arg]; + if (actionDict && [actionDict objectForKey:name] != nil) { [[MMBackend sharedInstance] executeActionWithName:name]; } else { - EMSG2(_("E???: \"%s\" is not a valid action"), eap->arg); + EMSG2(_("E???: Invalid action: %s"), eap->arg); } #ifdef FEAT_MBYTE @@ -1513,13 +1497,6 @@ } - static BOOL -gui_macvim_is_valid_action(NSString *action) -{ - NSDictionary *actionDict = [[MMBackend sharedInstance] actionDict]; - return actionDict && [actionDict objectForKey:action] != nil; -} - void gui_mch_enter_fullscreen(int fuoptions_flags, guicolor_T bg) @@ -1890,3 +1867,22 @@ return plainStr; } + + int +is_valid_macaction(char_u *action) +{ + int isValid = NO; + NSDictionary *actionDict = [[MMBackend sharedInstance] actionDict]; + if (actionDict) { +#ifdef FEAT_MBYTE + action = CONVERT_TO_UTF8(action); +#endif + NSString *string = [NSString stringWithUTF8String:(char*)action]; + isValid = (nil != [actionDict objectForKey:string]); +#ifdef FEAT_MBYTE + CONVERT_TO_UTF8_FREE(action); +#endif + } + + return isValid; +} diff --git a/src/MacVim/gvimrc b/src/MacVim/gvimrc index 022b806e65..8d03a046f5 100644 --- a/src/MacVim/gvimrc +++ b/src/MacVim/gvimrc @@ -1,7 +1,7 @@ " System gvimrc file for MacVim " " Maintainer: Bjorn Winckler -" Last Change: Sat May 10 2008 +" Last Change: Sun May 18 2008 " " This is a work in progress. If you feel so inclined, please help me improve " this file. @@ -42,14 +42,13 @@ aunmenu File.-SEP4- aunmenu File.Exit aunmenu File.Save-Exit -an 10.290 File.New\ Window :maca newWindow: +an 10.290 File.New\ Window an 10.295 File.New\ Tab :tabnew -an 10.310 File.&Open\.\.\. :maca fileOpen: -an 10.325 File.Open\ Recent :maca recentFilesDummy: +an 10.310 File.&Open\.\.\. +an 10.325 File.Open\ Recent an 10.328 File.-SEP0- an 10.330 File.Close\ Window:qa :confirm qa -an 10.331 File.Close :maca performClose: -"an 10.331 File.Close\ Tab :tabclose +an 10.332 File.Close " Edit menu @@ -58,8 +57,8 @@ aunmenu Edit.Find aunmenu Edit.Find\ and\ Replace an 20.410.10 Edit.Find.Find\.\.\./ / -an 20.410.20 Edit.Find.Find\ Next :maca findNext: -an 20.410.30 Edit.Find.Find\ Previous :maca findPrevious: +an 20.410.20 Edit.Find.Find\ Next +an 20.410.30 Edit.Find.Find\ Previous vmenu 20.410.35 Edit.Find.Use\ Selection\ for\ Find y:let @/=@"n an 20.410.40 Edit.Find.-SEP1- an 20.410.50 Edit.Find.Find\ and\ Replace\.\.\.:%s :%s/ @@ -67,30 +66,30 @@ vunmenu Edit.Find.Find\ and\ Replace\.\.\.:%s vnoremenu Edit.Find.Find\ and\ Replace\.\.\.:s :s/ an 20.460 Edit.-SEP4- -an 20.465.10 Edit.Font.Show\ Fonts :maca orderFrontFontPanel: +an 20.465.10 Edit.Font.Show\ Fonts an 20.465.20 Edit.Font.-SEP5- -an 20.465.30 Edit.Font.Bigger :maca fontSizeUp: -an 20.465.40 Edit.Font.Smaller :maca fontSizeDown: -an 20.470 Edit.Special\ Characters\.\.\. :maca orderFrontCharacterPalette: +an 20.465.30 Edit.Font.Bigger +an 20.465.40 Edit.Font.Smaller +an 20.470 Edit.Special\ Characters\.\.\. " Window menu (should be next to Help so give it a high priority) aunmenu Window -an 9900.300 Window.Minimize :maca performMiniaturize: -an 9900.310 Window.Zoom :maca performZoom: +an 9900.300 Window.Minimize +an 9900.310 Window.Zoom an 9900.320 Window.Toggle\ Full\ Screen\ Mode :set invfullscreen an 9900.330 Window.-SEP1- " TODO! Grey out if no tabs are visible. an 9900.340 Window.Previous\ Tab :tabprevious an 9900.350 Window.Next\ Tab :tabnext an 9900.360 Window.-SEP2- -an 9900.370 Window.Bring\ All\ To\ Front :maca arrangeInFront: +an 9900.370 Window.Bring\ All\ To\ Front " Help menu an 9999.1 Help.MacVim\ Help :h gui_mac -an 9999.2 Help.MacVim\ Website :maca openWebsite: +an 9999.2 Help.MacVim\ Website an 9999.3 Help.-sep0- @@ -189,55 +188,58 @@ endif " exists("macvim_hig_shift_movement") " -" Menu key equivalents (these should always have the 'D' modifier set) +" Set up menu key equivalents (these should always have the 'D' modifier set), +" action bindings, and alternate items. +" +" Note: menu items which should execute an action are bound to ; the +" action message is specified here via the :macmenu command. " -macmenukey File.New\ Window -macmenukey File.New\ Tab - -macmenukey File.Open\.\.\. -macmenukey File.Open\ Tab\.\.\. -macmenukey File.Close\ Window -"macmenukey File.Close\ Tab -macmenukey File.Close -macmenukey File.Save -macmenukey File.Save\ As\.\.\. -macmenukey File.Print - -macmenukey Edit.Undo -macmenukey Edit.Redo -macmenukey Edit.Cut -macmenukey Edit.Copy -macmenukey Edit.Paste -macmenukey Edit.Select\ All -macmenukey Edit.Find.Find\.\.\. -macmenukey Edit.Find.Find\ Next -macmenukey Edit.Find.Find\ Previous -macmenukey Edit.Find.Use\ Selection\ for\ Find -macmenukey Edit.Special\ Characters\.\.\. -macmenukey Edit.Font.Bigger -macmenukey Edit.Font.Smaller - -macmenukey Tools.Spelling.To\ Next\ error -macmenukey Tools.Spelling.Suggest\ Corrections -macmenukey Tools.Make -macmenukey Tools.List\ Errors -macmenukey Tools.List\ Messages -macmenukey Tools.Next\ Error -macmenukey Tools.Previous\ Error -macmenukey Tools.Older\ List -macmenukey Tools.Newer\ List - -macmenukey Window.Minimize -macmenukey Window.Zoom -macmenukey Window.Toggle\ Full\ Screen\ Mode -macmenukey Window.Previous\ Tab -macmenukey Window.Next\ Tab - -" TODO: seems to be reserved by the system on Leopard. Disable this key -" equivalent until I can figure out what to do about it. -"macmenukey Help.MacVim\ Help - +macm File.New\ Window key= action=newWindow: +macm File.New\ Tab key= +macm File.Open\.\.\. key= action=fileOpen: +macm File.Open\ Tab\.\.\. key= +macm File.Open\ Recent action=recentFilesDummy: +macm File.Close\ Window key= +macm File.Close key= action=performClose: +macm File.Save key= +macm File.Save\ As\.\.\. key= +macm File.Print key= + +macm Edit.Undo key= +macm Edit.Redo key= +macm Edit.Cut key= +macm Edit.Copy key= +macm Edit.Paste key= +macm Edit.Select\ All key= +macm Edit.Find.Find\.\.\. key= +macm Edit.Find.Find\ Next key= action=findNext: +macm Edit.Find.Find\ Previous key= action=findPrevious: +macm Edit.Find.Use\ Selection\ for\ Find key= +macm Edit.Special\ Characters\.\.\. key= +macm Edit.Font.Show\ Fonts action=orderFrontFontPanel: +macm Edit.Font.Bigger key= action=fontSizeUp: +macm Edit.Font.Smaller key= action=fontSizeDown: +macm Edit.Special\ Characters\.\.\. action=orderFrontCharacterPalette: + +macm Tools.Spelling.To\ Next\ error key= +macm Tools.Spelling.Suggest\ Corrections key= +macm Tools.Make key= +macm Tools.List\ Errors key= +macm Tools.List\ Messages key= +macm Tools.Next\ Error key= +macm Tools.Previous\ Error key= +macm Tools.Older\ List key= +macm Tools.Newer\ List key= + +macm Window.Minimize key= action=performMiniaturize: +macm Window.Zoom key= action=performZoom: +macm Window.Toggle\ Full\ Screen\ Mode key= +macm Window.Previous\ Tab key= +macm Window.Next\ Tab key= +macm Window.Bring\ All\ To\ Front action=arrangeInFront: + +macm Help.MacVim\ Website action=openWebsite: " Restore the previous value of 'cpoptions'. let &cpo = s:cpo_save diff --git a/src/ex_cmds.h b/src/ex_cmds.h index 27a98daea5..7da810345d 100644 --- a/src/ex_cmds.h +++ b/src/ex_cmds.h @@ -597,8 +597,8 @@ EX(CMD_match, "match", ex_match, RANGE|NOTADR|EXTRA|CMDWIN), EX(CMD_macaction, "macaction", ex_macaction, EXTRA|NOSPC|NEEDARG), -EX(CMD_macmenukey, "macmenukey", ex_macmenukey, - EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN), +EX(CMD_macmenu, "macmenu", ex_macmenu, + EXTRA|TRLBAR|CMDWIN), EX(CMD_menu, "menu", ex_menu, RANGE|NOTADR|ZEROR|BANG|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN), EX(CMD_menutranslate, "menutranslate", ex_menutranslate, diff --git a/src/ex_docmd.c b/src/ex_docmd.c index f1aa113ace..0474883777 100644 --- a/src/ex_docmd.c +++ b/src/ex_docmd.c @@ -466,7 +466,7 @@ static void ex_folddo __ARGS((exarg_T *eap)); #ifndef FEAT_GUI_MACVIM # define ex_macaction ex_ni -# define ex_macmenukey ex_ni +# define ex_macmenu ex_ni #endif /* @@ -3764,7 +3764,7 @@ set_one_cmd_context(xp, buff) case CMD_tmenu: case CMD_tunmenu: case CMD_popup: case CMD_tearoff: case CMD_emenu: #ifdef FEAT_GUI_MACVIM - case CMD_macmenukey: + case CMD_macmenu: #endif return set_context_in_menu_cmd(xp, cmd, arg, forceit); #endif diff --git a/src/menu.c b/src/menu.c index bd4b4f292c..7d04b0c85c 100644 --- a/src/menu.c +++ b/src/menu.c @@ -1038,6 +1038,9 @@ free_menu(menup) # ifdef FEAT_GUI_MOTIF vim_free(menu->xpm_fname); # endif +#ifdef FEAT_GUI_MACVIM + vim_free(menu->mac_action); +#endif #endif for (i = 0; i < MENU_MODES; i++) free_menu_string(menu, i); @@ -2137,6 +2140,9 @@ ex_emenu(eap) char_u *p; int idx; char_u *mode; +#ifdef FEAT_GUI_MACVIM + char_u *old_arg; +#endif saved_name = vim_strsave(eap->arg); if (saved_name == NULL) @@ -2243,8 +2249,10 @@ ex_emenu(eap) idx = MENU_INDEX_NORMAL; } - if (idx != MENU_INDEX_INVALID && menu->strings[idx] != NULL) + if (idx != MENU_INDEX_INVALID && menu->strings[idx] != NULL && + menu->strings[idx][0] != NUL) { + /* When executing a script or function execute the commands right now. * Otherwise put them in the typeahead buffer. */ #ifdef FEAT_EVAL @@ -2256,6 +2264,19 @@ ex_emenu(eap) ins_typebuf(menu->strings[idx], menu->noremap[idx], 0, TRUE, menu->silent[idx]); } +#ifdef FEAT_GUI_MACVIM + else if (menu->mac_action != NULL && menu->strings[idx][0] == NUL) + { + /* This allows us to bind a menu to an action without mapping to + * anything so that pressing the menu's key equivalent and typing + * ":emenu ..." does the same thing. (HACK: We count on the fact that + * ex_macaction() only looks at eap->arg.) */ + old_arg = eap->arg; + eap->arg = menu->mac_action; + ex_macaction(eap); + eap->arg = old_arg; + } +#endif /* FEAT_GUI_MACVIM */ else EMSG2(_("E335: Menu not defined for %s mode"), mode); } @@ -2473,32 +2494,145 @@ menutrans_lookup(name, len) #ifdef FEAT_GUI_MACVIM + vimmenu_T * +menu_for_path(char_u *menu_path) +{ + vimmenu_T *menu; + char_u *name; + char_u *saved_name; + char_u *p; + + saved_name = vim_strsave(menu_path); + if (saved_name == NULL) + return NULL; + + menu = root_menu; + name = saved_name; + while (*name) + { + /* Find in the menu hierarchy */ + p = menu_name_skip(name); + + while (menu != NULL) + { + if (menu_name_equal(name, menu)) + { + if (*p == NUL && menu->children != NULL) + { + EMSG(_("E333: Menu path must lead to a menu item")); + menu = NULL; + } + else if (*p != NUL && menu->children == NULL) + { + EMSG(_(e_notsubmenu)); + menu = NULL; + } + break; + } + menu = menu->next; + } + if (menu == NULL || *p == NUL) + break; + menu = menu->children; + name = p; + } + + vim_free(saved_name); + + if (menu == NULL) + { + EMSG2(_("E334: Menu not found: %s"), menu_path); + return NULL; + } + + return menu; +} + +/* + * Handle the ":macmenu" command. + */ void -ex_macmenukey(eap) +ex_macmenu(eap) exarg_T *eap; { - char_u *arg = eap->arg; - char_u *keys, *name, *p; - vimmenu_T *menu; + vimmenu_T *menu = NULL; + char_u *arg; + char_u *menu_path; + char_u *p; + char_u *keys; + int len; +#ifdef FEAT_MULTI_LANG + char_u *tofree = NULL; + char_u *new_cmd; +#endif + char_u *linep; + char_u *key_start; + char_u *key = NULL; + char_u *arg_start = NULL; + int error = FALSE; + char_u *action = NULL; + int mac_key = 0; + int mac_mods = 0; + int mac_alternate = 0; char_u *last_dash; - int modifiers; int bit; - int key; + int set_action = FALSE; + int set_key = FALSE; + int set_alt = FALSE; + + arg = eap->arg; + +#ifdef FEAT_MULTI_LANG + /* + * Translate menu names as specified with ":menutrans" commands. + */ + menu_path = arg; + while (*menu_path) + { + /* find the end of one part and check if it should be translated */ + p = menu_skip_part(menu_path); + keys = menutrans_lookup(menu_path, (int)(p - menu_path)); + if (keys != NULL) + { + /* found a match: replace with the translated part */ + len = (int)STRLEN(keys); + new_cmd = alloc((unsigned)STRLEN(arg) + len + 1); + if (new_cmd == NULL) + break; + mch_memmove(new_cmd, arg, menu_path - arg); + mch_memmove(new_cmd + (menu_path - arg), keys, (size_t)len); + STRCPY(new_cmd + (menu_path - arg) + len, p); + p = new_cmd + (menu_path - arg) + len; + vim_free(tofree); + tofree = new_cmd; + arg = new_cmd; + } + if (*p != '.') + break; + menu_path = p + 1; + } +#endif /* * Isolate the menu name. + * Skip the menu name, and translate into a real TAB. */ - name = arg; - if (*name == '.') + menu_path = arg; + if (*menu_path == '.') { - EMSG2(_(e_invarg2), name); - return; + EMSG2(_(e_invarg2), menu_path); + goto theend; } while (*arg && !vim_iswhite(*arg)) { if ((*arg == '\\' || *arg == Ctrl_V) && arg[1] != NUL) arg++; + else if (STRNICMP(arg, "", 5) == 0) + { + *arg = TAB; + mch_memmove(arg + 1, arg + 5, STRLEN(arg + 4)); + } arg++; } if (*arg != NUL) @@ -2506,107 +2640,223 @@ ex_macmenukey(eap) arg = skipwhite(arg); keys = arg; - // TODO: move to gui_find_menu_item(path_name) - menu = root_menu; - while (*name) + menu = menu_for_path(menu_path); + if (!menu) goto theend; + + /* + * Parse all key=value arguments. + */ + arg = NULL; + linep = keys; + while (!ends_excmd(*linep)) { - /* find the end of one dot-separated name and put a NUL at the dot */ - p = menu_name_skip(name); + key_start = linep; + if (*linep == '=') + { + EMSG2(_("E415: unexpected equal sign: %s"), key_start); + error = TRUE; + break; + } - while (menu != NULL) + /* + * Isolate the key ("action", "alt", or "key"). + */ + while (*linep && !vim_iswhite(*linep) && *linep != '=') + ++linep; + vim_free(key); + key = vim_strnsave_up(key_start, (int)(linep - key_start)); + if (key == NULL) { - if (STRCMP(name, menu->name) == 0 || STRCMP(name, menu->dname) == 0) - { - if (*p == NUL) - { - if (menu->children != NULL) - menu = NULL; - goto search_end; - } - break; - } - menu = menu->next; + error = TRUE; + break; } - if (menu == NULL) /* didn't find it */ + linep = skipwhite(linep); + + /* + * Check for the equal sign. + */ + if (*linep != '=') + { + EMSG2(_("E416: missing equal sign: %s"), key_start); + error = TRUE; break; + } + ++linep; - /* Found a match, search the sub-menu. */ - menu = menu->children; - name = p; - } + /* + * Isolate the argument. + */ + linep = skipwhite(linep); + arg_start = linep; + linep = skiptowhite(linep); -search_end: - if (!menu) { - EMSG(_("E337: Menu not found - check menu names")); - return; - } + if (linep == arg_start) + { + EMSG2(_("E417: missing argument: %s"), key_start); + error = TRUE; + break; + } + vim_free(arg); + arg = vim_strnsave(arg_start, (int)(linep - arg_start)); + if (arg == NULL) + { + error = TRUE; + break; + } - if (keys[0] == '<') - { - key = 0; + /* + * Store the argument. + */ + if (STRCMP(key, "ACTION") == 0) + { + action = vim_strsave(arg); + if (action == NULL) + { + error = TRUE; + break; + } - /* Find end of modifier list */ - last_dash = keys; - for (p = keys + 1; *p == '-' || vim_isIDc(*p); p++) - { - if (*p == '-') - { - last_dash = p; - if (p[1] != NUL && p[2] == '>') - ++p; /* anything accepted, like */ - } - if (p[0] == 't' && p[1] == '_' && p[2] && p[3]) - p += 3; /* skip t_xx, xx may be '-' or '>' */ - } - - if (*p == '>') /* found matching '>' */ - { - /* Which modifiers are given? */ - modifiers = 0x0; - for (p = keys + 1; p < last_dash; p++) - { - if (*p != '-') - { - bit = name_to_mod_mask(*p); - if (bit == 0x0) - break; /* Illegal modifier name */ - modifiers |= bit; - } - } + if (!is_valid_macaction(action)) + { + EMSG2(_("E???: Invalid action: %s"), arg); + error = TRUE; + break; + } - /* - * Legal modifier name. - */ - if (p >= last_dash) + set_action = TRUE; + } + else if (STRCMP(key, "ALT") == 0) + { + len = (int)STRLEN(arg); + if ( (len == 1 && (*arg == '0' || *arg == '1')) || + (STRICMP("no", arg) == 0 || STRICMP("yes", arg) == 0) ) + { + mac_alternate = (*arg == '1' || STRICMP("yes", arg) == 0); + set_alt = TRUE; + } + else + { + EMSG2(_(e_invarg2), arg); + error = TRUE; + break; + } + } + else if (STRCMP(key, "KEY") == 0) + { + if (arg[0] != '<') + { + EMSG2(_(e_invarg2), arg); + error = TRUE; + break; + } + + if (STRICMP("", arg) == 0) { - /* - * Modifier with single letter, or special key name. - */ - if (modifiers != 0 && last_dash[2] == '>') - key = last_dash[1]; - else - { - key = get_special_key_code(last_dash + 1); - key = handle_x_keys(key); - } + /* This is to let the user unset a key equivalent, thereby + * freeing up that key combination to be used for a :map + * command (which would otherwise not be possible since key + * equivalents take precedence over :map). */ + mac_key = 0; + mac_mods = 0; + set_key = TRUE; + continue; } - } - if (key != 0) - { - menu->mac_key = key; - menu->mac_mods = modifiers; - } + /* Find end of modifier list */ + last_dash = arg; + for (p = arg + 1; *p == '-' || vim_isIDc(*p); p++) + { + if (*p == '-') + { + last_dash = p; + if (p[1] != NUL && p[2] == '>') + ++p; /* anything accepted, like */ + } + if (p[0] == 't' && p[1] == '_' && p[2] && p[3]) + p += 3; /* skip t_xx, xx may be '-' or '>' */ + } + + if (*p == '>') /* found matching '>' */ + { + /* Which modifiers are given? */ + mac_mods = 0x0; + for (p = arg + 1; p < last_dash; p++) + { + if (*p != '-') + { + bit = name_to_mod_mask(*p); + if (bit == 0x0) + break; /* Illegal modifier name */ + mac_mods |= bit; + } + } + + /* + * Legal modifier name. + */ + if (p >= last_dash) + { + /* + * Modifier with single letter, or special key name. + */ + if (mac_mods != 0 && last_dash[2] == '>') + mac_key = last_dash[1]; + else + { + mac_key = get_special_key_code(last_dash + 1); + mac_key = handle_x_keys(mac_key); + } + } + } + + set_key = (mac_key != 0); + + if (mac_key == 0) + { + EMSG2(_(e_invarg2), arg); + error = TRUE; + break; + } + } + else + { + EMSG2(_(e_invarg2), key_start); + error = TRUE; + break; + } + + /* + * Continue with next argument. + */ + linep = skipwhite(linep); } - else if (keys[0] == NUL) + + vim_free(key); + vim_free(arg); + +theend: +#ifdef FEAT_MULTI_LANG + vim_free(tofree); +#endif + + /* + * Store all the keys that were set in the menu item. + */ + if (!error) { - /* Clear the key equivalent */ - menu->mac_key = 0; - menu->mac_mods = 0; + if (set_action) + menu->mac_action = action; + if (set_key) + { + menu->mac_key = mac_key; + menu->mac_mods = mac_mods; + } + if (set_alt != -1) + menu->mac_alternate = mac_alternate; } else { - EMSG(_(e_invarg)); + vim_free(action); } } #endif /* FEAT_GUI_MACVIM */ diff --git a/src/proto/gui_macvim.pro b/src/proto/gui_macvim.pro index 52ddaa62fb..b7ecf6cbcf 100644 --- a/src/proto/gui_macvim.pro +++ b/src/proto/gui_macvim.pro @@ -202,3 +202,4 @@ OSErr odb_post_buffer_write(buf_T *buf); void odb_end(void); char_u *get_macaction_name(expand_T *xp, int idx); +int is_valid_macaction(char_u *action); diff --git a/src/proto/menu.pro b/src/proto/menu.pro index 3d85d7562b..3326b5be81 100644 --- a/src/proto/menu.pro +++ b/src/proto/menu.pro @@ -20,6 +20,7 @@ void ex_emenu __ARGS((exarg_T *eap)); vimmenu_T *gui_find_menu __ARGS((char_u *path_name)); void ex_menutranslate __ARGS((exarg_T *eap)); #ifdef FEAT_GUI_MACVIM +void ex_macmenu __ARGS((exarg_T *eap)); void ex_macmenukey __ARGS((exarg_T *eap)); #endif /* vim: set ft=c : */ diff --git a/src/structs.h b/src/structs.h index 4244de1e45..ae0a4a94c2 100644 --- a/src/structs.h +++ b/src/structs.h @@ -2254,9 +2254,11 @@ struct VimMenu PtWidget_t *submenu_id; #endif #ifdef FEAT_GUI_MACVIM - int mac_key; /* Key equivalent */ - int mac_mods; /* Modifier flags for the above */ - int was_grey; /* Remember last 'grey' state */ + char_u *mac_action; /* Action this menu sends */ + int mac_key; /* Key equivalent */ + int mac_mods; /* Modifier flags for the above */ + int mac_alternate; /* Item is alternate of previous item */ + int was_grey; /* Remember last 'grey' state */ #endif }; #else From 04d9ab21b09676364f5fa1584f3655b66127f4a2 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Mon, 19 May 2008 19:28:20 +0200 Subject: [PATCH 0468/1156] Bind "File.Close" to ":conf q" With the introduction of ":macmenu" it is possible to bind "File.Close" to ":conf q" and at the same time have it send the "performClose:" action. This patch reverts back to using ":conf q" since there were problems with "File.Close" in conjunction with bindings to . --- src/MacVim/MMBackend.m | 18 ------------------ src/MacVim/MMWindowController.m | 9 ++++++--- src/MacVim/MacVim.h | 1 - src/MacVim/MacVim.m | 1 - src/MacVim/gvimrc | 6 +++--- 5 files changed, 9 insertions(+), 26 deletions(-) diff --git a/src/MacVim/MMBackend.m b/src/MacVim/MMBackend.m index 2bde88c057..aa87096a0f 100644 --- a/src/MacVim/MMBackend.m +++ b/src/MacVim/MMBackend.m @@ -1665,24 +1665,6 @@ - (void)handleInputEvent:(int)msgid data:(NSData *)data [self handleOdbEdit:data]; } else if (XcodeModMsgID == msgid) { [self handleXcodeMod:data]; - } else if (CloseMsgID == msgid) { - // If in Ex mode, then simply exit Ex mode (^U:vi). Otherwise - // try to close one (Vim-)window by going to Normal mode first - // (CTRL-\_CTRL-N) and then sending ":q", but only if the - // command-line window is not open. If the command-line window is open - // then we just go back to normal mode (since CTRL-\_CTRL-N closes the - // command-line window). - if (exmode_active) { - // Exit Ex mode - add_to_input_buf((char_u*)"\x15:vi\n", 5); - } else { - // Go to normal mode - add_to_input_buf((char_u*)"\x1c\xe", 2); - if (0 == cmdwin_type) { - // Command-line window was not open, so :q - add_to_input_buf((char_u*)":conf q\n", 8); - } - } } else { NSLog(@"WARNING: Unknown message received (msgid=%d)", msgid); } diff --git a/src/MacVim/MMWindowController.m b/src/MacVim/MMWindowController.m index 936ae9ffb0..9241ae0b50 100644 --- a/src/MacVim/MMWindowController.m +++ b/src/MacVim/MMWindowController.m @@ -595,9 +595,12 @@ - (IBAction)toggleToolbar:(id)sender - (IBAction)performClose:(id)sender { - // NOTE: File->Close is bound to this action message so that File->Close - // also works for auxiliary windows such as the About dialog. - [vimController sendMessage:CloseMsgID data:nil]; + // NOTE: With the introduction of :macmenu it is possible to bind + // File.Close to ":conf q" but at the same time have it send off the + // performClose: action. For this reason we no longer need the CloseMsgID + // message. However, we still need File.Close to send performClose: + // otherwise Cmd-w will not work on dialogs. + [self vimMenuItemAction:sender]; } - (IBAction)findNext:(id)sender diff --git a/src/MacVim/MacVim.h b/src/MacVim/MacVim.h index 7862fff8a8..ffc9401678 100644 --- a/src/MacVim/MacVim.h +++ b/src/MacVim/MacVim.h @@ -162,7 +162,6 @@ enum { LiveResizeMsgID, EnableAntialiasMsgID, DisableAntialiasMsgID, - CloseMsgID, }; diff --git a/src/MacVim/MacVim.m b/src/MacVim/MacVim.m index 50d5d727e3..9c24952312 100644 --- a/src/MacVim/MacVim.m +++ b/src/MacVim/MacVim.m @@ -75,7 +75,6 @@ "LiveResizeMsgID", "EnableAntialiasMsgID", "DisableAntialiasMsgID", - "CloseMsgID", }; diff --git a/src/MacVim/gvimrc b/src/MacVim/gvimrc index 8d03a046f5..e128fb76da 100644 --- a/src/MacVim/gvimrc +++ b/src/MacVim/gvimrc @@ -1,7 +1,7 @@ " System gvimrc file for MacVim " " Maintainer: Bjorn Winckler -" Last Change: Sun May 18 2008 +" Last Change: Sun May 19 2008 " " This is a work in progress. If you feel so inclined, please help me improve " this file. @@ -47,8 +47,8 @@ an 10.295 File.New\ Tab :tabnew an 10.310 File.&Open\.\.\. an 10.325 File.Open\ Recent an 10.328 File.-SEP0- -an 10.330 File.Close\ Window:qa :confirm qa -an 10.332 File.Close +an 10.330 File.Close\ Window:qa :conf qa +an 10.332 File.Close :conf q " Edit menu From d08cc220fdca68e64a62ed2f17a46cb964a68300 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Mon, 19 May 2008 20:08:52 +0200 Subject: [PATCH 0469/1156] Add "File.Save All" menu item This patch serves the secondary purpose of showing off the new feature of being able to specify alternate menu items using the new :macmenu command. When the "File" menu is revealed either the "Save All" or the "Save" item is displayed, depending on whether Alt is held or not. --- src/MacVim/gvimrc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/MacVim/gvimrc b/src/MacVim/gvimrc index e128fb76da..e1ade8468e 100644 --- a/src/MacVim/gvimrc +++ b/src/MacVim/gvimrc @@ -44,11 +44,13 @@ aunmenu File.Save-Exit an 10.290 File.New\ Window an 10.295 File.New\ Tab :tabnew -an 10.310 File.&Open\.\.\. +an 10.310 File.Open\.\.\. an 10.325 File.Open\ Recent an 10.328 File.-SEP0- an 10.330 File.Close\ Window:qa :conf qa an 10.332 File.Close :conf q +an 10.341 File.Save\ All :browse conf wa +an 10.350 File.Save\ As\.\.\.:sav :browse confirm saveas " Edit menu @@ -203,6 +205,7 @@ macm File.Open\ Recent action=recentFilesDummy: macm File.Close\ Window key= macm File.Close key= action=performClose: macm File.Save key= +macm File.Save\ All key= alt=YES macm File.Save\ As\.\.\. key= macm File.Print key= From 0f1ee647460bece847ea56353816f6bd4ce7e293 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Mon, 19 May 2008 21:34:55 +0200 Subject: [PATCH 0470/1156] Fix bug in :macmenu Menu item not found lead to bad memory access. --- src/menu.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/menu.c b/src/menu.c index 7d04b0c85c..eca37b5589 100644 --- a/src/menu.c +++ b/src/menu.c @@ -2834,11 +2834,6 @@ ex_macmenu(eap) vim_free(key); vim_free(arg); -theend: -#ifdef FEAT_MULTI_LANG - vim_free(tofree); -#endif - /* * Store all the keys that were set in the menu item. */ @@ -2851,13 +2846,21 @@ ex_macmenu(eap) menu->mac_key = mac_key; menu->mac_mods = mac_mods; } - if (set_alt != -1) + if (set_alt) menu->mac_alternate = mac_alternate; } else { vim_free(action); } + +theend: +#ifdef FEAT_MULTI_LANG + vim_free(tofree); +#else + ; +#endif + } #endif /* FEAT_GUI_MACVIM */ From 0430474168889760bdc7afddc8a11cb8e660d8aa Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Tue, 20 May 2008 14:40:57 +0200 Subject: [PATCH 0471/1156] Coerce MacVim to work with LCC The LCC (Logitech Control Center) comes with an input manager which registers its own root object with the default NSConnection. MacVim uses the root object of the default connection to vend the frontend object, so LCC would cause MacVim to never open any new windows. To work around this problem the default connection is no longer used in MacVim, instead a new connection is created and this connection is used to vend the frontend object instead. --- src/MacVim/MMAppController.h | 1 + src/MacVim/MMAppController.m | 37 +++++++++++++++++++++--------------- 2 files changed, 23 insertions(+), 15 deletions(-) diff --git a/src/MacVim/MMAppController.h b/src/MacVim/MMAppController.h index c464cf116d..db3d61af48 100644 --- a/src/MacVim/MMAppController.h +++ b/src/MacVim/MMAppController.h @@ -16,6 +16,7 @@ @interface MMAppController : NSObject { + NSConnection *connection; NSMutableArray *vimControllers; NSString *openSelectionString; ATSFontContainerRef fontContainerRef; diff --git a/src/MacVim/MMAppController.m b/src/MacVim/MMAppController.m index c3588683e5..002bec6bdd 100644 --- a/src/MacVim/MMAppController.m +++ b/src/MacVim/MMAppController.m @@ -140,24 +140,30 @@ - (id)init vimControllers = [NSMutableArray new]; pidArguments = [NSMutableDictionary new]; + // NOTE: Do not use the default connection since the Logitech Control + // Center (LCC) input manager steals and this would cause MacVim to + // never open any windows. (This is a bug in LCC but since they are + // unlikely to fix it, we graciously give them the default connection.) + connection = [[NSConnection alloc] initWithReceivePort:[NSPort port] + sendPort:nil]; + [connection setRootObject:self]; + [connection setRequestTimeout:MMRequestTimeout]; + [connection setReplyTimeout:MMReplyTimeout]; + + // NOTE: When the user is resizing the window the AppKit puts the run + // loop in event tracking mode. Unless the connection listens to + // request in this mode, live resizing won't work. + [connection addRequestMode:NSEventTrackingRunLoopMode]; + // NOTE! If the name of the connection changes here it must also be // updated in MMBackend.m. - NSConnection *connection = [NSConnection defaultConnection]; NSString *name = [NSString stringWithFormat:@"%@-connection", [[NSBundle mainBundle] bundleIdentifier]]; //NSLog(@"Registering connection with name '%@'", name); - if ([connection registerName:name]) { - [connection setRequestTimeout:MMRequestTimeout]; - [connection setReplyTimeout:MMReplyTimeout]; - [connection setRootObject:self]; - - // NOTE: When the user is resizing the window the AppKit puts the - // run loop in event tracking mode. Unless the connection listens - // to request in this mode, live resizing won't work. - [connection addRequestMode:NSEventTrackingRunLoopMode]; - } else { - NSLog(@"WARNING: Failed to register connection with name '%@'", + if (![connection registerName:name]) { + NSLog(@"FATAL ERROR: Failed to register connection with name '%@'", name); + [connection release]; connection = nil; } } @@ -168,6 +174,7 @@ - (void)dealloc { //NSLog(@"MMAppController dealloc"); + [connection release]; connection = nil; [pidArguments release]; pidArguments = nil; [vimControllers release]; vimControllers = nil; [openSelectionString release]; openSelectionString = nil; @@ -456,9 +463,9 @@ - (void)applicationWillTerminate:(NSNotification *)notification andEventID:'MOD ']; #endif - // This will invalidate all connections (since they were spawned from the - // default connection). - [[NSConnection defaultConnection] invalidate]; + // This will invalidate all connections (since they were spawned from this + // connection). + [connection invalidate]; // Send a SIGINT to all running Vim processes, so that they are sure to // receive the connectionDidDie: notification (a process has to be checking From 138be9d567cf685657e5c542100ac2e310ed826f Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Tue, 20 May 2008 16:12:52 +0200 Subject: [PATCH 0472/1156] Improve "Edit" menu support in dialogs The Edit menu items cut/copy/paste/select all/undo/redo are wired to send the appropriate action messages (now possible with :macmenu command) so that they may work with dialogs. However, to make this work 100%, menus must first autoenable (which they currently do not). This will be addressed in a future patch. --- src/MacVim/Actions.plist | 14 ++++++++- src/MacVim/MMAtsuiTextView.m | 50 ++++++++++++++++++++++++++++++--- src/MacVim/MMTextView.m | 49 +++++++++++++++++++++++++++++--- src/MacVim/MMWindowController.h | 1 + src/MacVim/MMWindowController.m | 21 +++++++------- src/MacVim/gvimrc | 12 ++++---- 6 files changed, 121 insertions(+), 26 deletions(-) diff --git a/src/MacVim/Actions.plist b/src/MacVim/Actions.plist index 920f48d98a..7df6bff739 100644 --- a/src/MacVim/Actions.plist +++ b/src/MacVim/Actions.plist @@ -1,5 +1,5 @@ - + addNewTab: @@ -8,6 +8,10 @@ clearRecentDocuments: + copy: + + cut: + fileOpen: findNext: @@ -34,6 +38,8 @@ orderFrontPreferencePanel: + paste: + performClose: performMiniaturize: @@ -42,12 +48,18 @@ recentFilesDummy: + redo: + + selectAll: + selectNextWindow: selectPreviousWindow: terminate: + undo: + unhide: unhideAllApplications: diff --git a/src/MacVim/MMAtsuiTextView.m b/src/MacVim/MMAtsuiTextView.m index f703249229..b5bd731b69 100644 --- a/src/MacVim/MMAtsuiTextView.m +++ b/src/MacVim/MMAtsuiTextView.m @@ -27,6 +27,7 @@ #import "MMAtsuiTextView.h" #import "MMVimController.h" +#import "MMWindowController.h" #import "MacVim.h" @@ -65,6 +66,7 @@ - (void)disposeAtsuStyles; - (void)updateAtsuStyles; - (void)dispatchKeyEvent:(NSEvent *)event; - (void)sendKeyDown:(const char *)chars length:(int)len modifiers:(int)flags; +- (MMWindowController *)windowController; - (MMVimController *)vimController; @end @@ -726,6 +728,42 @@ - (void)scrollWheel:(NSEvent *)event [[self vimController] sendMessage:ScrollWheelMsgID data:data]; } + +// +// NOTE: The menu items cut/copy/paste/undo/redo/select all/... must be bound +// to the same actions as in IB otherwise they will not work with dialogs. All +// we do here is forward these actions to the Vim process. +// +- (IBAction)cut:(id)sender +{ + [[self windowController] vimMenuItemAction:sender]; +} + +- (IBAction)copy:(id)sender +{ + [[self windowController] vimMenuItemAction:sender]; +} + +- (IBAction)paste:(id)sender +{ + [[self windowController] vimMenuItemAction:sender]; +} + +- (IBAction)undo:(id)sender +{ + [[self windowController] vimMenuItemAction:sender]; +} + +- (IBAction)redo:(id)sender +{ + [[self windowController] vimMenuItemAction:sender]; +} + +- (IBAction)selectAll:(id)sender +{ + [[self windowController] vimMenuItemAction:sender]; +} + @end // MMAtsuiTextView @@ -875,13 +913,17 @@ - (void)sendKeyDown:(const char *)chars length:(int)len modifiers:(int)flags } } -- (MMVimController *)vimController +- (MMWindowController *)windowController { id windowController = [[self window] windowController]; + if ([windowController isKindOfClass:[MMWindowController class]]) + return (MMWindowController*)windowController; + return nil; +} - // TODO: Make sure 'windowController' is a MMWindowController before type - // casting. - return [(MMWindowController*)windowController vimController]; +- (MMVimController *)vimController +{ + return [[self windowController] vimController]; } @end // MMAtsuiTextView (Private) diff --git a/src/MacVim/MMTextView.m b/src/MacVim/MMTextView.m index bd2609fd9b..72bcf4f1e7 100644 --- a/src/MacVim/MMTextView.m +++ b/src/MacVim/MMTextView.m @@ -51,6 +51,7 @@ - (BOOL)convertPoint:(NSPoint)point toRow:(int *)row column:(int *)column; - (BOOL)convertRow:(int)row column:(int)column toPoint:(NSPoint *)point; - (NSRect)trackingRect; - (void)dispatchKeyEvent:(NSEvent *)event; +- (MMWindowController *)windowController; - (MMVimController *)vimController; - (void)startDragTimerWithInterval:(NSTimeInterval)t; - (void)dragTimerFired:(NSTimer *)timer; @@ -1119,6 +1120,42 @@ - (void)updateFontPanel // The font panel is updated whenever the font is set. } + +// +// NOTE: The menu items cut/copy/paste/undo/redo/select all/... must be bound +// to the same actions as in IB otherwise they will not work with dialogs. All +// we do here is forward these actions to the Vim process. +// +- (IBAction)cut:(id)sender +{ + [[self windowController] vimMenuItemAction:sender]; +} + +- (IBAction)copy:(id)sender +{ + [[self windowController] vimMenuItemAction:sender]; +} + +- (IBAction)paste:(id)sender +{ + [[self windowController] vimMenuItemAction:sender]; +} + +- (IBAction)undo:(id)sender +{ + [[self windowController] vimMenuItemAction:sender]; +} + +- (IBAction)redo:(id)sender +{ + [[self windowController] vimMenuItemAction:sender]; +} + +- (IBAction)selectAll:(id)sender +{ + [[self windowController] vimMenuItemAction:sender]; +} + @end // MMTextView @@ -1259,13 +1296,17 @@ - (void)dispatchKeyEvent:(NSEvent *)event [self sendKeyDown:bytes length:len modifiers:mods]; } -- (MMVimController *)vimController +- (MMWindowController *)windowController { id windowController = [[self window] windowController]; + if ([windowController isKindOfClass:[MMWindowController class]]) + return (MMWindowController*)windowController; + return nil; +} - // TODO: Make sure 'windowController' is a MMWindowController before type - // casting. - return [(MMWindowController*)windowController vimController]; +- (MMVimController *)vimController +{ + return [[self windowController] vimController]; } - (void)startDragTimerWithInterval:(NSTimeInterval)t diff --git a/src/MacVim/MMWindowController.h b/src/MacVim/MMWindowController.h index b656f28da8..97b18b21ab 100644 --- a/src/MacVim/MMWindowController.h +++ b/src/MacVim/MMWindowController.h @@ -68,5 +68,6 @@ - (IBAction)performClose:(id)sender; - (IBAction)findNext:(id)sender; - (IBAction)findPrevious:(id)sender; +- (IBAction)vimMenuItemAction:(id)sender; @end diff --git a/src/MacVim/MMWindowController.m b/src/MacVim/MMWindowController.m index 9241ae0b50..c3b055e355 100644 --- a/src/MacVim/MMWindowController.m +++ b/src/MacVim/MMWindowController.m @@ -76,7 +76,6 @@ - (void)resizeWindowToFitContentSize:(NSSize)contentSize; - (NSSize)constrainContentSizeToScreenSize:(NSSize)contentSize; - (void)updateResizeConstraints; - (NSTabViewItem *)addNewTabViewItem; -- (IBAction)vimMenuItemAction:(id)sender; - (BOOL)askBackendForStarRegister:(NSPasteboard *)pb; - (void)hideTablineSeparator:(BOOL)hide; - (void)doFindNext:(BOOL)next; @@ -613,6 +612,16 @@ - (IBAction)findPrevious:(id)sender [self doFindNext:NO]; } +- (IBAction)vimMenuItemAction:(id)sender +{ + int tag = [sender tag]; + + NSMutableData *data = [NSMutableData data]; + [data appendBytes:&tag length:sizeof(int)]; + + [vimController sendMessage:ExecuteMenuMsgID data:data]; +} + // -- NSWindow delegate ------------------------------------------------------ @@ -784,16 +793,6 @@ - (NSTabViewItem *)addNewTabViewItem return [vimView addNewTabViewItem]; } -- (IBAction)vimMenuItemAction:(id)sender -{ - int tag = [sender tag]; - - NSMutableData *data = [NSMutableData data]; - [data appendBytes:&tag length:sizeof(int)]; - - [vimController sendMessage:ExecuteMenuMsgID data:data]; -} - - (BOOL)askBackendForStarRegister:(NSPasteboard *)pb { // TODO: Can this be done with evaluateExpression: instead? diff --git a/src/MacVim/gvimrc b/src/MacVim/gvimrc index e1ade8468e..6b3ab099f7 100644 --- a/src/MacVim/gvimrc +++ b/src/MacVim/gvimrc @@ -209,12 +209,12 @@ macm File.Save\ All key= alt=YES macm File.Save\ As\.\.\. key= macm File.Print key= -macm Edit.Undo key= -macm Edit.Redo key= -macm Edit.Cut key= -macm Edit.Copy key= -macm Edit.Paste key= -macm Edit.Select\ All key= +macm Edit.Undo key= action=undo: +macm Edit.Redo key= action=redo: +macm Edit.Cut key= action=cut: +macm Edit.Copy key= action=copy: +macm Edit.Paste key= action=paste: +macm Edit.Select\ All key= action=selectAll: macm Edit.Find.Find\.\.\. key= macm Edit.Find.Find\ Next key= action=findNext: macm Edit.Find.Find\ Previous key= action=findPrevious: From be6ecb5d9245d7f6ca90987e438c8b5afc1c3c04 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sun, 25 May 2008 13:35:08 +0200 Subject: [PATCH 0473/1156] Set 'backspace' in the system vimrc Add "indent,eol,start" to the 'backspace' option in $VIM/vimrc to make the delete key behave in a more familiar way to new users. The help file has been update to point out this non-standard behaviour. --- runtime/doc/gui_mac.txt | 5 +++++ src/MacVim/vimrc | 6 +++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/runtime/doc/gui_mac.txt b/runtime/doc/gui_mac.txt index a2b44c75bf..a55e452233 100644 --- a/runtime/doc/gui_mac.txt +++ b/runtime/doc/gui_mac.txt @@ -142,6 +142,11 @@ another in MacVim. Simply search for something in one window (using "/") then switch to another (e.g. with ) and hit and the search will be repeated in the new window. + *macvim-backspace* *macvim-delete* +The 'backspace' option is set in the system vimrc to make the delete key +behave in a more familiar way to new users. If you dislike this non-default +behaviour, then add the line "set backspace&" to your "~/.vimrc" file. + ============================================================================== 2. Starting MacVim *macvim-start* diff --git a/src/MacVim/vimrc b/src/MacVim/vimrc index b4ea93ecaa..da8d7f32a2 100644 --- a/src/MacVim/vimrc +++ b/src/MacVim/vimrc @@ -1,6 +1,10 @@ " System vimrc file for MacVim " " Maintainer: Bjorn Winckler -" Last Change: Sat Aug 11 14:26:41 CEST 2007 +" Last Change: Sun May 25 2008 set nocompatible + +" The default for 'backspace' is very confusing to new users, so change it to a +" more sensible value. Add "set backspace&" to your ~/.vimrc to reset it. +set backspace+=indent,eol,start From 9a69ad0d629bf4212a603e942779193ba1638521 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sun, 25 May 2008 19:22:12 +0200 Subject: [PATCH 0474/1156] Open and save dialogs track the Vim pwd Open and save dialogs will open up at the present working directory of the key Vim process. This can be disabled by setting the user default "MMDialogsTrackPwd" to 0. If disabled, these dialogs always open up at the last location browsed to (which is the default OS X behaviour). --- runtime/doc/gui_mac.txt | 3 ++- src/MacVim/MMAppController.m | 12 ++++++++++-- src/MacVim/MMBackend.m | 23 ++++++++++++++++++++++- src/MacVim/MMVimController.h | 2 ++ src/MacVim/MMVimController.m | 20 ++++++++++++++++++++ src/MacVim/MacVim.h | 10 ++++++++++ src/MacVim/MacVim.m | 25 +++++++++++++++++++++++++ 7 files changed, 91 insertions(+), 4 deletions(-) diff --git a/runtime/doc/gui_mac.txt b/runtime/doc/gui_mac.txt index a55e452233..afa7cba8fb 100644 --- a/runtime/doc/gui_mac.txt +++ b/runtime/doc/gui_mac.txt @@ -1,4 +1,4 @@ -*gui_mac.txt* For Vim version 7.1. Last change: 2008 May 19 +*gui_mac.txt* For Vim version 7.1. Last change: 2008 May 25 VIM REFERENCE MANUAL by Bjorn Winckler @@ -227,6 +227,7 @@ Here is a list of relevant dictionary entries: KEY VALUE ~ MMAtsuiRenderer enable ATSUI renderer [bool] MMCellWidthMultiplier width of a normal glyph in em units [float] +MMDialogsTrackPwd open/save dialogs track the Vim pwd [bool] MMLoginShellArgument login shell parameter [string] MMLoginShellCommand which shell to use to launch Vim [string] MMNoFontSubstitution disable automatic font substitution [bool] diff --git a/src/MacVim/MMAppController.m b/src/MacVim/MMAppController.m index 002bec6bdd..5a301cadef 100644 --- a/src/MacVim/MMAppController.m +++ b/src/MacVim/MMAppController.m @@ -124,6 +124,7 @@ + (void)initialize [NSNumber numberWithBool:NO], MMZoomBothKey, @"", MMLoginShellCommandKey, @"", MMLoginShellArgumentKey, + [NSNumber numberWithBool:YES], MMDialogsTrackPwdKey, nil]; [[NSUserDefaults standardUserDefaults] registerDefaults:dict]; @@ -554,10 +555,17 @@ - (IBAction)newWindow:(id)sender - (IBAction)fileOpen:(id)sender { + NSString *dir = nil; + BOOL trackPwd = [[NSUserDefaults standardUserDefaults] + boolForKey:MMDialogsTrackPwdKey]; + if (trackPwd) { + MMVimController *vc = [self keyVimController]; + if (vc) dir = [[vc vimState] objectForKey:@"pwd"]; + } + NSOpenPanel *panel = [NSOpenPanel openPanel]; [panel setAllowsMultipleSelection:YES]; - - int result = [panel runModalForTypes:nil]; + int result = [panel runModalForDirectory:dir file:nil types:nil]; if (NSOKButton == result) [self application:NSApp openFiles:[panel filenames]]; } diff --git a/src/MacVim/MMBackend.m b/src/MacVim/MMBackend.m index aa87096a0f..608388bd6f 100644 --- a/src/MacVim/MMBackend.m +++ b/src/MacVim/MMBackend.m @@ -77,6 +77,7 @@ - (NSComparisonResult)serverNameCompare:(NSString *)string; @interface MMBackend (Private) +- (void)queueVimStateMessage; - (void)processInputQueue; - (void)handleInputEvent:(int)msgid data:(NSData *)data; + (NSDictionary *)specialKeys; @@ -462,7 +463,12 @@ - (void)flushQueue:(BOOL)force [drawData setLength:0]; } - if ([outputQueue count] > 0) { + if ([outputQueue count] > 0 || force) { + // When 'force' is set we always update the Vim state to ensure that + // MacVim has a copy of the latest state (since 'force' is typically + // set just before Vim takes a nap whilst waiting for input). + [self queueVimStateMessage]; + @try { [frontendProxy processCommandQueue:outputQueue]; } @@ -1555,6 +1561,21 @@ - (BOOL)sendReply:(NSString *)reply toPort:(int)port @implementation MMBackend (Private) +- (void)queueVimStateMessage +{ + // NOTE: This is the place to add Vim state that needs to be accessed from + // MacVim. Do not add state that could potentially require lots of memory + // since this message gets sent each time the output queue is forcibly + // flushed (e.g. storing the currently selected text would be a bad idea). + // We take this approach of "pushing" the state to MacVim to avoid having + // to make synchronous calls from MacVim to Vim in order to get state. + NSDictionary *vimState = [NSDictionary dictionaryWithObjectsAndKeys: + [[NSFileManager defaultManager] currentDirectoryPath], @"pwd", + nil]; + + [self queueMessage:SetVimStateMsgID data:[vimState dictionaryAsData]]; +} + - (void)processInputQueue { // NOTE: One of the input events may cause this method to be called diff --git a/src/MacVim/MMVimController.h b/src/MacVim/MMVimController.h index 59bd4dd31a..74ef10691a 100644 --- a/src/MacVim/MMVimController.h +++ b/src/MacVim/MMVimController.h @@ -42,6 +42,7 @@ NSMenu *lastMenuSearched; NSMenuItem *recentFilesMenuItem; NSMenuItem *recentFilesDummy; + NSDictionary *vimState; } - (id)initWithBackend:(id)backend pid:(int)processIdentifier @@ -51,6 +52,7 @@ - (void)setServerName:(NSString *)name; - (NSString *)serverName; - (MMWindowController *)windowController; +- (NSDictionary *)vimState; - (void)cleanup; - (void)dropFiles:(NSArray *)filenames forceOpen:(BOOL)force; - (void)dropString:(NSString *)string; diff --git a/src/MacVim/MMVimController.m b/src/MacVim/MMVimController.m index 4385ac7d33..498a655435 100644 --- a/src/MacVim/MMVimController.m +++ b/src/MacVim/MMVimController.m @@ -152,6 +152,11 @@ - (MMWindowController *)windowController return windowController; } +- (NSDictionary *)vimState +{ + return vimState; +} + - (void)setServerName:(NSString *)name { if (name != serverName) { @@ -391,6 +396,15 @@ - (oneway void)showSavePanelForDirectory:(in bycopy NSString *)dir { if (!isInitialized) return; + if (!dir) { + // 'dir == nil' means: set dir to the pwd of the Vim process, or let + // open dialog decide (depending on the below user default). + BOOL trackPwd = [[NSUserDefaults standardUserDefaults] + boolForKey:MMDialogsTrackPwdKey]; + if (trackPwd) + dir = [vimState objectForKey:@"pwd"]; + } + if (saving) { [[NSSavePanel savePanel] beginSheetForDirectory:dir file:nil modalForWindow:[windowController window] @@ -916,6 +930,12 @@ - (void)handleMessage:(int)msgid data:(NSData *)data [[[windowController vimView] textView] setAntialias:YES]; } else if (DisableAntialiasMsgID == msgid) { [[[windowController vimView] textView] setAntialias:NO]; + } else if (SetVimStateMsgID == msgid) { + NSDictionary *dict = [NSDictionary dictionaryWithData:data]; + if (dict) { + [vimState release]; + vimState = [dict retain]; + } } else { NSLog(@"WARNING: Unknown message received (msgid=%d)", msgid); } diff --git a/src/MacVim/MacVim.h b/src/MacVim/MacVim.h index ffc9401678..eb94dd9cbd 100644 --- a/src/MacVim/MacVim.h +++ b/src/MacVim/MacVim.h @@ -162,6 +162,7 @@ enum { LiveResizeMsgID, EnableAntialiasMsgID, DisableAntialiasMsgID, + SetVimStateMsgID, }; @@ -226,6 +227,7 @@ extern NSString *MMZoomBothKey; extern NSString *MMCurrentPreferencePaneKey; extern NSString *MMLoginShellCommandKey; extern NSString *MMLoginShellArgumentKey; +extern NSString *MMDialogsTrackPwdKey; // Enum for MMUntitledWindowKey enum { @@ -283,6 +285,14 @@ NSString *buildSearchTextCommand(NSString *searchText); +@interface NSDictionary (MMExtras) ++ (id)dictionaryWithData:(NSData *)data; +- (NSData *)dictionaryAsData; +@end + + + + // ODB Editor Suite Constants (taken from ODBEditorSuite.h) #define keyFileSender 'FSnd' #define keyFileSenderToken 'FTok' diff --git a/src/MacVim/MacVim.m b/src/MacVim/MacVim.m index 9c24952312..d8b1c47013 100644 --- a/src/MacVim/MacVim.m +++ b/src/MacVim/MacVim.m @@ -75,6 +75,7 @@ "LiveResizeMsgID", "EnableAntialiasMsgID", "DisableAntialiasMsgID", + "SetVimStateMsgID", }; @@ -106,6 +107,7 @@ NSString *MMCurrentPreferencePaneKey = @"MMCurrentPreferencePane"; NSString *MMLoginShellCommandKey = @"MMLoginShellCommand"; NSString *MMLoginShellArgumentKey = @"MMLoginShellArgument"; +NSString *MMDialogsTrackPwdKey = @"MMDialogsTrackPwd"; @@ -307,3 +309,26 @@ - (void)noteNewRecentFilePath:(NSString *)path @end // NSDocumentController (MMExtras) + + + +@implementation NSDictionary (MMExtras) + ++ (id)dictionaryWithData:(NSData *)data +{ + id plist = [NSPropertyListSerialization + propertyListFromData:data + mutabilityOption:NSPropertyListImmutable + format:NULL + errorDescription:NULL]; + + return [plist isKindOfClass:[NSDictionary class]] ? plist : nil; +} + +- (NSData *)dictionaryAsData +{ + return [NSPropertyListSerialization dataFromPropertyList:self + format:NSPropertyListBinaryFormat_v1_0 errorDescription:NULL]; +} + +@end From 07831f45b20867062f7236fb55ca636102c6c3c4 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sun, 25 May 2008 20:22:58 +0200 Subject: [PATCH 0475/1156] Snapshot 28 --- src/MacVim/Info.plist | 2 +- src/MacVim/MacVim.xcodeproj/project.pbxproj | 6 ++--- src/MacVim/macvim_latest.xml | 30 +++++++++++++++++++++ 3 files changed, 34 insertions(+), 4 deletions(-) diff --git a/src/MacVim/Info.plist b/src/MacVim/Info.plist index 8858c85c28..9513a0c30b 100644 --- a/src/MacVim/Info.plist +++ b/src/MacVim/Info.plist @@ -545,7 +545,7 @@ CFBundleSignature VIMM CFBundleVersion - 27 + 28 NSMainNibFile MainMenu NSPrincipalClass diff --git a/src/MacVim/MacVim.xcodeproj/project.pbxproj b/src/MacVim/MacVim.xcodeproj/project.pbxproj index 5ac7b5027d..75ca441218 100644 --- a/src/MacVim/MacVim.xcodeproj/project.pbxproj +++ b/src/MacVim/MacVim.xcodeproj/project.pbxproj @@ -698,7 +698,7 @@ i386, ); COPY_PHASE_STRIP = YES; - CURRENT_PROJECT_VERSION = 27; + CURRENT_PROJECT_VERSION = 28; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "$(FRAMEWORK_SEARCH_PATHS_QUOTED_1)", @@ -739,7 +739,7 @@ buildSettings = { ARCHS = "$(NATIVE_ARCH)"; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 27; + CURRENT_PROJECT_VERSION = 28; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "$(FRAMEWORK_SEARCH_PATHS_QUOTED_1)", @@ -770,7 +770,7 @@ buildSettings = { ARCHS = "$(NATIVE_ARCH)"; COPY_PHASE_STRIP = YES; - CURRENT_PROJECT_VERSION = 27; + CURRENT_PROJECT_VERSION = 28; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "$(FRAMEWORK_SEARCH_PATHS_QUOTED_1)", diff --git a/src/MacVim/macvim_latest.xml b/src/MacVim/macvim_latest.xml index 84ad2fead0..5f3154a1f4 100644 --- a/src/MacVim/macvim_latest.xml +++ b/src/MacVim/macvim_latest.xml @@ -40,6 +40,36 @@ Sparkle supports updates in zip, tar, tbz, tgz, or dmg format. --> + + Snapshot 28 released + MacVim snapshot 28 released +

The ":macmenukey" command is now deprecated. Please update your .gvimrc +file to use the ":macmenu" command instead (if you use ":macmenukey").

+ +

Changes since snapshot 27: +

    +
  • Added the ":macmenu" commmand (see ":h macmenu") and deprecated + ":macmenukey"
  • +
  • Cmd-w now works even when mappings to <-\> are present
  • +
  • Added "File.Save All" menu item (Cmd-Alt-s)
  • +
  • The Logitech Control Center no longer causes any problems
  • +
  • "Edit" menu items now work better with open and save dialogs
  • +
  • The 'backspace' option now includes "indent,eol,start" by default
  • +
  • Open and save dialogs track the present working directory
  • +
+

+ ]]>
+ Sun, 25 May 2008 19:40 CET + +
+ + Snapshot 27 released Date: Sun, 25 May 2008 21:59:39 +0200 Subject: [PATCH 0476/1156] Patch a memory leak The 'vimState' instance variable in MMVimController is now released on dealloc. --- src/MacVim/MMVimController.m | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/MacVim/MMVimController.m b/src/MacVim/MMVimController.m index 498a655435..72a39ba179 100644 --- a/src/MacVim/MMVimController.m +++ b/src/MacVim/MMVimController.m @@ -144,6 +144,8 @@ - (void)dealloc [recentFilesMenuItem release]; recentFilesMenuItem = nil; [recentFilesDummy release]; recentFilesDummy = nil; + [vimState release]; vimState = nil; + [super dealloc]; } From 8d051eef4e017f228a0ceb675ba3ff6a7c5f6ba5 Mon Sep 17 00:00:00 2001 From: Nico Weber Date: Tue, 27 May 2008 17:40:55 +0200 Subject: [PATCH 0477/1156] Make QuickLook work with .vim files --- src/MacVim/Info.plist | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/MacVim/Info.plist b/src/MacVim/Info.plist index 9513a0c30b..bf59c17a7b 100644 --- a/src/MacVim/Info.plist +++ b/src/MacVim/Info.plist @@ -4,6 +4,35 @@ CFBundleDevelopmentRegion English + + UTExportedTypeDeclarations + + + UTTypeConformsTo + + public.text + public.plain-text + + UTTypeDescription + vim script file + UTTypeIdentifier + org.vim.vim + UTTypeTagSpecification + + com.apple.ostype + TEXT + public.filename-extension + + vim + + + + CFBundleDocumentTypes From defa7bd0986d4fea1d5d45877c073b6edd7c4313 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Wed, 28 May 2008 21:16:27 +0200 Subject: [PATCH 0478/1156] Insert mode cursor respects 'rightleft' option When 'rl' is enabled the insert mode cursor is drawn on the right-hand side of a cell. --- src/MacVim/MMBackend.m | 8 ++++++++ src/MacVim/MMTextView.m | 4 ++++ 2 files changed, 12 insertions(+) diff --git a/src/MacVim/MMBackend.m b/src/MacVim/MMBackend.m index 608388bd6f..0afd312264 100644 --- a/src/MacVim/MMBackend.m +++ b/src/MacVim/MMBackend.m @@ -1569,8 +1569,16 @@ - (void)queueVimStateMessage // flushed (e.g. storing the currently selected text would be a bad idea). // We take this approach of "pushing" the state to MacVim to avoid having // to make synchronous calls from MacVim to Vim in order to get state. + +#ifdef FEAT_RIGHTLEFT + BOOL rightLeft = curwin->w_p_rl; +#else + BOOL rightLeft = NO; +#endif + NSDictionary *vimState = [NSDictionary dictionaryWithObjectsAndKeys: [[NSFileManager defaultManager] currentDirectoryPath], @"pwd", + [NSNumber numberWithBool:rightLeft], @"w_p_rl", nil]; [self queueMessage:SetVimStateMsgID data:[vimState dictionaryAsData]]; diff --git a/src/MacVim/MMTextView.m b/src/MacVim/MMTextView.m index 72bcf4f1e7..c9b3431bce 100644 --- a/src/MacVim/MMTextView.m +++ b/src/MacVim/MMTextView.m @@ -469,7 +469,11 @@ - (void)drawRect:(NSRect)rect ipRect.origin.y += ipRect.size.height - frac; ipRect.size.height = frac; } else if (MMInsertionPointVertical == insertionPointShape) { + BOOL rightLeft = [[[[self vimController] vimState] + objectForKey:@"w_p_rl"] boolValue]; int frac = ([ts cellSize].width* insertionPointFraction + 99)/100; + if (rightLeft) + ipRect.origin.x += ipRect.size.width - frac; ipRect.size.width = frac; } From fdc64858c545b6d2168932ff6d7a537ca11e7174 Mon Sep 17 00:00:00 2001 From: Nico Weber Date: Thu, 29 May 2008 17:01:44 +0200 Subject: [PATCH 0479/1156] Wrap user-visible strings in NSLocalizedString() --- src/MacVim/MMAppController.m | 81 ++++++++++++++++++++++++------------ 1 file changed, 54 insertions(+), 27 deletions(-) diff --git a/src/MacVim/MMAppController.m b/src/MacVim/MMAppController.m index 5a301cadef..2128366fe2 100644 --- a/src/MacVim/MMAppController.m +++ b/src/MacVim/MMAppController.m @@ -194,20 +194,24 @@ - (void)applicationWillFinishLaunching:(NSNotification *)notification // The menu needs to be created and be added to a toplevel menu in // applicationWillFinishLaunching at the latest, otherwise it doesn't work. - recentFilesMenuItem = [[NSMenuItem alloc] initWithTitle:@"Open Recent" - action:nil keyEquivalent:@""]; + recentFilesMenuItem = [[NSMenuItem alloc] + initWithTitle:NSLocalizedString(@"Open Recent", @"Open Recent menu") + action:nil keyEquivalent:@""]; - NSMenu *recentFilesMenu = [[NSMenu alloc] initWithTitle:@"Open Recent"]; + NSMenu *recentFilesMenu = [[NSMenu alloc] + initWithTitle:NSLocalizedString(@"Open Recent", @"Open Recent menu")]; [recentFilesMenu performSelector:@selector(_setMenuName:) withObject:@"NSRecentDocumentsMenu"]; - [recentFilesMenu addItemWithTitle:@"Clear Menu" + [recentFilesMenu addItemWithTitle:NSLocalizedString(@"Clear Menu", + @"Open Recent menu") action:@selector(clearRecentDocuments:) keyEquivalent:@""]; [recentFilesMenuItem setSubmenu:recentFilesMenu]; [recentFilesMenu release]; // the menu is retained by recentFilesMenuItem [recentFilesMenuItem setTag:-1]; // must not be 0 + // TODO: this will not work in a localized MacVim [[[[NSApp mainMenu] itemWithTitle:@"File"] submenu] addItem:recentFilesMenuItem]; #if MM_HANDLE_XCODE_MOD_EVENT @@ -383,11 +387,16 @@ - (NSApplicationTerminateReply)applicationShouldTerminate: if (modifiedBuffers) { NSAlert *alert = [[NSAlert alloc] init]; [alert setAlertStyle:NSWarningAlertStyle]; - [alert addButtonWithTitle:@"Quit"]; - [alert addButtonWithTitle:@"Cancel"]; - [alert setMessageText:@"Quit without saving?"]; - [alert setInformativeText:@"There are modified buffers, " - "if you quit now all changes will be lost. Quit anyway?"]; + [alert addButtonWithTitle:NSLocalizedString(@"Quit", + @"Dialog button")]; + [alert addButtonWithTitle:NSLocalizedString(@"Cancel", + @"Dialog button")]; + [alert setMessageText:NSLocalizedString(@"Quit without saving?", + @"Quit dialog with changed buffers, title")]; + [alert setInformativeText:NSLocalizedString( + @"There are modified buffers, " + "if you quit now all changes will be lost. Quit anyway?", + @"Quit dialog with changed buffers, text")]; if ([alert runModal] != NSAlertFirstButtonReturn) reply = NSTerminateCancel; @@ -414,24 +423,35 @@ - (NSApplicationTerminateReply)applicationShouldTerminate: if (numWindows > 1 || numTabs > 1) { NSAlert *alert = [[NSAlert alloc] init]; [alert setAlertStyle:NSWarningAlertStyle]; - [alert addButtonWithTitle:@"Quit"]; - [alert addButtonWithTitle:@"Cancel"]; - [alert setMessageText:@"Are you sure you want to quit MacVim?"]; + [alert addButtonWithTitle:NSLocalizedString(@"Quit", + @"Dialog button")]; + [alert addButtonWithTitle:NSLocalizedString(@"Cancel", + @"Dialog button")]; + [alert setMessageText:NSLocalizedString( + @"Are you sure you want to quit MacVim?", + @"Quit dialog with no changed buffers, title")]; NSString *info = nil; if (numWindows > 1) { if (numTabs > numWindows) - info = [NSString stringWithFormat:@"There are %d windows " - "open in MacVim, with a total of %d tabs. Do you want " - "to quit anyway?", numWindows, numTabs]; + info = [NSString stringWithFormat:NSLocalizedString( + @"There are %d windows open in MacVim, with a " + "total of %d tabs. Do you want to quit anyway?", + @"Quit dialog with no changed buffers, text"), + numWindows, numTabs]; else - info = [NSString stringWithFormat:@"There are %d windows " - "open in MacVim. Do you want to quit anyway?", + info = [NSString stringWithFormat:NSLocalizedString( + @"There are %d windows open in MacVim. " + "Do you want to quit anyway?", + @"Quit dialog with no changed buffers, text"), numWindows]; } else { - info = [NSString stringWithFormat:@"There are %d tabs open " - "in MacVim. Do you want to quit anyway?", numTabs]; + info = [NSString stringWithFormat:NSLocalizedString( + @"There are %d tabs open in MacVim. " + "Do you want to quit anyway?", + @"Quit dialog with no changed buffers, text"), + numTabs]; } [alert setInformativeText:info]; @@ -870,18 +890,23 @@ - (NSArray *)filterFilesAndNotify:(NSArray *)filenames if (firstMissingFile) { NSAlert *alert = [[NSAlert alloc] init]; - [alert addButtonWithTitle:@"OK"]; + [alert addButtonWithTitle:NSLocalizedString(@"OK", + @"Dialog button")]; NSString *text; if ([files count] >= count-1) { - [alert setMessageText:@"File not found"]; - text = [NSString stringWithFormat:@"Could not open file with " - "name %@.", firstMissingFile]; + [alert setMessageText:NSLocalizedString(@"File not found", + @"File not found dialog, title")]; + text = [NSString stringWithFormat:NSLocalizedString( + @"Could not open file with name %@.", + @"File not found dialog, text"), firstMissingFile]; } else { - [alert setMessageText:@"Multiple files not found"]; - text = [NSString stringWithFormat:@"Could not open file with " - "name %@, and %d other files.", firstMissingFile, - count-[files count]-1]; + [alert setMessageText:NSLocalizedString(@"Multiple files not found", + @"File not found dialog, title")]; + text = [NSString stringWithFormat:NSLocalizedString( + @"Could not open file with name %@, and %d other files.", + @"File not found dialog, text"), + firstMissingFile, count-[files count]-1]; } [alert setInformativeText:text]; @@ -1013,6 +1038,8 @@ - (MMVimController *)findUntitledWindow // TODO: This is a moronic test...should query the Vim process if there // are any open buffers or something like that instead. NSString *title = [[[vc windowController] window] title]; + + // TODO: this will not work in a localized MacVim if ([title hasPrefix:@"[No Name] - VIM"]) { //NSLog(@"found untitled window"); return vc; From a588fc3e335a7a61708c520cc259605954614d7f Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sat, 31 May 2008 21:47:30 +0200 Subject: [PATCH 0480/1156] Use menu descriptors instead of tags to locate menu items --- src/MacVim/MMBackend.h | 10 +- src/MacVim/MMBackend.m | 179 +++---------------------- src/MacVim/MMVimController.m | 215 +++++++++++++++++++++++++++--- src/MacVim/MMWindowController.m | 22 +++- src/MacVim/gui_macvim.m | 227 ++++++++++++++++++++++++++------ 5 files changed, 414 insertions(+), 239 deletions(-) diff --git a/src/MacVim/MMBackend.h b/src/MacVim/MMBackend.h index df754a66b1..a49cb24054 100644 --- a/src/MacVim/MMBackend.h +++ b/src/MacVim/MMBackend.h @@ -57,6 +57,7 @@ - (NSConnection *)connection; - (NSDictionary *)actionDict; +- (void)queueMessage:(int)msgid properties:(NSDictionary *)props; - (BOOL)checkin; - (BOOL)openVimWindow; - (void)clearAll; @@ -84,15 +85,6 @@ saving:(int)saving; - (int)presentDialogWithType:(int)type title:(char *)title message:(char *)msg buttons:(char *)btns textField:(char *)txtfield; -- (void)addMenuWithTag:(int)tag parent:(int)parentTag name:(char *)name - atIndex:(int)index; -- (void)addMenuItemWithTag:(int)tag parent:(int)parentTag name:(char *)name - tip:(char *)tip icon:(char *)icon - keyEquivalent:(int)key modifiers:(int)mods - action:(char *)action isAlternate:(int)isAlt - atIndex:(int)index; -- (void)removeMenuItemWithTag:(int)tag; -- (void)enableMenuItemWithTag:(int)tag state:(int)enabled; - (void)showPopupMenuWithName:(char *)name atMouseLocation:(BOOL)mouse; - (void)showToolbar:(int)enable flags:(int)flags; - (void)createScrollbarWithIdentifier:(long)ident type:(int)type; diff --git a/src/MacVim/MMBackend.m b/src/MacVim/MMBackend.m index 0afd312264..6df13500e2 100644 --- a/src/MacVim/MMBackend.m +++ b/src/MacVim/MMBackend.m @@ -51,10 +51,12 @@ // TODO: Move to separate file. static int eventModifierFlagsToVimModMask(int modifierFlags); -static int vimModMaskToEventModifierFlags(int mods); static int eventModifierFlagsToVimMouseModMask(int modifierFlags); static int eventButtonNumberToVimMouseButton(int buttonNumber); -static int specialKeyToNSKey(int key); + +// In gui_macvim.m +vimmenu_T *menu_for_descriptor(NSArray *desc); + enum { MMBlinkStateNone = 0, @@ -76,6 +78,7 @@ - (NSComparisonResult)serverNameCompare:(NSString *)string; + @interface MMBackend (Private) - (void)queueVimStateMessage; - (void)processInputQueue; @@ -226,6 +229,11 @@ - (NSDictionary *)actionDict return actionDict; } +- (void)queueMessage:(int)msgid properties:(NSDictionary *)props +{ + [self queueMessage:msgid data:[props dictionaryAsData]]; +} + - (BOOL)checkin { if (![self connection]) { @@ -740,78 +748,6 @@ - (int)presentDialogWithType:(int)type title:(char *)title message:(char *)msg return retval; } -- (void)addMenuWithTag:(int)tag parent:(int)parentTag name:(char *)name - atIndex:(int)index -{ - //NSLog(@"addMenuWithTag:%d parent:%d name:%s atIndex:%d", tag, parentTag, - // name, index); - - int namelen = name ? strlen(name) : 0; - NSMutableData *data = [NSMutableData data]; - - [data appendBytes:&tag length:sizeof(int)]; - [data appendBytes:&parentTag length:sizeof(int)]; - [data appendBytes:&namelen length:sizeof(int)]; - if (namelen > 0) [data appendBytes:name length:namelen]; - [data appendBytes:&index length:sizeof(int)]; - - [self queueMessage:AddMenuMsgID data:data]; -} - -- (void)addMenuItemWithTag:(int)tag parent:(int)parentTag name:(char *)name - tip:(char *)tip icon:(char *)icon - keyEquivalent:(int)key modifiers:(int)mods - action:(char *)action isAlternate:(int)isAlt - atIndex:(int)index -{ - //NSLog(@"addMenuItemWithTag:%d parent:%d name:%s tip:%s atIndex:%d", tag, - // parentTag, name, tip, index); - - int namelen = name ? strlen(name) : 0; - int tiplen = tip ? strlen(tip) : 0; - int iconlen = icon ? strlen(icon) : 0; - int eventFlags = vimModMaskToEventModifierFlags(mods); - int actionlen = action ? strlen(action) : 0; - NSMutableData *data = [NSMutableData data]; - - key = specialKeyToNSKey(key); - - [data appendBytes:&tag length:sizeof(int)]; - [data appendBytes:&parentTag length:sizeof(int)]; - [data appendBytes:&namelen length:sizeof(int)]; - if (namelen > 0) [data appendBytes:name length:namelen]; - [data appendBytes:&tiplen length:sizeof(int)]; - if (tiplen > 0) [data appendBytes:tip length:tiplen]; - [data appendBytes:&iconlen length:sizeof(int)]; - if (iconlen > 0) [data appendBytes:icon length:iconlen]; - [data appendBytes:&actionlen length:sizeof(int)]; - if (actionlen > 0) [data appendBytes:action length:actionlen]; - [data appendBytes:&index length:sizeof(int)]; - [data appendBytes:&key length:sizeof(int)]; - [data appendBytes:&eventFlags length:sizeof(int)]; - [data appendBytes:&isAlt length:sizeof(int)]; - - [self queueMessage:AddMenuItemMsgID data:data]; -} - -- (void)removeMenuItemWithTag:(int)tag -{ - NSMutableData *data = [NSMutableData data]; - [data appendBytes:&tag length:sizeof(int)]; - - [self queueMessage:RemoveMenuItemMsgID data:data]; -} - -- (void)enableMenuItemWithTag:(int)tag state:(int)enabled -{ - NSMutableData *data = [NSMutableData data]; - - [data appendBytes:&tag length:sizeof(int)]; - [data appendBytes:&enabled length:sizeof(int)]; - - [self queueMessage:EnableMenuItemMsgID data:data]; -} - - (void)showPopupMenuWithName:(char *)name atMouseLocation:(BOOL)mouse { int len = strlen(name); @@ -1659,14 +1595,12 @@ - (void)handleInputEvent:(int)msgid data:(NSData *)data //NSLog(@"[VimTask] Resizing shell to %dx%d.", cols, rows); gui_resize_shell(cols, rows); } else if (ExecuteMenuMsgID == msgid) { - if (!data) return; - const void *bytes = [data bytes]; - int tag = *((int*)bytes); bytes += sizeof(int); - - vimmenu_T *menu = (vimmenu_T*)tag; - // TODO! Make sure 'menu' is a valid menu pointer! - if (menu) { - gui_menu_cb(menu); + NSDictionary *attrs = [NSDictionary dictionaryWithData:data]; + if (attrs) { + NSArray *desc = [attrs objectForKey:@"descriptor"]; + vimmenu_T *menu = menu_for_descriptor(desc); + if (menu) + gui_menu_cb(menu); } } else if (ToggleToolbarMsgID == msgid) { [self handleToggleToolbar]; @@ -2475,22 +2409,6 @@ static int eventModifierFlagsToVimModMask(int modifierFlags) return modMask; } -static int vimModMaskToEventModifierFlags(int mods) -{ - int flags = 0; - - if (mods & MOD_MASK_SHIFT) - flags |= NSShiftKeyMask; - if (mods & MOD_MASK_CTRL) - flags |= NSControlKeyMask; - if (mods & MOD_MASK_ALT) - flags |= NSAlternateKeyMask; - if (mods & MOD_MASK_CMD) - flags |= NSCommandKeyMask; - - return flags; -} - static int eventModifierFlagsToVimMouseModMask(int modifierFlags) { int modMask = 0; @@ -2512,68 +2430,3 @@ static int eventButtonNumberToVimMouseButton(int buttonNumber) return (buttonNumber >= 0 && buttonNumber < 3) ? mouseButton[buttonNumber] : -1; } - -static int specialKeyToNSKey(int key) -{ - if (!IS_SPECIAL(key)) - return key; - - static struct { - int special; - int nskey; - } sp2ns[] = { - { K_UP, NSUpArrowFunctionKey }, - { K_DOWN, NSDownArrowFunctionKey }, - { K_LEFT, NSLeftArrowFunctionKey }, - { K_RIGHT, NSRightArrowFunctionKey }, - { K_F1, NSF1FunctionKey }, - { K_F2, NSF2FunctionKey }, - { K_F3, NSF3FunctionKey }, - { K_F4, NSF4FunctionKey }, - { K_F5, NSF5FunctionKey }, - { K_F6, NSF6FunctionKey }, - { K_F7, NSF7FunctionKey }, - { K_F8, NSF8FunctionKey }, - { K_F9, NSF9FunctionKey }, - { K_F10, NSF10FunctionKey }, - { K_F11, NSF11FunctionKey }, - { K_F12, NSF12FunctionKey }, - { K_F13, NSF13FunctionKey }, - { K_F14, NSF14FunctionKey }, - { K_F15, NSF15FunctionKey }, - { K_F16, NSF16FunctionKey }, - { K_F17, NSF17FunctionKey }, - { K_F18, NSF18FunctionKey }, - { K_F19, NSF19FunctionKey }, - { K_F20, NSF20FunctionKey }, - { K_F21, NSF21FunctionKey }, - { K_F22, NSF22FunctionKey }, - { K_F23, NSF23FunctionKey }, - { K_F24, NSF24FunctionKey }, - { K_F25, NSF25FunctionKey }, - { K_F26, NSF26FunctionKey }, - { K_F27, NSF27FunctionKey }, - { K_F28, NSF28FunctionKey }, - { K_F29, NSF29FunctionKey }, - { K_F30, NSF30FunctionKey }, - { K_F31, NSF31FunctionKey }, - { K_F32, NSF32FunctionKey }, - { K_F33, NSF33FunctionKey }, - { K_F34, NSF34FunctionKey }, - { K_F35, NSF35FunctionKey }, - { K_DEL, NSBackspaceCharacter }, - { K_BS, NSDeleteCharacter }, - { K_HOME, NSHomeFunctionKey }, - { K_END, NSEndFunctionKey }, - { K_PAGEUP, NSPageUpFunctionKey }, - { K_PAGEDOWN, NSPageDownFunctionKey } - }; - - int i; - for (i = 0; i < sizeof(sp2ns)/sizeof(sp2ns[0]); ++i) { - if (sp2ns[i].special == key) - return sp2ns[i].nskey; - } - - return 0; -} diff --git a/src/MacVim/MMVimController.m b/src/MacVim/MMVimController.m index 72a39ba179..9d9b1ab5f4 100644 --- a/src/MacVim/MMVimController.m +++ b/src/MacVim/MMVimController.m @@ -64,18 +64,21 @@ - (void)alertDidEnd:(MMAlert *)alert code:(int)code context:(void *)context; - (NSMenuItem *)recurseMenuItemForTag:(int)tag rootMenu:(NSMenu *)root; - (NSMenuItem *)menuItemForTag:(int)tag; - (NSMenu *)menuForTag:(int)tag; +- (NSMenu *)parentMenuForDescriptor:(NSArray *)desc; - (NSMenu *)topLevelMenuForTitle:(NSString *)title; -- (void)addMenuWithTag:(int)tag parent:(int)parentTag title:(NSString *)title - atIndex:(int)idx; -- (void)addMenuItemWithTag:(int)tag parent:(NSMenu *)parent - title:(NSString *)title tip:(NSString *)tip - keyEquivalent:(int)key modifiers:(int)mask - action:(NSString *)action isAlternate:(int)isAlt - atIndex:(int)idx; +- (void)addMenuWithDescriptor:(NSArray *)desc atIndex:(int)index; +- (void)addMenuItemWithDescriptor:(NSArray *)desc + atIndex:(int)index + tip:(NSString *)tip + icon:(NSString *)icon + keyEquivalent:(NSString *)keyEquivalent + modifierMask:(int)modifierMask + action:(NSString *)action + isAlternate:(BOOL)isAlternate; - (NSToolbarItem *)toolbarItemForTag:(int)tag index:(int *)index; -- (void)addToolbarItemToDictionaryWithTag:(int)tag label:(NSString *)title +- (void)addToolbarItemToDictionaryWithLabel:(NSString *)title toolTip:(NSString *)tip icon:(NSString *)icon; -- (void)addToolbarItemWithTag:(int)tag label:(NSString *)label +- (void)addToolbarItemWithLabel:(NSString *)label tip:(NSString *)tip icon:(NSString *)icon atIndex:(int)idx; - (void)connectionDidDie:(NSNotification *)notification; @@ -656,6 +659,7 @@ - (void)handleMessage:(int)msgid data:(NSData *)data [string release]; } else if (AddMenuMsgID == msgid) { +#if 0 NSString *title = nil; const void *bytes = [data bytes]; int tag = *((int*)bytes); bytes += sizeof(int); @@ -688,7 +692,13 @@ - (void)handleMessage:(int)msgid data:(NSData *)data } [title release]; +#else + NSDictionary *attrs = [NSDictionary dictionaryWithData:data]; + [self addMenuWithDescriptor:[attrs objectForKey:@"descriptor"] + atIndex:[[attrs objectForKey:@"index"] intValue]]; +#endif } else if (AddMenuItemMsgID == msgid) { +#if 0 NSString *title = nil, *tip = nil, *icon = nil, *action = nil; const void *bytes = [data bytes]; int tag = *((int*)bytes); bytes += sizeof(int); @@ -740,7 +750,19 @@ - (void)handleMessage:(int)msgid data:(NSData *)data [tip release]; [icon release]; [action release]; +#else + NSDictionary *attrs = [NSDictionary dictionaryWithData:data]; + [self addMenuItemWithDescriptor:[attrs objectForKey:@"descriptor"] + atIndex:[[attrs objectForKey:@"index"] intValue] + tip:[attrs objectForKey:@"tip"] + icon:[attrs objectForKey:@"icon"] + keyEquivalent:[attrs objectForKey:@"keyEquivalent"] + modifierMask:[[attrs objectForKey:@"modifierMask"] intValue] + action:[attrs objectForKey:@"action"] + isAlternate:[[attrs objectForKey:@"isAlternate"] boolValue]]; +#endif } else if (RemoveMenuItemMsgID == msgid) { +#if 0 const void *bytes = [data bytes]; int tag = *((int*)bytes); bytes += sizeof(int); @@ -767,7 +789,9 @@ - (void)handleMessage:(int)msgid data:(NSData *)data // Reset cached menu, just to be on the safe side. lastMenuSearched = nil; +#endif } else if (EnableMenuItemMsgID == msgid) { +#if 0 const void *bytes = [data bytes]; int tag = *((int*)bytes); bytes += sizeof(int); int state = *((int*)bytes); bytes += sizeof(int); @@ -777,6 +801,7 @@ - (void)handleMessage:(int)msgid data:(NSData *)data item = [self menuItemForTag:tag]; [item setEnabled:state]; +#endif } else if (ShowToolbarMsgID == msgid) { const void *bytes = [data bytes]; int enable = *((int*)bytes); bytes += sizeof(int); @@ -1052,6 +1077,36 @@ - (NSMenu *)menuForTag:(int)tag return [[self menuItemForTag:tag] submenu]; } +- (NSMenu *)parentMenuForDescriptor:(NSArray *)desc +{ + if (!(desc && [desc count] > 0)) return nil; + + NSString *rootName = [desc objectAtIndex:0]; + NSArray *rootItems = [rootName hasPrefix:@"PopUp"] ? popupMenuItems + : mainMenuItems; + + NSMenu *menu = nil; + int i, count = [rootItems count]; + for (i = 0; i < count; ++i) { + NSMenuItem *item = [rootItems objectAtIndex:i]; + if ([[item title] isEqual:rootName]) { + menu = [item submenu]; + break; + } + } + + if (!menu) return nil; + + count = [desc count] - 1; + for (i = 1; i < count; ++i) { + NSMenuItem *item = [menu itemWithTitle:[desc objectAtIndex:i]]; + menu = [item submenu]; + if (!menu) return nil; + } + + return menu; +} + - (NSMenu *)topLevelMenuForTitle:(NSString *)title { // Search only the top-level menus. @@ -1073,9 +1128,9 @@ - (NSMenu *)topLevelMenuForTitle:(NSString *)title return nil; } -- (void)addMenuWithTag:(int)tag parent:(int)parentTag title:(NSString *)title - atIndex:(int)idx +- (void)addMenuWithDescriptor:(NSArray *)desc atIndex:(int)idx { +#if 0 NSMenu *parent = [self menuForTag:parentTag]; NSMenuItem *item = [[NSMenuItem alloc] init]; NSMenu *menu = [[NSMenu alloc] initWithTitle:title]; @@ -1105,14 +1160,73 @@ - (void)addMenuWithTag:(int)tag parent:(int)parentTag title:(NSString *)title [item release]; [menu release]; +#else + if (!(desc && [desc count] > 0)) return; + + NSString *rootName = [desc objectAtIndex:0]; + if ([rootName isEqual:@"ToolBar"]) { + // The toolbar only has one menu, we take this as a hint to create a + // toolbar, then we return. + if (!toolbar) { + // NOTE! Each toolbar must have a unique identifier, else each + // window will have the same toolbar. + NSString *ident = [NSString stringWithFormat:@"%d", (int)self]; + toolbar = [[NSToolbar alloc] initWithIdentifier:ident]; + + [toolbar setShowsBaselineSeparator:NO]; + [toolbar setDelegate:self]; + [toolbar setDisplayMode:NSToolbarDisplayModeIconOnly]; + [toolbar setSizeMode:NSToolbarSizeModeSmall]; + + [windowController setToolbar:toolbar]; + } + + return; + } + + // This is either a main menu item or a popup menu item. + NSString *title = [desc lastObject]; + NSMenuItem *item = [[NSMenuItem alloc] init]; + NSMenu *menu = [[NSMenu alloc] initWithTitle:title]; + + [menu setAutoenablesItems:NO]; + [item setTitle:title]; + [item setSubmenu:menu]; + + NSMenu *parent = [self parentMenuForDescriptor:desc]; + if (parent) { + if ([parent numberOfItems] <= idx) { + [parent addItem:item]; + } else { + [parent insertItem:item atIndex:idx]; + } + } else { + BOOL isPopup = [rootName hasPrefix:@"PopUp"]; + NSMutableArray *items = isPopup ? popupMenuItems : mainMenuItems; + if ([items count] <= idx) { + [items addObject:item]; + } else { + [items insertObject:item atIndex:idx]; + } + + shouldUpdateMainMenu = !isPopup; + } + + [item release]; + [menu release]; +#endif } -- (void)addMenuItemWithTag:(int)tag parent:(NSMenu *)parent - title:(NSString *)title tip:(NSString *)tip - keyEquivalent:(int)key modifiers:(int)mask - action:(NSString *)action isAlternate:(int)isAlt - atIndex:(int)idx +- (void)addMenuItemWithDescriptor:(NSArray *)desc + atIndex:(int)idx + tip:(NSString *)tip + icon:(NSString *)icon + keyEquivalent:(NSString *)keyEquivalent + modifierMask:(int)modifierMask + action:(NSString *)action + isAlternate:(BOOL)isAlternate { +#if 0 if (parent) { NSMenuItem *item = nil; if (!title || ([title hasPrefix:@"-"] && [title hasSuffix:@"-"])) { @@ -1160,6 +1274,66 @@ - (void)addMenuItemWithTag:(int)tag parent:(NSMenu *)parent } else { NSLog(@"WARNING: Menu item '%@' (tag=%d) has no parent.", title, tag); } +#else + if (!(desc && [desc count] > 1)) return; + + NSString *title = [desc lastObject]; + NSString *rootName = [desc objectAtIndex:0]; + + if ([rootName isEqual:@"ToolBar"]) { + if (toolbar) + [self addToolbarItemWithLabel:title tip:tip icon:icon atIndex:idx]; + return; + } + + NSMenu *parent = [self parentMenuForDescriptor:desc]; + if (!parent) { + NSLog(@"WARNING: Menu item '%@' has no parent", + [desc componentsJoinedByString:@"->"]); + return; + } + + NSMenuItem *item = nil; + if (!title || ([title hasPrefix:@"-"] && [title hasSuffix:@"-"])) { + item = [NSMenuItem separatorItem]; + } else { + item = [[[NSMenuItem alloc] init] autorelease]; + [item setTitle:title]; + + if ([action isEqualToString:@"recentFilesDummy:"]) { + // Remove the recent files menu item from its current menu + // and put it in the current file menu. See -[MMAppController + // applicationWillFinishLaunching for more information. + //[[recentFilesMenuItem menu] removeItem:recentFilesMenuItem]; + //item = recentFilesMenuItem; + recentFilesDummy = [item retain]; + } else { + // TODO: Check that 'action' is a valid action (nothing will + // happen if it isn't, but it would be nice with a warning). + if ([action length] > 0) + [item setAction:NSSelectorFromString(action)]; + else + [item setAction:@selector(vimMenuItemAction:)]; + if ([tip length] > 0) [item setToolTip:tip]; + if ([keyEquivalent length] > 0) { + [item setKeyEquivalent:keyEquivalent]; + [item setKeyEquivalentModifierMask:modifierMask]; + } + [item setAlternate:isAlternate]; + } + } + + // NOTE! The tag is used to idenfity which menu items were + // added by Vim (tag != 0) and which were added by the AppKit + // (tag == 0). + [item setTag:-1]; + + if ([parent numberOfItems] <= idx) { + [parent addItem:item]; + } else { + [parent insertItem:item atIndex:idx]; + } +#endif } - (NSToolbarItem *)toolbarItemForTag:(int)tag index:(int *)index @@ -1179,7 +1353,7 @@ - (NSToolbarItem *)toolbarItemForTag:(int)tag index:(int *)index return nil; } -- (void)addToolbarItemToDictionaryWithTag:(int)tag label:(NSString *)title +- (void)addToolbarItemToDictionaryWithLabel:(NSString *)title toolTip:(NSString *)tip icon:(NSString *)icon { // If the item corresponds to a separator then do nothing, since it is @@ -1190,7 +1364,7 @@ - (void)addToolbarItemToDictionaryWithTag:(int)tag label:(NSString *)title return; NSToolbarItem *item = [[NSToolbarItem alloc] initWithItemIdentifier:title]; - [item setTag:tag]; + [item setTag:-1]; [item setLabel:title]; [item setToolTip:tip]; [item setAction:@selector(vimMenuItemAction:)]; @@ -1213,7 +1387,7 @@ - (void)addToolbarItemToDictionaryWithTag:(int)tag label:(NSString *)title [item release]; } -- (void)addToolbarItemWithTag:(int)tag label:(NSString *)label tip:(NSString +- (void)addToolbarItemWithLabel:(NSString *)label tip:(NSString *)tip icon:(NSString *)icon atIndex:(int)idx { if (!toolbar) return; @@ -1234,8 +1408,7 @@ - (void)addToolbarItemWithTag:(int)tag label:(NSString *)label tip:(NSString } } - [self addToolbarItemToDictionaryWithTag:tag label:label toolTip:tip - icon:icon]; + [self addToolbarItemToDictionaryWithLabel:label toolTip:tip icon:icon]; int maxIdx = [[toolbar items] count]; if (maxIdx < idx) idx = maxIdx; diff --git a/src/MacVim/MMWindowController.m b/src/MacVim/MMWindowController.m index c3b055e355..b1b2ecf437 100644 --- a/src/MacVim/MMWindowController.m +++ b/src/MacVim/MMWindowController.m @@ -614,12 +614,26 @@ - (IBAction)findPrevious:(id)sender - (IBAction)vimMenuItemAction:(id)sender { - int tag = [sender tag]; + if (![sender isKindOfClass:[NSMenuItem class]]) return; - NSMutableData *data = [NSMutableData data]; - [data appendBytes:&tag length:sizeof(int)]; + // TODO: Make into category on NSMenuItem which returns descriptor. + NSMenuItem *item = (NSMenuItem*)sender; + NSMutableArray *desc = [NSMutableArray arrayWithObject:[item title]]; - [vimController sendMessage:ExecuteMenuMsgID data:data]; + NSMenu *menu = [item menu]; + while (menu) { + [desc insertObject:[menu title] atIndex:0]; + menu = [menu supermenu]; + } + + // The "MainMenu" item is part of the Cocoa menu and should not be part of + // the descriptor. + if ([[desc objectAtIndex:0] isEqual:@"MainMenu"]) + [desc removeObjectAtIndex:0]; + + NSDictionary *attrs = [NSDictionary dictionaryWithObject:desc + forKey:@"descriptor"]; + [vimController sendMessage:ExecuteMenuMsgID data:[attrs dictionaryAsData]]; } diff --git a/src/MacVim/gui_macvim.m b/src/MacVim/gui_macvim.m index 701712d835..63a5cc09ba 100644 --- a/src/MacVim/gui_macvim.m +++ b/src/MacVim/gui_macvim.m @@ -32,6 +32,15 @@ static NSFont *gui_macvim_font_with_name(char_u *name); +static int specialKeyToNSKey(int key); +static int vimModMaskToEventModifierFlags(int mods); + +NSArray *descriptor_for_menu(vimmenu_T *menu); +vimmenu_T *menu_for_descriptor(NSArray *desc); + +@interface NSString (VimStrings) ++ (id)stringWithVimString:(char_u *)s; +@end @@ -606,6 +615,46 @@ // -- Menu ------------------------------------------------------------------ + NSArray * +descriptor_for_menu(vimmenu_T *menu) +{ + if (!menu) return nil; + + NSMutableArray *desc = [NSMutableArray array]; + while (menu) { + NSString *name = [NSString stringWithVimString:menu->dname]; + [desc insertObject:name atIndex:0]; + menu = menu->parent; + } + + return desc; +} + + vimmenu_T * +menu_for_descriptor(NSArray *desc) +{ + if (!(desc && [desc count] > 0)) return NULL; + + vimmenu_T *menu = root_menu; + int i, count = [desc count]; + + for (i = 0; i < count; ++i) { + NSString *component = [desc objectAtIndex:i]; + while (menu) { + NSString *name = [NSString stringWithVimString:menu->dname]; + if ([component isEqual:name]) { + if (i+1 == count) + return menu; // Matched all components, so return menu + menu = menu->children; + break; + } + menu = menu->next; + } + } + + return NULL; +} + /* * Add a sub menu to the menu bar. */ @@ -628,9 +677,12 @@ dname = CONVERT_TO_UTF8(dname); #endif - [[MMBackend sharedInstance] - addMenuWithTag:(int)menu parent:parent name:(char*)dname - atIndex:idx]; + NSArray *desc = descriptor_for_menu(menu); + [[MMBackend sharedInstance] queueMessage:AddMenuMsgID properties: + [NSDictionary dictionaryWithObjectsAndKeys: + desc, @"descriptor", + [NSNumber numberWithInt:idx], @"index", + nil]]; #ifdef FEAT_MBYTE CONVERT_TO_UTF8_FREE(dname); @@ -649,40 +701,24 @@ char_u *icon = menu->iconfile ? menu->iconfile : menu->iconidx >= 0 ? menu->dname : NULL; - //char *name = menu_is_separator(menu->name) ? NULL : (char*)menu->dname; - char_u *name = menu->dname; char_u *tip = menu->strings[MENU_INDEX_TIP] ? menu->strings[MENU_INDEX_TIP] : menu->actext; - char_u *map_str = menu->strings[MENU_INDEX_NORMAL]; - char_u *mac_action = menu->mac_action; - -#ifdef FEAT_MBYTE - icon = CONVERT_TO_UTF8(icon); - name = CONVERT_TO_UTF8(name); - tip = CONVERT_TO_UTF8(tip); - map_str = CONVERT_TO_UTF8(map_str); - mac_action = CONVERT_TO_UTF8(mac_action); -#endif + NSArray *desc = descriptor_for_menu(menu); + NSString *keyEquivalent = [NSString stringWithFormat:@"%C", + specialKeyToNSKey(menu->mac_key)]; + int modifierMask = vimModMaskToEventModifierFlags(menu->mac_mods); - [[MMBackend sharedInstance] - addMenuItemWithTag:(int)menu - parent:(int)menu->parent - name:(char*)name - tip:(char*)tip - icon:(char*)icon - keyEquivalent:menu->mac_key - modifiers:menu->mac_mods - action:(char*)mac_action - isAlternate:menu->mac_alternate - atIndex:idx]; - -#ifdef FEAT_MBYTE - CONVERT_TO_UTF8_FREE(icon); - CONVERT_TO_UTF8_FREE(name); - CONVERT_TO_UTF8_FREE(tip); - CONVERT_TO_UTF8_FREE(map_str); - CONVERT_TO_UTF8_FREE(mac_action); -#endif + [[MMBackend sharedInstance] queueMessage:AddMenuItemMsgID properties: + [NSDictionary dictionaryWithObjectsAndKeys: + desc, @"descriptor", + [NSNumber numberWithInt:idx], @"index", + [NSString stringWithVimString:tip], @"tip", + [NSString stringWithVimString:icon], @"icon", + keyEquivalent, @"keyEquivalent", + [NSNumber numberWithInt:modifierMask], @"modifierMask", + [NSString stringWithVimString:menu->mac_action], @"action", + [NSNumber numberWithBool:menu->mac_alternate], @"isAlternate", + nil]]; } @@ -692,7 +728,9 @@ void gui_mch_destroy_menu(vimmenu_T *menu) { - [[MMBackend sharedInstance] removeMenuItemWithTag:(int)menu]; + NSArray *desc = descriptor_for_menu(menu); + [[MMBackend sharedInstance] queueMessage:RemoveMenuItemMsgID properties: + [NSDictionary dictionaryWithObject:desc forKey:@"descriptor"]]; } @@ -705,12 +743,12 @@ /* Only update menu if the 'grey' state has changed to avoid having to pass * lots of unnecessary data to MacVim. (Skipping this test makes MacVim * pause noticably on mode changes. */ - if (menu->was_grey != grey) - { - menu->was_grey = grey; - [[MMBackend sharedInstance] - enableMenuItemWithTag:(int)menu state:!grey]; - } + if (menu->was_grey != grey) return; + + menu->was_grey = grey; + [[MMBackend sharedInstance] queueMessage:EnableMenuItemMsgID properties: + [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:!grey] + forKey:@"enable"]]; } @@ -732,6 +770,7 @@ void gui_mch_show_popupmenu(vimmenu_T *menu) { +#if 0 char_u *name = menu->name; #ifdef FEAT_MBYTE name = CONVERT_TO_UTF8(name); @@ -743,7 +782,7 @@ #ifdef FEAT_MBYTE CONVERT_TO_UTF8_FREE(name); #endif - +#endif } @@ -753,6 +792,7 @@ void gui_make_popup(char_u *path_name, int mouse_pos) { +#if 0 #ifdef FEAT_MBYTE path_name = CONVERT_TO_UTF8(path_name); #endif @@ -763,6 +803,7 @@ #ifdef FEAT_MBYTE CONVERT_TO_UTF8_FREE(path_name); #endif +#endif } @@ -1886,3 +1927,105 @@ return isValid; } + +static int specialKeyToNSKey(int key) +{ + if (!IS_SPECIAL(key)) + return key; + + static struct { + int special; + int nskey; + } sp2ns[] = { + { K_UP, NSUpArrowFunctionKey }, + { K_DOWN, NSDownArrowFunctionKey }, + { K_LEFT, NSLeftArrowFunctionKey }, + { K_RIGHT, NSRightArrowFunctionKey }, + { K_F1, NSF1FunctionKey }, + { K_F2, NSF2FunctionKey }, + { K_F3, NSF3FunctionKey }, + { K_F4, NSF4FunctionKey }, + { K_F5, NSF5FunctionKey }, + { K_F6, NSF6FunctionKey }, + { K_F7, NSF7FunctionKey }, + { K_F8, NSF8FunctionKey }, + { K_F9, NSF9FunctionKey }, + { K_F10, NSF10FunctionKey }, + { K_F11, NSF11FunctionKey }, + { K_F12, NSF12FunctionKey }, + { K_F13, NSF13FunctionKey }, + { K_F14, NSF14FunctionKey }, + { K_F15, NSF15FunctionKey }, + { K_F16, NSF16FunctionKey }, + { K_F17, NSF17FunctionKey }, + { K_F18, NSF18FunctionKey }, + { K_F19, NSF19FunctionKey }, + { K_F20, NSF20FunctionKey }, + { K_F21, NSF21FunctionKey }, + { K_F22, NSF22FunctionKey }, + { K_F23, NSF23FunctionKey }, + { K_F24, NSF24FunctionKey }, + { K_F25, NSF25FunctionKey }, + { K_F26, NSF26FunctionKey }, + { K_F27, NSF27FunctionKey }, + { K_F28, NSF28FunctionKey }, + { K_F29, NSF29FunctionKey }, + { K_F30, NSF30FunctionKey }, + { K_F31, NSF31FunctionKey }, + { K_F32, NSF32FunctionKey }, + { K_F33, NSF33FunctionKey }, + { K_F34, NSF34FunctionKey }, + { K_F35, NSF35FunctionKey }, + { K_DEL, NSBackspaceCharacter }, + { K_BS, NSDeleteCharacter }, + { K_HOME, NSHomeFunctionKey }, + { K_END, NSEndFunctionKey }, + { K_PAGEUP, NSPageUpFunctionKey }, + { K_PAGEDOWN, NSPageDownFunctionKey } + }; + + int i; + for (i = 0; i < sizeof(sp2ns)/sizeof(sp2ns[0]); ++i) { + if (sp2ns[i].special == key) + return sp2ns[i].nskey; + } + + return 0; +} + +static int vimModMaskToEventModifierFlags(int mods) +{ + int flags = 0; + + if (mods & MOD_MASK_SHIFT) + flags |= NSShiftKeyMask; + if (mods & MOD_MASK_CTRL) + flags |= NSControlKeyMask; + if (mods & MOD_MASK_ALT) + flags |= NSAlternateKeyMask; + if (mods & MOD_MASK_CMD) + flags |= NSCommandKeyMask; + + return flags; +} + + + + +@implementation NSString (VimStrings) ++ (id)stringWithVimString:(char_u *)s +{ + if (s) { +#ifdef FEAT_MBYTE + s = CONVERT_TO_UTF8(s); +#endif + NSString *string = [NSString stringWithUTF8String:(char*)s]; +#ifdef FEAT_MBYTE + CONVERT_TO_UTF8_FREE(s); +#endif + return string; + } + + return [NSString string]; +} +@end From f54c3100e9f310ea997c185b83f1ac60093e7ce8 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sun, 1 Jun 2008 14:30:00 +0200 Subject: [PATCH 0481/1156] Menu removal functionality added --- src/MacVim/MMVimController.m | 277 +++++++++++++---------------------- 1 file changed, 102 insertions(+), 175 deletions(-) diff --git a/src/MacVim/MMVimController.m b/src/MacVim/MMVimController.m index 9d9b1ab5f4..022145f5af 100644 --- a/src/MacVim/MMVimController.m +++ b/src/MacVim/MMVimController.m @@ -64,6 +64,7 @@ - (void)alertDidEnd:(MMAlert *)alert code:(int)code context:(void *)context; - (NSMenuItem *)recurseMenuItemForTag:(int)tag rootMenu:(NSMenu *)root; - (NSMenuItem *)menuItemForTag:(int)tag; - (NSMenu *)menuForTag:(int)tag; +- (NSMenuItem *)menuItemForDescriptor:(NSArray *)desc; - (NSMenu *)parentMenuForDescriptor:(NSArray *)desc; - (NSMenu *)topLevelMenuForTitle:(NSString *)title; - (void)addMenuWithDescriptor:(NSArray *)desc atIndex:(int)index; @@ -75,6 +76,7 @@ - (void)addMenuItemWithDescriptor:(NSArray *)desc modifierMask:(int)modifierMask action:(NSString *)action isAlternate:(BOOL)isAlternate; +- (void)removeMenuItemWithDescriptor:(NSArray *)desc; - (NSToolbarItem *)toolbarItemForTag:(int)tag index:(int *)index; - (void)addToolbarItemToDictionaryWithLabel:(NSString *)title toolTip:(NSString *)tip icon:(NSString *)icon; @@ -89,6 +91,11 @@ - (void)replaceMenuItem:(NSMenuItem*)old with:(NSMenuItem*)new; @end +@interface NSToolbar (MMExtras) +- (void)removeItemWithItemIdentifier:(NSString *)identifier; +@end + + @implementation MMVimController @@ -659,98 +666,10 @@ - (void)handleMessage:(int)msgid data:(NSData *)data [string release]; } else if (AddMenuMsgID == msgid) { -#if 0 - NSString *title = nil; - const void *bytes = [data bytes]; - int tag = *((int*)bytes); bytes += sizeof(int); - int parentTag = *((int*)bytes); bytes += sizeof(int); - int len = *((int*)bytes); bytes += sizeof(int); - if (len > 0) { - title = [[NSString alloc] initWithBytes:(void*)bytes length:len - encoding:NSUTF8StringEncoding]; - bytes += len; - } - int idx = *((int*)bytes); bytes += sizeof(int); - - if (MenuToolbarType == parentTag) { - if (!toolbar) { - // NOTE! Each toolbar must have a unique identifier, else each - // window will have the same toolbar. - NSString *ident = [NSString stringWithFormat:@"%d.%d", - (int)self, tag]; - toolbar = [[NSToolbar alloc] initWithIdentifier:ident]; - - [toolbar setShowsBaselineSeparator:NO]; - [toolbar setDelegate:self]; - [toolbar setDisplayMode:NSToolbarDisplayModeIconOnly]; - [toolbar setSizeMode:NSToolbarSizeModeSmall]; - - [windowController setToolbar:toolbar]; - } - } else if (title) { - [self addMenuWithTag:tag parent:parentTag title:title atIndex:idx]; - } - - [title release]; -#else NSDictionary *attrs = [NSDictionary dictionaryWithData:data]; [self addMenuWithDescriptor:[attrs objectForKey:@"descriptor"] atIndex:[[attrs objectForKey:@"index"] intValue]]; -#endif } else if (AddMenuItemMsgID == msgid) { -#if 0 - NSString *title = nil, *tip = nil, *icon = nil, *action = nil; - const void *bytes = [data bytes]; - int tag = *((int*)bytes); bytes += sizeof(int); - int parentTag = *((int*)bytes); bytes += sizeof(int); - int namelen = *((int*)bytes); bytes += sizeof(int); - if (namelen > 0) { - title = [[NSString alloc] initWithBytes:(void*)bytes length:namelen - encoding:NSUTF8StringEncoding]; - bytes += namelen; - } - int tiplen = *((int*)bytes); bytes += sizeof(int); - if (tiplen > 0) { - tip = [[NSString alloc] initWithBytes:(void*)bytes length:tiplen - encoding:NSUTF8StringEncoding]; - bytes += tiplen; - } - int iconlen = *((int*)bytes); bytes += sizeof(int); - if (iconlen > 0) { - icon = [[NSString alloc] initWithBytes:(void*)bytes length:iconlen - encoding:NSUTF8StringEncoding]; - bytes += iconlen; - } - int actionlen = *((int*)bytes); bytes += sizeof(int); - if (actionlen > 0) { - action = [[NSString alloc] initWithBytes:(void*)bytes - length:actionlen - encoding:NSUTF8StringEncoding]; - bytes += actionlen; - } - int idx = *((int*)bytes); bytes += sizeof(int); - if (idx < 0) idx = 0; - int key = *((int*)bytes); bytes += sizeof(int); - int mask = *((int*)bytes); bytes += sizeof(int); - int isalt = *((int*)bytes); bytes += sizeof(int); - - NSString *ident = [NSString stringWithFormat:@"%d.%d", - (int)self, parentTag]; - if (toolbar && [[toolbar identifier] isEqual:ident]) { - [self addToolbarItemWithTag:tag label:title tip:tip icon:icon - atIndex:idx]; - } else { - NSMenu *parent = [self menuForTag:parentTag]; - [self addMenuItemWithTag:tag parent:parent title:title tip:tip - keyEquivalent:key modifiers:mask action:action - isAlternate:isalt atIndex:idx]; - } - - [title release]; - [tip release]; - [icon release]; - [action release]; -#else NSDictionary *attrs = [NSDictionary dictionaryWithData:data]; [self addMenuItemWithDescriptor:[attrs objectForKey:@"descriptor"] atIndex:[[attrs objectForKey:@"index"] intValue] @@ -760,7 +679,6 @@ - (void)handleMessage:(int)msgid data:(NSData *)data modifierMask:[[attrs objectForKey:@"modifierMask"] intValue] action:[attrs objectForKey:@"action"] isAlternate:[[attrs objectForKey:@"isAlternate"] boolValue]]; -#endif } else if (RemoveMenuItemMsgID == msgid) { #if 0 const void *bytes = [data bytes]; @@ -789,6 +707,9 @@ - (void)handleMessage:(int)msgid data:(NSData *)data // Reset cached menu, just to be on the safe side. lastMenuSearched = nil; +#else + NSDictionary *attrs = [NSDictionary dictionaryWithData:data]; + [self removeMenuItemWithDescriptor:[attrs objectForKey:@"descriptor"]]; #endif } else if (EnableMenuItemMsgID == msgid) { #if 0 @@ -1077,6 +998,33 @@ - (NSMenu *)menuForTag:(int)tag return [[self menuItemForTag:tag] submenu]; } +- (NSMenuItem *)menuItemForDescriptor:(NSArray *)desc +{ + if (!(desc && [desc count] > 0)) return nil; + + NSString *rootName = [desc objectAtIndex:0]; + NSArray *rootItems = [rootName hasPrefix:@"PopUp"] ? popupMenuItems + : mainMenuItems; + + NSMenuItem *item = nil; + int i, count = [rootItems count]; + for (i = 0; i < count; ++i) { + item = [rootItems objectAtIndex:i]; + if ([[item title] isEqual:rootName]) + break; + } + + if (i == count) return nil; + + count = [desc count]; + for (i = 1; i < count; ++i) { + item = [[item submenu] itemWithTitle:[desc objectAtIndex:i]]; + if (!item) return nil; + } + + return item; +} + - (NSMenu *)parentMenuForDescriptor:(NSArray *)desc { if (!(desc && [desc count] > 0)) return nil; @@ -1130,38 +1078,7 @@ - (NSMenu *)topLevelMenuForTitle:(NSString *)title - (void)addMenuWithDescriptor:(NSArray *)desc atIndex:(int)idx { -#if 0 - NSMenu *parent = [self menuForTag:parentTag]; - NSMenuItem *item = [[NSMenuItem alloc] init]; - NSMenu *menu = [[NSMenu alloc] initWithTitle:title]; - - [menu setAutoenablesItems:NO]; - [item setTag:tag]; - [item setTitle:title]; - [item setSubmenu:menu]; - - if (parent) { - if ([parent numberOfItems] <= idx) { - [parent addItem:item]; - } else { - [parent insertItem:item atIndex:idx]; - } - } else { - NSMutableArray *items = (MenuPopupType == parentTag) - ? popupMenuItems : mainMenuItems; - if ([items count] <= idx) { - [items addObject:item]; - } else { - [items insertObject:item atIndex:idx]; - } - - shouldUpdateMainMenu = (MenuPopupType != parentTag); - } - - [item release]; - [menu release]; -#else - if (!(desc && [desc count] > 0)) return; + if (!(desc && [desc count] > 0 && idx >= 0)) return; NSString *rootName = [desc objectAtIndex:0]; if ([rootName isEqual:@"ToolBar"]) { @@ -1214,7 +1131,6 @@ - (void)addMenuWithDescriptor:(NSArray *)desc atIndex:(int)idx [item release]; [menu release]; -#endif } - (void)addMenuItemWithDescriptor:(NSArray *)desc @@ -1226,62 +1142,13 @@ - (void)addMenuItemWithDescriptor:(NSArray *)desc action:(NSString *)action isAlternate:(BOOL)isAlternate { -#if 0 - if (parent) { - NSMenuItem *item = nil; - if (!title || ([title hasPrefix:@"-"] && [title hasSuffix:@"-"])) { - item = [NSMenuItem separatorItem]; - } else { - item = [[[NSMenuItem alloc] init] autorelease]; - [item setTitle:title]; - - if ([action isEqualToString:@"recentFilesDummy:"]) { - // Remove the recent files menu item from its current menu - // and put it in the current file menu. See -[MMAppController - // applicationWillFinishLaunching for more information. - //[[recentFilesMenuItem menu] removeItem:recentFilesMenuItem]; - //item = recentFilesMenuItem; - recentFilesDummy = [item retain]; - - } else { - // TODO: Check that 'action' is a valid action (nothing will - // happen if it isn't, but it would be nice with a warning). - if (action) [item setAction:NSSelectorFromString(action)]; - else [item setAction:@selector(vimMenuItemAction:)]; - if (tip) [item setToolTip:tip]; - - if (key != 0) { - NSString *keyString = - [NSString stringWithFormat:@"%C", key]; - [item setKeyEquivalent:keyString]; - [item setKeyEquivalentModifierMask:mask]; - } - - if (isAlt) [item setAlternate:YES]; - } - } - - // NOTE! The tag is used to idenfity which menu items were - // added by Vim (tag != 0) and which were added by the AppKit - // (tag == 0). - [item setTag:tag]; - - if ([parent numberOfItems] <= idx) { - [parent addItem:item]; - } else { - [parent insertItem:item atIndex:idx]; - } - } else { - NSLog(@"WARNING: Menu item '%@' (tag=%d) has no parent.", title, tag); - } -#else - if (!(desc && [desc count] > 1)) return; + if (!(desc && [desc count] > 1 && idx >= 0)) return; NSString *title = [desc lastObject]; NSString *rootName = [desc objectAtIndex:0]; if ([rootName isEqual:@"ToolBar"]) { - if (toolbar) + if (toolbar && [desc count] == 2) [self addToolbarItemWithLabel:title tip:tip icon:icon atIndex:idx]; return; } @@ -1294,7 +1161,8 @@ - (void)addMenuItemWithDescriptor:(NSArray *)desc } NSMenuItem *item = nil; - if (!title || ([title hasPrefix:@"-"] && [title hasSuffix:@"-"])) { + if (0 == [title length] + || ([title hasPrefix:@"-"] && [title hasSuffix:@"-"])) { item = [NSMenuItem separatorItem]; } else { item = [[[NSMenuItem alloc] init] autorelease]; @@ -1333,7 +1201,47 @@ - (void)addMenuItemWithDescriptor:(NSArray *)desc } else { [parent insertItem:item atIndex:idx]; } -#endif +} + +- (void)removeMenuItemWithDescriptor:(NSArray *)desc +{ + if (!(desc && [desc count] > 0)) return; + + NSString *title = [desc lastObject]; + NSString *rootName = [desc objectAtIndex:0]; + if ([rootName isEqual:@"ToolBar"]) { + if (toolbar) { + if ([desc count] == 1) { + [windowController setToolbar:nil]; + [toolbar release]; toolbar = nil; + } else if ([desc count] == 2) { + [toolbar removeItemWithItemIdentifier:title]; + } + } + return; + } + + NSMenuItem *item = [self menuItemForDescriptor:desc]; + if (!item) { + NSLog(@"Failed to remove menu item, descriptor not found: %@", + [desc componentsJoinedByString:@"->"]); + return; + } + + [item retain]; + + if ([item menu] == [NSApp mainMenu] || ![item menu]) { + // NOTE: To be on the safe side we try to remove the item from + // both arrays (it is ok to call removeObject: even if an array + // does not contain the object to remove). + [mainMenuItems removeObject:item]; + [popupMenuItems removeObject:item]; + } + + if ([item menu]) + [[item menu] removeItem:item]; + + [item release]; } - (NSToolbarItem *)toolbarItemForTag:(int)tag index:(int *)index @@ -1465,6 +1373,25 @@ - (void)replaceMenuItem:(NSMenuItem*)old with:(NSMenuItem*)new + +@implementation NSToolbar (MMExtras) +- (void)removeItemWithItemIdentifier:(NSString *)identifier +{ + NSArray *items = [self items]; + int i, count = [items count]; + for (i = 0; i < count; ++i) { + id item = [items objectAtIndex:i]; + if ([[item identifier] isEqual:identifier]) { + [self removeItemAtIndex:i]; + break; + } + } +} +@end // NSToolbar (MMExtras) + + + + @implementation MMAlert - (void)dealloc { From a0f684e00315920d8bc597fd00cc938d008b24d6 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sun, 1 Jun 2008 15:57:21 +0200 Subject: [PATCH 0482/1156] Add autoenabling for menus --- src/MacVim/MMAppController.m | 36 +----- src/MacVim/MMTextView.m | 12 ++ src/MacVim/MMVimController.h | 1 - src/MacVim/MMVimController.m | 193 +++++++++----------------------- src/MacVim/MMWindowController.m | 8 ++ src/MacVim/gui_macvim.m | 11 +- 6 files changed, 80 insertions(+), 181 deletions(-) diff --git a/src/MacVim/MMAppController.m b/src/MacVim/MMAppController.m index 2128366fe2..3ad8e2e493 100644 --- a/src/MacVim/MMAppController.m +++ b/src/MacVim/MMAppController.m @@ -86,9 +86,6 @@ - (NSMutableDictionary *)extractArgumentsFromOdocEvent: - (void)passArguments:(NSDictionary *)args toVimController:(MMVimController*)vc; @end -@interface NSMenu (MMExtras) -- (void)recurseSetAutoenablesItems:(BOOL)on; -@end @interface NSNumber (MMExtras) - (int)tag; @@ -516,16 +513,7 @@ - (void)removeVimController:(id)controller [vimControllers removeObject:controller]; if (![vimControllers count]) { - // Turn on autoenabling of menus (because no Vim is open to handle it), - // but do not touch the MacVim menu. Note that the menus must be - // enabled first otherwise autoenabling does not work. - NSMenu *mainMenu = [NSApp mainMenu]; - int i, count = [mainMenu numberOfItems]; - for (i = 1; i < count; ++i) { - NSMenuItem *item = [mainMenu itemAtIndex:i]; - [item setEnabled:YES]; - [[item submenu] recurseSetAutoenablesItems:YES]; - } + // TODO: change menu to default state } } @@ -1146,28 +1134,6 @@ - (void)passArguments:(NSDictionary *)args toVimController:(MMVimController*)vc -@implementation NSMenu (MMExtras) - -- (void)recurseSetAutoenablesItems:(BOOL)on -{ - [self setAutoenablesItems:on]; - - int i, count = [self numberOfItems]; - for (i = 0; i < count; ++i) { - NSMenuItem *item = [self itemAtIndex:i]; - [item setEnabled:YES]; - NSMenu *submenu = [item submenu]; - if (submenu) { - [submenu recurseSetAutoenablesItems:on]; - } - } -} - -@end // NSMenu (MMExtras) - - - - @implementation NSNumber (MMExtras) - (int)tag { diff --git a/src/MacVim/MMTextView.m b/src/MacVim/MMTextView.m index c9b3431bce..7460dbe05d 100644 --- a/src/MacVim/MMTextView.m +++ b/src/MacVim/MMTextView.m @@ -1160,6 +1160,18 @@ - (IBAction)selectAll:(id)sender [[self windowController] vimMenuItemAction:sender]; } +- (BOOL)validateMenuItem:(NSMenuItem *)item +{ + if ([item action] == @selector(cut:) + || [item action] == @selector(copy:) + || [item action] == @selector(paste:) + || [item action] == @selector(undo:) + || [item action] == @selector(redo:) + || [item action] == @selector(selectAll:)) + return [item tag]; + + return YES; +} @end // MMTextView diff --git a/src/MacVim/MMVimController.h b/src/MacVim/MMVimController.h index 74ef10691a..23f045696d 100644 --- a/src/MacVim/MMVimController.h +++ b/src/MacVim/MMVimController.h @@ -39,7 +39,6 @@ int resendMsgid; NSData *resendData; #endif - NSMenu *lastMenuSearched; NSMenuItem *recentFilesMenuItem; NSMenuItem *recentFilesDummy; NSDictionary *vimState; diff --git a/src/MacVim/MMVimController.m b/src/MacVim/MMVimController.m index 022145f5af..f0dba25e93 100644 --- a/src/MacVim/MMVimController.m +++ b/src/MacVim/MMVimController.m @@ -61,9 +61,6 @@ - (void)handleMessage:(int)msgid data:(NSData *)data; - (void)savePanelDidEnd:(NSSavePanel *)panel code:(int)code context:(void *)context; - (void)alertDidEnd:(MMAlert *)alert code:(int)code context:(void *)context; -- (NSMenuItem *)recurseMenuItemForTag:(int)tag rootMenu:(NSMenu *)root; -- (NSMenuItem *)menuItemForTag:(int)tag; -- (NSMenu *)menuForTag:(int)tag; - (NSMenuItem *)menuItemForDescriptor:(NSArray *)desc; - (NSMenu *)parentMenuForDescriptor:(NSArray *)desc; - (NSMenu *)topLevelMenuForTitle:(NSString *)title; @@ -77,7 +74,7 @@ - (void)addMenuItemWithDescriptor:(NSArray *)desc action:(NSString *)action isAlternate:(BOOL)isAlternate; - (void)removeMenuItemWithDescriptor:(NSArray *)desc; -- (NSToolbarItem *)toolbarItemForTag:(int)tag index:(int *)index; +- (void)enableMenuItemWithDescriptor:(NSArray *)desc state:(BOOL)on; - (void)addToolbarItemToDictionaryWithLabel:(NSString *)title toolTip:(NSString *)tip icon:(NSString *)icon; - (void)addToolbarItemWithLabel:(NSString *)label @@ -92,7 +89,9 @@ - (void)replaceMenuItem:(NSMenuItem*)old with:(NSMenuItem*)new; @interface NSToolbar (MMExtras) -- (void)removeItemWithItemIdentifier:(NSString *)identifier; +- (int)indexOfItemWithItemIdentifier:(NSString *)identifier; +- (NSToolbarItem *)itemAtIndex:(int)idx; +- (NSToolbarItem *)itemWithItemIdentifier:(NSString *)identifier; @end @@ -596,12 +595,11 @@ - (void)updateMainMenu // TODO! Need to look for 'Window' in all localized languages. NSMenu *windowMenu = [[mainMenu itemWithTitle:@"Window"] submenu]; if (windowMenu) { - // Remove all AppKit owned menu items (tag == 0); they will be added - // again when setWindowsMenu: is called. + // Remove all items that are added when setWindowsMenu: is called. count = [windowMenu numberOfItems]; for (i = count-1; i >= 0; --i) { NSMenuItem *item = [windowMenu itemAtIndex:i]; - if (![item tag]) { + if ([item action] == @selector(makeKeyAndOrderFront:)) { [windowMenu removeItem:item]; } } @@ -680,49 +678,12 @@ - (void)handleMessage:(int)msgid data:(NSData *)data action:[attrs objectForKey:@"action"] isAlternate:[[attrs objectForKey:@"isAlternate"] boolValue]]; } else if (RemoveMenuItemMsgID == msgid) { -#if 0 - const void *bytes = [data bytes]; - int tag = *((int*)bytes); bytes += sizeof(int); - - id item; - int idx; - if ((item = [self toolbarItemForTag:tag index:&idx])) { - [toolbar removeItemAtIndex:idx]; - } else if ((item = [self menuItemForTag:tag])) { - [item retain]; - - if ([item menu] == [NSApp mainMenu] || ![item menu]) { - // NOTE: To be on the safe side we try to remove the item from - // both arrays (it is ok to call removeObject: even if an array - // does not contain the object to remove). - [mainMenuItems removeObject:item]; - [popupMenuItems removeObject:item]; - } - - if ([item menu]) - [[item menu] removeItem:item]; - - [item release]; - } - - // Reset cached menu, just to be on the safe side. - lastMenuSearched = nil; -#else NSDictionary *attrs = [NSDictionary dictionaryWithData:data]; [self removeMenuItemWithDescriptor:[attrs objectForKey:@"descriptor"]]; -#endif } else if (EnableMenuItemMsgID == msgid) { -#if 0 - const void *bytes = [data bytes]; - int tag = *((int*)bytes); bytes += sizeof(int); - int state = *((int*)bytes); bytes += sizeof(int); - - id item = [self toolbarItemForTag:tag index:NULL]; - if (!item) - item = [self menuItemForTag:tag]; - - [item setEnabled:state]; -#endif + NSDictionary *attrs = [NSDictionary dictionaryWithData:data]; + [self enableMenuItemWithDescriptor:[attrs objectForKey:@"descriptor"] + state:[[attrs objectForKey:@"enable"] boolValue]]; } else if (ShowToolbarMsgID == msgid) { const void *bytes = [data bytes]; int enable = *((int*)bytes); bytes += sizeof(int); @@ -928,76 +889,6 @@ - (void)alertDidEnd:(MMAlert *)alert code:(int)code context:(void *)context } } -- (NSMenuItem *)recurseMenuItemForTag:(int)tag rootMenu:(NSMenu *)root -{ - if (root) { - NSMenuItem *item = [root itemWithTag:tag]; - if (item) { - lastMenuSearched = root; - return item; - } - - NSArray *items = [root itemArray]; - unsigned i, count = [items count]; - for (i = 0; i < count; ++i) { - item = [items objectAtIndex:i]; - if ([item hasSubmenu]) { - item = [self recurseMenuItemForTag:tag - rootMenu:[item submenu]]; - if (item) { - lastMenuSearched = [item submenu]; - return item; - } - } - } - } - - return nil; -} - -- (NSMenuItem *)menuItemForTag:(int)tag -{ - // First search the same menu that was search last time this method was - // called. Since this method is often called for each menu item in a - // menu this can significantly improve search times. - if (lastMenuSearched) { - NSMenuItem *item = [self recurseMenuItemForTag:tag - rootMenu:lastMenuSearched]; - if (item) return item; - } - - // Search the main menu. - int i, count = [mainMenuItems count]; - for (i = 0; i < count; ++i) { - NSMenuItem *item = [mainMenuItems objectAtIndex:i]; - if ([item tag] == tag) return item; - item = [self recurseMenuItemForTag:tag rootMenu:[item submenu]]; - if (item) { - lastMenuSearched = [item submenu]; - return item; - } - } - - // Search the popup menus. - count = [popupMenuItems count]; - for (i = 0; i < count; ++i) { - NSMenuItem *item = [popupMenuItems objectAtIndex:i]; - if ([item tag] == tag) return item; - item = [self recurseMenuItemForTag:tag rootMenu:[item submenu]]; - if (item) { - lastMenuSearched = [item submenu]; - return item; - } - } - - return nil; -} - -- (NSMenu *)menuForTag:(int)tag -{ - return [[self menuItemForTag:tag] submenu]; -} - - (NSMenuItem *)menuItemForDescriptor:(NSArray *)desc { if (!(desc && [desc count] > 0)) return nil; @@ -1106,7 +997,6 @@ - (void)addMenuWithDescriptor:(NSArray *)desc atIndex:(int)idx NSMenuItem *item = [[NSMenuItem alloc] init]; NSMenu *menu = [[NSMenu alloc] initWithTitle:title]; - [menu setAutoenablesItems:NO]; [item setTitle:title]; [item setSubmenu:menu]; @@ -1188,14 +1078,10 @@ - (void)addMenuItemWithDescriptor:(NSArray *)desc [item setKeyEquivalentModifierMask:modifierMask]; } [item setAlternate:isAlternate]; + [item setTag:1]; // 'tag != 0' means item is enabled } } - // NOTE! The tag is used to idenfity which menu items were - // added by Vim (tag != 0) and which were added by the AppKit - // (tag == 0). - [item setTag:-1]; - if ([parent numberOfItems] <= idx) { [parent addItem:item]; } else { @@ -1215,7 +1101,9 @@ - (void)removeMenuItemWithDescriptor:(NSArray *)desc [windowController setToolbar:nil]; [toolbar release]; toolbar = nil; } else if ([desc count] == 2) { - [toolbar removeItemWithItemIdentifier:title]; + int idx = [toolbar indexOfItemWithItemIdentifier:title]; + if (idx != NSNotFound) + [toolbar removeItemAtIndex:idx]; } } return; @@ -1244,21 +1132,26 @@ - (void)removeMenuItemWithDescriptor:(NSArray *)desc [item release]; } -- (NSToolbarItem *)toolbarItemForTag:(int)tag index:(int *)index +- (void)enableMenuItemWithDescriptor:(NSArray *)desc state:(BOOL)on { - if (!toolbar) return nil; + if (!(desc && [desc count] > 0)) return; - NSArray *items = [toolbar items]; - int i, count = [items count]; - for (i = 0; i < count; ++i) { - NSToolbarItem *item = [items objectAtIndex:i]; - if ([item tag] == tag) { - if (index) *index = i; - return item; + /*NSLog(@"%sable item %@", on ? "En" : "Dis", + [desc componentsJoinedByString:@"->"]);*/ + + NSString *rootName = [desc objectAtIndex:0]; + if ([rootName isEqual:@"ToolBar"]) { + if (toolbar && [desc count] == 2) { + NSString *title = [desc lastObject]; + [[toolbar itemWithItemIdentifier:title] setEnabled:on]; } + } else { + // Use tag to set whether item is enabled or disabled instead of + // calling setEnabled:. This way the menus can autoenable themselves + // but at the same time Vim can set if a menu is enabled whenever it + // wants to. + [[self menuItemForDescriptor:desc] setTag:on]; } - - return nil; } - (void)addToolbarItemToDictionaryWithLabel:(NSString *)title @@ -1272,7 +1165,6 @@ - (void)addToolbarItemToDictionaryWithLabel:(NSString *)title return; NSToolbarItem *item = [[NSToolbarItem alloc] initWithItemIdentifier:title]; - [item setTag:-1]; [item setLabel:title]; [item setToolTip:tip]; [item setAction:@selector(vimMenuItemAction:)]; @@ -1375,18 +1267,35 @@ - (void)replaceMenuItem:(NSMenuItem*)old with:(NSMenuItem*)new @implementation NSToolbar (MMExtras) -- (void)removeItemWithItemIdentifier:(NSString *)identifier + +- (int)indexOfItemWithItemIdentifier:(NSString *)identifier { NSArray *items = [self items]; int i, count = [items count]; for (i = 0; i < count; ++i) { id item = [items objectAtIndex:i]; - if ([[item identifier] isEqual:identifier]) { - [self removeItemAtIndex:i]; - break; - } + if ([[item itemIdentifier] isEqual:identifier]) + return i; } + + return NSNotFound; +} + +- (NSToolbarItem *)itemAtIndex:(int)idx +{ + NSArray *items = [self items]; + if (idx < 0 || idx >= [items count]) + return nil; + + return [items objectAtIndex:idx]; } + +- (NSToolbarItem *)itemWithItemIdentifier:(NSString *)identifier +{ + int idx = [self indexOfItemWithItemIdentifier:identifier]; + return idx != NSNotFound ? [self itemAtIndex:idx] : nil; +} + @end // NSToolbar (MMExtras) diff --git a/src/MacVim/MMWindowController.m b/src/MacVim/MMWindowController.m index b1b2ecf437..ede1a753a6 100644 --- a/src/MacVim/MMWindowController.m +++ b/src/MacVim/MMWindowController.m @@ -636,6 +636,14 @@ - (IBAction)vimMenuItemAction:(id)sender [vimController sendMessage:ExecuteMenuMsgID data:[attrs dictionaryAsData]]; } +- (BOOL)validateMenuItem:(NSMenuItem *)item +{ + if ([item action] == @selector(vimMenuItemAction:) + || [item action] == @selector(performClose:)) + return [item tag]; + + return YES; +} // -- NSWindow delegate ------------------------------------------------------ diff --git a/src/MacVim/gui_macvim.m b/src/MacVim/gui_macvim.m index 63a5cc09ba..99aa689957 100644 --- a/src/MacVim/gui_macvim.m +++ b/src/MacVim/gui_macvim.m @@ -743,12 +743,17 @@ + (id)stringWithVimString:(char_u *)s; /* Only update menu if the 'grey' state has changed to avoid having to pass * lots of unnecessary data to MacVim. (Skipping this test makes MacVim * pause noticably on mode changes. */ - if (menu->was_grey != grey) return; + NSArray *desc = descriptor_for_menu(menu); + if (menu->was_grey == grey) + return; menu->was_grey = grey; + [[MMBackend sharedInstance] queueMessage:EnableMenuItemMsgID properties: - [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:!grey] - forKey:@"enable"]]; + [NSDictionary dictionaryWithObjectsAndKeys: + desc, @"descriptor", + [NSNumber numberWithInt:!grey], @"enable", + nil]]; } From 0e37f590ab7ac1bc83deab383ebc49d0f869aa35 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sun, 1 Jun 2008 21:28:18 +0200 Subject: [PATCH 0483/1156] Use -[NSApp setMainMenu:] to update main menu --- src/MacVim/MMVimController.h | 3 +- src/MacVim/MMVimController.m | 164 ++++++++++++++++++++++++----------- 2 files changed, 116 insertions(+), 51 deletions(-) diff --git a/src/MacVim/MMVimController.h b/src/MacVim/MMVimController.h index 23f045696d..56fb6d16b9 100644 --- a/src/MacVim/MMVimController.h +++ b/src/MacVim/MMVimController.h @@ -27,9 +27,8 @@ id backendProxy; BOOL inProcessCommandQueue; NSMutableArray *sendQueue; - NSMutableArray *mainMenuItems; + NSMenu *mainMenu; NSMutableArray *popupMenuItems; - BOOL shouldUpdateMainMenu; NSToolbar *toolbar; NSMutableDictionary *toolbarItemDict; int pid; diff --git a/src/MacVim/MMVimController.m b/src/MacVim/MMVimController.m index f0dba25e93..8bd79564cf 100644 --- a/src/MacVim/MMVimController.m +++ b/src/MacVim/MMVimController.m @@ -85,6 +85,10 @@ - (void)connectionDidDie:(NSNotification *)notification; - (void)resendTimerFired:(NSTimer *)timer; #endif - (void)replaceMenuItem:(NSMenuItem*)old with:(NSMenuItem*)new; +- (NSMenu *)findMenuContainingItemWithAction:(SEL)action; +- (NSMenu *)findWindowsMenu; +- (NSMenu *)findApplicationMenu; +- (NSMenu *)findServicesMenu; @end @@ -95,6 +99,12 @@ - (NSToolbarItem *)itemWithItemIdentifier:(NSString *)identifier; @end +@interface NSMenu (MMExtras) +- (int)indexOfItemWithAction:(SEL)action; +- (NSMenuItem *)itemWithAction:(SEL)action; +@end + + @implementation MMVimController @@ -103,14 +113,12 @@ - (id)initWithBackend:(id)backend pid:(int)processIdentifier recentFiles:(NSMenuItem*)menu; { if ((self = [super init])) { - recentFilesMenuItem = [menu retain]; windowController = [[MMWindowController alloc] initWithVimController:self]; backendProxy = [backend retain]; sendQueue = [NSMutableArray new]; - mainMenuItems = [[NSMutableArray alloc] init]; popupMenuItems = [[NSMutableArray alloc] init]; toolbarItemDict = [[NSMutableDictionary alloc] init]; pid = processIdentifier; @@ -125,6 +133,18 @@ - (id)initWithBackend:(id)backend pid:(int)processIdentifier selector:@selector(connectionDidDie:) name:NSConnectionDidDieNotification object:connection]; + // Copy the "MacVim menu" from the current main menu. + mainMenu = [[NSMenu alloc] initWithTitle:@"MainMenu"]; + NSMenuItem *appMenuItem = [[NSApp mainMenu] itemAtIndex:0]; + appMenuItem = [[appMenuItem copy] autorelease]; + + // Note: If the title of the application menu is anything but "MacVim", + // then the application menu will not be typeset in boldface for some + // reason. + [appMenuItem setTitle:@"MacVim"]; + + [mainMenu addItem:appMenuItem]; + isInitialized = YES; } @@ -147,13 +167,13 @@ - (void)dealloc [toolbarItemDict release]; toolbarItemDict = nil; [toolbar release]; toolbar = nil; [popupMenuItems release]; popupMenuItems = nil; - [mainMenuItems release]; mainMenuItems = nil; [windowController release]; windowController = nil; [recentFilesMenuItem release]; recentFilesMenuItem = nil; [recentFilesDummy release]; recentFilesDummy = nil; [vimState release]; vimState = nil; + [mainMenu release]; mainMenu = nil; [super dealloc]; } @@ -529,10 +549,6 @@ - (oneway void)processCommandQueue:(in bycopy NSArray *)queue } //NSLog(@"======== %s END ========", _cmd); - if (shouldUpdateMainMenu) { - [self updateMainMenu]; - } - [windowController processCommandQueueDidFinish]; inProcessCommandQueue = NO; @@ -574,39 +590,30 @@ - (NSArray *)toolbarDefaultItemIdentifiers:(NSToolbar *)theToolbar - (void)updateMainMenu { - NSMenu *mainMenu = [NSApp mainMenu]; + if ([NSApp mainMenu] == mainMenu) return; - // Stop NSApp from updating the Window menu. - [NSApp setWindowsMenu:nil]; + [NSApp setMainMenu:mainMenu]; - // Remove all menus from main menu (except the MacVim menu). - int i, count = [mainMenu numberOfItems]; - for (i = count-1; i > 0; --i) { - [mainMenu removeItemAtIndex:i]; - } + NSMenu *appMenu = [self findApplicationMenu]; + [NSApp performSelector:@selector(setAppleMenu:) withObject:appMenu]; - // Add menus from 'mainMenuItems' to main menu. - count = [mainMenuItems count]; - for (i = 0; i < count; ++i) { - [mainMenu addItem:[mainMenuItems objectAtIndex:i]]; - } + NSMenu *servicesMenu = [self findServicesMenu]; + [NSApp setServicesMenu:servicesMenu]; - // Set the new Window menu. - // TODO! Need to look for 'Window' in all localized languages. - NSMenu *windowMenu = [[mainMenu itemWithTitle:@"Window"] submenu]; - if (windowMenu) { + NSMenu *windowsMenu = [self findWindowsMenu]; + if (windowsMenu) { // Remove all items that are added when setWindowsMenu: is called. - count = [windowMenu numberOfItems]; + int i, count = [windowsMenu numberOfItems]; for (i = count-1; i >= 0; --i) { - NSMenuItem *item = [windowMenu itemAtIndex:i]; - if ([item action] == @selector(makeKeyAndOrderFront:)) { - [windowMenu removeItem:item]; - } + NSMenuItem *item = [windowsMenu itemAtIndex:i]; + if ([item action] == @selector(makeKeyAndOrderFront:)) + [windowsMenu removeItem:item]; } - [NSApp setWindowsMenu:windowMenu]; + [NSApp setWindowsMenu:windowsMenu]; } +#if 0 // Replace real Recent Files menu in the old menu with the dummy, then // remove dummy from new menu and put Recent Files menu there NSMenuItem *oldItem = (NSMenuItem*)[recentFilesMenuItem representedObject]; @@ -614,8 +621,7 @@ - (void)updateMainMenu [self replaceMenuItem:recentFilesMenuItem with:oldItem]; [recentFilesMenuItem setRepresentedObject:recentFilesDummy]; [self replaceMenuItem:recentFilesDummy with:recentFilesMenuItem]; - - shouldUpdateMainMenu = NO; +#endif } @end // MMVimController @@ -895,7 +901,7 @@ - (NSMenuItem *)menuItemForDescriptor:(NSArray *)desc NSString *rootName = [desc objectAtIndex:0]; NSArray *rootItems = [rootName hasPrefix:@"PopUp"] ? popupMenuItems - : mainMenuItems; + : [mainMenu itemArray]; NSMenuItem *item = nil; int i, count = [rootItems count]; @@ -922,7 +928,7 @@ - (NSMenu *)parentMenuForDescriptor:(NSArray *)desc NSString *rootName = [desc objectAtIndex:0]; NSArray *rootItems = [rootName hasPrefix:@"PopUp"] ? popupMenuItems - : mainMenuItems; + : [mainMenu itemArray]; NSMenu *menu = nil; int i, count = [rootItems count]; @@ -957,9 +963,9 @@ - (NSMenu *)topLevelMenuForTitle:(NSString *)title return [item submenu]; } - count = [mainMenuItems count]; + count = [mainMenu numberOfItems]; for (i = 0; i < count; ++i) { - NSMenuItem *item = [mainMenuItems objectAtIndex:i]; + NSMenuItem *item = [mainMenu itemAtIndex:i]; if ([title isEqual:[item title]]) return [item submenu]; } @@ -1001,22 +1007,22 @@ - (void)addMenuWithDescriptor:(NSArray *)desc atIndex:(int)idx [item setSubmenu:menu]; NSMenu *parent = [self parentMenuForDescriptor:desc]; - if (parent) { - if ([parent numberOfItems] <= idx) { - [parent addItem:item]; + if (!parent && [rootName hasPrefix:@"PopUp"]) { + if ([popupMenuItems count] <= idx) { + [popupMenuItems addObject:item]; } else { - [parent insertItem:item atIndex:idx]; + [popupMenuItems insertObject:item atIndex:idx]; } } else { - BOOL isPopup = [rootName hasPrefix:@"PopUp"]; - NSMutableArray *items = isPopup ? popupMenuItems : mainMenuItems; - if ([items count] <= idx) { - [items addObject:item]; + // If descriptor has no parent and its not a popup (or toolbar) menu, + // then it must belong to main menu. + if (!parent) parent = mainMenu; + + if ([parent numberOfItems] <= idx) { + [parent addItem:item]; } else { - [items insertObject:item atIndex:idx]; + [parent insertItem:item atIndex:idx]; } - - shouldUpdateMainMenu = !isPopup; } [item release]; @@ -1122,7 +1128,6 @@ - (void)removeMenuItemWithDescriptor:(NSArray *)desc // NOTE: To be on the safe side we try to remove the item from // both arrays (it is ok to call removeObject: even if an array // does not contain the object to remove). - [mainMenuItems removeObject:item]; [popupMenuItems removeObject:item]; } @@ -1230,7 +1235,7 @@ - (void)connectionDidDie:(NSNotification *)notification - (NSString *)description { - return [NSString stringWithFormat:@"%@ : isInitialized=%d inProcessCommandQueue=%d mainMenuItems=%@ popupMenuItems=%@ toolbar=%@", [self className], isInitialized, inProcessCommandQueue, mainMenuItems, popupMenuItems, toolbar]; + return [NSString stringWithFormat:@"%@ : isInitialized=%d inProcessCommandQueue=%d mainMenu=%@ popupMenuItems=%@ toolbar=%@", [self className], isInitialized, inProcessCommandQueue, mainMenu, popupMenuItems, toolbar]; } #if MM_RESEND_LAST_FAILURE @@ -1261,6 +1266,46 @@ - (void)replaceMenuItem:(NSMenuItem*)old with:(NSMenuItem*)new [menu insertItem:new atIndex:index]; } +- (NSMenu *)findMenuContainingItemWithAction:(SEL)action +{ + int i, count = [mainMenu numberOfItems]; + for (i = 0; i < count; ++i) { + NSMenu *menu = [[mainMenu itemAtIndex:i] submenu]; + NSMenuItem *item = [menu itemWithAction:action]; + if (item) return menu; + } + + return nil; +} + +- (NSMenu *)findWindowsMenu +{ + return [self findMenuContainingItemWithAction: + @selector(performMiniaturize:)]; +} + +- (NSMenu *)findApplicationMenu +{ + return [self findMenuContainingItemWithAction:@selector(terminate:)]; +} + +- (NSMenu *)findServicesMenu +{ + // NOTE! Our heuristic for finding the "Services" menu is to look for the + // second item after the "Preferences" menu item on the "MacVim" menu. + // (The item after "Preferences" should be a separator, but this is not + // important as long as the second item is the "Services" menu.) + + NSMenu *appMenu = [self findApplicationMenu]; + if (!appMenu) return nil; + + int idx = [appMenu indexOfItemWithAction: + @selector(orderFrontPreferencePanel:)]; + if (idx < 0 || idx+2 >= [appMenu numberOfItems]) return nil; + + return [[appMenu itemAtIndex:idx+2] submenu]; +} + @end // MMVimController (Private) @@ -1298,6 +1343,27 @@ - (NSToolbarItem *)itemWithItemIdentifier:(NSString *)identifier @end // NSToolbar (MMExtras) +@implementation NSMenu (MMExtras) + +- (int)indexOfItemWithAction:(SEL)action +{ + int i, count = [self numberOfItems]; + for (i = 0; i < count; ++i) { + NSMenuItem *item = [self itemAtIndex:i]; + if ([item action] == action) + return i; + } + + return -1; +} + +- (NSMenuItem *)itemWithAction:(SEL)action +{ + int idx = [self indexOfItemWithAction:action]; + return idx >= 0 ? [self itemAtIndex:idx] : nil; +} + +@end // NSMenu (MMExtras) From 44d7e60b0622c208308c84869af30d6b6188d3f6 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Mon, 2 Jun 2008 18:44:59 +0200 Subject: [PATCH 0484/1156] Change heuristic for finding "Services" menu --- src/MacVim/MMVimController.m | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/MacVim/MMVimController.m b/src/MacVim/MMVimController.m index 8bd79564cf..be74f1dcd0 100644 --- a/src/MacVim/MMVimController.m +++ b/src/MacVim/MMVimController.m @@ -1292,18 +1292,17 @@ - (NSMenu *)findApplicationMenu - (NSMenu *)findServicesMenu { // NOTE! Our heuristic for finding the "Services" menu is to look for the - // second item after the "Preferences" menu item on the "MacVim" menu. - // (The item after "Preferences" should be a separator, but this is not - // important as long as the second item is the "Services" menu.) + // second item before the "Hide MacVim" menu item on the "MacVim" menu. + // (The item before "Hide MacVim" should be a separator, but this is not + // important as long as the item before that is the "Services" menu.) NSMenu *appMenu = [self findApplicationMenu]; if (!appMenu) return nil; - int idx = [appMenu indexOfItemWithAction: - @selector(orderFrontPreferencePanel:)]; - if (idx < 0 || idx+2 >= [appMenu numberOfItems]) return nil; + int idx = [appMenu indexOfItemWithAction: @selector(hide:)]; + if (idx-2 < 0) return nil; // idx == -1, if selector not found - return [[appMenu itemAtIndex:idx+2] submenu]; + return [[appMenu itemAtIndex:idx-2] submenu]; } @end // MMVimController (Private) From f6ab5cbc0377c8e635c79cf971e7f2fd730c5d32 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Tue, 3 Jun 2008 23:15:18 +0200 Subject: [PATCH 0485/1156] Use default menu when no window open, fix 'Recent Files' menu --- .../English.lproj/MainMenu.nib/classes.nib | 10 + .../English.lproj/MainMenu.nib/info.nib | 4 +- .../MainMenu.nib/keyedobjects.nib | Bin 9287 -> 7688 bytes src/MacVim/MMAppController.h | 5 +- src/MacVim/MMAppController.m | 220 +++++++++++++++--- src/MacVim/MMVimController.h | 7 +- src/MacVim/MMVimController.m | 185 +++------------ src/MacVim/MMWindowController.m | 4 +- 8 files changed, 247 insertions(+), 188 deletions(-) diff --git a/src/MacVim/English.lproj/MainMenu.nib/classes.nib b/src/MacVim/English.lproj/MainMenu.nib/classes.nib index 1dbd06362c..4a0573b97d 100644 --- a/src/MacVim/English.lproj/MainMenu.nib/classes.nib +++ b/src/MacVim/English.lproj/MainMenu.nib/classes.nib @@ -15,6 +15,8 @@ id newWindow id + openWebsite + id orderFrontPreferencePanel id selectNextWindow @@ -29,6 +31,14 @@ SUPERCLASS NSObject + + CLASS + NSMenu + LANGUAGE + ObjC + SUPERCLASS + NSObject + ACTIONS diff --git a/src/MacVim/English.lproj/MainMenu.nib/info.nib b/src/MacVim/English.lproj/MainMenu.nib/info.nib index 0fe119084e..fb4d19ea6e 100644 --- a/src/MacVim/English.lproj/MainMenu.nib/info.nib +++ b/src/MacVim/English.lproj/MainMenu.nib/info.nib @@ -10,10 +10,10 @@ 5 IBOpenObjects - 57 + 218 IBSystem Version - 9B18 + 9D34 targetFramework IBCocoaFramework diff --git a/src/MacVim/English.lproj/MainMenu.nib/keyedobjects.nib b/src/MacVim/English.lproj/MainMenu.nib/keyedobjects.nib index f58db777c012b9552a5310329c93c38c2a075b1a..241ca9cbc215547607056ff4caabc65d29f516f0 100644 GIT binary patch literal 7688 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 diff --git a/src/MacVim/MMAppController.h b/src/MacVim/MMAppController.h index db3d61af48..0236eaaed9 100644 --- a/src/MacVim/MMAppController.h +++ b/src/MacVim/MMAppController.h @@ -21,12 +21,15 @@ NSString *openSelectionString; ATSFontContainerRef fontContainerRef; NSMutableDictionary *pidArguments; - + NSMenu *defaultMainMenu; NSMenuItem *recentFilesMenuItem; } ++ (MMAppController *)sharedInstance; +- (NSMenu *)defaultMainMenu; - (void)removeVimController:(id)controller; - (void)windowControllerWillOpen:(MMWindowController *)windowController; +- (void)setMainMenu:(NSMenu *)mainMenu; - (IBAction)newWindow:(id)sender; - (IBAction)fileOpen:(id)sender; - (IBAction)selectNextWindow:(id)sender; diff --git a/src/MacVim/MMAppController.m b/src/MacVim/MMAppController.m index 3ad8e2e493..0a978d6d53 100644 --- a/src/MacVim/MMAppController.m +++ b/src/MacVim/MMAppController.m @@ -92,6 +92,18 @@ - (int)tag; @end +@interface NSMenu (MMExtras) +- (int)indexOfItemWithAction:(SEL)action; +- (NSMenuItem *)itemWithAction:(SEL)action; +- (NSMenu *)findMenuContainingItemWithAction:(SEL)action; +- (NSMenu *)findWindowsMenu; +- (NSMenu *)findApplicationMenu; +- (NSMenu *)findServicesMenu; +- (NSMenu *)findFileMenu; +@end + + + @implementation MMAppController @@ -177,39 +189,42 @@ - (void)dealloc [vimControllers release]; vimControllers = nil; [openSelectionString release]; openSelectionString = nil; [recentFilesMenuItem release]; recentFilesMenuItem = nil; + [defaultMainMenu release]; defaultMainMenu = nil; [super dealloc]; } - (void)applicationWillFinishLaunching:(NSNotification *)notification { - // Create the "Open Recent" menu. See - // http://lapcatsoftware.com/blog/2007/07/10/working-without-a-nib-part-5-open-recent-menu/ - // and http://www.cocoabuilder.com/archive/message/cocoa/2007/8/15/187793 + // Remember the default menu so that it can be restored if the user closes + // all editor windows. + defaultMainMenu = [[NSApp mainMenu] retain]; + + // Set up the "Open Recent" menu. See + // http://lapcatsoftware.com/blog/2007/07/10/ + // working-without-a-nib-part-5-open-recent-menu/ + // and + // http://www.cocoabuilder.com/archive/message/cocoa/2007/8/15/187793 // for more information. - // - // The menu needs to be created and be added to a toplevel menu in - // applicationWillFinishLaunching at the latest, otherwise it doesn't work. - - recentFilesMenuItem = [[NSMenuItem alloc] - initWithTitle:NSLocalizedString(@"Open Recent", @"Open Recent menu") - action:nil keyEquivalent:@""]; - - NSMenu *recentFilesMenu = [[NSMenu alloc] - initWithTitle:NSLocalizedString(@"Open Recent", @"Open Recent menu")]; - [recentFilesMenu performSelector:@selector(_setMenuName:) - withObject:@"NSRecentDocumentsMenu"]; - - [recentFilesMenu addItemWithTitle:NSLocalizedString(@"Clear Menu", - @"Open Recent menu") - action:@selector(clearRecentDocuments:) - keyEquivalent:@""]; - [recentFilesMenuItem setSubmenu:recentFilesMenu]; - [recentFilesMenu release]; // the menu is retained by recentFilesMenuItem - [recentFilesMenuItem setTag:-1]; // must not be 0 - - // TODO: this will not work in a localized MacVim - [[[[NSApp mainMenu] itemWithTitle:@"File"] submenu] addItem:recentFilesMenuItem]; + // + // The menu itself is created in MainMenu.nib but we still seem to have to + // hack around a bit to get it to work. (This has to be done in + // applicationWillFinishLaunching at the latest, otherwise it doesn't + // work.) + NSMenu *fileMenu = [defaultMainMenu findFileMenu]; + if (fileMenu) { + int idx = [fileMenu indexOfItemWithAction:@selector(fileOpen:)]; + if (idx >= 0 && idx+1 < [fileMenu numberOfItems]) + + recentFilesMenuItem = [fileMenu itemWithTitle:@"Open Recent"]; + [[recentFilesMenuItem submenu] performSelector:@selector(_setMenuName:) + withObject:@"NSRecentDocumentsMenu"]; + + // Note: The "Recent Files" menu must be moved around since there is no + // -[NSApp setRecentFilesMenu:] method. We keep a reference to it to + // facilitate this move (see setMainMenu: below). + [recentFilesMenuItem retain]; + } #if MM_HANDLE_XCODE_MOD_EVENT [[NSAppleEventManager sharedAppleEventManager] @@ -504,6 +519,19 @@ - (void)applicationWillTerminate:(NSNotification *)notification [NSApp setDelegate:nil]; } ++ (MMAppController *)sharedInstance +{ + // Note: The app controller is a singleton which is instantiated in + // MainMenu.nib where it is also connected as the delegate of NSApp. + id delegate = [NSApp delegate]; + return [delegate isKindOfClass:self] ? (MMAppController*)delegate : nil; +} + +- (NSMenu *)defaultMainMenu +{ + return defaultMainMenu; +} + - (void)removeVimController:(id)controller { //NSLog(@"%s%@", _cmd, controller); @@ -513,7 +541,9 @@ - (void)removeVimController:(id)controller [vimControllers removeObject:controller]; if (![vimControllers count]) { - // TODO: change menu to default state + // The last editor window just closed so restore the main menu back to + // its default state (which is defined in MainMenu.nib). + [self setMainMenu:defaultMainMenu]; } } @@ -556,6 +586,68 @@ - (void)windowControllerWillOpen:(MMWindowController *)windowController } } +- (void)setMainMenu:(NSMenu *)mainMenu +{ + if ([NSApp mainMenu] == mainMenu) return; + + // If the new menu has a "Recent Files" dummy item, then swap the real item + // for the dummy. We are forced to do this since Cocoa initializes the + // "Recent Files" menu and there is no way to simply point Cocoa to a new + // item each time the menus are swapped. + NSMenu *fileMenu = [mainMenu findFileMenu]; + int dummyIdx = + [fileMenu indexOfItemWithAction:@selector(recentFilesDummy:)]; + if (dummyIdx >= 0 && recentFilesMenuItem) { + NSMenuItem *dummyItem = [[fileMenu itemAtIndex:dummyIdx] retain]; + [fileMenu removeItemAtIndex:dummyIdx]; + + NSMenu *recentFilesParentMenu = [recentFilesMenuItem menu]; + int idx = [recentFilesParentMenu indexOfItem:recentFilesMenuItem]; + if (idx >= 0) { + [[recentFilesMenuItem retain] autorelease]; + [recentFilesParentMenu removeItemAtIndex:idx]; + [recentFilesParentMenu insertItem:dummyItem atIndex:idx]; + } + + [fileMenu insertItem:recentFilesMenuItem atIndex:dummyIdx]; + [dummyItem release]; + } + + // Now set the new menu. Notice that we keep one menu for each editor + // window since each editor can have its own set of menus. When swapping + // menus we have to tell Cocoa where the new "MacVim", "Windows", and + // "Services" menu are. + [NSApp setMainMenu:mainMenu]; + + // Setting the "MacVim" (or "Application") menu ensures that it is typeset + // in boldface. (The setAppleMenu: method used to be public but is now + // private so this will have to be considered a bit of a hack!) + NSMenu *appMenu = [mainMenu findApplicationMenu]; + [NSApp performSelector:@selector(setAppleMenu:) withObject:appMenu]; + + NSMenu *servicesMenu = [mainMenu findServicesMenu]; + [NSApp setServicesMenu:servicesMenu]; + + NSMenu *windowsMenu = [mainMenu findWindowsMenu]; + if (windowsMenu) { + // Cocoa isn't clever enough to get rid of items it has added to the + // "Windows" menu so we have to do it ourselves otherwise there will be + // multiple menu items for each window in the "Windows" menu. + // This code assumes that the only items Cocoa add are ones which + // send off the action makeKeyAndOrderFront:. (Cocoa will not add + // another separator item if the last item on the "Windows" menu + // already is a separator, so we needen't worry about separators.) + int i, count = [windowsMenu numberOfItems]; + for (i = count-1; i >= 0; --i) { + NSMenuItem *item = [windowsMenu itemAtIndex:i]; + if ([item action] == @selector(makeKeyAndOrderFront:)) + [windowsMenu removeItem:item]; + } + + [NSApp setWindowsMenu:windowsMenu]; + } +} + - (IBAction)newWindow:(id)sender { [self launchVimProcessWithArguments:nil]; @@ -657,7 +749,7 @@ - (IBAction)openWebsite:(id)sender setProtocolForProxy:@protocol(MMBackendProtocol)]; vc = [[[MMVimController alloc] - initWithBackend:backend pid:pid recentFiles:recentFilesMenuItem] + initWithBackend:backend pid:pid] autorelease]; if (![vimControllers count]) { @@ -1144,6 +1236,77 @@ - (int)tag +@implementation NSMenu (MMExtras) + +- (int)indexOfItemWithAction:(SEL)action +{ + int i, count = [self numberOfItems]; + for (i = 0; i < count; ++i) { + NSMenuItem *item = [self itemAtIndex:i]; + if ([item action] == action) + return i; + } + + return -1; +} + +- (NSMenuItem *)itemWithAction:(SEL)action +{ + int idx = [self indexOfItemWithAction:action]; + return idx >= 0 ? [self itemAtIndex:idx] : nil; +} + +- (NSMenu *)findMenuContainingItemWithAction:(SEL)action +{ + // NOTE: We only look for the action in the submenus of 'self' + int i, count = [self numberOfItems]; + for (i = 0; i < count; ++i) { + NSMenu *menu = [[self itemAtIndex:i] submenu]; + NSMenuItem *item = [menu itemWithAction:action]; + if (item) return menu; + } + + return nil; +} + +- (NSMenu *)findWindowsMenu +{ + return [self findMenuContainingItemWithAction: + @selector(performMiniaturize:)]; +} + +- (NSMenu *)findApplicationMenu +{ + // TODO: Just return [self itemAtIndex:0]? + return [self findMenuContainingItemWithAction:@selector(terminate:)]; +} + +- (NSMenu *)findServicesMenu +{ + // NOTE! Our heuristic for finding the "Services" menu is to look for the + // second item before the "Hide MacVim" menu item on the "MacVim" menu. + // (The item before "Hide MacVim" should be a separator, but this is not + // important as long as the item before that is the "Services" menu.) + + NSMenu *appMenu = [self findApplicationMenu]; + if (!appMenu) return nil; + + int idx = [appMenu indexOfItemWithAction: @selector(hide:)]; + if (idx-2 < 0) return nil; // idx == -1, if selector not found + + return [[appMenu itemAtIndex:idx-2] submenu]; +} + +- (NSMenu *)findFileMenu +{ + return [self findMenuContainingItemWithAction:@selector(performClose:)]; +} + +@end // NSMenu (MMExtras) + + + + static int executeInLoginShell(NSString *path, NSArray *args) { @@ -1237,4 +1400,3 @@ - (int)tag return pid; } - diff --git a/src/MacVim/MMVimController.h b/src/MacVim/MMVimController.h index 56fb6d16b9..a48ae7429a 100644 --- a/src/MacVim/MMVimController.h +++ b/src/MacVim/MMVimController.h @@ -38,19 +38,17 @@ int resendMsgid; NSData *resendData; #endif - NSMenuItem *recentFilesMenuItem; - NSMenuItem *recentFilesDummy; NSDictionary *vimState; } -- (id)initWithBackend:(id)backend pid:(int)processIdentifier - recentFiles:(NSMenuItem*)menu; +- (id)initWithBackend:(id)backend pid:(int)processIdentifier; - (id)backendProxy; - (int)pid; - (void)setServerName:(NSString *)name; - (NSString *)serverName; - (MMWindowController *)windowController; - (NSDictionary *)vimState; +- (NSMenu *)mainMenu; - (void)cleanup; - (void)dropFiles:(NSArray *)filenames forceOpen:(BOOL)force; - (void)dropString:(NSString *)string; @@ -61,5 +59,4 @@ timeout:(NSTimeInterval)timeout; - (void)addVimInput:(NSString *)string; - (NSString *)evaluateVimExpression:(NSString *)expr; -- (void)updateMainMenu; @end diff --git a/src/MacVim/MMVimController.m b/src/MacVim/MMVimController.m index be74f1dcd0..53d8daf371 100644 --- a/src/MacVim/MMVimController.m +++ b/src/MacVim/MMVimController.m @@ -84,11 +84,6 @@ - (void)connectionDidDie:(NSNotification *)notification; #if MM_RESEND_LAST_FAILURE - (void)resendTimerFired:(NSTimer *)timer; #endif -- (void)replaceMenuItem:(NSMenuItem*)old with:(NSMenuItem*)new; -- (NSMenu *)findMenuContainingItemWithAction:(SEL)action; -- (NSMenu *)findWindowsMenu; -- (NSMenu *)findApplicationMenu; -- (NSMenu *)findServicesMenu; @end @@ -99,22 +94,13 @@ - (NSToolbarItem *)itemWithItemIdentifier:(NSString *)identifier; @end -@interface NSMenu (MMExtras) -- (int)indexOfItemWithAction:(SEL)action; -- (NSMenuItem *)itemWithAction:(SEL)action; -@end - - @implementation MMVimController - (id)initWithBackend:(id)backend pid:(int)processIdentifier - recentFiles:(NSMenuItem*)menu; { if ((self = [super init])) { - recentFilesMenuItem = [menu retain]; - windowController = [[MMWindowController alloc] initWithVimController:self]; backendProxy = [backend retain]; @@ -133,15 +119,21 @@ - (id)initWithBackend:(id)backend pid:(int)processIdentifier selector:@selector(connectionDidDie:) name:NSConnectionDidDieNotification object:connection]; - // Copy the "MacVim menu" from the current main menu. + // Copy the "MacVim menu" from the default main menu (we assume that it + // is the first item on the default main menu). mainMenu = [[NSMenu alloc] initWithTitle:@"MainMenu"]; - NSMenuItem *appMenuItem = [[NSApp mainMenu] itemAtIndex:0]; + NSMenuItem *appMenuItem = [[[MMAppController sharedInstance] + defaultMainMenu] itemAtIndex:0]; appMenuItem = [[appMenuItem copy] autorelease]; - // Note: If the title of the application menu is anything but "MacVim", - // then the application menu will not be typeset in boldface for some - // reason. - [appMenuItem setTitle:@"MacVim"]; + // Note: If the title of the application menu is anything but what + // CFBundleName says then the application menu will not be typeset in + // boldface for some reason. (It should already be set when we copy + // from the default main menu, but this is not the case for some + // reason.) + NSString *appName = [[NSBundle mainBundle] + objectForInfoDictionaryKey:@"CFBundleName"]; + [appMenuItem setTitle:appName]; [mainMenu addItem:appMenuItem]; @@ -169,9 +161,6 @@ - (void)dealloc [popupMenuItems release]; popupMenuItems = nil; [windowController release]; windowController = nil; - [recentFilesMenuItem release]; recentFilesMenuItem = nil; - [recentFilesDummy release]; recentFilesDummy = nil; - [vimState release]; vimState = nil; [mainMenu release]; mainMenu = nil; @@ -188,6 +177,11 @@ - (NSDictionary *)vimState return vimState; } +- (NSMenu *)mainMenu +{ + return mainMenu; +} + - (void)setServerName:(NSString *)name { if (name != serverName) { @@ -588,42 +582,6 @@ - (NSArray *)toolbarDefaultItemIdentifiers:(NSToolbar *)theToolbar return nil; } -- (void)updateMainMenu -{ - if ([NSApp mainMenu] == mainMenu) return; - - [NSApp setMainMenu:mainMenu]; - - NSMenu *appMenu = [self findApplicationMenu]; - [NSApp performSelector:@selector(setAppleMenu:) withObject:appMenu]; - - NSMenu *servicesMenu = [self findServicesMenu]; - [NSApp setServicesMenu:servicesMenu]; - - NSMenu *windowsMenu = [self findWindowsMenu]; - if (windowsMenu) { - // Remove all items that are added when setWindowsMenu: is called. - int i, count = [windowsMenu numberOfItems]; - for (i = count-1; i >= 0; --i) { - NSMenuItem *item = [windowsMenu itemAtIndex:i]; - if ([item action] == @selector(makeKeyAndOrderFront:)) - [windowsMenu removeItem:item]; - } - - [NSApp setWindowsMenu:windowsMenu]; - } - -#if 0 - // Replace real Recent Files menu in the old menu with the dummy, then - // remove dummy from new menu and put Recent Files menu there - NSMenuItem *oldItem = (NSMenuItem*)[recentFilesMenuItem representedObject]; - if (oldItem) - [self replaceMenuItem:recentFilesMenuItem with:oldItem]; - [recentFilesMenuItem setRepresentedObject:recentFilesDummy]; - [self replaceMenuItem:recentFilesDummy with:recentFilesMenuItem]; -#endif -} - @end // MMVimController @@ -1064,28 +1022,25 @@ - (void)addMenuItemWithDescriptor:(NSArray *)desc item = [[[NSMenuItem alloc] init] autorelease]; [item setTitle:title]; - if ([action isEqualToString:@"recentFilesDummy:"]) { - // Remove the recent files menu item from its current menu - // and put it in the current file menu. See -[MMAppController - // applicationWillFinishLaunching for more information. - //[[recentFilesMenuItem menu] removeItem:recentFilesMenuItem]; - //item = recentFilesMenuItem; - recentFilesDummy = [item retain]; - } else { - // TODO: Check that 'action' is a valid action (nothing will - // happen if it isn't, but it would be nice with a warning). - if ([action length] > 0) - [item setAction:NSSelectorFromString(action)]; - else - [item setAction:@selector(vimMenuItemAction:)]; - if ([tip length] > 0) [item setToolTip:tip]; - if ([keyEquivalent length] > 0) { - [item setKeyEquivalent:keyEquivalent]; - [item setKeyEquivalentModifierMask:modifierMask]; - } - [item setAlternate:isAlternate]; - [item setTag:1]; // 'tag != 0' means item is enabled + // Note: It is possible to set the action to a message that "doesn't + // exist" without problems. We take advantage of this when adding + // "dummy items" e.g. when dealing with the "Recent Files" menu (in + // which case a recentFilesDummy: action is set, although it is never + // used). + if ([action length] > 0) + [item setAction:NSSelectorFromString(action)]; + else + [item setAction:@selector(vimMenuItemAction:)]; + if ([tip length] > 0) [item setToolTip:tip]; + if ([keyEquivalent length] > 0) { + [item setKeyEquivalent:keyEquivalent]; + [item setKeyEquivalentModifierMask:modifierMask]; } + [item setAlternate:isAlternate]; + + // The tag is used to indicate whether Vim thinks a menu item should be + // enabled or disabled. By default Vim thinks menu items are enabled. + [item setTag:1]; } if ([parent numberOfItems] <= idx) { @@ -1228,7 +1183,7 @@ - (void)connectionDidDie:(NSNotification *)notification [self cleanup]; // NOTE! This causes the call to removeVimController: to be delayed. - [[NSApp delegate] + [[MMAppController sharedInstance] performSelectorOnMainThread:@selector(removeVimController:) withObject:self waitUntilDone:NO]; } @@ -1258,53 +1213,6 @@ - (void)resendTimerFired:(NSTimer *)timer } #endif -- (void)replaceMenuItem:(NSMenuItem*)old with:(NSMenuItem*)new -{ - NSMenu *menu = [old menu]; - int index = [menu indexOfItem:old]; - [menu removeItemAtIndex:index]; - [menu insertItem:new atIndex:index]; -} - -- (NSMenu *)findMenuContainingItemWithAction:(SEL)action -{ - int i, count = [mainMenu numberOfItems]; - for (i = 0; i < count; ++i) { - NSMenu *menu = [[mainMenu itemAtIndex:i] submenu]; - NSMenuItem *item = [menu itemWithAction:action]; - if (item) return menu; - } - - return nil; -} - -- (NSMenu *)findWindowsMenu -{ - return [self findMenuContainingItemWithAction: - @selector(performMiniaturize:)]; -} - -- (NSMenu *)findApplicationMenu -{ - return [self findMenuContainingItemWithAction:@selector(terminate:)]; -} - -- (NSMenu *)findServicesMenu -{ - // NOTE! Our heuristic for finding the "Services" menu is to look for the - // second item before the "Hide MacVim" menu item on the "MacVim" menu. - // (The item before "Hide MacVim" should be a separator, but this is not - // important as long as the item before that is the "Services" menu.) - - NSMenu *appMenu = [self findApplicationMenu]; - if (!appMenu) return nil; - - int idx = [appMenu indexOfItemWithAction: @selector(hide:)]; - if (idx-2 < 0) return nil; // idx == -1, if selector not found - - return [[appMenu itemAtIndex:idx-2] submenu]; -} - @end // MMVimController (Private) @@ -1342,27 +1250,6 @@ - (NSToolbarItem *)itemWithItemIdentifier:(NSString *)identifier @end // NSToolbar (MMExtras) -@implementation NSMenu (MMExtras) - -- (int)indexOfItemWithAction:(SEL)action -{ - int i, count = [self numberOfItems]; - for (i = 0; i < count; ++i) { - NSMenuItem *item = [self itemAtIndex:i]; - if ([item action] == action) - return i; - } - - return -1; -} - -- (NSMenuItem *)itemWithAction:(SEL)action -{ - int idx = [self indexOfItemWithAction:action]; - return idx >= 0 ? [self itemAtIndex:idx] : nil; -} - -@end // NSMenu (MMExtras) diff --git a/src/MacVim/MMWindowController.m b/src/MacVim/MMWindowController.m index ede1a753a6..2a78cae3d4 100644 --- a/src/MacVim/MMWindowController.m +++ b/src/MacVim/MMWindowController.m @@ -263,7 +263,7 @@ - (void)cleanup - (void)openWindow { - [[NSApp delegate] windowControllerWillOpen:self]; + [[MMAppController sharedInstance] windowControllerWillOpen:self]; [self addNewTabViewItem]; @@ -649,7 +649,7 @@ - (BOOL)validateMenuItem:(NSMenuItem *)item - (void)windowDidBecomeMain:(NSNotification *)notification { - [vimController updateMainMenu]; + [[MMAppController sharedInstance] setMainMenu:[vimController mainMenu]]; [vimController sendMessage:GotFocusMsgID data:nil]; if ([vimView textView]) { From d1a9e08f94400c8564a1e7ad11e6ae296abc314c Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Wed, 4 Jun 2008 18:17:23 +0200 Subject: [PATCH 0486/1156] Add standard menus to default main menu --- .../MainMenu.nib/keyedobjects.nib | Bin 7688 -> 10777 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/src/MacVim/English.lproj/MainMenu.nib/keyedobjects.nib b/src/MacVim/English.lproj/MainMenu.nib/keyedobjects.nib index 241ca9cbc215547607056ff4caabc65d29f516f0..ba0a63ad1b114ddcad891fe91993672343a1fe4d 100644 GIT binary patch literal 10777 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 NvM=#j_18E0e*no7otgju literal 7688 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 Date: Wed, 4 Jun 2008 18:25:08 +0200 Subject: [PATCH 0487/1156] Hook up "MacVim Help" on default main menu --- .../English.lproj/MainMenu.nib/classes.nib | 2 ++ .../English.lproj/MainMenu.nib/info.nib | 2 +- .../MainMenu.nib/keyedobjects.nib | Bin 10777 -> 10856 bytes src/MacVim/MMAppController.h | 1 + src/MacVim/MMAppController.m | 6 ++++++ 5 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/MacVim/English.lproj/MainMenu.nib/classes.nib b/src/MacVim/English.lproj/MainMenu.nib/classes.nib index 4a0573b97d..a4684b9ef0 100644 --- a/src/MacVim/English.lproj/MainMenu.nib/classes.nib +++ b/src/MacVim/English.lproj/MainMenu.nib/classes.nib @@ -23,6 +23,8 @@ id selectPreviousWindow id + showHelp + id CLASS MMAppController diff --git a/src/MacVim/English.lproj/MainMenu.nib/info.nib b/src/MacVim/English.lproj/MainMenu.nib/info.nib index fb4d19ea6e..cde701ab98 100644 --- a/src/MacVim/English.lproj/MainMenu.nib/info.nib +++ b/src/MacVim/English.lproj/MainMenu.nib/info.nib @@ -10,7 +10,7 @@ 5 IBOpenObjects - 218 + 233 IBSystem Version 9D34 diff --git a/src/MacVim/English.lproj/MainMenu.nib/keyedobjects.nib b/src/MacVim/English.lproj/MainMenu.nib/keyedobjects.nib index ba0a63ad1b114ddcad891fe91993672343a1fe4d..06716af282b44dbfbbca91a0baa7fe554c2dea9f 100644 GIT binary patch literal 10856 zcmbVR3!F^l`+wha-nrk-ncF#gnK>tRwUYatDt>fxbtl(K+-3I*%@*%jkD>1^tCJSc`R7k1g1VUD%BUoQ@mf44jD@;X80k+zPkG zZEy$N6?enkaSz-Z=i)p(01w24co-gzM_?ZwhXZ&#o`9?Hy*P>|;~1WSAHWad1^5xX z5I>3+}%{+_H}j}`v$w6eUsh6zQyijcd>7?yV-ZxJ?vg~AG@DDz`o1A z#~x(gXAiN5*(2-+>{0eZ_89vSdz}3bdxHI#J;{E;e#)L=zamY^WO5&wLZ*^w&WeizFnY+fW145M`iD)Ck>!w*E;`kYadTmiPq9#PD78A^Kwsccuoq zooeZMdV#(f!yPH2I{HQocj9p$`qPKthE}LGY6D8DiYZD^4P}*qcBnn-034b{qTxVr zEF~a%_bPy?GM{3k4^b!78Qq1tl*Fy?j|`391c62^>Vob@T~#0CR!4oHUV%!bB(LDc zOlC4M!u; zNK}eOAs-rz%1}A-qcPM-Me3yuX%pI#wxykDSDH<8XdW$~gXwTuO3UatT1mrnBAr5~ z)0xLW&T%M!#-jnqafW&~|Qn?VSPHmFa8tw|zm2N7;dh#)76@D@n93w-%7 z3_eoI*?TBUT466oLvrsh*auwZ3x|EdvHqN(`l3^^S@xoRXg|o1MKkCf^-1v_NO3S> zh{GU7BYL}Ph|HUjbrgLF5^SPdhUWQeDQ;?A=cdA; zp-|=UDt~xPC|s%B-=gSV^e4Ke8onLvSPxx{Pz}aO5!jw~h(}-r;9FQhF8EWfK~Pv# zE&t9^E;SS`_lH$K4-EUq_{08SnSY=!=&!hiyM#^H4BQ#onciI=cN=i$lDOYRyTrK< z>jM!j=laTu1C{yXij?@ih4NmUiqllRy3wBXQT765DJh`3(;o4F@&j^LDf-Bb@FHoJ6c2?VljlGgLJ>zpSVXE=k0)aW5b?fDWpUSRWvklSFJF%})?3g2EvG zzM^WlBoP~g3xHT5Ev}DPaZ89YRw*;Zjjzq|Bw?yKA=s0Mj0Be;S}#ro$2(`uHoVhD0DMDmO`ixf{O&bZh8+^-T&prZ;jpK83#kR+K(apBi6-8s8+;P_k!?&QR6JEb3Viium(uMkGQ?eM~aW zdHf?#oki!=NA+To$$tZ?4<=NYom3g%%V-V00=|9`2GgAEWu>Ts+Nn%=800VW z2cy}cvg%5>M&dOVzJ~v*#ed=JYQ>%?w7Wz3Fc~U9^{N)z3}zU*Z3EW=&teGrlhNWq zj2>Np^<2uB(OR?}DY1GUZDJgZ6aU7z83F8c6r0dKoXU7$nXJQG&{U=Y(-3FlET$1U z%w*wq%pG_)b0<^)pE1oLhp%8-!FruX+tEb;hfhKR9tAkIgr-tiT?4bAa(aQ*(%E!9 zoev(E3dt;kcB8M-01eRyHPf~96+q=)^ck8-7X#RDg>YL4l|?hU63X-xy5bXLW!gXn zO)Axywoo!`M{nJ zHSibjBep|9n-eMUSNXy|sCS_)$cbbJB1&6U4&tR7l>dr&vRXkiB`CTY3Zbt5r1n(k z5^mJJptcW)n4wRI*S_=V35y*VxQAM}D~d-)c<=D@TNpkSR|PZcWIROgZTbna?Ey;=yNU~wG8 z>V_84x$E&!^f^TApG+&JInw|NsTzn>J$@YG?@oxcc60?q*IJ0hQ4nEI(!l>;mwy!l z|IP%Ali7UJ1ZXX@4NOo=S0zl4N>`T@_`?$eu!)i!$2*v}n4J*EYv^#G&SSIID#b*Rvewlf06iGZf6fW8*sS^%91 zR5|PLZ-9`8A^hFwFzn|YhA-B_?_qU@8LwlsiJ35$@c@OX@YPh9vlgyEN%50;z<{5!!Lu?`nft1GW#Ct#!oZ*M zHnmQh-ikIY(Vw_RNll4ll#Ne;p^gG-nUrJ%dff?2c{g(hB%cYeu!)k=0F(8&6eQk@ zw&Pl~37=QfSt^>~Ct_Hp(Jb}{=T zy9AwJpJJD>PqWL}XV?|&N_G{ynyqEmu+Os3v1{4q*%#Os*>!XWeT(j-yXf0=H)OJR z=pMS4?xXwZ0s1a|j~=A&(?j$yJwiXAN9l+382yMIr~jcR=*RRVZA?F*pVH6h=kyf) zf__QAqF>W*=(qGc`aL~O&(O2<9Q`2#+jY5W3tNq3l%w|Om2j8!Pc1HjodiKyiL$bZ zC1*XzZkNQ=Ava2cVK?rYwz*Z} zoAq?#VM(o1i1Yq~YyQP1i{d6*lJc<2*f>docDD)}FOU9a6s6Gkn^N%(_ix`R8!O4Q zTi@ycA0#{fW|5sNQL8#z zWYy)!#vzXX2jkw@0zq}&O&B6MV3Zw=znMW%Fqvt~TjMFAml`Qaj%YhLvHg{ZB$Y}j z=S))ihRlC^o!I3BF_OQo>y{hWVb$k!8*Jf2r3-oG%cT2n6b#Ej!(kU}04j}RGwj!o zM1%ja22drBK;)#rT0f6ZWqI=XtRMMd_oitQqx`*b)@m`7*AdBP$%O(;mTFACBttxF|f{Y1cerG4o{YoTR{ z<9!4WKL<`5ly;>VoJS<1K54F6jI|OtJJOzXARS33(wW>vx{$j`SJI7i zCp}0{l1+M%-sB$AhvbmHq#x-|a!DQ;Kn9Y0GKdtALQ+JE$zW1KhLE9T7#U7RkddU6 zj3PcVnv{`p;wNLsSTc?T$ape=RFFy%Bq35o?j>OoAyHCICXyO5iC&~X(_iSX^f!8m z{+C{+ztb!94|H@vM+`e-*cHR>7#3n!jNz0RPL1KT7*3C2PYiowSc+jehHs1E1~J?) zhBIO~Glm<*@a-|26~m2V_>LHE62o`KaMKuW7Q@YBxJ3-NjNw)>+&YHa#BkdfZWqJt zW4Hs4yKyld-_7Hm+@stXt|O1LxkWs7@z};=E$88W=Q?q-xlehV#$$<_!=2@EFCO2; zb>J5AxFdI-TfpOn4mf>L{$1noJ=}F3d%30DBit44Dv#Up*v{2KcHo=MZ`|KI^zr;Y&AQ-zsh~+_W z6+mE>Ku8UTa2f@nR1QHDfB>q5(1}3M+z+SJ^WlX0NjQJ5g)`uY28|{ww1Pvwx700J6api zPS93r!`i5JvUZAgns&N&zIKWBDecqRXSA!eYqT4+yR^Htd$jwshqYg7&uTB|u+FOE zbatInce}2IuC1<{u9q%PSEQ@dP1QZDTc%sCTcKN}tJUq%?b995y{CI$cUbp~Sw9K^Jw8FH?wA-}Dw9jh>mlm}>qYA?*59oEwf=7X!=|-yHjhoR-DYcO%eM8l^|AG}^|$5O2HJ+% zM%c#LCflairrD<3Vzy^&D{ZT7Yi!Tip0~Yd+iE*u`_}fo?TqalXW}fJjpI27=i&qa zEQxChkaZV#H`k5xab=vJ8_NZ_30x(2KS#M4+)RM8N4XccSGjH60qz6tB!Ju9d^f%a zpUwB?`|y4F{(K%kkRQYs^2K}!Ka?NNkK{-3qxo`v3_p$^&sXq4zKRd?QGOyniNBAZ z%HPjZeg;32pUuzVAL8fp3;2cnBK~oHF~5X=ihr7ahTqR0>uxHqt+MC;3+FRS(+DFNw{(@3`Q&==jC)o8!NZ-yMHA{&f81L{7%p#M#u@+}Xm}%Gui4 z*4f_K(K*^#?i}MB>kK%@J1d+)XO(lQbD49wbA@x2v)1{nbFK3Q=c~?loO_-7o$opi zIzMv$$N7cxE9ckF-&`J-}ulb;PSc3Tz=OW*Em-xdI0`Ci0>~bcuqPBBqHRQ4((x8;Y6Y z?P6oGiP%(ZF18d~i*3dBVn?yF*hTCrb{Bh!y~KOO9I>BRC>D#`#U0{K@on)Paj&>v zd{;au9ukj;N5x~}aq)zBQv6i>T>L`(O8iFrPCPB16@L(a6n_$b7Jn5liI>GI;#KjQ zcs&KDuqm1pU5X*alwwJ-rSK_^6jzFnl9G~^;z=2pGCpNm%Dj}7DQ~14O8F|~k5pG` zR%(yb;i=oa`dI4v)Ynrlry0^*X?LV`NgI^rPrEm5R@$Ppm1#TDPNiK=XVYEj zozi=!4@s{`pOn5R{h9RV(qBz~H~q`>%O2!mJgmp;v3hJC(Ua=g;MwTee=Sm z?%Cnl>3Q4pj%TlDzvo@gLC+!25zkT2G0$<&3C~H-r=HI}UwFRqeB=4fbJ}y(^MmI{ z&rhD8J->P`c`kddc&>V`d9Hi0m-TAAI;w$FYk4DU0%VP;!X2PTl}N*+k&;g;m&QutrAnzvibxZs$(YCC!oMNeiS$rN^Zw zrKhCj(n_gTdQN&lS}$#oHcFeNtN(ZEa(jn=HbW}Pf9hW|qK9xR~ zzL36_zLQQ%XQlJf1?i&ntMsRIUB)tzwX$9|%4XRn+hwOL$f>eNmgNR=rko`=k(-$S+}%FLL}Cm#ag@W*4P~kyEAKM7F*<;!XH1ycxfPcjG;HFW!eg#Gm5N@KJmme}hlqZ}GqJ zdHgfJfG^@-ncAoslgTt@9%b4x*-Seoj~U1eXGSnVCd8C6Q6|QWVJ0$^i8E7}smx4x zGM`z-tYO}S(RyYx^ER^+MjycM5#|K^{gOG$Tx71o=nv*5t7G-7k!{6}W>>MVvahkL z*){B1_H}k0`v&_ayPn;^Ze%yHZ?T)%x7jW1R(2cv4!fOwm)*hcWOuRevG23H**)xD zb|1T+{eV5d9%Mgc53wJyhuM$WPuL^ur|f6!QTB8882bf#lH5ni$Y>HFQ4%BNWDFTg z#*qs01bLE-Clkn1WFny?PM#){$Ye5wOeN2dX=FN?L7pYgk>|-wGK`w?8t(w$c8w?BRg^+CvqV-5|D_}P&&#$9wZ?z zl93PHgKD9BQEhY|s)I67T~rU%M-5OzbU$i@9za z15t$zj5|c&%h+&al=4=BqVl9a@B;$M5FV%t?#3udI~-Bo><|vca{M9x@Ia)H2`H&5rYJ!*lvN%yMUS9nz@bqz772!iQv#y5 zDFc8i@+(FVP_e`I9&orTS$FGM!PE6{rj9 zidus~su%}i`M@<0ORUU6-RYF|oPc_uo+uafLV2h+%0~sL59*8hq5fz98i)p=!Ke@o zL4Gt86`^7jphlWbee^zBpEjaR>7(><+MafyJ!o&*mkyvqXn+Q3h(_r+I-b&FAmeZ} z0tL}XGzyiVQZQY+Kr|K%sisqm5H61t1^RT)>*gOCD4}W8O-)oh0qer342?z+6h$#q zj>e#|XdJ3QPoO8!cr*bP^bW>K0)-r}VtV`0<-svI;o=;BbQIVFVnUq(b~&LyX*d)t z>J}~nANB}!E`@kgj1n9dC|18f^5g_U<Y!#tgD{$iD2k(} z(Ihk(-d2JG0!3NWITk35()sjxx{%HcLqcbRwgE8JC`j62urdOl<)BG1m@o!UqP{vk zKL?tP(KIw2%|OqBqk9FSsuk3rvr~@ppq?sPB5r_B_J}~ys8WAqRKmTp(CkVyTZt=3 zn?#&c5lJOJmnzhp>RXDms?K>ae=Lw7GaoIeL<>-BuvnEcRhh6DqF?Bjm!Dq-#Z%4C zB1MD_;Yea8+9E+>DO$DyEknx{SzKV6;7~~MSR`C>JJUhI#H<1;;fNw%A|O_xRp9Ro zD%a%g)!^+lNpG(M*GSZ>I>e)_53BB2k2Zki-=OPz=L2BmK9OGzA1$isZ$Vpu{ynsI zP4u?|{dZI7*P{0(=z}?9x#M~lmB&&@?L+&4R2^EcCQ=7e0`oA4T9;Z?Qkki-a|B}d zGZ1$ZJlx#7e>hw^uq+T67LJrE;})rjBBL+R31G+22K4@#7=D$)Z~`!Fm}F?~n>Qjn z*4L(_q>yu$heia8129g3s^}ej&Z6(pIpFgUeSkh(6Q7@e&-tW{E&`tiX=7EftZE-z zM!$kmFVj~703&4(-yvU}+;CM8U45wJtKi( zfk+@!6zJ&>1xl*@i;dU>oLkb?HSx7pn;YAK?_)`Gw@UFZcA*L^fGHNi!^QoxO9K9g zPsu6BiX!DpuRu{C6l)hQDldi4XbNu+mVkE~+O8(vKG6A|lrU{evlC(3KQB-M`J^~I z*WW*?et~fc-TJrz(Ct7w*F?7w(0w4qwH;}vglqG&OTy7W?$|-e=v2R^P;G{r1J$my zdreeZ0@YSYs!Aqwqd6+o%)U9nP_Q)kL?E}ckaHwSD|7x>c?72K3FoB&;6(xI=Lrsg_hR)kqhD&fM$UKl1)?|+|u*c}6Jrt}QL ztRlB4zX(45VT32~c-07gT3i#!i9nJjNh%OCloqKZ%>#1FgH?9O9o-*FL#a~C11TXg z9nS#L!{~^b2tQw)Oh}P+c+$e2f_7k=SfGz$A|Q9$hR`{j#q;q3Ao&m-NlR-Yy11Gs zUJ67@l0-+{1}a>MS3q{IpsNNaeCX>F7#a=60t3TK&6n%J!ad{FZ|(?ycLm(luXlxa86Ut0RgM+($(lHR1Zt#meBw@K2|ML0j8Y794F3ygPM{NO zqIja(4@k-Xr;>iiEadEMmEKu_D_<<^Q{fm2gFh1ShlU3_ht!D_HmC6!U=yd4Yhv>~ z2!1Zb{!i0M$$0M-fJUHyegr-e{RzH=e_4Tl!I#yJI@t)f0j?F$VyT~MGmNj`-{{u$ zTo(QvisC-V+LibkzK;Jw6QDNO@h!ZS!MG#3$PhfA(K0%G0BwP!^q?-j2W#EA@G|KDfi*z;}1$GA0Py?ZMH+n~B#{d`Rvs zm{Cj#Qwj(*m(HUvDf+^$lYzZvmFf{XWf>$)p|XKX5L3DfwFhU)QF$e7GFtyXRUHUK z6%+|56bC4MnJ>|;RPmlfr!2=t+Ol^C=-a9$r_m{^AS1qq$QE#Yh}{Pu2A9zecQG6! zkt@Y;7nylrrB-UYq(oL0UHacjuXLi-A(?eIeoJv>H9tt%)v#<76o5o;UP)J`bZ^Y- z%sS=`u>Pxb3w^D(5_wf>ZlqHx@n3j8r0U4NIsRZMVRmKfox^Me8!$SChdk#P0$IBj zGIAqbeixb01lU5}-o%1T`#~l%>>aCQT64FB7t!TA7JdQ?v!Ly+TKM|i7Oq30F2`Wl) zuXdB?ZUP=gNA3{tKd>xQ-6bhuQAyt_Nc3=3{jttV)c1(H^%^-QT|T>-0=>ZMdIr5-*6n9TrYyP+1&0*7Wo z4O|YItp)^-gZ@gjtEzOjt6Y2VPgK>2jj`qI7j;&yyV4q~ivlE!t*@-M=3Yn^{Crpbe)2SP}e=t_Ncwp?k3*-Odj873FVX}lr6Pp{D zOm*NL#!Tts!yJDX&bQB4P`!S)JvvbFKxWj}V{9l8NpbXpeQqD#rMk8HY$7!(9!go* zBpFQ!d~x2mCnnLETu_E}YNuIiS;v}rQ_lf+UTo3cl)SB1XE=~g(K zhrR)D>&uk!*9wMpg2Q*fWe90FW>YfAot1VC^`c&aF8k|6AGzhxj9&l8jTZPnc zT;B_h>-*h-*a2)rqtFlqwefs(IEmVRIN0wCM~sE2cQt;a;>1n`5IkSqr__hingK`s z%0a$@<%vB?Pr&pnIP$MT^C9Z)q$?c!=TjqG2Ka8{dJniF=nEGEsrXI--`#LMpkVw+ zK=}m5hiGrOLTEq(aG_9*_T!T~n+I+HG>E9pjZNO#hM z^dz~Y7s(^NNj@nceMn!@kMt)4$UriP3?_wS2=SAlq=*!g02xMxlMy6HMv_sagp`sH z3DZmT7kZigO0Ur0={z+~;rgZ@o#(pzzi;uyyt9NXjA5y#FrcEzzfj)gcD<2Wsj)8jZJjy-WK z#j!VziQ|X4g*B00O8#1kYdyn<5CA;SemPBn;Qjli`|q8eA$bh707^;aYenIY^F> z)8st)joi?HaWwa88fqTVG}pAyWNW%;`e+7ehG|A<7HSr2UePSoEZ3~itkS%uS)+Mf z^M+={(0(FJuOU4`yx-DKTV-E7?o-8$V{x{q`xbwB8S(*3Nv zsJH4lyC5yHeM~<_KTiLI{wY1x zPtniO&(+VNhaBJkEx-lk*T?aHb)D$+2HbqV4rm?09(?nC;G|Tj|X^Cl>snWF9wBK~V^r7h^)5oSGrW2-z^D*;r^S9<7&A(W*7Kg=U5iDtz7M7Nl$1IOq+FIIKI#{||ax8h4V#_eg z2+K%IiRF3AEXxa)7cDPY=35q8R#{%NY_hy(*=^Zt*>5>#`O$LTa=~)Ra@lgla?OgZ zcB|9swu;tt>!a3I*4EZG)@*BgYe#EuYk{?|wZAoJ9b=tjonn2)I^DX~y3YEhb%S-2 zb+dJgb%%AAb-(qv^@R1L^=s=X>n$6$u{OQUXfxZaHqPd;d2Nr_I@!9|y4kwhdfGLH-bbnE!XUu)lN-)Vo(zT3XnzTbYp{-OON`^Wa<_V4Xi?SI;@+i%!!I&=<$ z!|rf8T#igfmg8Z^V8;;0P)Cs?;27o@;TY*Caa1^_IA%I#J6?3Wkrvoa3BNILABV&Kb_S-;%jc@)s_m-ds_UxnYUpa@%5wE{4R8%|6}tScB3HmQ+!b_% zTw`4ot{JZ9Tr*v>U2|M>UGrQET#H;kxNYZpKaA zTDRV9bo1_Xx5s^-JJVgy-N1dnyTIMo-QPXHJ;*)SJ;XiKUFYKjWV6zTm#( zzU;o@{@s1m{ipl7`-c0bfCNS$f>zKAM!_st1x~OFPQfjRLb~7)yn;`tCDaz`2z7<} zLPMdEkR>!0ng~sWWWxX@N;Cv*@x30;J4LcY*P*dgo^-WT==`-BgKgTf)< zu<(iSsc=*{CL9+|2q%TFg;TRpC$Jx^P3dDI$>( ziKrFzqER%9R*@6!qEmE>qL?mvM6Z}B))Qxnv&A{$TydVbKwKogEG`k3iIw6?@l|oP zxK>;zzA0`HH;J3YE#fwDySPK#CB8525%-B7hzG?(;$iU<@l)}rcuYJlo)AxpUyG;2 z@5D3WS@E3sqj+AtAYKwLr?F}7w5+tp(t4&1OdFFnD{W=khO|Rz-=tklH>S5r@0}h_ zpOn5Q{fqQp)Bnz>mC-Pxc}Dw;oQz=^k&LG@p37L1u_NQNjB^=(dpOU%o(DWVJw={! z&vTvyo|T>roh2%($mspX{t0$njt+W&6H+KbELV_JZXWn zNP1aXA}y0DrIpgF(rRg~v`%_c+8}L`HcMNiZPIpWhqOz2U)m$>lRl6RN{6Jw(kIfV z(oyM{bX+zIq65~ymUdjBwd!SNWV*0r9Y+X(hcdR7kL>k@oK$# zuhDDvTD_b%&70wU)4RdD$-CLR#k@;^J?s6!d)|A|d)fP&_p0}r_lEbD%*Yy9FPmhm%*#$$kke&J_R06kb>w<- zL-_%@vHY;yOny{;Ol~8$lRL^?F@6{H*-EJWGB-o-5Cj7s`v}SL9{#3VD_Mn!H9{C$E<`%A4h_@^*Qr{GPl= z-Y*}J56Oq+Bk~FPEBPDwTltK9R{lXgFJF*`0Du@_!{}Le9e82`da$h`#SnM`Eq@EzTUn;zM)9{$1sUc NvM=#j_18E0e*no7otgju diff --git a/src/MacVim/MMAppController.h b/src/MacVim/MMAppController.h index 0236eaaed9..8021ef6be0 100644 --- a/src/MacVim/MMAppController.h +++ b/src/MacVim/MMAppController.h @@ -38,5 +38,6 @@ - (IBAction)fontSizeDown:(id)sender; - (IBAction)orderFrontPreferencePanel:(id)sender; - (IBAction)openWebsite:(id)sender; +- (IBAction)showHelp:(id)sender; @end diff --git a/src/MacVim/MMAppController.m b/src/MacVim/MMAppController.m index 0a978d6d53..89bd2ddafa 100644 --- a/src/MacVim/MMAppController.m +++ b/src/MacVim/MMAppController.m @@ -736,6 +736,12 @@ - (IBAction)openWebsite:(id)sender [NSURL URLWithString:MMWebsiteString]]; } +- (IBAction)showHelp:(id)sender +{ + [self launchVimProcessWithArguments:[NSArray arrayWithObjects: + @"-c", @":h gui_mac", nil]]; +} + - (byref id ) connectBackend:(byref in id )backend pid:(int)pid From c2f8b396de2f5c2f0512511649b9aaaf4d708f61 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Wed, 4 Jun 2008 18:45:45 +0200 Subject: [PATCH 0488/1156] Add "Cycle Through Windows" to Windows menu (remove hack) --- src/MacVim/Actions.plist | 4 ++++ src/MacVim/MMAtsuiTextView.m | 8 -------- src/MacVim/MMTextView.m | 8 -------- src/MacVim/gvimrc | 4 ++++ 4 files changed, 8 insertions(+), 16 deletions(-) diff --git a/src/MacVim/Actions.plist b/src/MacVim/Actions.plist index 7df6bff739..344b0da1c6 100644 --- a/src/MacVim/Actions.plist +++ b/src/MacVim/Actions.plist @@ -2,6 +2,10 @@ + _cycleWindows: + + _cycleWindowsBackwards: + addNewTab: arrangeInFront: diff --git a/src/MacVim/MMAtsuiTextView.m b/src/MacVim/MMAtsuiTextView.m index b5bd731b69..8ed5713e4f 100644 --- a/src/MacVim/MMAtsuiTextView.m +++ b/src/MacVim/MMAtsuiTextView.m @@ -416,14 +416,6 @@ - (BOOL)performKeyEquivalent:(NSEvent *)event if ([[NSApp mainMenu] performKeyEquivalent:event]) return YES; - // HACK! KeyCode 50 represent the key which switches between windows - // within an application (like Cmd+Tab is used to switch between - // applications). Return NO here, else the window switching does not work. - // - // Will this hack work for all languages / keyboard layouts? - if ([event keyCode] == 50) - return NO; - // HACK! On Leopard Ctrl-key events end up here instead of keyDown:. if (flags & NSControlKeyMask) { [self keyDown:event]; diff --git a/src/MacVim/MMTextView.m b/src/MacVim/MMTextView.m index 7460dbe05d..912b02151d 100644 --- a/src/MacVim/MMTextView.m +++ b/src/MacVim/MMTextView.m @@ -651,14 +651,6 @@ - (BOOL)performKeyEquivalent:(NSEvent *)event if ([[NSApp mainMenu] performKeyEquivalent:event]) return YES; - // HACK! KeyCode 50 represent the key which switches between windows - // within an application (like Cmd+Tab is used to switch between - // applications). Return NO here, else the window switching does not work. - // - // Will this hack work for all languages / keyboard layouts? - if ([event keyCode] == 50) - return NO; - // HACK! On Leopard Ctrl-key events end up here instead of keyDown:. if (flags & NSControlKeyMask) { [self keyDown:event]; diff --git a/src/MacVim/gvimrc b/src/MacVim/gvimrc index 6b3ab099f7..baaa8bbe84 100644 --- a/src/MacVim/gvimrc +++ b/src/MacVim/gvimrc @@ -81,6 +81,8 @@ aunmenu Window an 9900.300 Window.Minimize an 9900.310 Window.Zoom an 9900.320 Window.Toggle\ Full\ Screen\ Mode :set invfullscreen +an 9900.325 Window.Cycle\ Through\ Windows +an 9900.326 Window.Cycle\ Through\ Windows\ Backwards an 9900.330 Window.-SEP1- " TODO! Grey out if no tabs are visible. an 9900.340 Window.Previous\ Tab :tabprevious @@ -238,6 +240,8 @@ macm Tools.Newer\ List key= macm Window.Minimize key= action=performMiniaturize: macm Window.Zoom key= action=performZoom: macm Window.Toggle\ Full\ Screen\ Mode key= +macm Window.Cycle\ Through\ Windows key= action=_cycleWindows: +macm Window.Cycle\ Through\ Windows\ Backwards key= action=_cycleWindowsBackwards: alt=YES macm Window.Previous\ Tab key= macm Window.Next\ Tab key= macm Window.Bring\ All\ To\ Front action=arrangeInFront: From 11ec93a03a0ea8cad5d677f6da23d958844086ce Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Wed, 4 Jun 2008 19:03:33 +0200 Subject: [PATCH 0489/1156] Add "Minimize All" and "Zoom All" items to "Windows" menu --- src/MacVim/Actions.plist | 2 ++ src/MacVim/MMAppController.h | 1 + src/MacVim/MMAppController.m | 5 +++++ src/MacVim/gvimrc | 8 ++++++-- 4 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/MacVim/Actions.plist b/src/MacVim/Actions.plist index 344b0da1c6..5e578cf748 100644 --- a/src/MacVim/Actions.plist +++ b/src/MacVim/Actions.plist @@ -68,5 +68,7 @@ unhideAllApplications: + zoomAll: + diff --git a/src/MacVim/MMAppController.h b/src/MacVim/MMAppController.h index 8021ef6be0..6405a93955 100644 --- a/src/MacVim/MMAppController.h +++ b/src/MacVim/MMAppController.h @@ -39,5 +39,6 @@ - (IBAction)orderFrontPreferencePanel:(id)sender; - (IBAction)openWebsite:(id)sender; - (IBAction)showHelp:(id)sender; +- (IBAction)zoomAll:(id)sender; @end diff --git a/src/MacVim/MMAppController.m b/src/MacVim/MMAppController.m index 89bd2ddafa..c6f9a4371a 100644 --- a/src/MacVim/MMAppController.m +++ b/src/MacVim/MMAppController.m @@ -742,6 +742,11 @@ - (IBAction)showHelp:(id)sender @"-c", @":h gui_mac", nil]]; } +- (IBAction)zoomAll:(id)sender +{ + [NSApp makeWindowsPerform:@selector(performZoom:) inOrder:YES]; +} + - (byref id ) connectBackend:(byref in id )backend pid:(int)pid diff --git a/src/MacVim/gvimrc b/src/MacVim/gvimrc index baaa8bbe84..9095a0ee8e 100644 --- a/src/MacVim/gvimrc +++ b/src/MacVim/gvimrc @@ -79,7 +79,9 @@ an 20.470 Edit.Special\ Characters\.\.\. aunmenu Window an 9900.300 Window.Minimize +an 9900.301 Window.Minimize\ All an 9900.310 Window.Zoom +an 9900.311 Window.Zoom\ All an 9900.320 Window.Toggle\ Full\ Screen\ Mode :set invfullscreen an 9900.325 Window.Cycle\ Through\ Windows an 9900.326 Window.Cycle\ Through\ Windows\ Backwards @@ -237,8 +239,10 @@ macm Tools.Previous\ Error key= macm Tools.Older\ List key= macm Tools.Newer\ List key= -macm Window.Minimize key= action=performMiniaturize: -macm Window.Zoom key= action=performZoom: +macm Window.Minimize key= action=performMiniaturize: +macm Window.Minimize\ All key= action=miniaturizeAll: alt=YES +macm Window.Zoom key= action=performZoom: +macm Window.Zoom\ All key= action=zoomAll: alt=YES macm Window.Toggle\ Full\ Screen\ Mode key= macm Window.Cycle\ Through\ Windows key= action=_cycleWindows: macm Window.Cycle\ Through\ Windows\ Backwards key= action=_cycleWindowsBackwards: alt=YES From c0159b8fdf5a69e4cd94775be38916725a41309e Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Wed, 4 Jun 2008 19:08:52 +0200 Subject: [PATCH 0490/1156] Default menu "MacVim Help" item opens help window maximized --- src/MacVim/Actions.plist | 2 ++ .../English.lproj/MainMenu.nib/classes.nib | 4 ++++ .../MainMenu.nib/keyedobjects.nib | Bin 10856 -> 10859 bytes src/MacVim/MMAppController.h | 2 +- src/MacVim/MMAppController.m | 5 +++-- 5 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/MacVim/Actions.plist b/src/MacVim/Actions.plist index 5e578cf748..83aa78c124 100644 --- a/src/MacVim/Actions.plist +++ b/src/MacVim/Actions.plist @@ -60,6 +60,8 @@ selectPreviousWindow: + showVimHelp: + terminate: undo: diff --git a/src/MacVim/English.lproj/MainMenu.nib/classes.nib b/src/MacVim/English.lproj/MainMenu.nib/classes.nib index a4684b9ef0..39b79be525 100644 --- a/src/MacVim/English.lproj/MainMenu.nib/classes.nib +++ b/src/MacVim/English.lproj/MainMenu.nib/classes.nib @@ -25,6 +25,10 @@ id showHelp id + showVimHelp + id + zoomAll + id CLASS MMAppController diff --git a/src/MacVim/English.lproj/MainMenu.nib/keyedobjects.nib b/src/MacVim/English.lproj/MainMenu.nib/keyedobjects.nib index 06716af282b44dbfbbca91a0baa7fe554c2dea9f..7f539627f805139e6f83caad9172ce3abfc5e62c 100644 GIT binary patch literal 10859 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 Date: Wed, 4 Jun 2008 21:17:05 +0200 Subject: [PATCH 0491/1156] Add support for popup menus --- src/MacVim/MMAtsuiTextView.h | 1 - src/MacVim/MMAtsuiTextView.m | 5 --- src/MacVim/MMBackend.h | 1 - src/MacVim/MMBackend.m | 24 +------------ src/MacVim/MMTextView.h | 2 -- src/MacVim/MMTextView.m | 8 ----- src/MacVim/MMVimController.m | 57 ++++++++++++++++++++--------- src/MacVim/MMWindowController.h | 1 - src/MacVim/MMWindowController.m | 27 -------------- src/MacVim/gui_macvim.m | 63 ++++++++++----------------------- 10 files changed, 60 insertions(+), 129 deletions(-) diff --git a/src/MacVim/MMAtsuiTextView.h b/src/MacVim/MMAtsuiTextView.h index 97fabcc08e..48c976a1b8 100644 --- a/src/MacVim/MMAtsuiTextView.h +++ b/src/MacVim/MMAtsuiTextView.h @@ -54,7 +54,6 @@ enum { MMMaxCellsPerChar = 2 }; // // MMTextView methods // -- (NSEvent *)lastMouseDownEvent; - (void)setShouldDrawInsertionPoint:(BOOL)on; - (void)setPreEditRow:(int)row column:(int)col; - (void)hideMarkedTextField; diff --git a/src/MacVim/MMAtsuiTextView.m b/src/MacVim/MMAtsuiTextView.m index 8ed5713e4f..2e156912dd 100644 --- a/src/MacVim/MMAtsuiTextView.m +++ b/src/MacVim/MMAtsuiTextView.m @@ -247,11 +247,6 @@ - (void)setLinespace:(float)newLinespace -- (NSEvent *)lastMouseDownEvent -{ - return nil; -} - - (void)setShouldDrawInsertionPoint:(BOOL)on { } diff --git a/src/MacVim/MMBackend.h b/src/MacVim/MMBackend.h index a49cb24054..b99af3ebdb 100644 --- a/src/MacVim/MMBackend.h +++ b/src/MacVim/MMBackend.h @@ -85,7 +85,6 @@ saving:(int)saving; - (int)presentDialogWithType:(int)type title:(char *)title message:(char *)msg buttons:(char *)btns textField:(char *)txtfield; -- (void)showPopupMenuWithName:(char *)name atMouseLocation:(BOOL)mouse; - (void)showToolbar:(int)enable flags:(int)flags; - (void)createScrollbarWithIdentifier:(long)ident type:(int)type; - (void)destroyScrollbarWithIdentifier:(long)ident; diff --git a/src/MacVim/MMBackend.m b/src/MacVim/MMBackend.m index 6df13500e2..a22419236b 100644 --- a/src/MacVim/MMBackend.m +++ b/src/MacVim/MMBackend.m @@ -748,28 +748,6 @@ - (int)presentDialogWithType:(int)type title:(char *)title message:(char *)msg return retval; } -- (void)showPopupMenuWithName:(char *)name atMouseLocation:(BOOL)mouse -{ - int len = strlen(name); - int row = -1, col = -1; - - if (len <= 0) return; - - if (!mouse && curwin) { - row = curwin->w_wrow; - col = curwin->w_wcol; - } - - NSMutableData *data = [NSMutableData data]; - - [data appendBytes:&row length:sizeof(int)]; - [data appendBytes:&col length:sizeof(int)]; - [data appendBytes:&len length:sizeof(int)]; - [data appendBytes:name length:len]; - - [self queueMessage:ShowPopupMenuMsgID data:data]; -} - - (void)showToolbar:(int)enable flags:(int)flags { NSMutableData *data = [NSMutableData data]; @@ -1507,7 +1485,7 @@ - (void)queueVimStateMessage // to make synchronous calls from MacVim to Vim in order to get state. #ifdef FEAT_RIGHTLEFT - BOOL rightLeft = curwin->w_p_rl; + BOOL rightLeft = curwin ? curwin->w_p_rl : NO; #else BOOL rightLeft = NO; #endif diff --git a/src/MacVim/MMTextView.h b/src/MacVim/MMTextView.h index 0cd686d791..c8f04c292e 100644 --- a/src/MacVim/MMTextView.h +++ b/src/MacVim/MMTextView.h @@ -13,7 +13,6 @@ @interface MMTextView : NSTextView { BOOL shouldDrawInsertionPoint; - NSEvent *lastMouseDownEvent; NSTrackingRectTag trackingRectTag; BOOL isDragging; BOOL isAutoscrolling; @@ -34,7 +33,6 @@ - (id)initWithFrame:(NSRect)frame; -- (NSEvent *)lastMouseDownEvent; - (void)setShouldDrawInsertionPoint:(BOOL)on; - (void)setPreEditRow:(int)row column:(int)col; - (void)drawInsertionPointAtRow:(int)row column:(int)col shape:(int)shape diff --git a/src/MacVim/MMTextView.m b/src/MacVim/MMTextView.m index 912b02151d..a99b21b11a 100644 --- a/src/MacVim/MMTextView.m +++ b/src/MacVim/MMTextView.m @@ -128,15 +128,9 @@ - (void)dealloc markedTextField = nil; } - [lastMouseDownEvent release]; lastMouseDownEvent = nil; [super dealloc]; } -- (NSEvent *)lastMouseDownEvent -{ - return lastMouseDownEvent; -} - - (BOOL)shouldDrawInsertionPoint { // NOTE: The insertion point is drawn manually in drawRect:. It would be @@ -820,8 +814,6 @@ - (void)mouseDown:(NSEvent *)event if (![self convertPoint:pt toRow:&row column:&col]) return; - lastMouseDownEvent = [event copy]; - int button = [event buttonNumber]; int flags = [event modifierFlags]; int count = [event clickCount]; diff --git a/src/MacVim/MMVimController.m b/src/MacVim/MMVimController.m index 53d8daf371..e27ee3ffcf 100644 --- a/src/MacVim/MMVimController.m +++ b/src/MacVim/MMVimController.m @@ -80,6 +80,9 @@ - (void)addToolbarItemToDictionaryWithLabel:(NSString *)title - (void)addToolbarItemWithLabel:(NSString *)label tip:(NSString *)tip icon:(NSString *)icon atIndex:(int)idx; +- (void)popupMenuWithDescriptor:(NSArray *)desc + atRow:(NSNumber *)row + column:(NSNumber *)col; - (void)connectionDidDie:(NSNotification *)notification; #if MM_RESEND_LAST_FAILURE - (void)resendTimerFired:(NSTimer *)timer; @@ -746,23 +749,10 @@ - (void)handleMessage:(int)msgid data:(NSData *)data [actionName release]; } else if (ShowPopupMenuMsgID == msgid) { - const void *bytes = [data bytes]; - int row = *((int*)bytes); bytes += sizeof(int); - int col = *((int*)bytes); bytes += sizeof(int); - int len = *((int*)bytes); bytes += sizeof(int); - NSString *title = [[NSString alloc] - initWithBytes:(void*)bytes length:len - encoding:NSUTF8StringEncoding]; - - NSMenu *menu = [self topLevelMenuForTitle:title]; - if (menu) { - [windowController popupMenu:menu atRow:row column:col]; - } else { - NSLog(@"WARNING: Cannot popup menu with title %@; no such menu.", - title); - } - - [title release]; + NSDictionary *attrs = [NSDictionary dictionaryWithData:data]; + [self popupMenuWithDescriptor:[attrs objectForKey:@"descriptor"] + atRow:[attrs objectForKey:@"row"] + column:[attrs objectForKey:@"column"]]; } else if (SetMouseShapeMsgID == msgid) { const void *bytes = [data bytes]; int shape = *((int*)bytes); bytes += sizeof(int); @@ -1176,6 +1166,39 @@ - (void)addToolbarItemWithLabel:(NSString *)label tip:(NSString [toolbar insertItemWithItemIdentifier:label atIndex:idx]; } +- (void)popupMenuWithDescriptor:(NSArray *)desc + atRow:(NSNumber *)row + column:(NSNumber *)col +{ + NSMenu *menu = [[self menuItemForDescriptor:desc] submenu]; + if (!menu) return; + + id textView = [[windowController vimView] textView]; + NSPoint pt; + if (row && col) { + // TODO: Let textView convert (row,col) to NSPoint. + int r = [row intValue]; + int c = [col intValue]; + NSSize cellSize = [textView cellSize]; + pt = NSMakePoint((c+1)*cellSize.width, (r+1)*cellSize.height); + pt = [textView convertPoint:pt toView:nil]; + } else { + pt = [[windowController window] mouseLocationOutsideOfEventStream]; + } + + NSEvent *event = [NSEvent mouseEventWithType:NSRightMouseDown + location:pt + modifierFlags:0 + timestamp:0 + windowNumber:[[windowController window] windowNumber] + context:nil + eventNumber:0 + clickCount:0 + pressure:1.0]; + + [NSMenu popUpContextMenu:menu withEvent:event forView:textView]; +} + - (void)connectionDidDie:(NSNotification *)notification { //NSLog(@"%@ %s%@", [self className], _cmd, notification); diff --git a/src/MacVim/MMWindowController.h b/src/MacVim/MMWindowController.h index 97b18b21ab..c2fe2ec25c 100644 --- a/src/MacVim/MMWindowController.h +++ b/src/MacVim/MMWindowController.h @@ -51,7 +51,6 @@ - (void)setFont:(NSFont *)font; - (void)setWideFont:(NSFont *)font; - (void)processCommandQueueDidFinish; -- (void)popupMenu:(NSMenu *)menu atRow:(int)row column:(int)col; - (void)showTabBar:(BOOL)on; - (void)showToolbar:(BOOL)on size:(int)size mode:(int)mode; - (void)setMouseShape:(int)shape; diff --git a/src/MacVim/MMWindowController.m b/src/MacVim/MMWindowController.m index 2a78cae3d4..c1f7b26ab2 100644 --- a/src/MacVim/MMWindowController.m +++ b/src/MacVim/MMWindowController.m @@ -411,33 +411,6 @@ - (void)processCommandQueueDidFinish } } -- (void)popupMenu:(NSMenu *)menu atRow:(int)row column:(int)col -{ - if (!setupDone) return; - - NSEvent *event; - if (row >= 0 && col >= 0) { - // TODO: Let textView convert (row,col) to NSPoint. - NSSize cellSize = [[vimView textView] cellSize]; - NSPoint pt = { (col+1)*cellSize.width, (row+1)*cellSize.height }; - pt = [[vimView textView] convertPoint:pt toView:nil]; - - event = [NSEvent mouseEventWithType:NSRightMouseDown - location:pt - modifierFlags:0 - timestamp:0 - windowNumber:[[self window] windowNumber] - context:nil - eventNumber:0 - clickCount:0 - pressure:1.0]; - } else { - event = [[vimView textView] lastMouseDownEvent]; - } - - [NSMenu popUpContextMenu:menu withEvent:event forView:[vimView textView]]; -} - - (void)showTabBar:(BOOL)on { [[vimView tabBarControl] setHidden:!on]; diff --git a/src/MacVim/gui_macvim.m b/src/MacVim/gui_macvim.m index 99aa689957..17f68faa5d 100644 --- a/src/MacVim/gui_macvim.m +++ b/src/MacVim/gui_macvim.m @@ -615,6 +615,10 @@ + (id)stringWithVimString:(char_u *)s; // -- Menu ------------------------------------------------------------------ +/* + * A menu descriptor represents the "address" of a menu as an array of strings. + * E.g. the menu "File->Close" has descriptor { "File", "Close" }. + */ NSArray * descriptor_for_menu(vimmenu_T *menu) { @@ -656,37 +660,17 @@ + (id)stringWithVimString:(char_u *)s; } /* - * Add a sub menu to the menu bar. + * Add a submenu to the menu bar, toolbar, or a popup menu. */ void gui_mch_add_menu(vimmenu_T *menu, int idx) { - // HACK! If menu has no parent, then we set the parent tag to the type of - // menu it is. This will not mix up tag and type because pointers can not - // take values close to zero (and the tag is simply the value of the - // pointer). - int parent = (int)menu->parent; - if (!parent) { - parent = menu_is_popup(menu->name) ? MenuPopupType : - menu_is_toolbar(menu->name) ? MenuToolbarType : - MenuMenubarType; - } - - char_u *dname = menu->dname; -#ifdef FEAT_MBYTE - dname = CONVERT_TO_UTF8(dname); -#endif - NSArray *desc = descriptor_for_menu(menu); [[MMBackend sharedInstance] queueMessage:AddMenuMsgID properties: [NSDictionary dictionaryWithObjectsAndKeys: desc, @"descriptor", [NSNumber numberWithInt:idx], @"index", nil]]; - -#ifdef FEAT_MBYTE - CONVERT_TO_UTF8_FREE(dname); -#endif } @@ -775,19 +759,9 @@ + (id)stringWithVimString:(char_u *)s; void gui_mch_show_popupmenu(vimmenu_T *menu) { -#if 0 - char_u *name = menu->name; -#ifdef FEAT_MBYTE - name = CONVERT_TO_UTF8(name); -#endif - - [[MMBackend sharedInstance] showPopupMenuWithName:(char*)name - atMouseLocation:YES]; - -#ifdef FEAT_MBYTE - CONVERT_TO_UTF8_FREE(name); -#endif -#endif + NSArray *desc = descriptor_for_menu(menu); + [[MMBackend sharedInstance] queueMessage:ShowPopupMenuMsgID properties: + [NSDictionary dictionaryWithObject:desc forKey:@"descriptor"]]; } @@ -797,18 +771,19 @@ + (id)stringWithVimString:(char_u *)s; void gui_make_popup(char_u *path_name, int mouse_pos) { -#if 0 -#ifdef FEAT_MBYTE - path_name = CONVERT_TO_UTF8(path_name); -#endif + vimmenu_T *menu = gui_find_menu(path_name); + if (!(menu && menu->children)) return; - [[MMBackend sharedInstance] showPopupMenuWithName:(char*)path_name - atMouseLocation:mouse_pos]; + NSArray *desc = descriptor_for_menu(menu); + NSDictionary *p = (mouse_pos || NULL == curwin) + ? [NSDictionary dictionaryWithObject:desc forKey:@"descriptor"] + : [NSDictionary dictionaryWithObjectsAndKeys: + desc, @"descriptor", + [NSNumber numberWithInt:curwin->w_wrow], @"row", + [NSNumber numberWithInt:curwin->w_wcol], @"column", + nil]; -#ifdef FEAT_MBYTE - CONVERT_TO_UTF8_FREE(path_name); -#endif -#endif + [[MMBackend sharedInstance] queueMessage:ShowPopupMenuMsgID properties:p]; } From d98e291038be92dccdbe2efb419e10550a935f0b Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Wed, 4 Jun 2008 21:21:28 +0200 Subject: [PATCH 0492/1156] Set windows menu even if it is nil --- src/MacVim/MMAppController.m | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/MacVim/MMAppController.m b/src/MacVim/MMAppController.m index a8af088413..79b6a6d369 100644 --- a/src/MacVim/MMAppController.m +++ b/src/MacVim/MMAppController.m @@ -643,9 +643,8 @@ - (void)setMainMenu:(NSMenu *)mainMenu if ([item action] == @selector(makeKeyAndOrderFront:)) [windowsMenu removeItem:item]; } - - [NSApp setWindowsMenu:windowsMenu]; } + [NSApp setWindowsMenu:windowsMenu]; } - (IBAction)newWindow:(id)sender From af279d24774804d9d5b44edb6dd1c461c4b60448 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Wed, 4 Jun 2008 21:53:05 +0200 Subject: [PATCH 0493/1156] Update MMAppController top level information --- src/MacVim/MMAppController.m | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/MacVim/MMAppController.m b/src/MacVim/MMAppController.m index 79b6a6d369..07292638f7 100644 --- a/src/MacVim/MMAppController.m +++ b/src/MacVim/MMAppController.m @@ -13,7 +13,7 @@ * MMAppController is the delegate of NSApp and as such handles file open * requests, application termination, etc. It sets up a named NSConnection on * which it listens to incoming connections from Vim processes. It also - * coordinates all MMVimControllers. + * coordinates all MMVimControllers and takes care of the main menu. * * A new Vim process is started by calling launchVimProcessWithArguments:. * When the Vim process is initialized it notifies the app controller by @@ -24,6 +24,17 @@ * A Vim process started from the command line connects directly by sending the * connectBackend:pid: message (launchVimProcessWithArguments: is never called * in this case). + * + * The main menu is handled as follows. Each Vim controller keeps its own main + * menu. All menus except the "MacVim" menu are controlled by the Vim process. + * The app controller also keeps a reference to the "default main menu" which + * is set up in MainMenu.nib. When no editor window is open the default main + * menu is used. When a new editor window becomes main its main menu becomes + * the new main menu, this is done in -[MMAppController setMainMenu:]. + * NOTE: Certain heuristics are used to find the "MacVim", "Windows", "File", + * and "Services" menu. If MainMenu.nib changes these heuristics may have to + * change as well. For specifics see the find... methods defined in the NSMenu + * category "MMExtras". */ #import "MMAppController.h" From e18186c461e10c5958afbf06880c9622d8e0b2a2 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Thu, 5 Jun 2008 20:19:32 +0200 Subject: [PATCH 0494/1156] Pass key equivalents to default main menu after main menu This is so that the key equivalents set up in the default main menu will work even when the system gvimrc files hasn't been sourced. This is useful e.g. when "-u NONE -U NONE" is passed as arguments resulting in the default Vim menus being used. --- src/MacVim/MMAtsuiTextView.m | 9 +++++++++ src/MacVim/MMTextView.m | 9 +++++++++ 2 files changed, 18 insertions(+) diff --git a/src/MacVim/MMAtsuiTextView.m b/src/MacVim/MMAtsuiTextView.m index 2e156912dd..e4cc4c5896 100644 --- a/src/MacVim/MMAtsuiTextView.m +++ b/src/MacVim/MMAtsuiTextView.m @@ -28,6 +28,7 @@ #import "MMAtsuiTextView.h" #import "MMVimController.h" #import "MMWindowController.h" +#import "MMAppController.h" #import "MacVim.h" @@ -411,6 +412,14 @@ - (BOOL)performKeyEquivalent:(NSEvent *)event if ([[NSApp mainMenu] performKeyEquivalent:event]) return YES; + // HACK! Give the default main menu a chance to handle the key down event. + // This is to ensure that the standard mappings (which are in the default + // main menu) are always available, also when the default Vim menus are + // used (these do not set any key equivalents!). + if ([[[MMAppController sharedInstance] defaultMainMenu] + performKeyEquivalent:event]) + return YES; + // HACK! On Leopard Ctrl-key events end up here instead of keyDown:. if (flags & NSControlKeyMask) { [self keyDown:event]; diff --git a/src/MacVim/MMTextView.m b/src/MacVim/MMTextView.m index a99b21b11a..c61ef0eef3 100644 --- a/src/MacVim/MMTextView.m +++ b/src/MacVim/MMTextView.m @@ -22,6 +22,7 @@ #import "MMWindowController.h" #import "MMVimController.h" #import "MMTypesetter.h" +#import "MMAppController.h" #import "MacVim.h" @@ -645,6 +646,14 @@ - (BOOL)performKeyEquivalent:(NSEvent *)event if ([[NSApp mainMenu] performKeyEquivalent:event]) return YES; + // HACK! Give the default main menu a chance to handle the key down event. + // This is to ensure that the standard mappings (which are in the default + // main menu) are always available, also when the default Vim menus are + // used (these do not set any key equivalents!). + if ([[[MMAppController sharedInstance] defaultMainMenu] + performKeyEquivalent:event]) + return YES; + // HACK! On Leopard Ctrl-key events end up here instead of keyDown:. if (flags & NSControlKeyMask) { [self keyDown:event]; From ebf10927c71692bc9f59e7af315d0697f0c1bbeb Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Thu, 5 Jun 2008 20:24:36 +0200 Subject: [PATCH 0495/1156] Ignore "Recent Files" when no "File" menu is found --- src/MacVim/MMAppController.m | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/src/MacVim/MMAppController.m b/src/MacVim/MMAppController.m index 07292638f7..88b8f79bc1 100644 --- a/src/MacVim/MMAppController.m +++ b/src/MacVim/MMAppController.m @@ -606,22 +606,24 @@ - (void)setMainMenu:(NSMenu *)mainMenu // "Recent Files" menu and there is no way to simply point Cocoa to a new // item each time the menus are swapped. NSMenu *fileMenu = [mainMenu findFileMenu]; - int dummyIdx = - [fileMenu indexOfItemWithAction:@selector(recentFilesDummy:)]; - if (dummyIdx >= 0 && recentFilesMenuItem) { - NSMenuItem *dummyItem = [[fileMenu itemAtIndex:dummyIdx] retain]; - [fileMenu removeItemAtIndex:dummyIdx]; - - NSMenu *recentFilesParentMenu = [recentFilesMenuItem menu]; - int idx = [recentFilesParentMenu indexOfItem:recentFilesMenuItem]; - if (idx >= 0) { - [[recentFilesMenuItem retain] autorelease]; - [recentFilesParentMenu removeItemAtIndex:idx]; - [recentFilesParentMenu insertItem:dummyItem atIndex:idx]; - } + if (recentFilesMenuItem && fileMenu) { + int dummyIdx = + [fileMenu indexOfItemWithAction:@selector(recentFilesDummy:)]; + if (dummyIdx >= 0) { + NSMenuItem *dummyItem = [[fileMenu itemAtIndex:dummyIdx] retain]; + [fileMenu removeItemAtIndex:dummyIdx]; + + NSMenu *recentFilesParentMenu = [recentFilesMenuItem menu]; + int idx = [recentFilesParentMenu indexOfItem:recentFilesMenuItem]; + if (idx >= 0) { + [[recentFilesMenuItem retain] autorelease]; + [recentFilesParentMenu removeItemAtIndex:idx]; + [recentFilesParentMenu insertItem:dummyItem atIndex:idx]; + } - [fileMenu insertItem:recentFilesMenuItem atIndex:dummyIdx]; - [dummyItem release]; + [fileMenu insertItem:recentFilesMenuItem atIndex:dummyIdx]; + [dummyItem release]; + } } // Now set the new menu. Notice that we keep one menu for each editor From 9f1b770ee6f8d0cecea8c17b71392e14e3db53c7 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Thu, 5 Jun 2008 20:52:30 +0200 Subject: [PATCH 0496/1156] Add "Cycle Through Windows" to default "Windows" menu This ensures that Cmd-` works for all windows. Also changed its alternate to read "Cycle Backwards Through Windows". Note that the default "Windows" menu does not contain the alternate since Interface Builder turned Cmd-Shift-` into Cmd-~ which is no longer a valid alternate. --- .../English.lproj/MainMenu.nib/classes.nib | 4 ++++ .../English.lproj/MainMenu.nib/info.nib | 2 +- .../MainMenu.nib/keyedobjects.nib | Bin 10859 -> 11124 bytes src/MacVim/gvimrc | 4 ++-- 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/MacVim/English.lproj/MainMenu.nib/classes.nib b/src/MacVim/English.lproj/MainMenu.nib/classes.nib index 39b79be525..b18c47169d 100644 --- a/src/MacVim/English.lproj/MainMenu.nib/classes.nib +++ b/src/MacVim/English.lproj/MainMenu.nib/classes.nib @@ -48,6 +48,10 @@ ACTIONS + _cycleWindows + id + _cycleWindowsBackwards + id addNewTab id diff --git a/src/MacVim/English.lproj/MainMenu.nib/info.nib b/src/MacVim/English.lproj/MainMenu.nib/info.nib index cde701ab98..ed5b381a05 100644 --- a/src/MacVim/English.lproj/MainMenu.nib/info.nib +++ b/src/MacVim/English.lproj/MainMenu.nib/info.nib @@ -10,7 +10,7 @@ 5 IBOpenObjects - 233 + 310 IBSystem Version 9D34 diff --git a/src/MacVim/English.lproj/MainMenu.nib/keyedobjects.nib b/src/MacVim/English.lproj/MainMenu.nib/keyedobjects.nib index 7f539627f805139e6f83caad9172ce3abfc5e62c..61f27a69dd8edc655371f10618135f7f0bd56871 100644 GIT binary patch literal 11124 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 literal 10859 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 9900.310 Window.Zoom an 9900.311 Window.Zoom\ All an 9900.320 Window.Toggle\ Full\ Screen\ Mode :set invfullscreen an 9900.325 Window.Cycle\ Through\ Windows -an 9900.326 Window.Cycle\ Through\ Windows\ Backwards +an 9900.326 Window.Cycle\ Backwards\ Through\ Windows an 9900.330 Window.-SEP1- " TODO! Grey out if no tabs are visible. an 9900.340 Window.Previous\ Tab :tabprevious @@ -245,7 +245,7 @@ macm Window.Zoom key= action=performZoom: macm Window.Zoom\ All key= action=zoomAll: alt=YES macm Window.Toggle\ Full\ Screen\ Mode key= macm Window.Cycle\ Through\ Windows key= action=_cycleWindows: -macm Window.Cycle\ Through\ Windows\ Backwards key= action=_cycleWindowsBackwards: alt=YES +macm Window.Cycle\ Backwards\ Through\ Windows key= action=_cycleWindowsBackwards: alt=YES macm Window.Previous\ Tab key= macm Window.Next\ Tab key= macm Window.Bring\ All\ To\ Front action=arrangeInFront: From 7070fd3f76b05db2c1a6a88f8f0045d91c14f98d Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Thu, 5 Jun 2008 21:27:02 +0200 Subject: [PATCH 0497/1156] Update help on menus --- runtime/doc/gui_mac.txt | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/runtime/doc/gui_mac.txt b/runtime/doc/gui_mac.txt index afa7cba8fb..d52b8e1097 100644 --- a/runtime/doc/gui_mac.txt +++ b/runtime/doc/gui_mac.txt @@ -389,6 +389,12 @@ equivalent Cmd-n, which opens a new window when selected: > 3. Create a mapping in normal mode which closes the current tab/window: > :map :maca performClose: > + +The standard Vim menus are modified in "$VIM/gvimrc". Take a look at that +file for more examples on how to set up menus. Note: When no window is open a +minimal default menu is used. The default menu is set up in MainMenu.nib +which resides in "Resources/English.lproj/" folder inside the app bundle. + *Actions.plist* Some action messages would not be suitable to call from within Vim, so there is a dictionary called "Actions.plist" (in the Resources folder of the @@ -403,18 +409,23 @@ Here is a random assortment of actions from Actions.plist which might be useful. Action Description ~ +fileOpen: Show "File Open" dialog findNext: Search forward using the "Find Pasteboard" findPrevious: Search backward using the "Find Pasteboard" fontSizeDown: Decrease font size fontSizeUp: Increase font size +hide: Hide MacVim +miniaturizeAll: Minimize all windows to the dock newWindow: Open a new (empty) window orderFrontCharacterPalette: Show the the "Special Characters" dialog orderFrontFontPanel: Show the Font panel orderFrontPreferencePanel: Show the Preferences panel -performClose: Close tab/window +performMiniaturize: Minimize window to the dock performZoom: Zoom window (same as clicking the green blob) -selectNextWindow: Select next window (similar to ) -selectPreviousWindow: Select previous window (similar to ) +terminate: Quit MacVim +zoomAll: Zoom all windows +_cycleWindows: Select next window (similar to ) +_cycleWindowsBackwards: Select previous window (similar to ) ============================================================================== 6. Toolbar *macvim-toolbar* From cb120a21cfa13bf9d0de4a1f2e08823c01aee0ae Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Thu, 5 Jun 2008 23:13:40 +0200 Subject: [PATCH 0498/1156] Validate performClose: in MMWindow and MMFullscreenWindow Failing to validate would cause the "Close" menu item to be disabled in full-screen. --- src/MacVim/MMFullscreenWindow.m | 9 +++++++++ src/MacVim/MMWindow.m | 9 +++++++++ 2 files changed, 18 insertions(+) diff --git a/src/MacVim/MMFullscreenWindow.m b/src/MacVim/MMFullscreenWindow.m index be0201e97b..717b8c26d6 100644 --- a/src/MacVim/MMFullscreenWindow.m +++ b/src/MacVim/MMFullscreenWindow.m @@ -298,6 +298,15 @@ - (void)performClose:(id)sender [super performClose:sender]; } +- (BOOL)validateMenuItem:(NSMenuItem *)item +{ + if ([item action] == @selector(vimMenuItemAction:) + || [item action] == @selector(performClose:)) + return [item tag]; + + return YES; +} + @end // MMFullscreenWindow diff --git a/src/MacVim/MMWindow.m b/src/MacVim/MMWindow.m index dae9087a56..96b65e2bb1 100644 --- a/src/MacVim/MMWindow.m +++ b/src/MacVim/MMWindow.m @@ -129,4 +129,13 @@ - (void)performClose:(id)sender [super performClose:sender]; } +- (BOOL)validateMenuItem:(NSMenuItem *)item +{ + if ([item action] == @selector(vimMenuItemAction:) + || [item action] == @selector(performClose:)) + return [item tag]; + + return YES; +} + @end // MMWindow From a4569d06acc1bb3250dc7482f5122e2a83eebb67 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Fri, 6 Jun 2008 14:16:10 +0200 Subject: [PATCH 0499/1156] Do not set key equivalent when 'mac_key == 0' --- src/MacVim/gui_macvim.m | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/MacVim/gui_macvim.m b/src/MacVim/gui_macvim.m index 17f68faa5d..382946d6d4 100644 --- a/src/MacVim/gui_macvim.m +++ b/src/MacVim/gui_macvim.m @@ -688,8 +688,9 @@ + (id)stringWithVimString:(char_u *)s; char_u *tip = menu->strings[MENU_INDEX_TIP] ? menu->strings[MENU_INDEX_TIP] : menu->actext; NSArray *desc = descriptor_for_menu(menu); - NSString *keyEquivalent = [NSString stringWithFormat:@"%C", - specialKeyToNSKey(menu->mac_key)]; + NSString *keyEquivalent = menu->mac_key + ? [NSString stringWithFormat:@"%C", specialKeyToNSKey(menu->mac_key)] + : [NSString string]; int modifierMask = vimModMaskToEventModifierFlags(menu->mac_mods); [[MMBackend sharedInstance] queueMessage:AddMenuItemMsgID properties: From 3915c6afc69b1e57ced7adb50f62b81079d23ae0 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Fri, 6 Jun 2008 14:22:49 +0200 Subject: [PATCH 0500/1156] Catch exceptions in processCommandQueue: --- src/MacVim/MMVimController.m | 39 ++++++++++++++++++++---------------- 1 file changed, 22 insertions(+), 17 deletions(-) diff --git a/src/MacVim/MMVimController.m b/src/MacVim/MMVimController.m index e27ee3ffcf..60690beec1 100644 --- a/src/MacVim/MMVimController.m +++ b/src/MacVim/MMVimController.m @@ -525,28 +525,33 @@ - (oneway void)processCommandQueue:(in bycopy NSArray *)queue { if (!isInitialized) return; - unsigned i, count = [queue count]; - if (count % 2) { - NSLog(@"WARNING: Uneven number of components (%d) in flush queue " - "message; ignoring this message.", count); - return; - } + @try { + unsigned i, count = [queue count]; + if (count % 2) { + NSLog(@"WARNING: Uneven number of components (%d) in flush queue " + "message; ignoring this message.", count); + return; + } - inProcessCommandQueue = YES; + inProcessCommandQueue = YES; - //NSLog(@"======== %s BEGIN ========", _cmd); - for (i = 0; i < count; i += 2) { - NSData *value = [queue objectAtIndex:i]; - NSData *data = [queue objectAtIndex:i+1]; + //NSLog(@"======== %s BEGIN ========", _cmd); + for (i = 0; i < count; i += 2) { + NSData *value = [queue objectAtIndex:i]; + NSData *data = [queue objectAtIndex:i+1]; - int msgid = *((int*)[value bytes]); - //NSLog(@"%s%s", _cmd, MessageStrings[msgid]); + int msgid = *((int*)[value bytes]); + //NSLog(@"%s%s", _cmd, MessageStrings[msgid]); - [self handleMessage:msgid data:data]; - } - //NSLog(@"======== %s END ========", _cmd); + [self handleMessage:msgid data:data]; + } + //NSLog(@"======== %s END ========", _cmd); - [windowController processCommandQueueDidFinish]; + [windowController processCommandQueueDidFinish]; + } + @catch (NSException *e) { + NSLog(@"Exception caught whilst processing command queue: %@", e); + } inProcessCommandQueue = NO; From 9c517cb4e993d53628ed84dd7c4e3d4d8497be3d Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Fri, 6 Jun 2008 14:24:49 +0200 Subject: [PATCH 0501/1156] Don't draw control chars in MMTextStorage It can happen that MMTextStorage is asked to draw characters from the "Control Characters" set (e.g. when :shell is invoked). This would cause internal errors in MMTextStorage so when control chars are detected, simply draw blanks instead. --- src/MacVim/MMTextStorage.m | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/MacVim/MMTextStorage.m b/src/MacVim/MMTextStorage.m index 284cefcad8..2d6fd7751f 100644 --- a/src/MacVim/MMTextStorage.m +++ b/src/MacVim/MMTextStorage.m @@ -258,6 +258,16 @@ - (void)drawString:(NSString *)string atRow:(int)row column:(int)col || col+cells > maxColumns || !string || !(fg && bg && sp)) return; + BOOL hasControlChars = [string rangeOfCharacterFromSet: + [NSCharacterSet controlCharacterSet]].location != NSNotFound; + if (hasControlChars) { + // HACK! If a string for some reason contains control characters, then + // draw blanks instead (otherwise charRangeForRow::: fails). + NSRange subRange = { 0, cells }; + flags &= ~DRAW_WIDE; + string = [[emptyRowString string] substringWithRange:subRange]; + } + // Find range of characters in text storage to replace. int acol = col; int acells = cells; From 2ac28f887e9f868462ebc29abc42430cb6be36f5 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Fri, 6 Jun 2008 17:47:54 +0200 Subject: [PATCH 0502/1156] Edit->Font->Bigger/Smaller validates properly Fixes bug where the above items were enabled even when all windows were minimized. --- src/MacVim/MMAppController.h | 2 -- src/MacVim/MMAppController.m | 12 ------------ src/MacVim/MMWindowController.h | 2 ++ src/MacVim/MMWindowController.m | 12 ++++++++++++ 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/MacVim/MMAppController.h b/src/MacVim/MMAppController.h index 4f8324e019..3bc393366c 100644 --- a/src/MacVim/MMAppController.h +++ b/src/MacVim/MMAppController.h @@ -34,8 +34,6 @@ - (IBAction)fileOpen:(id)sender; - (IBAction)selectNextWindow:(id)sender; - (IBAction)selectPreviousWindow:(id)sender; -- (IBAction)fontSizeUp:(id)sender; -- (IBAction)fontSizeDown:(id)sender; - (IBAction)orderFrontPreferencePanel:(id)sender; - (IBAction)openWebsite:(id)sender; - (IBAction)showVimHelp:(id)sender; diff --git a/src/MacVim/MMAppController.m b/src/MacVim/MMAppController.m index 88b8f79bc1..031d89f0ad 100644 --- a/src/MacVim/MMAppController.m +++ b/src/MacVim/MMAppController.m @@ -725,18 +725,6 @@ - (IBAction)selectPreviousWindow:(id)sender } } -- (IBAction)fontSizeUp:(id)sender -{ - [[NSFontManager sharedFontManager] modifyFont: - [NSNumber numberWithInt:NSSizeUpFontAction]]; -} - -- (IBAction)fontSizeDown:(id)sender -{ - [[NSFontManager sharedFontManager] modifyFont: - [NSNumber numberWithInt:NSSizeDownFontAction]]; -} - - (IBAction)orderFrontPreferencePanel:(id)sender { [[MMPreferenceController sharedPrefsWindowController] showWindow:self]; diff --git a/src/MacVim/MMWindowController.h b/src/MacVim/MMWindowController.h index c2fe2ec25c..b323d8f492 100644 --- a/src/MacVim/MMWindowController.h +++ b/src/MacVim/MMWindowController.h @@ -68,5 +68,7 @@ - (IBAction)findNext:(id)sender; - (IBAction)findPrevious:(id)sender; - (IBAction)vimMenuItemAction:(id)sender; +- (IBAction)fontSizeUp:(id)sender; +- (IBAction)fontSizeDown:(id)sender; @end diff --git a/src/MacVim/MMWindowController.m b/src/MacVim/MMWindowController.m index c1f7b26ab2..9e3c3d0d67 100644 --- a/src/MacVim/MMWindowController.m +++ b/src/MacVim/MMWindowController.m @@ -609,6 +609,18 @@ - (IBAction)vimMenuItemAction:(id)sender [vimController sendMessage:ExecuteMenuMsgID data:[attrs dictionaryAsData]]; } +- (IBAction)fontSizeUp:(id)sender +{ + [[NSFontManager sharedFontManager] modifyFont: + [NSNumber numberWithInt:NSSizeUpFontAction]]; +} + +- (IBAction)fontSizeDown:(id)sender +{ + [[NSFontManager sharedFontManager] modifyFont: + [NSNumber numberWithInt:NSSizeDownFontAction]]; +} + - (BOOL)validateMenuItem:(NSMenuItem *)item { if ([item action] == @selector(vimMenuItemAction:) From 7752431b822b5b3309afba4436346e1162bcb10d Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Fri, 6 Jun 2008 21:20:55 +0200 Subject: [PATCH 0503/1156] Ensure "Services" menu is empty when creating new main menu MMVimController uses a copy of the "MacVim" menu that is defined inside MainMenu.nib instead of getting it from the default main menu. This ensures that the "Services" menu is initially empty for each new MMVimController. Without this the setKeyEquivalent: call would fail if the key equivalent already was in a "Services" menu item (e.g. and would fail). --- src/MacVim/MMAppController.h | 2 ++ src/MacVim/MMAppController.m | 14 ++++++++++++++ src/MacVim/MMVimController.m | 9 +++++---- 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/src/MacVim/MMAppController.h b/src/MacVim/MMAppController.h index 3bc393366c..fcec67f639 100644 --- a/src/MacVim/MMAppController.h +++ b/src/MacVim/MMAppController.h @@ -22,11 +22,13 @@ ATSFontContainerRef fontContainerRef; NSMutableDictionary *pidArguments; NSMenu *defaultMainMenu; + NSMenuItem *appMenuItemTemplate; NSMenuItem *recentFilesMenuItem; } + (MMAppController *)sharedInstance; - (NSMenu *)defaultMainMenu; +- (NSMenuItem *)appMenuItemTemplate; - (void)removeVimController:(id)controller; - (void)windowControllerWillOpen:(MMWindowController *)windowController; - (void)setMainMenu:(NSMenu *)mainMenu; diff --git a/src/MacVim/MMAppController.m b/src/MacVim/MMAppController.m index 031d89f0ad..24bb18bb7a 100644 --- a/src/MacVim/MMAppController.m +++ b/src/MacVim/MMAppController.m @@ -201,6 +201,7 @@ - (void)dealloc [openSelectionString release]; openSelectionString = nil; [recentFilesMenuItem release]; recentFilesMenuItem = nil; [defaultMainMenu release]; defaultMainMenu = nil; + [appMenuItemTemplate release]; appMenuItemTemplate = nil; [super dealloc]; } @@ -211,6 +212,14 @@ - (void)applicationWillFinishLaunching:(NSNotification *)notification // all editor windows. defaultMainMenu = [[NSApp mainMenu] retain]; + // Store a copy of the default app menu so we can use this as a template + // for all other menus. We make a copy here because the "Services" menu + // will not yet have been populated at this time. If we don't we get + // problems trying to set key equivalents later on because they might clash + // with items on the "Services" menu. + appMenuItemTemplate = [defaultMainMenu itemAtIndex:0]; + appMenuItemTemplate = [appMenuItemTemplate copy]; + // Set up the "Open Recent" menu. See // http://lapcatsoftware.com/blog/2007/07/10/ // working-without-a-nib-part-5-open-recent-menu/ @@ -543,6 +552,11 @@ - (NSMenu *)defaultMainMenu return defaultMainMenu; } +- (NSMenuItem *)appMenuItemTemplate +{ + return appMenuItemTemplate; +} + - (void)removeVimController:(id)controller { //NSLog(@"%s%@", _cmd, controller); diff --git a/src/MacVim/MMVimController.m b/src/MacVim/MMVimController.m index 60690beec1..a370cfb784 100644 --- a/src/MacVim/MMVimController.m +++ b/src/MacVim/MMVimController.m @@ -122,11 +122,12 @@ - (id)initWithBackend:(id)backend pid:(int)processIdentifier selector:@selector(connectionDidDie:) name:NSConnectionDidDieNotification object:connection]; - // Copy the "MacVim menu" from the default main menu (we assume that it - // is the first item on the default main menu). + // Set up a main menu with only a "MacVim" menu (copied from a template + // which itself is set up in MainMenu.nib). The main menu is populated + // by Vim later on. mainMenu = [[NSMenu alloc] initWithTitle:@"MainMenu"]; - NSMenuItem *appMenuItem = [[[MMAppController sharedInstance] - defaultMainMenu] itemAtIndex:0]; + NSMenuItem *appMenuItem = [[MMAppController sharedInstance] + appMenuItemTemplate]; appMenuItem = [[appMenuItem copy] autorelease]; // Note: If the title of the application menu is anything but what From 1d835270396e54af6fa512297d38e06247c0a67a Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Fri, 6 Jun 2008 22:31:21 +0200 Subject: [PATCH 0504/1156] Pass 'rl' option in "DrawCursor" message --- src/MacVim/MMBackend.m | 7 ------- src/MacVim/MMTextView.m | 10 +++++----- src/MacVim/MacVim.h | 1 + src/MacVim/gui_macvim.m | 17 +++++++++++++++-- 4 files changed, 21 insertions(+), 14 deletions(-) diff --git a/src/MacVim/MMBackend.m b/src/MacVim/MMBackend.m index a22419236b..791b29fb66 100644 --- a/src/MacVim/MMBackend.m +++ b/src/MacVim/MMBackend.m @@ -1484,15 +1484,8 @@ - (void)queueVimStateMessage // We take this approach of "pushing" the state to MacVim to avoid having // to make synchronous calls from MacVim to Vim in order to get state. -#ifdef FEAT_RIGHTLEFT - BOOL rightLeft = curwin ? curwin->w_p_rl : NO; -#else - BOOL rightLeft = NO; -#endif - NSDictionary *vimState = [NSDictionary dictionaryWithObjectsAndKeys: [[NSFileManager defaultManager] currentDirectoryPath], @"pwd", - [NSNumber numberWithBool:rightLeft], @"w_p_rl", nil]; [self queueMessage:SetVimStateMsgID data:[vimState dictionaryAsData]]; diff --git a/src/MacVim/MMTextView.m b/src/MacVim/MMTextView.m index c61ef0eef3..7272657db8 100644 --- a/src/MacVim/MMTextView.m +++ b/src/MacVim/MMTextView.m @@ -464,11 +464,11 @@ - (void)drawRect:(NSRect)rect ipRect.origin.y += ipRect.size.height - frac; ipRect.size.height = frac; } else if (MMInsertionPointVertical == insertionPointShape) { - BOOL rightLeft = [[[[self vimController] vimState] - objectForKey:@"w_p_rl"] boolValue]; - int frac = ([ts cellSize].width* insertionPointFraction + 99)/100; - if (rightLeft) - ipRect.origin.x += ipRect.size.width - frac; + int frac = ([ts cellSize].width * insertionPointFraction + 99)/100; + ipRect.size.width = frac; + } else if (MMInsertionPointVerticalRight == insertionPointShape) { + int frac = ([ts cellSize].width * insertionPointFraction + 99)/100; + ipRect.origin.x += ipRect.size.width - frac; ipRect.size.width = frac; } diff --git a/src/MacVim/MacVim.h b/src/MacVim/MacVim.h index eb94dd9cbd..be02e79484 100644 --- a/src/MacVim/MacVim.h +++ b/src/MacVim/MacVim.h @@ -183,6 +183,7 @@ enum { MMInsertionPointHorizontal, MMInsertionPointVertical, MMInsertionPointHollow, + MMInsertionPointVerticalRight, }; diff --git a/src/MacVim/gui_macvim.m b/src/MacVim/gui_macvim.m index 382946d6d4..16db6b7464 100644 --- a/src/MacVim/gui_macvim.m +++ b/src/MacVim/gui_macvim.m @@ -1073,11 +1073,24 @@ + (id)stringWithVimString:(char_u *)s; // font dimensions. Thus these parameters are useless. Instead we look at // the shape_table to determine the shape and size of the cursor (just like // gui_update_cursor() does). + +#ifdef FEAT_RIGHTLEFT + // If 'rl' is set the insert mode cursor must be drawn on the right-hand + // side of a text cell. + int rl = curwin ? curwin->w_p_rl : FALSE; +#else + int rl = FALSE; +#endif int idx = get_shape_idx(FALSE); int shape = MMInsertionPointBlock; switch (shape_table[idx].shape) { - case SHAPE_HOR: shape = MMInsertionPointHorizontal; break; - case SHAPE_VER: shape = MMInsertionPointVertical; break; + case SHAPE_HOR: + shape = MMInsertionPointHorizontal; + break; + case SHAPE_VER: + shape = rl ? MMInsertionPointVerticalRight + : MMInsertionPointVertical; + break; } return [[MMBackend sharedInstance] From 9471224d0bcc08e209cc66f8ff9964566ed9c2d9 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Fri, 6 Jun 2008 22:46:13 +0200 Subject: [PATCH 0505/1156] Give Vim processes some time to terminate before MacVim does This should stop MacVim from beeping when Cmd-q is pressed. --- src/MacVim/MMAppController.m | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/MacVim/MMAppController.m b/src/MacVim/MMAppController.m index 24bb18bb7a..7e3396fb00 100644 --- a/src/MacVim/MMAppController.m +++ b/src/MacVim/MMAppController.m @@ -54,6 +54,10 @@ static NSString *MMWebsiteString = @"http://code.google.com/p/macvim/"; +// When terminating, notify Vim processes then sleep for these many +// microseconds. +static useconds_t MMTerminationSleepPeriod = 10000; + #pragma options align=mac68k typedef struct @@ -503,6 +507,11 @@ - (NSApplicationTerminateReply)applicationShouldTerminate: id vc; while ((vc = [e nextObject])) [vc sendMessage:TerminateNowMsgID data:nil]; + + // Give Vim processes a chance to terminate before MacVim. If they + // haven't terminated by the time applicationWillTerminate: is sent, + // they may be forced to quit (see below). + usleep(MMTerminationSleepPeriod); } return reply; From 1f538dc364272ae7c5c716e94e81c323ac73ae3b Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Fri, 6 Jun 2008 23:32:26 +0200 Subject: [PATCH 0506/1156] Set title for separator items to ensure valid descriptors --- src/MacVim/MMVimController.m | 1 + 1 file changed, 1 insertion(+) diff --git a/src/MacVim/MMVimController.m b/src/MacVim/MMVimController.m index a370cfb784..c1bb02aa9c 100644 --- a/src/MacVim/MMVimController.m +++ b/src/MacVim/MMVimController.m @@ -1014,6 +1014,7 @@ - (void)addMenuItemWithDescriptor:(NSArray *)desc if (0 == [title length] || ([title hasPrefix:@"-"] && [title hasSuffix:@"-"])) { item = [NSMenuItem separatorItem]; + [item setTitle:title]; } else { item = [[[NSMenuItem alloc] init] autorelease]; [item setTitle:title]; From c4222c6ebb2125898ee18d4f1937b11192dbbbe8 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sat, 7 Jun 2008 12:42:47 +0200 Subject: [PATCH 0507/1156] Don't delay loading "Buffers" menu This avoids a flickering menu each time a new editor window is opened. --- runtime/menu.vim | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/runtime/menu.vim b/runtime/menu.vim index fe3529f78d..dbe1c17eb8 100644 --- a/runtime/menu.vim +++ b/runtime/menu.vim @@ -783,8 +783,9 @@ func! s:BMMunge(fname, bnum) return name endfunc -" When just starting Vim, load the buffer menu later -if has("vim_starting") +" When just starting Vim, load the buffer menu later. Don't do this for MacVim +" because it makes the menu flicker each time a new editor window is opened. +if has("vim_starting") && !has("gui_macvim") augroup LoadBufferMenu au! VimEnter * if !exists("no_buffers_menu") | call BMShow() | endif au VimEnter * au! LoadBufferMenu From 2fa74c01aa80c4b781fb3cb4b170508a24758746 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sat, 7 Jun 2008 14:30:52 +0200 Subject: [PATCH 0508/1156] Use -[NSScreen visibleFrame] to get full-screen max dimensions This fixes a bug where the window dimensions were not restored after leaving full-screen (with 'maxvert' fu-option set). --- src/MacVim/MMFullscreenWindow.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/MacVim/MMFullscreenWindow.m b/src/MacVim/MMFullscreenWindow.m index 717b8c26d6..57df0704ef 100644 --- a/src/MacVim/MMFullscreenWindow.m +++ b/src/MacVim/MMFullscreenWindow.m @@ -137,7 +137,7 @@ - (void)enterFullscreen:(int)fuoptions int fuRows = currRows, fuColumns = currColumns; int maxRows, maxColumns; - NSSize size = [[self screen] frame].size; + NSSize size = [[self screen] visibleFrame].size; [view constrainRows:&maxRows columns:&maxColumns toSize:size]; // Store current pre-fu vim size From 321fdf61aa5734cdc07432edad2e15a32f727b52 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sat, 7 Jun 2008 14:33:05 +0200 Subject: [PATCH 0509/1156] Ensure processCommandQueueDidFinish: gets called if exception is raised --- src/MacVim/MMVimController.m | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/MacVim/MMVimController.m b/src/MacVim/MMVimController.m index c1bb02aa9c..9edc0884ce 100644 --- a/src/MacVim/MMVimController.m +++ b/src/MacVim/MMVimController.m @@ -547,13 +547,12 @@ - (oneway void)processCommandQueue:(in bycopy NSArray *)queue [self handleMessage:msgid data:data]; } //NSLog(@"======== %s END ========", _cmd); - - [windowController processCommandQueueDidFinish]; } @catch (NSException *e) { NSLog(@"Exception caught whilst processing command queue: %@", e); } + [windowController processCommandQueueDidFinish]; inProcessCommandQueue = NO; if ([sendQueue count] > 0) { From 0ea7546c7c0b86df43cc1ff0c44e07ef90897cc2 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sat, 7 Jun 2008 15:35:25 +0200 Subject: [PATCH 0510/1156] Add 'mousehide' option support --- src/MacVim/MMAtsuiTextView.m | 17 +++++++++++++---- src/MacVim/MMBackend.m | 1 + src/MacVim/MMTextView.m | 17 +++++++++++++---- 3 files changed, 27 insertions(+), 8 deletions(-) diff --git a/src/MacVim/MMAtsuiTextView.m b/src/MacVim/MMAtsuiTextView.m index e4cc4c5896..470e006094 100644 --- a/src/MacVim/MMAtsuiTextView.m +++ b/src/MacVim/MMAtsuiTextView.m @@ -67,6 +67,7 @@ - (void)disposeAtsuStyles; - (void)updateAtsuStyles; - (void)dispatchKeyEvent:(NSEvent *)event; - (void)sendKeyDown:(const char *)chars length:(int)len modifiers:(int)flags; +- (void)hideMouseCursor; - (MMWindowController *)windowController; - (MMVimController *)vimController; @end @@ -333,8 +334,7 @@ - (void)insertText:(id)string } } - // TODO: Support 'mousehide' (check p_mh) - [NSCursor setHiddenUntilMouseMoves:YES]; + [self hideMouseCursor]; // NOTE: 'string' is either an NSString or an NSAttributedString. Since we // do not support attributes, simply pass the corresponding NSString in the @@ -901,14 +901,23 @@ - (void)sendKeyDown:(const char *)chars length:(int)len modifiers:(int)flags [data appendBytes:&len length:sizeof(int)]; [data appendBytes:chars length:len]; - // TODO: Support 'mousehide' (check p_mh) - [NSCursor setHiddenUntilMouseMoves:YES]; + [self hideMouseCursor]; //NSLog(@"%s len=%d chars=0x%x", _cmd, len, chars[0]); [[self vimController] sendMessage:KeyDownMsgID data:data]; } } +- (void)hideMouseCursor +{ + // Check 'mousehide' option + id mh = [[[self vimController] vimState] objectForKey:@"p_mh"]; + if (mh && ![mh boolValue]) + [NSCursor setHiddenUntilMouseMoves:NO]; + else + [NSCursor setHiddenUntilMouseMoves:YES]; +} + - (MMWindowController *)windowController { id windowController = [[self window] windowController]; diff --git a/src/MacVim/MMBackend.m b/src/MacVim/MMBackend.m index 791b29fb66..6ab1769406 100644 --- a/src/MacVim/MMBackend.m +++ b/src/MacVim/MMBackend.m @@ -1486,6 +1486,7 @@ - (void)queueVimStateMessage NSDictionary *vimState = [NSDictionary dictionaryWithObjectsAndKeys: [[NSFileManager defaultManager] currentDirectoryPath], @"pwd", + [NSNumber numberWithInt:p_mh], @"p_mh", nil]; [self queueMessage:SetVimStateMsgID data:[vimState dictionaryAsData]]; diff --git a/src/MacVim/MMTextView.m b/src/MacVim/MMTextView.m index 7272657db8..22554ced0a 100644 --- a/src/MacVim/MMTextView.m +++ b/src/MacVim/MMTextView.m @@ -57,6 +57,7 @@ - (MMVimController *)vimController; - (void)startDragTimerWithInterval:(NSTimeInterval)t; - (void)dragTimerFired:(NSTimer *)timer; - (void)sendKeyDown:(const char *)chars length:(int)len modifiers:(int)flags; +- (void)hideMouseCursor; @end @@ -566,8 +567,7 @@ - (void)insertText:(id)string } } - // TODO: Support 'mousehide' (check p_mh) - [NSCursor setHiddenUntilMouseMoves:YES]; + [self hideMouseCursor]; // NOTE: 'string' is either an NSString or an NSAttributedString. Since we // do not support attributes, simply pass the corresponding NSString in the @@ -1377,12 +1377,21 @@ - (void)sendKeyDown:(const char *)chars length:(int)len modifiers:(int)flags [data appendBytes:&len length:sizeof(int)]; [data appendBytes:chars length:len]; - // TODO: Support 'mousehide' (check p_mh) - [NSCursor setHiddenUntilMouseMoves:YES]; + [self hideMouseCursor]; //NSLog(@"%s len=%d chars=0x%x", _cmd, len, chars[0]); [[self vimController] sendMessage:KeyDownMsgID data:data]; } } +- (void)hideMouseCursor +{ + // Check 'mousehide' option + id mh = [[[self vimController] vimState] objectForKey:@"p_mh"]; + if (mh && ![mh boolValue]) + [NSCursor setHiddenUntilMouseMoves:NO]; + else + [NSCursor setHiddenUntilMouseMoves:YES]; +} + @end // MMTextView (Private) From 89d9e60b8a35f2c691d820855e02d2fa45d3bc09 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sat, 7 Jun 2008 15:36:07 +0200 Subject: [PATCH 0511/1156] Add 'rightleft' support to ATSUI renderer --- src/MacVim/MMAtsuiTextView.m | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/MacVim/MMAtsuiTextView.m b/src/MacVim/MMAtsuiTextView.m index 470e006094..7990b63da1 100644 --- a/src/MacVim/MMAtsuiTextView.m +++ b/src/MacVim/MMAtsuiTextView.m @@ -1121,6 +1121,10 @@ - (void)drawInsertionPointAtRow:(int)row column:(int)col shape:(int)shape } else if (MMInsertionPointVertical == shape) { int frac = (cellSize.width * percent + 99)/100; rect.size.width = frac; + } else if (MMInsertionPointVerticalRight == shape) { + int frac = (cellSize.width * percent + 99)/100; + rect.origin.x += rect.size.width - frac; + rect.size.width = frac; } [color set]; From bf70f82498ffe9b1751b8f26337da5cab88b484e Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sun, 8 Jun 2008 14:21:16 +0200 Subject: [PATCH 0512/1156] Snapshot 29 --- src/MacVim/Info.plist | 2 +- src/MacVim/MacVim.xcodeproj/project.pbxproj | 6 ++-- src/MacVim/macvim_latest.xml | 36 +++++++++++++++++++++ 3 files changed, 40 insertions(+), 4 deletions(-) diff --git a/src/MacVim/Info.plist b/src/MacVim/Info.plist index bf59c17a7b..646d1f36e9 100644 --- a/src/MacVim/Info.plist +++ b/src/MacVim/Info.plist @@ -574,7 +574,7 @@ CFBundleSignature VIMM CFBundleVersion - 28 + 29 NSMainNibFile MainMenu NSPrincipalClass diff --git a/src/MacVim/MacVim.xcodeproj/project.pbxproj b/src/MacVim/MacVim.xcodeproj/project.pbxproj index 75ca441218..99e8b31e9f 100644 --- a/src/MacVim/MacVim.xcodeproj/project.pbxproj +++ b/src/MacVim/MacVim.xcodeproj/project.pbxproj @@ -698,7 +698,7 @@ i386, ); COPY_PHASE_STRIP = YES; - CURRENT_PROJECT_VERSION = 28; + CURRENT_PROJECT_VERSION = 29; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "$(FRAMEWORK_SEARCH_PATHS_QUOTED_1)", @@ -739,7 +739,7 @@ buildSettings = { ARCHS = "$(NATIVE_ARCH)"; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 28; + CURRENT_PROJECT_VERSION = 29; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "$(FRAMEWORK_SEARCH_PATHS_QUOTED_1)", @@ -770,7 +770,7 @@ buildSettings = { ARCHS = "$(NATIVE_ARCH)"; COPY_PHASE_STRIP = YES; - CURRENT_PROJECT_VERSION = 28; + CURRENT_PROJECT_VERSION = 29; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "$(FRAMEWORK_SEARCH_PATHS_QUOTED_1)", diff --git a/src/MacVim/macvim_latest.xml b/src/MacVim/macvim_latest.xml index 5f3154a1f4..658ca769b4 100644 --- a/src/MacVim/macvim_latest.xml +++ b/src/MacVim/macvim_latest.xml @@ -40,6 +40,42 @@ Sparkle supports updates in zip, tar, tbz, tgz, or dmg format. --> + + Snapshot 29 released + MacVim snapshot 29 released +

Changes since snapshot 28: +

    +
  • copy&paste and other "Edit" menu items now work as expected with dialogs + (such as open/save).
  • +
  • some menus (such as the "Window" menu) has got some new items
  • +
  • general menu improvements when no editor window is open
  • +
  • window-cycling key Cmd-` is no longer hard-coded and can be changed with + :macmenu command
  • +
  • ability to access some OS X default Cmd-keys even if menus are + completely altered (e.g. when starting with "-u NONE")
  • +
  • QuickLook works with .vim files (patch by Nico Weber)
  • +
  • insert mode cursor honors the 'rightleft' option
  • +
  • no more "freezes" during :shell
  • +
  • no beeping on Cmd-q
  • +
  • Cmd-w works in full-screen again
  • +
  • window dimensions properly restored when leaving full-screen when + "maxvert" is in 'fuoptions'
  • +
  • support for 'mousehide' option
  • +
  • latest vim patches and runtime files
  • +
+

+ ]]>
+ Sun, 7 Jun 2008 12:57 CET + +
+ + Snapshot 28 released Date: Sun, 8 Jun 2008 16:35:43 +0200 Subject: [PATCH 0513/1156] Window cycling hardcoded to keycode 50 Window cycling is hardcoded to happen when the Cmd key is pressed with the key whose keycode = 50. Having window cycling in the "Window" menu means that window cycling stops working when the keyboard layout is changed. Thus revert back to the old way of dealing with this since it seems to work better. --- .../MainMenu.nib/keyedobjects.nib | Bin 11124 -> 10859 bytes src/MacVim/MMAtsuiTextView.m | 6 ++++++ src/MacVim/MMTextView.m | 6 ++++++ src/MacVim/gvimrc | 4 ---- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/MacVim/English.lproj/MainMenu.nib/keyedobjects.nib b/src/MacVim/English.lproj/MainMenu.nib/keyedobjects.nib index 61f27a69dd8edc655371f10618135f7f0bd56871..8864a9f6c40391c951d45a32acfb62881d6e8215 100644 GIT binary patch literal 10859 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 literal 11124 zcmdUVcYGAZ`~S@DTyMMAFJ*6!9#8};Lbp1S-vQXzG} z%uX$1gJs@`m*N4ODLb#bZ;Y=jBmPk}kGmor(xcYs0n`?CM4eF=^cd=ahM)j?3QaIynt`50v(a4i0$P9;q8HIhvG>n$fF(#%nlg;EXJ(&Wg4^zyPF#VVz%m`*AjE!O@Fw@{VoteqZ zXBIFoGHc-JWo9F@jd_#V#~fqMF`qHtF;`&p25Q6n#^kV=Wmp4iWbJV8W<|CE+nb%i zzQ^uj-)DETAFzAaz3e`AKYM`vkUhvAVh^)N*rV(*_BeZjJ;~Ovr`Xf%8TKrDjy=y_ zU_W9%WT9>=pKV_6PPy_A2`m`wQtpo+oq3 z3uGRdPZp4cWD!|RmXH_8Qt}d6MwXKmWF=WeR+Ba4WwMsMLe`O2$$GMZRFRFOn!H9f zk=My)vW09VZ;)-|O|qTrAa9Yk$vfm-vXi_=c9HkVZt?-yL-vw=WIs7TJ|qXpA##`; zAxFtEa-5tXCrJ%CMNX45k=BQvrf zE3zRwav&#ip(K=yQcx-qkQ<4}gBqZQs1a(6nxLkr8A?OVQ44ezx*N4b_n=n2v-5fd zgOT2iO3S_BaKG%loS2J%4}_!6&{-b$g?oF;D}6BH%FfFuE%k-N{(=5-e`HLKzbyU^ zzU>?g1i-(*^TH+BdD-3yUs$FC_uWG9Fe(@tCeMmdl;0EsKOi9A!i(q!cVZN$9Sq4c zy9EQ0EN{R&*cTeWaoKsj{UA@dua7@a7916mJHC!ua*lfBmf02oTi@siNYOVYOY8&6 zNVp4~O@ESbXR4v^Q6;@jf2O-6oIw#)(VY_R#N(dy#tAUPz34u4KP)o3FnJMFL0S35 zgXkgD1~{|~M?(Irw2Tg+<#YtCq+{s>I+;#C39|apP&5pcqY8QH!OBpnuTOSf5AQ%wTNlny3 z^|G`x{Myy$Oa| zLYEeFE)Rx%xug0G_k{)pLlx1-^g2fGqMg8~5p7x@qxXT)?po*pqsFvJ3?0RJu&~mI zm{DGy>n#pPAK*TL?jdv-=%&%T>!W)N=pK*LtpU0%=v`5|&1JO*(dj7e&cc-QfYB(H z7SNYr&MN~rb0<0e$c)8EQ0x{0Gxh|U-zD@J$l{{+(0l8X z<_nPK%LH|{qOD`<^g&n{4(=Who8$(I2Kmc<+h&R!W9;xF^TeL^G;*Vz#B*bL0u(~kAAw$-slvJE@b+AzO3 z7_8_Uhnsw#KvBSMpxB9at&d^@G#WQdKt*TTC5DQ^EPudX;UDYEtr);r;*{kvZ=^B= z!wC%T!gm9MN9p7BF=z!0TE`iT2azA6nNbFM2t1M8(fOs7k=xaeAI9yX>hD3b&qSe_ z5SVd?S`0^3pH-{+z8M39l@T$^TiV+X@}>quWxh}pmJqK3W!_L(bV5&Wz*qh+cA5C` zD7&6CuRi&+a5m0~$sc8zYlbQb(O%I-q?bGf#uRfRL!e{G9RlW+jT?Qu&AbV&feUdF zE(VT$XaOy%k7K_&BS$&*u3cmh>bB0%IQSqV4ujfk5V&m!u9e_0WsoT&@FpxaiN{AQ z*Aaz9c?AW-p*e|GI;Cr!zScn%z*Wjna>LdDM z9Z@W=VQB3dO5y@P<|`lGHw?}XsFd#$q+Nqw2GSLDczuM|B@nIx!ofJuc71k zbx_bUc)6mubGgqO66HJ$*|t=E=;bT*1tML7rIi(M4c}%SH+~au2mTBV(MWv~ybU%_ zgnjsS#K+cGAfr8DO?&WOpgEF`sgL3Tp!i_|ibm1VF%;!@4h|oaTUt;Gm)nF~hHLPt zsQ$;%r|Khl7D%2;@XaUb_?TOkLuDC?){MUBH2@wH^^M%S25?Dr!J%i!H^>+A1xkJO zMTX1x^Qej_om3z9uYmj43EU+*F&-3hEB&>xD0f6L_+Euv!X#?y8omysr_gEj5xxP0 ze@W2PRQhyWQ@wmp02UX7;F6&Bn~a>Vo}n}AA;v(qVo02roHAz6XQRZL157%P0icNa zLqfsI!9(JCF`WBE{{f})i+DQ}tL7LzV_3x)7-O_Uh!^%5Pymd9Vl#S;7WWLt@bukk zt~GiWUByL=jj`ivj1#ZH5+2H=;5}G?z@TD0xQc1WG-4VvP4G>?;$@~eI)pQE4cdSU znO00|d>2&gm(Y03qb*Du{4kS_7or-pjA@UbK{uHUrW4dp_d^JMjxGc}E&@;TLi}0- z=<5U_C!JQ)0G&(M(T#Kys3t@y-3*mcPdW|?ygqa*eF+kl4yqG9+z?AJCl#{mWd(Q)`6Z)%{n&J5@IhI>O^ zD7~Ra$qaY#hvh!83}nAcBmavwC3nyQ+Jd&#X@P0O42RF$Q2oZL%Ek1>gjmIdnFvz} zOWRK0p*!-sK~-0~s4;Zb8gvz1Vp=op(FQQ-Jz$!ZRJa3MTm^Bju8`frJPm9E(HJO8 z>!!;~^hqEzsf5+cAdPRrS17Z#+=+^WCnr*25m50$ zNmEPZjr^`<{@Q&Jme5(RpmGS9c6=9v%ApYI-i07F1w!1T5ZFo}Ff}U7^7;cYzn8aR zvRDqV!!%)>OgfXow1Q~22qM`Uy7dksq47w%O(X$C(!=&btw?W|fO_hfz#bFpVT>!~ z$R7n1!?BHGA$~mC0%}qL#qkiLtC&{u6`pFa1YunT9&Lkr6^y}8nCFgPw;(r+ZIQo& z;GT|Z7$WYHPltE%&vYnf zVpliZErxI9@7$n{=AaZNI?oHLVWMy3`H=O1xb}9Q3yNq4Vu3%TP ztJu}-8un#&E&B?)j(wF~&u(C=*o|y8`x?86eVyIRZehag8|*f;n%&OsVBccjX5V4o zWp~o|>2CS~-9z`%eRMxPKtH4h=^=WU9-&9+F?yVypeJb!Jw;E`GxRJyN6*s>^dtH) z{e)hmpVCY8GkTeRPQRdE(y!>(kS4yN-_j)d9lb)or$5ji=~a3Sx+@v?qP!y}HmlnV zNxS_;U5lR<$- zSBXP%s{5CKb(MNrN%Z4pa(aPDd;+OxX9Z*Cgt1u8fWbtuYTI-ePUI`s)G(Bk@cHdc zR9e3n@7QSKqVBEb+AJZH0xeVQgWB37@srjGI=OEE=Sbk1&>(|7oOiIt9m;jt20{X{ z|L#MT~a~|e*3J1`W(LZBrvGAB8EAMW{8u&-CofxzO+7dy>reQH>RKORCV@u92wK$7|F_E~uR|Nc=3F0Ph zrTj~jD6u$jZlN)8U2%*>S6p<9+AxlKn{Ryagpf;vmr|-g1Lo90F zNVxw^j&w)^?p{OXg8JbqIB)Qwf@nL^1Uk-J z?Ff`fnP>x?OAJJP{Mba&*Ir1oZ zjAW9>Nq5qNWRYx=Lwb^2(u?Ggd{RJqlRl)76p><5Li&<^q(2!zo*-T_kd%@#;v<8| zU^0aG$xt$kl#>b)AVD&mj36NrCJ|CeMv_rvG#Nw2l5yloGM+p|CJ;&_GLcLolgSh^ zl{`(Rk?G_aGJ`xzW|CQCHhGTBp}){y>2LIR`Um}!{zd<$|InKfMiPd863*CI2@?q` zB&?LMO2TRhYb30duuj5y2^%DAl(0#{oP>D^nAz{AYr$JMG1Q(+(5z&CEQ5DjV0Vf!c8UIOu}grZZ6>#6242qcT2dXgzu4XD+#xj z@VyegPr~<0_yGw&DB*`B+(yD}C7dqdhb7!j!jDL}y@WeRxFe4nau>Lp+$3H;2TbL0 zJ07QS=XlI<-@pbik3}B0=kWtPcJufl9wY8s?sx7A{4N34mYc`R1WerX+zjqdZX%D{ za&0(?$KAQ9+%yXuCdq&P=5adr95;vija$SmfybFV zeuT%#Ja+I{!Q&+EJdfM(xCfWYrSsUuV+)TTFX9Y*lPiY*)Occt^2Qu}iUAu}85_aX@iUaaeIwaa?gyaY}JU zaZYhT@v-8f;*#RB;tR!f#h*%6sZgqv8fA0ky~=LNT;%|zUpZ1aUO7Q2DW@u@DQ7BY zE9WTZDwiuaC^sr!Q@*a;rrfUFt30JVqdcd)puDWSq5Mb1s_d$Us>Z6Osx(zQRae#H zssdGss!TOZHA(fnYL#k}YO`vqYMW}i>V4G*s=cbSs!OVGRoB#NwN33%yVS|*cIx)( zj_OY8F6wUT$J7PtKI$TMiQ20!RgX|VrKakM>dERg>b2^1>h
b+vkv`fc^Q>I3T2 z>a*(e>W|cat8Z$shSexEDvd^yr15APY8q>rYSJ|AH61j$nt_@!%^=MX%}~t@%}mW~ z%^b~K%{hqr)}7b=q1WjRdXt{lTlDwqAJn(eKcerT z&(L?)ch%?W^YrEV@%jmRNk2(HMgOw?75%IF4f>7x*YvOJ&*?wYf3E*hf7QSmID^?> zHP{Ug8QK~iHaueJV8}3ZHe?#Q8+sW^4L-wQgWoXB@T_5$;W@+eh8GO;4GRrx3~LSR z4C@U$4EqcvL1#%acN#`VT3W3_RUakFu&aj$W|@k8Sw;}PRI<24gwA||CtZPJ=r znC>>+V`^=>&-8%lAya2lrm457&{S;dYZ`BwV3JIeOjArxo2Hv)nVvJvH?1|TGp#pO znW|04Oeah=rqiagrt_wcOgBuwa#pS}*OW`+T5xxB*<4Sq7njfV<_fuDZV)$w3v-m4 z$W4Z*w3b`Pt>>z^YHky^nR}Dl!M(>F=8kg5xs%+_+%FKL{(z|R507{!pTwu}_wsG| z$M~Ln5nsZ;$G^{i!0+Yv^B?ku_#^x={sdpcpXSf<=lPHLPxw#y&-l;zFZr+eZ}}_y z5BydBI{!2O3;!Gc2mcrUj~SU6Gcha8YO~g?Hyh2I*=)9&?PjMr$(&*q%%Zu0xx2Z* z+~53!d7!z>Jjgu6Jk(rn4wy%ordP!}hlA9otUZF57O~726NC ztF~*lpKL$dezE;#`@^oXx3b@Bzu*3#y^THH-p=0M-qD_E?{3eskF<}rkF`H(f67kn z6YZ1jQ|&YCFWBeX*V@Kfk zb~$!C_Bi%A4mb`v4m*xIjyp~|PC3pv&N(hPK6YGmTyk7?eBt=Y@r~m<$M=pO9oHN` zIc_+9b^Px5)A6_CrV~3^r^0D;a?VlCG0t($@y-cO$vMe6#rd>zx^sqergOG)j&rVa zo^ye7k#mW2sdJfgg>#j2jdQJYopZgj%31B)fGks?tIJnj&rATmvgssk8_{% zfb*d9u=A+%xbvj*l=F=9ob!V7bLW??ELV;z*OligaP@H&xk_C9TmxKQSE zxmLJVxz@PWy4JbYyQ*B(u1&5FU6+#@B(+WInpBuHENODmb4ja{wkI7+x}1!Xjmb&L z_atW|XC)UUhm&7U-j{qS`TG=AN{f_^DfuaVQ-UeeQC|nXQ3ttFd3Ev3c3EvAp z3fF|6gd4)I!tcVL!r#J8H+E~?diNUlTK78ldUut(+P%rW*}c`h&Ar|IwtJ`hefJ*s ze)mE55%+O-jr)xIy!&JKr|!${FWuj`ueg77Uw7Yd|K|SF{f~%6BC15KXb?HkBHBfl zm?FBx24Z8enb<;XDYh2x7atPS#Ye=BVrQ|Nm?`!UbHrX^fmkS(i2X&cSSAh@hl&;A za4{^76vv29iW5XhoFq;Wr-?JfS>haVt~g&@C@v9S5?6?;#kJzAVwG4eZW1?(Z-{S- zJH&Uy_r&+b55&FVe(|7qSUf785NpKK;zjW@@pJJ@@oVv0@rwAPcuo9C{6+j-{7by) zVLS?t+N1LrJ-o;2ad=#w6p!2E@ig=_@uYd~^0f4{_T2Az(9_0~?rG=g;K}ej?&;yl i^7Qr;dWt*)J!KxBC*TRA=pTlOUCB4GYwb_Z#Qy^{yfKFW diff --git a/src/MacVim/MMAtsuiTextView.m b/src/MacVim/MMAtsuiTextView.m index 7990b63da1..c2eaa9c45f 100644 --- a/src/MacVim/MMAtsuiTextView.m +++ b/src/MacVim/MMAtsuiTextView.m @@ -406,6 +406,12 @@ - (BOOL)performKeyEquivalent:(NSEvent *)event && !(116 == [event keyCode] || 121 == [event keyCode])) return NO; + // HACK! KeyCode 50 represent the key which switches between windows + // within an application (like Cmd+Tab is used to switch between + // applications). Return NO here, else the window switching does not work. + if ([event keyCode] == 50) + return NO; + // HACK! Let the main menu try to handle any key down event, before // passing it on to vim, otherwise key equivalents for menus will // effectively be disabled. diff --git a/src/MacVim/MMTextView.m b/src/MacVim/MMTextView.m index 22554ced0a..80ccbdfabc 100644 --- a/src/MacVim/MMTextView.m +++ b/src/MacVim/MMTextView.m @@ -640,6 +640,12 @@ - (BOOL)performKeyEquivalent:(NSEvent *)event && !(116 == [event keyCode] || 121 == [event keyCode])) return NO; + // HACK! KeyCode 50 represent the key which switches between windows + // within an application (like Cmd+Tab is used to switch between + // applications). Return NO here, else the window switching does not work. + if ([event keyCode] == 50) + return NO; + // HACK! Let the main menu try to handle any key down event, before // passing it on to vim, otherwise key equivalents for menus will // effectively be disabled. diff --git a/src/MacVim/gvimrc b/src/MacVim/gvimrc index 1c39d71d3e..a735ff310f 100644 --- a/src/MacVim/gvimrc +++ b/src/MacVim/gvimrc @@ -83,8 +83,6 @@ an 9900.301 Window.Minimize\ All an 9900.310 Window.Zoom an 9900.311 Window.Zoom\ All an 9900.320 Window.Toggle\ Full\ Screen\ Mode :set invfullscreen -an 9900.325 Window.Cycle\ Through\ Windows -an 9900.326 Window.Cycle\ Backwards\ Through\ Windows an 9900.330 Window.-SEP1- " TODO! Grey out if no tabs are visible. an 9900.340 Window.Previous\ Tab :tabprevious @@ -244,8 +242,6 @@ macm Window.Minimize\ All key= action=miniaturizeAll: alt=YES macm Window.Zoom key= action=performZoom: macm Window.Zoom\ All key= action=zoomAll: alt=YES macm Window.Toggle\ Full\ Screen\ Mode key= -macm Window.Cycle\ Through\ Windows key= action=_cycleWindows: -macm Window.Cycle\ Backwards\ Through\ Windows key= action=_cycleWindowsBackwards: alt=YES macm Window.Previous\ Tab key= macm Window.Next\ Tab key= macm Window.Bring\ All\ To\ Front action=arrangeInFront: From 9716d0b66f36db27f0e455ad48ac0de0fbf5bb26 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sun, 8 Jun 2008 16:54:26 +0200 Subject: [PATCH 0514/1156] Snapshot 30 --- src/MacVim/Info.plist | 2 +- src/MacVim/MacVim.xcodeproj/project.pbxproj | 6 +++--- src/MacVim/macvim_latest.xml | 16 ++++++++-------- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/MacVim/Info.plist b/src/MacVim/Info.plist index 646d1f36e9..9b47d0c47e 100644 --- a/src/MacVim/Info.plist +++ b/src/MacVim/Info.plist @@ -574,7 +574,7 @@ CFBundleSignature VIMM CFBundleVersion - 29 + 30 NSMainNibFile MainMenu NSPrincipalClass diff --git a/src/MacVim/MacVim.xcodeproj/project.pbxproj b/src/MacVim/MacVim.xcodeproj/project.pbxproj index 99e8b31e9f..8ae9603cbf 100644 --- a/src/MacVim/MacVim.xcodeproj/project.pbxproj +++ b/src/MacVim/MacVim.xcodeproj/project.pbxproj @@ -698,7 +698,7 @@ i386, ); COPY_PHASE_STRIP = YES; - CURRENT_PROJECT_VERSION = 29; + CURRENT_PROJECT_VERSION = 30; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "$(FRAMEWORK_SEARCH_PATHS_QUOTED_1)", @@ -739,7 +739,7 @@ buildSettings = { ARCHS = "$(NATIVE_ARCH)"; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 29; + CURRENT_PROJECT_VERSION = 30; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "$(FRAMEWORK_SEARCH_PATHS_QUOTED_1)", @@ -770,7 +770,7 @@ buildSettings = { ARCHS = "$(NATIVE_ARCH)"; COPY_PHASE_STRIP = YES; - CURRENT_PROJECT_VERSION = 29; + CURRENT_PROJECT_VERSION = 30; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "$(FRAMEWORK_SEARCH_PATHS_QUOTED_1)", diff --git a/src/MacVim/macvim_latest.xml b/src/MacVim/macvim_latest.xml index 658ca769b4..621c3b8217 100644 --- a/src/MacVim/macvim_latest.xml +++ b/src/MacVim/macvim_latest.xml @@ -41,17 +41,15 @@ --> - Snapshot 29 released + Snapshot 30 released MacVim snapshot 29 released +

MacVim snapshot 30 released

Changes since snapshot 28:

  • copy&paste and other "Edit" menu items now work as expected with dialogs (such as open/save).
  • some menus (such as the "Window" menu) has got some new items
  • general menu improvements when no editor window is open
  • -
  • window-cycling key Cmd-` is no longer hard-coded and can be changed with - :macmenu command
  • ability to access some OS X default Cmd-keys even if menus are completely altered (e.g. when starting with "-u NONE")
  • QuickLook works with .vim files (patch by Nico Weber)
  • @@ -65,12 +63,14 @@
  • latest vim patches and runtime files

+

The only difference between snapshot 29 and 30 is that the former did not +handle window cycling very well with international keyboard layouts.

]]>
- Sun, 7 Jun 2008 12:57 CET + Sun, 8 Jun 2008 16:43 CET
From 46ae2ec9cbed8200db9494aa79932a90a99616b3 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Mon, 9 Jun 2008 18:48:10 +0200 Subject: [PATCH 0515/1156] Force flush output queue before showing dialog This ensures that the swap file information is displayed when the 'swap file exists' dialog is shown. --- src/message.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/message.c b/src/message.c index b2daa90e22..4c39817712 100644 --- a/src/message.c +++ b/src/message.c @@ -3288,6 +3288,11 @@ do_dialog(type, title, message, buttons, dfltbutton, textfield) /* When GUI is running and 'c' not in 'guioptions', use the GUI dialog */ if (gui.in_use && vim_strchr(p_go, GO_CONDIALOG) == NULL) { +# ifdef FEAT_GUI_MACVIM + /* The 'swap file exists' dialog also displays text in the editor + * window so make sure this is flushed before showing the dialog. */ + gui_macvim_force_flush(); +# endif c = gui_mch_dialog(type, title, message, buttons, dfltbutton, textfield); msg_end_prompt(); From 04cd1420c1e160502962ca1432b8b76eaf2ec552 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Mon, 9 Jun 2008 19:13:43 +0200 Subject: [PATCH 0516/1156] Force flush output queue before presenting any dialog The previous commit did not ensure the output queue was flushed before "browse" dialogs were shown. --- src/MacVim/gui_macvim.m | 6 ++++++ src/message.c | 5 ----- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/MacVim/gui_macvim.m b/src/MacVim/gui_macvim.m index 16db6b7464..9e22970b9c 100644 --- a/src/MacVim/gui_macvim.m +++ b/src/MacVim/gui_macvim.m @@ -1286,6 +1286,9 @@ + (id)stringWithVimString:(char_u *)s; //NSLog(@"gui_mch_browse(saving=%d, title=%s, dflt=%s, ext=%s, initdir=%s," // " filter=%s", saving, title, dflt, ext, initdir, filter); + // Ensure no data is on the output queue before presenting the dialog. + gui_macvim_force_flush(); + #ifdef FEAT_MBYTE title = CONVERT_TO_UTF8(title); initdir = CONVERT_TO_UTF8(initdir); @@ -1319,6 +1322,9 @@ + (id)stringWithVimString:(char_u *)s; // "dfltbutton=%d textfield=%s)", type, title, message, buttons, // dfltbutton, textfield); + // Ensure no data is on the output queue before presenting the dialog. + gui_macvim_force_flush(); + #ifdef FEAT_MBYTE title = CONVERT_TO_UTF8(title); message = CONVERT_TO_UTF8(message); diff --git a/src/message.c b/src/message.c index 4c39817712..b2daa90e22 100644 --- a/src/message.c +++ b/src/message.c @@ -3288,11 +3288,6 @@ do_dialog(type, title, message, buttons, dfltbutton, textfield) /* When GUI is running and 'c' not in 'guioptions', use the GUI dialog */ if (gui.in_use && vim_strchr(p_go, GO_CONDIALOG) == NULL) { -# ifdef FEAT_GUI_MACVIM - /* The 'swap file exists' dialog also displays text in the editor - * window so make sure this is flushed before showing the dialog. */ - gui_macvim_force_flush(); -# endif c = gui_mch_dialog(type, title, message, buttons, dfltbutton, textfield); msg_end_prompt(); From 404077032eef1838b1e554b8e238f8b52b76f49d Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Mon, 9 Jun 2008 21:34:54 +0200 Subject: [PATCH 0517/1156] Dialog box handling updated Keep waiting for dialog reply until it is received. Any input received during this wait is discarded unless it is a 'set text dimensions' message (or keyboard/mouse input). Also, make setDialogReturn: a synchronous call so that it is less likely to get dropped. --- src/MacVim/MMBackend.m | 61 +++++++++++++++++++++++++++++++----- src/MacVim/MMVimController.m | 14 +++++++++ src/MacVim/MacVim.h | 2 +- 3 files changed, 69 insertions(+), 8 deletions(-) diff --git a/src/MacVim/MMBackend.m b/src/MacVim/MMBackend.m index 6ab1769406..2f75583e3e 100644 --- a/src/MacVim/MMBackend.m +++ b/src/MacVim/MMBackend.m @@ -80,6 +80,7 @@ - (NSComparisonResult)serverNameCompare:(NSString *)string; @interface MMBackend (Private) +- (void)waitForDialogReturn; - (void)queueVimStateMessage; - (void)processInputQueue; - (void)handleInputEvent:(int)msgid data:(NSData *)data; @@ -640,9 +641,7 @@ - (char *)browseForFileInDirectory:(char *)dir title:(char *)title @try { [frontendProxy showSavePanelForDirectory:ds title:ts saving:saving]; - // Wait until a reply is sent from MMVimController. - [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode - beforeDate:[NSDate distantFuture]]; + [self waitForDialogReturn]; if (dialogReturn && [dialogReturn isKindOfClass:[NSString class]]) { char_u *ret = (char_u*)[dialogReturn UTF8String]; @@ -664,13 +663,18 @@ - (char *)browseForFileInDirectory:(char *)dir title:(char *)title return (char *)s; } -- (oneway void)setDialogReturn:(in bycopy id)obj +- (void)setDialogReturn:(in bycopy id)obj { // NOTE: This is called by // - [MMVimController panelDidEnd:::], and // - [MMVimController alertDidEnd:::], // to indicate that a save/open panel or alert has finished. + // We want to distinguish between "no dialog return yet" and "dialog + // returned nothing". The former can be tested with dialogReturn == nil, + // the latter with dialogReturn == [NSNull null]. + if (!obj) obj = [NSNull null]; + if (obj != dialogReturn) { [dialogReturn release]; dialogReturn = [obj retain]; @@ -719,9 +723,7 @@ - (int)presentDialogWithType:(int)type title:(char *)title message:(char *)msg informativeText:text buttonTitles:buttons textFieldString:textFieldString]; - // Wait until a reply is sent from MMVimController. - [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode - beforeDate:[NSDate distantFuture]]; + [self waitForDialogReturn]; if (dialogReturn && [dialogReturn isKindOfClass:[NSArray class]] && [dialogReturn count]) { @@ -1475,6 +1477,49 @@ - (BOOL)sendReply:(NSString *)reply toPort:(int)port @implementation MMBackend (Private) +- (void)waitForDialogReturn +{ + // Keep processing the run loop until a dialog returns. To avoid getting + // stuck in an endless loop (could happen if the setDialogReturn: message + // was lost) we also do some paranoia checks. + // + // Note that in Cocoa the user can still resize windows and select menu + // items while a sheet is being displayed, so we can't just wait for the + // first message to arrive and assume that is the setDialogReturn: call. + + while (nil == dialogReturn && !got_int && [connection isValid] + && !isTerminating) + [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode + beforeDate:[NSDate distantFuture]]; + + // Search for any resize messages on the input queue. All other messages + // on the input queue are dropped. The reason why we single out resize + // messages is because the user may have resized the window while a sheet + // was open. + int i, count = [inputQueue count]; + if (count > 0) { + id textDimData = nil; + if (count%2 == 0) { + for (i = count-2; i >= 0; i -= 2) { + int msgid = [[inputQueue objectAtIndex:i] intValue]; + if (SetTextDimensionsMsgID == msgid) { + textDimData = [[inputQueue objectAtIndex:i+1] retain]; + break; + } + } + } + + [inputQueue removeAllObjects]; + + if (textDimData) { + [inputQueue addObject: + [NSNumber numberWithInt:SetTextDimensionsMsgID]]; + [inputQueue addObject:textDimData]; + [textDimData release]; + } + } +} + - (void)queueVimStateMessage { // NOTE: This is the place to add Vim state that needs to be accessed from @@ -1494,6 +1539,8 @@ - (void)queueVimStateMessage - (void)processInputQueue { + if ([inputQueue count] == 0) return; + // NOTE: One of the input events may cause this method to be called // recursively, so copy the input queue to a local variable and clear it // before starting to process input events (otherwise we could get stuck in diff --git a/src/MacVim/MMVimController.m b/src/MacVim/MMVimController.m index 9edc0884ce..b7766ce78f 100644 --- a/src/MacVim/MMVimController.m +++ b/src/MacVim/MMVimController.m @@ -47,6 +47,8 @@ static NSTimeInterval MMResendInterval = 0.5; #endif +static NSTimeInterval MMSetDialogReturnTimeout = 1.0; + @interface MMAlert : NSAlert { NSTextField *textField; @@ -813,6 +815,15 @@ - (void)savePanelDidEnd:(NSSavePanel *)panel code:(int)code context:(void *)context { NSString *path = (code == NSOKButton) ? [panel filename] : nil; + + // NOTE! setDialogReturn: is a synchronous call so set a proper timeout to + // avoid waiting forever for it to finish. We make this a synchronous call + // so that we can be fairly certain that Vim doesn't think the dialog box + // is still showing when MacVim has in fact already dismissed it. + NSConnection *conn = [backendProxy connectionForProxy]; + NSTimeInterval oldTimeout = [conn requestTimeout]; + [conn setRequestTimeout:MMSetDialogReturnTimeout]; + @try { [backendProxy setDialogReturn:path]; @@ -825,6 +836,9 @@ - (void)savePanelDidEnd:(NSSavePanel *)panel code:(int)code @catch (NSException *e) { NSLog(@"Exception caught in %s %@", _cmd, e); } + @finally { + [conn setRequestTimeout:oldTimeout]; + } } - (void)alertDidEnd:(MMAlert *)alert code:(int)code context:(void *)context diff --git a/src/MacVim/MacVim.h b/src/MacVim/MacVim.h index be02e79484..5c93c3f9d3 100644 --- a/src/MacVim/MacVim.h +++ b/src/MacVim/MacVim.h @@ -29,7 +29,7 @@ @protocol MMBackendProtocol - (oneway void)processInput:(int)msgid data:(in bycopy NSData *)data; - (oneway void)processInputAndData:(in bycopy NSArray *)messages; -- (oneway void)setDialogReturn:(in bycopy id)obj; +- (void)setDialogReturn:(in bycopy id)obj; - (NSString *)evaluateExpression:(in bycopy NSString *)expr; - (BOOL)starRegisterToPasteboard:(byref NSPasteboard *)pboard; @end From 80b4c97a2c4aec97bd7225f95a0303775a5dd766 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Mon, 9 Jun 2008 21:52:32 +0200 Subject: [PATCH 0518/1156] Add Dock menu --- .../English.lproj/MainMenu.nib/info.nib | 4 +--- .../MainMenu.nib/keyedobjects.nib | Bin 10859 -> 11350 bytes 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/MacVim/English.lproj/MainMenu.nib/info.nib b/src/MacVim/English.lproj/MainMenu.nib/info.nib index ed5b381a05..4e41f05cd3 100644 --- a/src/MacVim/English.lproj/MainMenu.nib/info.nib +++ b/src/MacVim/English.lproj/MainMenu.nib/info.nib @@ -9,9 +9,7 @@ IBOldestOS 5 IBOpenObjects - - 310 - + IBSystem Version 9D34 targetFramework diff --git a/src/MacVim/English.lproj/MainMenu.nib/keyedobjects.nib b/src/MacVim/English.lproj/MainMenu.nib/keyedobjects.nib index 8864a9f6c40391c951d45a32acfb62881d6e8215..85b21c55dfefaa83e3d7989d9e3bc39c782fc327 100644 GIT binary patch literal 11350 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 From 21b029712fd20934d5f6b8fa803f0f68930a5e87 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Mon, 9 Jun 2008 22:18:36 +0200 Subject: [PATCH 0519/1156] Set mouse cursor on mouseMoved: This seems to be the only way to get the mouse cursor not to be changed to an I-beam cursor all the time. --- src/MacVim/MMTextView.m | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/MacVim/MMTextView.m b/src/MacVim/MMTextView.m index 80ccbdfabc..c90bc23e50 100644 --- a/src/MacVim/MMTextView.m +++ b/src/MacVim/MMTextView.m @@ -932,6 +932,11 @@ - (void)mouseMoved:(NSEvent *)event MMTextStorage *ts = (MMTextStorage*)[self textStorage]; if (!ts) return; + // HACK! NSTextView has a nasty habit of resetting the cursor to the + // default I-beam cursor at random moments. The only reliable way we know + // of to work around this is to set the cursor each time the mouse moves. + [self setCursor]; + NSPoint pt = [self convertPoint:[event locationInWindow] fromView:nil]; int row, col; if (![self convertPoint:pt toRow:&row column:&col]) @@ -964,11 +969,6 @@ - (void)mouseEntered:(NSEvent *)event // key. if ([[self window] isKeyWindow]) { [[self window] setAcceptsMouseMovedEvents:YES]; - - // Ensure Vim gets to choose the mouse cursor when it enters over the - // text view, otherwise NSTextView will automatically set its I-Beam - // cursor. - [self setCursor]; } } From 7b68b0b56dbe93ca95aa813ba61028ef3a5410af Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Thu, 12 Jun 2008 12:58:52 +0200 Subject: [PATCH 0520/1156] Disable default main menu key equivalent hack In performKeyEquivalent: do not pass the key equivalent to defaultMainMenu since this breaks the menus on OS X 10.4. Also, this hack is not strictly needed now that window cycling is hardcoded (and a "New Window" menu is always available on the dock menu) so it is just as well that it is removed. --- src/MacVim/MMAtsuiTextView.m | 8 -------- src/MacVim/MMTextView.m | 8 -------- 2 files changed, 16 deletions(-) diff --git a/src/MacVim/MMAtsuiTextView.m b/src/MacVim/MMAtsuiTextView.m index c2eaa9c45f..cbc51eecc4 100644 --- a/src/MacVim/MMAtsuiTextView.m +++ b/src/MacVim/MMAtsuiTextView.m @@ -418,14 +418,6 @@ - (BOOL)performKeyEquivalent:(NSEvent *)event if ([[NSApp mainMenu] performKeyEquivalent:event]) return YES; - // HACK! Give the default main menu a chance to handle the key down event. - // This is to ensure that the standard mappings (which are in the default - // main menu) are always available, also when the default Vim menus are - // used (these do not set any key equivalents!). - if ([[[MMAppController sharedInstance] defaultMainMenu] - performKeyEquivalent:event]) - return YES; - // HACK! On Leopard Ctrl-key events end up here instead of keyDown:. if (flags & NSControlKeyMask) { [self keyDown:event]; diff --git a/src/MacVim/MMTextView.m b/src/MacVim/MMTextView.m index c90bc23e50..2da9148349 100644 --- a/src/MacVim/MMTextView.m +++ b/src/MacVim/MMTextView.m @@ -652,14 +652,6 @@ - (BOOL)performKeyEquivalent:(NSEvent *)event if ([[NSApp mainMenu] performKeyEquivalent:event]) return YES; - // HACK! Give the default main menu a chance to handle the key down event. - // This is to ensure that the standard mappings (which are in the default - // main menu) are always available, also when the default Vim menus are - // used (these do not set any key equivalents!). - if ([[[MMAppController sharedInstance] defaultMainMenu] - performKeyEquivalent:event]) - return YES; - // HACK! On Leopard Ctrl-key events end up here instead of keyDown:. if (flags & NSControlKeyMask) { [self keyDown:event]; From 757e8b43590593630a34afd8fd25521126d171d9 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Thu, 12 Jun 2008 13:23:26 +0200 Subject: [PATCH 0521/1156] Toolbar buttons respond to mouse clicks again Toolbar items send vimToolbarItemAction: instead of vimMenuItemAction:. This enables us to separate toolbar items from menu items and can build proper descriptors (starting with "ToolBar"). --- src/MacVim/MMVimController.m | 2 +- src/MacVim/MMWindowController.h | 1 + src/MacVim/MMWindowController.m | 8 ++++++++ 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/MacVim/MMVimController.m b/src/MacVim/MMVimController.m index b7766ce78f..78eba7a266 100644 --- a/src/MacVim/MMVimController.m +++ b/src/MacVim/MMVimController.m @@ -1137,7 +1137,7 @@ - (void)addToolbarItemToDictionaryWithLabel:(NSString *)title NSToolbarItem *item = [[NSToolbarItem alloc] initWithItemIdentifier:title]; [item setLabel:title]; [item setToolTip:tip]; - [item setAction:@selector(vimMenuItemAction:)]; + [item setAction:@selector(vimToolbarItemAction:)]; [item setAutovalidates:NO]; NSImage *img = [NSImage imageNamed:icon]; diff --git a/src/MacVim/MMWindowController.h b/src/MacVim/MMWindowController.h index b323d8f492..24b7e7a3d7 100644 --- a/src/MacVim/MMWindowController.h +++ b/src/MacVim/MMWindowController.h @@ -68,6 +68,7 @@ - (IBAction)findNext:(id)sender; - (IBAction)findPrevious:(id)sender; - (IBAction)vimMenuItemAction:(id)sender; +- (IBAction)vimToolbarItemAction:(id)sender; - (IBAction)fontSizeUp:(id)sender; - (IBAction)fontSizeDown:(id)sender; diff --git a/src/MacVim/MMWindowController.m b/src/MacVim/MMWindowController.m index 9e3c3d0d67..dca72db0d7 100644 --- a/src/MacVim/MMWindowController.m +++ b/src/MacVim/MMWindowController.m @@ -609,6 +609,14 @@ - (IBAction)vimMenuItemAction:(id)sender [vimController sendMessage:ExecuteMenuMsgID data:[attrs dictionaryAsData]]; } +- (IBAction)vimToolbarItemAction:(id)sender +{ + NSArray *desc = [NSArray arrayWithObjects:@"ToolBar", [sender label], nil]; + NSDictionary *attrs = [NSDictionary dictionaryWithObject:desc + forKey:@"descriptor"]; + [vimController sendMessage:ExecuteMenuMsgID data:[attrs dictionaryAsData]]; +} + - (IBAction)fontSizeUp:(id)sender { [[NSFontManager sharedFontManager] modifyFont: From cdf043f0f95aae9eb300f828c6630ca3858e3624 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Thu, 12 Jun 2008 22:22:16 +0200 Subject: [PATCH 0522/1156] Draw modeless selection --- src/MacVim/MMAtsuiTextView.m | 31 +++++++++ src/MacVim/MMBackend.h | 2 + src/MacVim/MMBackend.m | 13 ++++ src/MacVim/MMTextView.h | 4 +- src/MacVim/MMTextView.m | 119 ++++++++++++++++++++++++++++++----- src/MacVim/MacVim.h | 1 + src/MacVim/gui_macvim.m | 20 +++--- src/proto/gui_macvim.pro | 2 +- src/ui.c | 4 ++ 9 files changed, 167 insertions(+), 29 deletions(-) diff --git a/src/MacVim/MMAtsuiTextView.m b/src/MacVim/MMAtsuiTextView.m index cbc51eecc4..b41874aee0 100644 --- a/src/MacVim/MMAtsuiTextView.m +++ b/src/MacVim/MMAtsuiTextView.m @@ -96,6 +96,8 @@ - (void)clearBlockFromRow:(int)row1 column:(int)col1 toRow:(int)row2 - (void)clearAll; - (void)drawInsertionPointAtRow:(int)row column:(int)col shape:(int)shape fraction:(int)percent color:(NSColor *)color; +- (void)drawInvertedRectAtRow:(int)row column:(int)col numRows:(int)nrows + numColumns:(int)ncols; @end @@ -599,6 +601,19 @@ - (void)performBatchDrawWithData:(NSData *)data [self drawInsertionPointAtRow:row column:col shape:shape fraction:percent color:[NSColor colorWithRgbInt:color]]; + } else if (DrawInvertedRectDrawType == type) { + int row = *((int*)bytes); bytes += sizeof(int); + int col = *((int*)bytes); bytes += sizeof(int); + int nr = *((int*)bytes); bytes += sizeof(int); + int nc = *((int*)bytes); bytes += sizeof(int); + /*int invert = *((int*)bytes);*/ bytes += sizeof(int); + +#if MM_DEBUG_DRAWING + NSLog(@" Draw inverted rect: row=%d col=%d nrows=%d ncols=%d", + row, col, nr, nc); +#endif + [self drawInvertedRectAtRow:row column:col numRows:nr + numColumns:nc]; } else if (SetCursorPosDrawType == type) { // TODO: This is used for Voice Over support in MMTextView, // MMAtsuiTextView currently does not support Voice Over. @@ -1133,4 +1148,20 @@ - (void)drawInsertionPointAtRow:(int)row column:(int)col shape:(int)shape } } +- (void)drawInvertedRectAtRow:(int)row column:(int)col numRows:(int)nrows + numColumns:(int)ncols +{ + // TODO: THIS CODE HAS NOT BEEN TESTED! + CGContextRef cgctx = [[NSGraphicsContext currentContext] graphicsPort]; + CGContextSaveGState(cgctx); + CGContextSetBlendMode(cgctx, kCGBlendModeDifference); + CGContextSetRGBFillColor(cgctx, 1.0, 1.0, 1.0, 1.0); + + CGRect rect = { col * cellSize.width, row * cellSize.height, + ncols * cellSize.width, nrows * cellSize.height }; + CGContextFillRect(cgctx, rect); + + CGContextRestoreGState(cgctx); +} + @end // MMAtsuiTextView (Drawing) diff --git a/src/MacVim/MMBackend.h b/src/MacVim/MMBackend.h index b99af3ebdb..f518b25ab1 100644 --- a/src/MacVim/MMBackend.h +++ b/src/MacVim/MMBackend.h @@ -71,6 +71,8 @@ scrollBottom:(int)bottom left:(int)left right:(int)right; - (void)drawCursorAtRow:(int)row column:(int)col shape:(int)shape fraction:(int)percent color:(int)color; +- (void)drawInvertedRectAtRow:(int)row column:(int)col numRows:(int)nr + numColumns:(int)nc invert:(int)invert; - (void)update; - (void)flushQueue:(BOOL)force; - (BOOL)waitForInput:(int)milliseconds; diff --git a/src/MacVim/MMBackend.m b/src/MacVim/MMBackend.m index 2f75583e3e..91a8e098ae 100644 --- a/src/MacVim/MMBackend.m +++ b/src/MacVim/MMBackend.m @@ -429,6 +429,19 @@ - (void)drawCursorAtRow:(int)row column:(int)col shape:(int)shape [drawData appendBytes:&percent length:sizeof(int)]; } +- (void)drawInvertedRectAtRow:(int)row column:(int)col numRows:(int)nr + numColumns:(int)nc invert:(int)invert +{ + int type = DrawInvertedRectDrawType; + [drawData appendBytes:&type length:sizeof(int)]; + + [drawData appendBytes:&row length:sizeof(int)]; + [drawData appendBytes:&col length:sizeof(int)]; + [drawData appendBytes:&nr length:sizeof(int)]; + [drawData appendBytes:&nc length:sizeof(int)]; + [drawData appendBytes:&invert length:sizeof(int)]; +} + - (void)update { // Tend to the run loop, returning immediately if there are no events diff --git a/src/MacVim/MMTextView.h b/src/MacVim/MMTextView.h index c8f04c292e..264f6207b0 100644 --- a/src/MacVim/MMTextView.h +++ b/src/MacVim/MMTextView.h @@ -29,14 +29,14 @@ int preEditColumn; int mouseShape; BOOL antialias; + NSRect *invertRects; + int numInvertRects; } - (id)initWithFrame:(NSRect)frame; - (void)setShouldDrawInsertionPoint:(BOOL)on; - (void)setPreEditRow:(int)row column:(int)col; -- (void)drawInsertionPointAtRow:(int)row column:(int)col shape:(int)shape - fraction:(int)percent color:(NSColor *)color; - (void)hideMarkedTextField; - (void)performBatchDrawWithData:(NSData *)data; - (void)setMouseShape:(int)shape; diff --git a/src/MacVim/MMTextView.m b/src/MacVim/MMTextView.m index 2da9148349..2307d16684 100644 --- a/src/MacVim/MMTextView.m +++ b/src/MacVim/MMTextView.m @@ -50,6 +50,8 @@ @interface MMTextView (Private) - (void)setCursor; - (BOOL)convertPoint:(NSPoint)point toRow:(int *)row column:(int *)column; - (BOOL)convertRow:(int)row column:(int)column toPoint:(NSPoint *)point; +- (BOOL)convertRow:(int)row column:(int)column numRows:(int)nr + numColumns:(int)nc toRect:(NSRect *)rect; - (NSRect)trackingRect; - (void)dispatchKeyEvent:(NSEvent *)event; - (MMWindowController *)windowController; @@ -58,6 +60,10 @@ - (void)startDragTimerWithInterval:(NSTimeInterval)t; - (void)dragTimerFired:(NSTimer *)timer; - (void)sendKeyDown:(const char *)chars length:(int)len modifiers:(int)flags; - (void)hideMouseCursor; +- (void)drawInsertionPointAtRow:(int)row column:(int)col shape:(int)shape + fraction:(int)percent color:(NSColor *)color; +- (void)drawInvertedRectAtRow:(int)row column:(int)col numRows:(int)nrows + numColumns:(int)ncols invert:(int)invert; @end @@ -130,6 +136,12 @@ - (void)dealloc markedTextField = nil; } + if (invertRects) { + free(invertRects); + invertRects = NULL; + numInvertRects = 0; + } + [super dealloc]; } @@ -153,23 +165,6 @@ - (void)setPreEditRow:(int)row column:(int)col preEditColumn = col; } -- (void)drawInsertionPointAtRow:(int)row column:(int)col shape:(int)shape - fraction:(int)percent color:(NSColor *)color -{ - //NSLog(@"drawInsertionPointAtRow:%d column:%d shape:%d color:%@", - // row, col, shape, color); - - // This only stores where to draw the insertion point, the actual drawing - // is done in drawRect:. - shouldDrawInsertionPoint = YES; - insertionPointRow = row; - insertionPointColumn = col; - insertionPointShape = shape; - insertionPointFraction = percent; - - [self setInsertionPointColor:color]; -} - - (void)hideMarkedTextField { if (markedTextField) { @@ -300,6 +295,19 @@ - (void)performBatchDrawWithData:(NSData *)data [self drawInsertionPointAtRow:row column:col shape:shape fraction:percent color:[NSColor colorWithRgbInt:color]]; + } else if (DrawInvertedRectDrawType == type) { + int row = *((int*)bytes); bytes += sizeof(int); + int col = *((int*)bytes); bytes += sizeof(int); + int nr = *((int*)bytes); bytes += sizeof(int); + int nc = *((int*)bytes); bytes += sizeof(int); + int invert = *((int*)bytes); bytes += sizeof(int); + +#if MM_DEBUG_DRAWING + NSLog(@" Draw inverted rect: row=%d col=%d nrows=%d ncols=%d", + row, col, nr, nc); +#endif + [self drawInvertedRectAtRow:row column:col numRows:nr numColumns:nc + invert:invert]; } else if (SetCursorPosDrawType == type) { cursorRow = *((int*)bytes); bytes += sizeof(int); cursorCol = *((int*)bytes); bytes += sizeof(int); @@ -452,6 +460,24 @@ - (void)drawRect:(NSRect)rect [super drawRect:rect]; + if (invertRects) { + CGContextRef cgctx = (CGContextRef)[context graphicsPort]; + CGContextSaveGState(cgctx); + CGContextSetBlendMode(cgctx, kCGBlendModeDifference); + CGContextSetRGBFillColor(cgctx, 1.0, 1.0, 1.0, 1.0); + + int i; + CGRect *rect = (CGRect*)invertRects; + for (i = 0; i < numInvertRects; ++i) + CGContextFillRect(cgctx, rect[i]); + + CGContextRestoreGState(cgctx); + + free(invertRects); + invertRects = NULL; + numInvertRects = 0; + } + if (shouldDrawInsertionPoint) { MMTextStorage *ts = (MMTextStorage*)[self textStorage]; @@ -1242,6 +1268,23 @@ - (BOOL)convertRow:(int)row column:(int)column toPoint:(NSPoint *)point return YES; } +- (BOOL)convertRow:(int)row column:(int)column numRows:(int)nr + numColumns:(int)nc toRect:(NSRect *)rect +{ + MMTextStorage *ts = (MMTextStorage*)[self textStorage]; + NSSize cellSize = [ts cellSize]; + if (!(rect && cellSize.width > 0 && cellSize.height > 0)) + return NO; + + rect->origin = [self textContainerOrigin]; + rect->origin.x += column * cellSize.width; + rect->origin.y += row * cellSize.height; + rect->size.width = cellSize.width * nc; + rect->size.height = cellSize.height * nr; + + return YES; +} + - (NSRect)trackingRect { NSRect rect = [self frame]; @@ -1392,4 +1435,46 @@ - (void)hideMouseCursor [NSCursor setHiddenUntilMouseMoves:YES]; } +- (void)drawInsertionPointAtRow:(int)row column:(int)col shape:(int)shape + fraction:(int)percent color:(NSColor *)color +{ + //NSLog(@"drawInsertionPointAtRow:%d column:%d shape:%d color:%@", + // row, col, shape, color); + + // This only stores where to draw the insertion point, the actual drawing + // is done in drawRect:. + shouldDrawInsertionPoint = YES; + insertionPointRow = row; + insertionPointColumn = col; + insertionPointShape = shape; + insertionPointFraction = percent; + + [self setInsertionPointColor:color]; +} + +- (void)drawInvertedRectAtRow:(int)row column:(int)col numRows:(int)nrows + numColumns:(int)ncols invert:(int)invert +{ + if (invert) { + // The result should be inverted. + int n = numInvertRects++; + invertRects = reallocf(invertRects, + numInvertRects*sizeof(NSRect)); + if (NULL != invertRects) { + [self convertRow:row column:col numRows:nrows numColumns:ncols + toRect:&invertRects[n]]; + [self setNeedsDisplayInRect:invertRects[n]]; + } else { + n = numInvertRects = 0; + } + } else { + // The result should look normal; all we need to do is to mark + // the rect for redrawing and Cocoa will redraw the text. + NSRect rect; + [self convertRow:row column:col numRows:nrows numColumns:ncols + toRect:&rect]; + [self setNeedsDisplayInRect:rect]; + } +} + @end // MMTextView (Private) diff --git a/src/MacVim/MacVim.h b/src/MacVim/MacVim.h index 5c93c3f9d3..45f5bb8213 100644 --- a/src/MacVim/MacVim.h +++ b/src/MacVim/MacVim.h @@ -176,6 +176,7 @@ enum { InsertLinesDrawType, DrawCursorDrawType, SetCursorPosDrawType, + DrawInvertedRectDrawType, }; enum { diff --git a/src/MacVim/gui_macvim.m b/src/MacVim/gui_macvim.m index 9e22970b9c..beb5e2e033 100644 --- a/src/MacVim/gui_macvim.m +++ b/src/MacVim/gui_macvim.m @@ -426,6 +426,17 @@ + (id)stringWithVimString:(char_u *)s; foreground:gui.def_norm_pixel]; } +/* + * Invert a rectangle from row r, column c, for nr rows and nc columns. + */ + void +gui_mch_invert_rectangle(int r, int c, int nr, int nc, int invert) +{ + [[MMBackend sharedInstance] drawInvertedRectAtRow:r column:c numRows:nr + numColumns:nc invert:invert]; +} + + // -- Tabline --------------------------------------------------------------- @@ -1454,15 +1465,6 @@ + (id)stringWithVimString:(char_u *)s; } -/* - * Invert a rectangle from row r, column c, for nr rows and nc columns. - */ - void -gui_mch_invert_rectangle(int r, int c, int nr, int nc) -{ -} - - #if defined(FEAT_EVAL) || defined(PROTO) /* * Bring the Vim window to the foreground. diff --git a/src/proto/gui_macvim.pro b/src/proto/gui_macvim.pro index b7ecf6cbcf..fda7a2b6c1 100644 --- a/src/proto/gui_macvim.pro +++ b/src/proto/gui_macvim.pro @@ -124,7 +124,7 @@ gui_mch_haskey(char_u *name); void gui_mch_iconify(void); void -gui_mch_invert_rectangle(int r, int c, int nr, int nc); +gui_mch_invert_rectangle(int r, int c, int nr, int nc, int invert); void gui_mch_new_colors(void); void diff --git a/src/ui.c b/src/ui.c index 5e4f69f10c..55080161ad 100644 --- a/src/ui.c +++ b/src/ui.c @@ -1126,7 +1126,11 @@ clip_invert_rectangle(row, col, height, width, invert) { #ifdef FEAT_GUI if (gui.in_use) +# ifdef FEAT_GUI_MACVIM + gui_mch_invert_rectangle(row, col, height, width, invert); +# else gui_mch_invert_rectangle(row, col, height, width); +#endif else #endif screen_draw_rectangle(row, col, height, width, invert); From 8009a9912d56b868b32d99fa31c1e67129b26ad7 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Fri, 13 Jun 2008 14:27:02 +0200 Subject: [PATCH 0523/1156] Update DejaVu font to version 2.25 --- src/MacVim/MacVim.xcodeproj/project.pbxproj | 8 +- .../{dejavu-ttf-2.20 => dejavu-ttf}/AUTHORS | 6 +- .../{dejavu-ttf-2.20 => dejavu-ttf}/BUGS | 0 .../DejaVuSansMono-Bold.ttf | Bin 288964 -> 290372 bytes .../DejaVuSansMono-BoldOblique.ttf | Bin 210444 -> 211948 bytes .../DejaVuSansMono-Oblique.ttf | Bin 216556 -> 217972 bytes .../DejaVuSansMono.ttf | Bin 303436 -> 309588 bytes .../{dejavu-ttf-2.20 => dejavu-ttf}/LICENSE | 5 +- .../{dejavu-ttf-2.20 => dejavu-ttf}/NEWS | 123 +- .../{dejavu-ttf-2.20 => dejavu-ttf}/README | 24 +- .../langcover.txt | 44 +- src/MacVim/dejavu-ttf/status.txt | 6038 +++++++++++++++++ .../unicover.txt | 40 +- 13 files changed, 6229 insertions(+), 59 deletions(-) rename src/MacVim/{dejavu-ttf-2.20 => dejavu-ttf}/AUTHORS (84%) rename src/MacVim/{dejavu-ttf-2.20 => dejavu-ttf}/BUGS (100%) rename src/MacVim/{dejavu-ttf-2.20 => dejavu-ttf}/DejaVuSansMono-Bold.ttf (74%) rename src/MacVim/{dejavu-ttf-2.20 => dejavu-ttf}/DejaVuSansMono-BoldOblique.ttf (77%) rename src/MacVim/{dejavu-ttf-2.20 => dejavu-ttf}/DejaVuSansMono-Oblique.ttf (72%) rename src/MacVim/{dejavu-ttf-2.20 => dejavu-ttf}/DejaVuSansMono.ttf (72%) rename src/MacVim/{dejavu-ttf-2.20 => dejavu-ttf}/LICENSE (97%) rename src/MacVim/{dejavu-ttf-2.20 => dejavu-ttf}/NEWS (87%) rename src/MacVim/{dejavu-ttf-2.20 => dejavu-ttf}/README (70%) rename src/MacVim/{dejavu-ttf-2.20 => dejavu-ttf}/langcover.txt (88%) create mode 100644 src/MacVim/dejavu-ttf/status.txt rename src/MacVim/{dejavu-ttf-2.20 => dejavu-ttf}/unicover.txt (92%) diff --git a/src/MacVim/MacVim.xcodeproj/project.pbxproj b/src/MacVim/MacVim.xcodeproj/project.pbxproj index 8ae9603cbf..99d6277586 100644 --- a/src/MacVim/MacVim.xcodeproj/project.pbxproj +++ b/src/MacVim/MacVim.xcodeproj/project.pbxproj @@ -193,10 +193,10 @@ 1D1474B40C56796D0038FA2B /* MMVimController.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = MMVimController.m; sourceTree = ""; }; 1D1474B90C567A910038FA2B /* MMWindowController.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = MMWindowController.h; sourceTree = ""; }; 1D1474BA0C567A910038FA2B /* MMWindowController.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = MMWindowController.m; sourceTree = ""; }; - 1D3D190D0CA690FF0004A0A5 /* DejaVuSansMono-Bold.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "DejaVuSansMono-Bold.ttf"; path = "dejavu-ttf-2.20/DejaVuSansMono-Bold.ttf"; sourceTree = ""; }; - 1D3D190E0CA690FF0004A0A5 /* DejaVuSansMono-BoldOblique.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "DejaVuSansMono-BoldOblique.ttf"; path = "dejavu-ttf-2.20/DejaVuSansMono-BoldOblique.ttf"; sourceTree = ""; }; - 1D3D190F0CA690FF0004A0A5 /* DejaVuSansMono-Oblique.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "DejaVuSansMono-Oblique.ttf"; path = "dejavu-ttf-2.20/DejaVuSansMono-Oblique.ttf"; sourceTree = ""; }; - 1D3D19100CA690FF0004A0A5 /* DejaVuSansMono.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = DejaVuSansMono.ttf; path = "dejavu-ttf-2.20/DejaVuSansMono.ttf"; sourceTree = ""; }; + 1D3D190D0CA690FF0004A0A5 /* DejaVuSansMono-Bold.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "DejaVuSansMono-Bold.ttf"; path = "dejavu-ttf/DejaVuSansMono-Bold.ttf"; sourceTree = ""; }; + 1D3D190E0CA690FF0004A0A5 /* DejaVuSansMono-BoldOblique.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "DejaVuSansMono-BoldOblique.ttf"; path = "dejavu-ttf/DejaVuSansMono-BoldOblique.ttf"; sourceTree = ""; }; + 1D3D190F0CA690FF0004A0A5 /* DejaVuSansMono-Oblique.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "DejaVuSansMono-Oblique.ttf"; path = "dejavu-ttf/DejaVuSansMono-Oblique.ttf"; sourceTree = ""; }; + 1D3D19100CA690FF0004A0A5 /* DejaVuSansMono.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = DejaVuSansMono.ttf; path = "dejavu-ttf/DejaVuSansMono.ttf"; sourceTree = ""; }; 1D493D570C5247BF00AB718C /* Vim */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.executable"; name = Vim; path = ../Vim; sourceTree = SOURCE_ROOT; }; 1D493DB30C52533B00AB718C /* PSMTabBarControl.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = PSMTabBarControl.xcodeproj; path = PSMTabBarControl/PSMTabBarControl.xcodeproj; sourceTree = ""; }; 1D71ACA90BC702AB002F2B60 /* doc-bm-c.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = "doc-bm-c.icns"; sourceTree = ""; }; diff --git a/src/MacVim/dejavu-ttf-2.20/AUTHORS b/src/MacVim/dejavu-ttf/AUTHORS similarity index 84% rename from src/MacVim/dejavu-ttf-2.20/AUTHORS rename to src/MacVim/dejavu-ttf/AUTHORS index 68e2af2879..66b7e44597 100644 --- a/src/MacVim/dejavu-ttf-2.20/AUTHORS +++ b/src/MacVim/dejavu-ttf/AUTHORS @@ -20,21 +20,25 @@ John Karp Keenan Pepper Lars Naesbye Christensen Mashrab Kuvatov +Max Berger Mederic Boquien Michael Everson Misu Moldovan Nguyen Thai Ngoc Duy +Nicolas Mailhot Ognyan Kulev Ondrej Koala Vacha Peter Cernak Remy Oudompheng Roozbeh Pournader +Sahak Petrosyan Sander Vesik Stepan Roh +Stephen Hartke Tavmjong Bah Tim May Valentin Stoykov Vasek Stodulka Wesley Transue -$Id: AUTHORS 1910 2007-06-25 19:10:14Z ben_laenen $ +$Id: AUTHORS 2162 2007-12-27 12:39:07Z ben_laenen $ diff --git a/src/MacVim/dejavu-ttf-2.20/BUGS b/src/MacVim/dejavu-ttf/BUGS similarity index 100% rename from src/MacVim/dejavu-ttf-2.20/BUGS rename to src/MacVim/dejavu-ttf/BUGS diff --git a/src/MacVim/dejavu-ttf-2.20/DejaVuSansMono-Bold.ttf b/src/MacVim/dejavu-ttf/DejaVuSansMono-Bold.ttf similarity index 74% rename from src/MacVim/dejavu-ttf-2.20/DejaVuSansMono-Bold.ttf rename to src/MacVim/dejavu-ttf/DejaVuSansMono-Bold.ttf index 16defbc603fd75767a5ae35cfaa53a47cd4c2b3b..afb628a3e635d8418c8b349544ddbfa9cce6f136 100644 GIT binary patch delta 34664 zcmb5X4}6tlANYS=_kHi2by{_*wXOfF*0vO_TD6p#3d3ZS?C~s3Leih1RKyvDB1|Wp z5KZEltSpO#o(y3Ki#>!eS!)=EMYMCy_kCUWIcF=rukY{YdERH|{#>8y^Z8u=ulwI= z@BYqv4|etlDTL_4hb0ovK6}~)*>7}sQwTW(X|Ho8pLO<>$8x{nIE&*O&dIrOYWj2i zKIVA05Z&v}nR>~@Uk-iSS%{v+7>K=a>d@i04}7agh`u|~pMK^1D+)GOzcoOJ#26vk zt-tc7MTtAl-EoQ#gSKE}<<$k(c;;W9K4z{EgHy@y>@`>1SRkDIPYkZ%IOdvp%dYO- z@3G%Gt`%m%hB;SVG5h<}aRY_9aVhDe<{)TSA%EbwjN_y^^A{~0>KnX+WAeuhpSSSJ zD>|24o+!-nXd#B=&c9-5L8q?H=Y;unKKh9ZuJFvi>c$a0<{~H*qTj@Vg*PrLtbIS1 z+Sn_^oVyEdxT+xgqD>=&b!|2!JVqu}Ut({!Yc2hE`bYVZzbb`t3W_5P(Mg!bEkYX0 zjr;g^zi~g`A21%|`&!Es(y}ZxtPyT&HV0Q(S8;H)bq(L=Sd007ldGGMt~gh`FkA_) zZ~0#5`ho9_?PJT!d$uGX!Ep=mdonE zp=mj-Xsf+aADtD`p|rhj>s^`LXY*XGwknBVF+`&pw!e`}02PK+Ut zsp1URbl1PcGFP5!rnuF$(6vz9?z)Kp?>NEG$34Tw+fmXe?bKzpw_>agR;O}DhfdKK z*-pNRI7!k@#%d=Mw3A!36OVSX!gYgdu~_L^imO$)`UkV#tGmtg++a{>;|{7KlaN-4 z`^7r(h$t3Mi&F8t*d_MRuHcQuP9#+K@gD2( zX!%1u=Sz<(nyQjA1~V=?PdC-6_AK!^qieBiiEEkbR+q=M z!gZ%>wd+3DgRX~M54#?9J?7fvdcyUT>lxQJ*ACYUu9sZ@b-m_#)Af$)eb;{1|6HHB zzI1)<`o?vtYoM#UtG8>AtDnnrhHH%LOxIbi^IhkTwa&Y^`z@Ru4i4(xyoG?u2)>Iy54ZT?Qy;5`q1^U>r>Yku5VpKT`8`f zuD-6pt^uwIuCcC3u5(-?To<~gy8cC9mLl1#GwaO;^E>l<^9Qrh{Kfp${LO4OkD9-m zf0)P2zs%!ii|IE5X3!FrNznZ*6?BS~s)8oup@cfp8bwDQt3&i8yKZ(By6$q_ThbIQQr(g`;fomwN{ca zMYQNBVqFcSEOFKId84b2&+8*8-|3ViI_0qFr;=LD^x%6mrW_(h&1>R9SDg3pzIkU) zV7Af!nS3gGp~!#EH5{pLy@cf~V5U02fm0kna+`cf?vZcEZ}mv~)97jR^G-<|WAfp)iC6ZElRLa|{SH~DC7gDe_gKFHonK*;zAx)#vpgnSj6Oz^_w@e5%+1zT?+yKz zbW7-y+9$2g^geU?+}7v*K5P3t+NZcr+1dezJSzY1ZyuM&FFtGDuNup;M!wc@;~BV>o4-J@!##g!+)Fq7XKpuLjMB)9RHM~Zy$Z@=-#7m9DVKR zD@R{G`qI%|M=OrLaCGO<@}nicJ$>YfBO8ybJ@Vj@HAf1Mc#hn5Wa*J>j$Cyl@5nhv z&OYKeVjL0mf%@k9ruy&e8|v%p57mEFUtRxheO3ML`lmhhkJN9dUt3>Pe}Da&`g`hE z*RQI-yZ)~FmGvv?@2D@V_tf87zr6mI`kU$(*WXxwUH$C(E9+;}XVquakE$P8pH$zs zzGr>+!|xw{{qQS?%MNcly!G&k!&47mboj!F}7tqYjTaoObxM z!|e}8)%{u5Tvu23ZQVC@U)OmK)_q>LzplFOgSvfn@729iS5@~`-J5l9)V)?$S+}Qd zciqc%FV=0VE2&#uH|o&mhdw&=!J+pK{rAv@QJ133Fge}93P3B#9Zfk7Me$#*N7XPk2oI{*N7#~ zsm{xtGmIAJ0x?f4Hx7#u@v^vGTqzbfuaeW8w>d8n^Tn->hs7)wsXK*F#>#Gv)sA}{ z4?5O5?sMEPUW(o#UX!N_;dsySnB#G^5pX%yi)D@n9A3wx-r_+6y3RBfi0h5H#&yO# zakH_|m~Z5le=_KeN%G0^N9JECJ8u=cTBf^G#4Uk<*ywh+{`7WS7(eJwA>2-}NW9ZB zo!&b%@T;}NvBsU^2x~76_O`Xlrz~tIIxAJ2JGYsdG zi-p@ElD%asx_O+g-$h@!7^@|0mCkcs=S~*v>fBB$^PlB^{9ok1h2*8!8K~_H(RSDe zYWpY4o0U8k$0sCocDnxXT8jqA-+W~~WRf>~(X#}9Y|&r}m9*5|ykz|L~S9A;DXtB<07JR7g3~TefU~T;Q!)HdM|lw{E^&I-kr^)o`}g z{d}Bv^DVe*Lhtz7d&}eA+8yzO?+6*}7g%V$AN4t<9)qnQp+jNCm1b# zz2Dr@ZHTb~Q>ubXDBt;Zxy3iS+;l(WdB|@KmHYISy}KV1BXx{<#CWSib<->%Iy;Pf zZ^6pmwD|oi<2^GQRlS{uVP#=)q?DYyFqDoDx8<_}xmK3rY%HKjt%O_PWc`*C^i?g| z`YXcr16{4TQBAbWW;Uwr-41Wkot@?V-cfg|9(bAhEWho}g_3^y(_I7l(W9uG-^lFD zG~GhZ7^Z@>JO31SGW9k5?xB4PbrmSB)>KtkHI^uXxA5-x?%{w-siJ{YT_}|fQby|h zYyLTJOL^_xuSp`?ym~C@w<#yTaR9pnVQ7+^F z!t!Vrm)I^s-Tiht&h$`Gr#v{6D!c8$c)QBP^iY-EPTfzZ@so`wz1ts*cRr~si0Qt< z=WG|@Ne@$lwF@%R*YZQzFC+UBUE@!BJFboI`=oe58@M!5*GrsBXxPzo8UprCUOPbk zT0Up(Ak~}JdIvL;?eX?egX}A>s)sJ?s0VN6x_Iw@$~(kF&n0Vy%4*E>7OWeTK6gP6Y%`zCLK~S0q?W&v8(i*Oj5J7oNU&9 z=M6ONA6~~p1DHfld8jWncAoye;Gt8QhBrQR2F>yLLnCF2*S$Wzdw2ldNZ!?Y8ahMS zq?noO<7K`#cl}i!L&Ol_5=X2^5Q$XgcsXKtm(FfuK>y^FZv8qB7&&5Ozi#|bxRd)k z+;PL@%cCB+?Cno$Dz939THxS4_ox%Xz$bFUygdsR>@i=PF(XhNs0%a%_RYHDY3uhb zH{ZOatg5I_+2^`h{U&54d8^mIB*&NE<9pDEi4(mEpuf}6Ev=h3 z`H_pump!s5TKc>{ZH|||a>tXW8c|GHGR-^ssrlZgo?0otE(UNSnWU7iHvv%1U^o7he8mcc0Y||I=!+iny)y{8dTQwgYwfhup zPs_{qy+zymdE6mcSVQd^gwccIYMaqf6!%uNH&G3HbbpzvY)1b*ALTzO->Uz2zBmfO z_Tr?B%e|*P7w`E)yX!~wl!c2RyAh5Ko^V2|tEz72g>1O4$K6=uPoI!4+0`P7DJ0tA zg6nkMOyo-zs+p1vx-=U!Z9}JXdM2!m&MEE`hUkLl;=32Bx>tKFog7|jQt0z6T;20e zT)4>l4&y?len4K`H^@Cj=gnh;F4i;8d~bk)GD1lU?@M$lepyeHN4Y8FaTd82>Iu3~ z%Zo#DSFp}{+xA5Tu%(d8w3h{eEbB_uC)AWhuSpB(KM=?@e^tw`k>5G03rk3sP(o{w zn!Wdz-8)Qg`v`29HmADp(C{`2DRa7(^GP+SqBeWa+cA=9qHsriceYeI)owkt{HgkP zxB}j?9r4D!!h2>xSBvAn)DEgU7gn_PLTt5eV3oG}d9+i!J66QWzr2~xqZ-Y^m8#S_&+kjeUR2ZS-zgU1GQ81M;A*z^1hGI@DM|rmIwe3=c zkvsOx&|&oZm%k~ zoYljw8RWyF9#{I;C_Ah&TCVnWS#29%3|8_Oy(<}NCzQ|H`LMjMC6vRSp447Q^?P=d zA-UScou`)#rb6UThW1Y3U7X&nwUsmO7XRb89PYjR#rOfcbbM;Br?ip<=IA3w>7w1j z(z#l=8q6IaB79>=YtAA9(T>monbj-siEckEH){ouuTSy*2G;(ab> zyhs#cbeebBYk3AIl{K&3IcV6cDuXOD?>4g;P7Vicb;9xe`uJ<>b>mmZYeZ7yz2}E> zqufNE=Kb`CQ_G_oOC@vu^FL0I+q}R2IJMiqg$QKpOrIOc#viP)P9x8I*-sNX-(j1I z8jGo6s!-)yf0|&h!TG-FIYU0-edM>Ho!Q9YJ|?QC`KDtGIt#p?|2CGixaObbJg?*E zLe|rpjt*|OTC#{?d9`=z(FyIYquCCiJ-7VVqmwK-zkJkRUl?+Yw~K#uYDX37$l;?# zrY8^JZ(OWH9v?V-_`p1mC*WE+JbB>om7ZONRL86SDRR&g%Bq9Uz>mbyT5Q&(V9RBj&U43GM zUdukM_mR>IkjfTb=Wp4f<=iPM$)mmxI>@-$wwAsTqQZ#m z8;s*8grTh}cOk3curq^)thHJm)vC|lYGLp@s&b%cC%TIPzO0V2w@mY0)lvT2_gY7J ztnV8w7b##i8RHuthu`GC&ma}Ht%ZfQshxE7WB_a85zKrhjVP~dRYW5xIF84b}=4p3SEzd#DnPNqLFL{CKR9fn2XJ0uc#(9-GGVZ8o9xM+# zyU$WbVp3>Lv`?&=Ld{veUq?uf%&)j1UB(-uuhD8Zg*w#+98J>Atc^vokL9d-gF34= z3qnpRN67}MZdG;&?6KaA`k#mwVnjRHuWRQKoxApvT}N~t(0PFAO{8aU4tyww z-5j`t2Dp_KE!#f9dzWf5S?_drco_L;z4ku&vXalPsL7DsWM6$z&72a_QtRPBiz_CE zzRF}S@I{|4Z}E&_2>XbZDWPk>p0c0n(_>`%@#8W*Fe~ttmG2*9e0u!Vz-ajnhSYU; zrVeV3X{u{Ks!n!OmB#5$=Mf{LIVb8b2gvb(5lu~j&zhQ|{^u_-a$A;U23i8gWVEz0 zwT-Y(Y@B90?KYy@fNuRps&lA_^Qx-AS5;Nv0LFh&R`$hs-_FzJlbslPBXDW=+O*NW z*<)pn6u$DY^0dB_R8zZ{A9U5I$#Jjl0$18y;KgxrhB2BQQ5z+D2ci1O3|lFb88__I z)yPM`Gb7)7tRU65d%Wx_XZWhe%V8ch{BYLAc4l{1Wk+{o;|{#5fumRas3x|i>@h>f zTu0*gkI3<2{OD5_HA|Z>MdY_Sy0e3rD;ki#9Eyv1$a+)hdtAQ-kLe7Q8pC#Jb%vnI zK$*4tR_2#%+d;5V>(h16f0$`~wC$i->CX=7>m4{-rxSMG>;m+jn|$_&pW^m}w)7@L zS{t-SqPpf%sA|S!JZgD(ifAn%IWT1F6R^@`;8RX5xA#b@=FhilUaejtdS|;HeNE?J zd;iX2;JYnTc97Tk)?~`=9$E{FdWm2xIE=0*SZei5HxBEysoQr$k?JWoR8=47s=7?; z+t)31)$UVOb#qAHp5!>W@w7)m0&|_tU{5}+RlyXb<>6VeH6U^jkgea^*eB~JE6a2? z{|WZhnujLE9d>spfts|gIiWXA(+=)Ip46tqi+nX_%4_@nCQ@}VbG1@mlye3t*zaOz-DW|^|jIuIs!T98n)SMW7+ynnQ7b;mRs*c#hfLta)y+AOV5(mI)Ait_!`cVmpFe89ZWu3zVB4~Bxn0* zU&1-^%}#1_MBt*qs8BaRefhVUJ$#NVd7)Enk4W+5WyuGf%m(_PIZF=e%Q~$Nj9RM; z!HYnuwLj`Xf~SR$J1fSW%biPShOJf6a-Q5EqgCzc#EseV8KZNexKFi}|37ArV6oe2 zC00zoP<|R^*Q0q*oZ>Hu)QhS|yS_RZadtiWldQLlo~?4(5V%9>`ue8ZgyrhiLZ~4-$vsgyVR@Sd_Bf5R#jt-!=w$pMz75MAw?_;`OSd&KB;V1- zP)FkiQU4EeH}W6Y;_u@e_Z{n7cZzvX&hl5#@984J;3+!cQ_DfO?F~l}nxLE@O2HGzOB8>p^9Fg&u>7&a+ppG&>r{Id<#gc?|s7 zQA;`QtnJ*&d~t_9W(_3&c#gMnY&xv26{lS$Z;}1tbpo@fb+cAX(8ua@X?fH#40W$~ z_uumE4yQ72`7bAA{{9tEvw*nBI%;{HLj*IqOiW20Jt{uV>2O+VYwG*&wQ{KM$7^Md z^J-nt#TAq1$}yH)SaI6|xq47kZ}PC?-XNz?z>3@rvb%A{Gk9Q$qga_nNX~pVd z85b>|@D-QH`0h_o097BVe(q*6P8I_R)8T6IRjcF`YNb`lf#KHOQJ;pBjZN#HA$3zY zb71ZXsoQ*MBww;El)Qlr-I;o#Z&o+U)W*)fiyBH-8@>XyEfzOjtu6?LZZ2xa>N1Pk za@e=eR9yMW^NNjjT&sy|vA%YaqQW*d`HI>Gwwl1&CU5gql6-DBu+=zL$tlK@!7PJGzLeZlX^yOi{tP@t;=Jx?(AjIT*~qq%gp5|Z0q$a%(>xK$-%R9P(vbUz`v z)R#l@wWX0{E(58OstZ7rH&wU8@xCgnz7(W(hoLkbtZ_$*N_&wS(q}bdklk{j&D?h6 zV|C4)Ys-DrTV-62_Ud|&%4groW2p<>nk!uYEWx&f%2G;hbrmaFu(8qoAx$NRTfCHd zAF67|PNv@TRq~So7F=vkq5@l!oyL>CB9*)~Y&_7dO|rw->Z>GqFg|te2dJp~)U+nD zm2V>~51-em3!YrtmCe2$rLuPZ*P-XH>S>Pr*874spN3Ql~Qp-+az!E<*Vdy$ffl9w#m=sV9=_}IePNs6_%U8)^ zua{Alw#nOkMJhSmYM0S0ZIhqzRjTB0tIfrD+k2J8z9yAi9O~V38G>z-OMQtuNDhz0 zxfpMo{ERP0C5MfV!T1I}D~}09UPyA+aOC(1-S_<6w{?dc%0T{nhrCL*_%ffz%8F17 z0xSEqmD5933RH5~N>8l3sB2GOd}L)PZks!rWOXAbS&R!+ZZ*m0hK=8d@zu(>v8fx^ zvBVi6r<;+FQTJ+%O;JidBP73(+Sd9?lg40)D<_z6ZR;`8WW9@bU6iCy zQHn^uC|nfI2swZMlTrUW=MyF|Yc(zo6zYy*-!a?F;D3|sPGdPs`ZzjQ31-_aIGcQx zn4PpKyrN+CJm-AO9u>pXxszH`$Y!7ZCs4)(;%lU=CXv3XpNXKW_1M{FX3fKozHO%O zC8(a5v$IW0oZOc->An}ma$59~X*=+n z5&4X^@<6JR+nvfp>fVm|ahoPMY8N;x_e6SWC_y}kgSJf&mfwxMZ4-p$ z{5_!w!t(c#w{3!uoR<;^DAEKThq@1@spZ8p;vzr>D9J8+^e;`nJ#G7g)7|Z;kn2twmInxr+rWC! zYAM$x`$iR@Wqw4Scf7uh{E?8{!zy%~p+Z&Y4E`5Xg6>?Gx3H58%Y}V&G}4L8s89{H z%IzBZyWFm!zsq$EdH%tWT}6M-pck7H_1o0Y3Hn-Y*HB0vTu8x|gobg6F4$pei19Zl zl5n$sRwNYOLby?>K?>v zwf>utgjZS<2q;y_+cW`lgbws%`G0M>$V7jwDuD5tvJ=I8uStNkAKX- zbaA3Qig|(Q1~(_knFmgm+r3=})Yw+vmh15!6`IL{3n_t`qr*+`lbse%5&;mkVX#x!O*MJbtTEbq!I4_5*K@1%Xp^8AxG*Vl->H z!+6s+j6;2q#hy39`Q_Wz>t;Ke)}gK!1cQbnFx~7N+`=QH#%sRI-jt&~3zVD(0mqte zI`88gl7h%-To{?F?b`E*dY&yjUHsK5=h|dMuAVImO$%ymYn9VyBl6aYLfe+BmKe$t zh>;AAER_&wPXX1dNhyv6{>i%FA8Gj$A-Tg~d1MsRr1lei=-GSA8m+f1BzG80iv+M5 zKUwN3RH%Z`(sIv(*6aGj2S;)gj+|VVcsG=Ilr(#Xy=;L_37)1h$rx(&P5P%@TaScm zH*|KT`XN2DwI7D$t^F|EZz+O@v!Vk;HBV;pYw|28n!Xr`b#s-F}+un_lk!E-yBzG9^=<2$g8d0Z%s>epJX^v#SwWl`uZBH+QGM}Vq4x? z#iXi${GTcPPz`s{u1N_7(*y2Mg2Q-E2?8w~-=eGWW_5*y7{AgbdYd7-g_2YCzVYwy zeBxf;^mk-m&udD@VT8)3R~>x~SIb-XZq$c<%2F*K?DSk=ef{)hYq6uka;=Zt)_2@s z%L5tuT+SYs*DFgop_9naqq2m{=%E-?I}Knf-lB`4x6?s-hL$^weY#kesfLQ$85x*| zeUsmni{)JvFTX2ajqV)`pvLoxL75(kj8SflP|snyg1+@1^B`NW;^mL!8%F+4E%i&VFGkU3t+y>A>p|WZwBGiJtUaVlVNO`Jyoh+4B+Ep5V1+SMzFQY@$MX zt+JgF*&u>0G49~5H;oszhwKF{V-^X?`Xd|qoEBC`gp$%#8;jVZEsDr`MKV`a{Pmd} z5hV}%PWxJpmVf%L{#y3s&t3d+{;8_o@vN`(YuP<=u#bb3P>TIxaj-e?t+mX-YT($a zUq4QEg>%N#MwClKZy^uh$;m-@0%4!POxo5#U9wwdjboZniv{X@=hdJn>| z)3=>qdAn~P#&~?WzE+-cikk)!GS}R14PxB*#5)z4?TxD}=S)>tXSJ`ilX1bB)qw?p zBzKClI~6#l zP{~=!I=@yjNM#IOW-W^<(GGlc3JmyO?r!vMR~_)#iWRlpjpxixCcl7is(Of%=YPSs zzPFJ)c)Hd9_*V*JdcVs?T|VnM*?-{hk@C5|DZ@uS_gvz|!!s^5Vt+Jt{$RR&-}g59 z_F?2$V!BMRmO4-8aV;m$IWXZzj3)Il`nPX2dY&(*kC8CIHepOjIAy}H-aSr>ACS_o z-(%fkXU`lqWk|2Yf${mzi;8u9jM4<3yS*`@V(Mt)b4Ry_**)0fdV+%Ai)j@T z#~be%^5u$-XBzJtvWM^BB%`O9*4gkqG0BMab(n1QtQa)e__s5gAE!8m^9;}2eL z()LfXGa3D-PSDqO9Iv{QqnX9n3)zz;BfC*tW*v^Y+@0)Hj-AmgilPb!Cuis#3iKO! zli3tCI;`KG*)`~(|D7t|GPgus8w$v&aB(6}- z+ei5dE;izf_E8n9F6Q?D?B`rXf7`Xa=g^OXvMIo{UijFt>7|fkeUh)z)e;ddg5LVF zrD{{BE2!%!>WO3%%gC8dw7#xWz0hDExvBQ_t%kUZs0_C;r1#1=uy0OD;SMA*oqZtM zi+&YWT(rZCYcGc$Y~=sLM1|`C%PAg+GKP+89DcAdEq)~3p8=qrVRp;+WKa3tm;QEr ze+*2L|J5J#>WYsqF-jfXXkm#~n)zMeOXpp`-_-6N!txd68Sk|wHMB{pm^Z_?-Z-ll zF*w?paWdL{u#x`{6FbENmI?s(>dEtdu;3@7`%i%+W2^G(pRUUrY&2r6!;VyX!{rr@ ze1qQ%xVmD`6~;_My`keApz6drDjIVnx$Nshi@N^7EVZ6tnz`o{pYnUf5)4Qz?; zw5yC~oh!A`TPkX=GM3#XFZNy5Xe9G^S7D=3S#jo%Mn_9M(`c1jAM-;;=cp%5#PGf{ zE`D@eyfgF}>x_3eQylhZC+X-vR3@i5lT${AKGR31j2az3%Kn@nyCm`kZ{jGoBi7MB zIepY{!-1q@ON0+=1-Y2-}=}pY~THof$8%HkLYmLc_aIr-h0$}XLT4ccz*i8X$di&s3=cN z!nAPmsNSdd8L5(o%u~tj3xndLz-QIfG9_=p1s5#1K(%(o^}ibHE*bc$_>!7(wtF>5 z=TOxuemD1;U+}PGO1sKXT4lv4S?1BGIL2H&FH@=aK1TCqRmy2Hg}1AGBc_<=@htuF zDdss*o#^mszPG2C!z%uqVrF+c!xY{e5Nhz+S0?C-rY<@gp{}r(KK^b{Y-r%pB%d6%%Kh&r47HPV(2lR-PZE$C5%o({x|aWJO+CrJ=Y0~~@*K1ABnO-atEy)aam$fr zGt=KG1^7xmHY<|+&!1>N%4ys8xSb>?`o9P{m>y2oK=;?rtkc_#a`7$0;s?eFzj5UsVg1QN=4vB0+ULI3 z9K-lM_gZsSuCnI8&B`;cbSJyk>S#O3?tz0^{<+m+&PMLF8Cgj0c+RqJ&D)(J;hj<-}J%*L-`79b-ox z#@VN1yyJxIYOK|sklk%0i&yOI*O~8m?CfsQ5@`5`>~1+tW!Dc}e-y<}0?-q@2D5|x zgmy5W_ZSX`WS`Gta>&eKdY+Zx$aB+FJs5nr=gUdl6Mi``9CE-SMaW= z8IF1MfRVn5^UY^H?`k`T7+b&dT$974Pt3L2mCobD(V53GJ1TXpw}9+1&LDP~<>_FZ zjcJ0{0aTB)20Nceu9jP8`!3>vR=Zk$VMxAF$wk+|3s#v?#saYRS!|=Qr>7T=lTCFdrlmU6I_o;~X=fKC z?D06K@vXStJi}vgwTI2EHWI~qC~V;(MmSDZ$Fv@%wB9M!mXHyynS`BTG}+>~jb2({ zvsoNGhCO?=sO5c>U&J@)sVOXCPj~{>OJ|jx$BYox z<2YPOq&mQ2(bGEB{ED2qHbpJX(B$078v!vCnpxg{(MHLwdgo3as^E9@XlXl{n)nYH z+|d{5H)not%^(k`49LU!9Yl&`4zu6Pv5qQzkssiOoW*V%xlldb`UQQxbKqr)mcT6R zZ{@9#uIkAC+m2tCwai)CtLJ9m&f~I;U&uXKK>F%jl2Z&%Rkp&8x|0USP(kV->tT`I~<7>B*mb z2h3i`#|2`o{l-t|{ZjGQQeLB(MZJ$Q6O}+^3>-t@yQrCDb=l-TnV(JZ74MI8wSa)XY7(m z%Xl0|wRDI|^EKpKL-M{xZAku$S&sZ!Th5znA5lZhb=C`d2y$Z1n{2{Yd7F7b#hBYn zQ_iB?H>*x%+7|^-2+b2aY#YWTlb5c7)gc?nuIEGYJIztZnGZtxhQ_T~4+eve)iRdG>KURK% z!6e=L59s8%6Efu%jVZJJ*-#31x8I*yF@pqbU>6)uBe#dc! zcKmFhvsG_)q$Vy21$v=zDvoIi<0mF4YC<-gJb#4bzi4@z88iIS7~Mk8l;(0SzYGkG zJI)08Wq~fkyV^rAK5ne+HlTk>T8eMo-DXb3;k(Uiq+vvfY1EQ*<)IXcqiv>kR8`xl8&qkzmIvpO^fV?)aPS5YH)9Hl3I^;JoYfg3c zLH~PIYAYtNUeeKm^VDpr<;+RQuZRh((Fs5646j5obO?;s@*15%$?Xgs0t1v>%<~sm zQ}qgIJLt#;_#G|3gtG;;a@zVGD+=#5J9bFU6!)dq&YIb2+)>e&?Fs+woqpig@ZXmC zEuTew9zC~W=LYk?hK%tQJZgGfdXg|ViC3$p|hw~h{bf=#f4BM z#7*S63EMYS3b6#aXGsoU=D-0Vmf~RPMj@6F)G{(G!_du(V5JbZL<7ce!N~F?m<`Ke zgAlh`kPoH&G%$L%Wy2bb3m}i@pb&-lDa7gRsX(6FcS1EPcO(dL2f{ltAs5JS$0{g> zT~G}TLac~}L_lu^dMlPf5tKm{9Drj&taL*fwpajsp_W+=` z#to^E3AwOWi2JZ}9}e%w$NlI&fcyde7GbBThIV=|1`s~jD8$-y!06fB^bVAjF0>LOjg(M`8i_qqCt@h>hgmSS!S12W~X(**S&4F3nG zCFqynumt%tNw7hPt>|rC3HW&y$ItE*>esPEX*T_{v`mO?sjw0D3g!dIf~COmb3=f% zvJAjj*)bt@JVW8;Otu`LGJM(Ee{=q{hrI8kLIz~PA|Q}=YJ_-~^mj>rm%_a3 zA>mym#Nc}ZDDit_cn`zxt%JQljqHnsG?)yzK&|ZC2-M8`{5X46XPzXgp$v@f)wa_BO z#~Aw1gZf?w$AoC)dm}a)`R@5KT8JML zAP3e!vk*V={iiuVhMzV-nGio`0P>%kgy8?8$qiYM3zb6rf{kC+K`HEogF^g@&aa8E z1qk+6GX6&TZ@YzPUIiOy|D$9)ng*G$3##A%Gzjtg5Euv9kO#>Bz}X+wLL9^Su`(h4 zoWuM7*!XKUVE8z;j;|D=WilLuMjkc5uKIzx0P-Myf;pV)B|sIw?Id%d01BarD@dh6 z@|dzTQ84p?G?O&55~}%UEBIGHtPOx}R5t&B2mkPiV<)r->CA!MLPqlsqC{h--DJpv zMQ{-KL1NcB*aGBndG_%^LVFb3Zv+%#$Q+Xd;{fL|D8?KUvO^lohP^^|OoZi71C2s< zvLFlAK$Vbg3gAY^odNRz+wM|0$Sq0ao%4WWPiGu<$p;*DDFjN^rA)}Ky@2Dc7>jko zDyW4Pe!nmlhQJ&^r&|#e!!D=>^tv_iPs9*JTp|!eTn?ZghkhLTap=eG5*`^xhPVbH z;{{Oa_{lI0X2Wt=2Sggb7Y+geC&U1{3F83Wgn6(M$^e}Nbh@L{eF&@q0_%|m6s`w4 zJ*uDFL=Z`2PC6juz&zLpb%29p zj3lQ4d6JjIK_OGnNvRbwH48AB%J)I&3@QQgostBkor3-;)j|%&*Wi6X+Ta%2e@Lv5 zLx^MuMu*G>6o;&XQrHUz0q3X20LD%o2h(64tQ7LJ49Ec-pLR^hp>9|tWE%F;u$QL3 zuYrwF3cFz+V0TzP?LUl+!-;TsF3bTU99|{l2%L^RRPX zjgaRf%SM)szY9DTA6tZ+f`KVzLS8rzYK6?1Cger2fT4?vg`A4fsf|1iTPoxw z(+S|x1R#i9^mEDguZ==pwo1ryZpefJApNQaA+N^y)yS?!b~W~|Ms^L3 zuPFlZT+<}v9DL1T{+HMG67t$bLe52DZXr|)c^%)cTPNf^l;-Uga()`j0U}=@ARkJE zTo?`Gpa3cbvp8fzAv6kkeJo((dUUSOf!R<8%|hOg4y$PY8)}8T5eGN!5^@p3MHpVx zz#GtHTwDxfxQXvK<-r=L5|Z;rxnv%YXURb!mo5VSF2l((WXs5Nb1v}r7V_M3K*;6T zUcOPtTVr53YynS=khdkmDnQvY4yFOdJu86>o}I7{RC$?4iv%$D1$1fg=0eA<%U$qgj^_qRZtAOpqd5nt_C6R7SPLAwAb9E;<=Z@ zdlMiHvLGLpLJ^ceB^-bzA=gAhB4j`g%z;AK0A)}GwQx+x``nNUnUD(wunLM{7gSTp z_caK4zkmctgDl90rBDPVPzeX1NyrDHArUel2j)N_Y=APTf?7BxWRV+EAro?;09HXU z>;kR~$f5=z9~6)PX^;i^uoQ}*1S;VGGzqyj8WJG`a$pV=!UiaVDyW5HLVDeh3Ym}# z1+WT=VHZ?0D7+0qvYV6Z5+Dt-ARm@O5tKkB9DpVvABu)V$bcM}1BI{w%Ag8r;h2!? z(Or-3`ZUObTqpqa*Q3AQQ^H3jR6_%h$>)Yt$OJO@$lzNA#jp#|^`W~#Kmw#e7UaWH zD1s8GgagndEQ8L7y^?a4;BGa$KxA;spD~`j>nlg9!Gam45R|Oo6y~a?xr=c1<>7u?k03Mab-pp z#|l|I1W+zUnQIiXcqL%CxD<9n4Kxb*gay4I9kK!aCl&$vPoVz<`cI(y{~bEvW~ySd z8!~`e*t`m;s?C)CNgO_z3Cp2a$Svq@L1#-P924@X9Khkz;jBVclRZu77b1{$!ivYvV z9e_q5%LHJnEEUE9!Icp}*-}^o#jq2wQ-<@hCfa|8CFG6-7y=mGF%3|79!KS5+)3Kb zEkeG)-xqNBLW7Vm^7qA+untIjaWB*fSz$pEOorL861Kozs1tIR1xY|~yXHYL?Z2x= z$d^cXDH|~O(q3p5@?{iXo(3DCPRLiNw%ughy%P2b`QKQ`1JeI{P{=(5xCi|`=
    z)n2eg$jTwmDCBD;+`(Q06yObHZ_I{`wEr75Lhg-$$*^3=H>t)qaq?!RkZ+|zm5^`G z0W!b66L3~#0Y<8DSVb*WZ3L?G9c;X_0cwSOm%Q&5z%FPO^1XB*Z6Ch&A>UU99x}b3 z1_<8YC*%iY`T%Dilt6=!A11+U*aGNQj{^d!CW!r{?I+)Ug4*9A2sr)--H!?I zV{Cm)L2BH9otnKu{x1=*@jq;MKH=aK5;CkY6dPg!~$twfWF2EsS)zq zY$5B2vMvp#!Ez{p1|bipLXnX5q}T6*Iw6k`_>mkafGQ!mMj;yt0sZfge}~QQv*3V` zKM-sq{1^k3LUO4={!H*c7tsDqL!cOT0m@Csg#0A|@?eYLAFc$P{7U+-EkgcA^uMiv zY9X7E9i0pW@Hj&1*9dAmOw2e%!U%caCh{2V5dhG5I_%t=}`*%gwYdu&*iXF7`+la zd{Cl(iBJd_=vO0*{zTg!d4DqWuM@_AInX4Gq-el+5@|`5!Wb9>d4Tcc3|I+O!bl;1 zN&)N^MydtVU<;^Y?58#gV-WH|9uxlL}VGJGulzK3khm3=1 zfc}t0uo5=HPS^)^&@7BoCquO`P9u<^RCyY{hGAzIvf<<#j*e$UqA*6}!BQxL24SRA z%5+MZj)U|<*a8HTPTI&A!0<>Mj;w(uVT?)z^hVJnqmYfp=ICrF0`iWogoAKQ7#XpU z2Bc@qq5U&f@}(Gd!vP?wF>WBzFa2&ehW#3aV?6p3IG)f*`)4i^#zc%vM95jVF_D^>xCJT!CzE1e9OObF zYy=EX!ti7aPaXoKO~%e-(kAZ$(#{f)3X`D#*1%4vhGW7wI{~;dW1L+ijB|PcO6SxF zBWs^9&c)Gr=`ar}g>il?@csO~!pO#G_EIPY0=Zxa@cn`&VNAiVQ|)BY?ua=>Jg3~?Inzjl!R@$@i@jdk-n)}80?M>cEZLJ z{N0=fTZHi>4!4kJ3&&fq_f)Aco-TrFVf+Uh|Ka<8nuJk8K%No~o=Ji_VQeLU(n?`$ z!^rlX!g%hWFxV^_JBal8W5Ot}5ysAS!gyhWFkVEyD^?gU;pinw^|Bj~y+Z!~3SsP7 zDU3=2tE?5qYv{j@jO~~4dI?kuZp#9&#@m?If6(fwd69FStlL7fV@LriPKH!+$ zk5Rn{DxpCb`!VoQvoLCkgz*WEKDUJNMX4~p%mM6uRVa*al7w*x{cp)z*C>qo1UM#) zBg>&y7!8wY|AtktPZ-}(vhVr+Lo|$orLY^w*q9A`|8a{jeo6-nHWdit*9>7CEdq@G zPWm5-uu~Yv2>4F{g+P#h&4U_Y94Gxavg38aXu(H|2jl)UKI$??p!Zd(2 z+;l_>)44^Mt^#3lmEG)ICCu0aAgx=GFyp2PGrmTc-E)N51HGQj!t9*^Wq_?d==RBi zrBDrx!t9I9zDdIL^d+G$M*FS;GAC{nWX>6Xt0NFdKFWb0`LfB4?E|(-y&QVGbjJVf-DA&Edy{ zIig0G=>@`M@iIqM3v=`w4<8$VgwZX+%pib_$v_D*4gwCx;A9N4G4o&@?1g4wo{sM6 z(*VO`6Cn$5HV)l!$j9N}44j=o`gk{_LMG$_^6~f>?~m;;5d0m`5XYT=kL&vXO9omm4EYN7?`cqXDW5v7SJO+vuR zW=`UG633Hw!ak@2YUiw27y^{=EJ}D*lQ7Q~fbp|aAro?;01AOT=fuDPXb@&r5$qM_ zxzUgSskHyOWIC5j=gt8#or}`BN{L9%#qqfqIS(V}B|$o5Lmn)Gm9P;?fjs9Ogl1u$ zkN)}SpFa+!!8}0se00y>3Ht!u>{!}Adk9R1Jiuu78rTB6p#~a-d4UDJARV${HY|sA zPzrki-6<4eO0_UAoCfn?C2WM9fKE<2kUxj~Ig7xvkB>TN5#~iPKvi9gk*R#2ngrtj zV^ik=4yW;b+CgEm+?tmZ!!E$#B@J*)nA6dlzE7B!QmZVx=A{LI?xpBnS|-d~j&srf zS3WGI{r^?OmlCLi1JESQ%c3C>G9U-$Kp~*}?>wL+d6__3p8DP*%o!Zd;CM!}F#k_o zXA@gh6~ys*XNEI7HDV@C`CjGlpIWqR-=Z6i7r?mnu>`FLQFJ<1q%}RzgIRcyvZ+fGc)HulibD4 zP0l^j2;meoQqV|2BL#m78hGb(3h}0K;%4}ooACUb@8RYlamzXICAbCtB5oBh8&reW zK^xc&j)Omm+g|=3Zo&_}Gzz50h&SCOZbuXC6T}_xbzA{hpMh=$b9*_1q8Su?vkMG@ zaqu&MuM+aGo^n188BDaf~IKqaRg{QG) zt6S*2ZlzLU)^q?Nnem$%M zVXu?91$0D*bwtn5ar)4I?_Q6_JtoSlp7{&i^*c43Hrtl#N=iqp8wd9i#X%h ziJRuE!|rGob@|S@0$1psanoJQ&2UBTSy$|4x)L|bHx$WF9I5mbC4z}`HDN=ktSC$9 zj_yol@M?0(CMuuWAUs_vX=Fbtm7|dvujJhEc>PnmJRB&OIS7xIOQtaTQqEmnR~zOn zlJ@A7NOgVSI~GaGMVDm5L87uQoT!r8sc?`80{>5ytl+#{dXT91FV;$OenC7D3WA_RKI?-{=4Q>Um-IXMJw#ve#O( zFSuiWs~umo@(3w}Xw45xBwlgFgsU?)je0@|*%xX2n9-MCarM`e430B6zGqD4wc}Uz ze|sy(&|&YG@i$!hW50b}h3K>f2eH?V??3Rtq$^en(WM0aiPL7@miO@Jmv0v$k;7(t zr`RHKD&+q--o|l{oSAbM3|!ysUXH7UXeV-KO}nkt z?IKN>uW{Vx)Xdu!(a>2vyZoQ|MQh_09B&6+d!*;Y%h6lQ&z z5HlXjyJvddxa*!BB&=z>s3AJKy~OraSJDDP{JZtZ!zPq1Z9^EgX@Ab= z|JZx^{I&f@d6~RW_8Cl%q0(+N8O2jqDY_9|B9+FS4Qu!$Eg(|8H`?si!fZfa3e)`E z{KNEnN1I=@R307KZ)UwEz3rQKE6=c=aF6=Z{89*WugcSkwJs3dtiD!%F`Pt3ii_<_ z?9pPOJ;oj@7Tc5U$>Kr#HWFN-orfHK)hXn>nR(W%(?J_dzZtNEWt6+lZy9}^6J$>~ zNDm!kgbp%F2f1Gd@#r8+?VIf>qQIU;s1=0z3%B0e+unL!w&9`y=F$|SyrVnZ-d?^b zH_LbB4*7}PE%(a(@}R7h$K|Q=%y#3Y_ocWCWJ~X!xBSek4B)J%1;I$BxYufqqj%?RrTJpv5f ztwMFE*VSpg6y?R8?v|crCseP<<~XwHP=0W1h_U7k{C2ros8XvZk~}fQ&a!W@r`S{N zY&*xk)4tozv*+3i>_v9IU0^S_SJ;o(EA7?x8oSUgvWx8vc8OhTm)V=_&GuG%o4v!{ zX@6qxvfJA+wq-}#v37IYlWg~}``Rh?PQR6cDjA3ouSe(zcT+v#~-6lI?(a$ zM0cx$)k!2-304=;+v;j{7k#XrB-hXCW%U;Qtv*&?G0^H~^%H}!zg{HSx7)e)J@&o! zef9(P5_^^Xr2VwL&VI&z&faLhY`9OCox7hF6+wBkS&+U$OYujbpc00R;eSw{1 z_p=Au3HC+yNP9HnONu1(Yx5iPTXVnpoq53g-mEqcn>FSUv)264{K@xPw23J3wq9@6oZr^3kw&&Rk?Zx(k_G9)F_EYv+ z`|tKY>=*2p>{snK?6>TH+W)fOw?D8yvpd+W>?pgL-PS(e?rrz9FSG~Po$cZF#r9?P zmH+Q4dj5ZMlp;ZOg^0zqW&f8ElA}MVlV5!@NNo$h)j+gG4`GUE(L%)9Ur{pE{(_&k z*#F^YR=8x3F8NZI>=s>BQKOrVe2&JIOEgz=jkwm9-j};%O?dBn#<2R&3=)qb|G9S| zQJ><4;;7#r}z+GrPXT5B_>CNgkKh92QozOlZIUyxsVnR;B z0|~1Vp2T0Vx3=3s@8{j)JPm<>5P?I1?Sc0L+XC+e-VVGK*c5m(P!=c+yb^dR@M7SF zz=pu{f#(9x2A&G639JsR3akt~5_mYUBH#(k3FHN`0uut421W)(1cnBN1O^8N1qKFs z_)qzN@gMcq_^bT~{QLZs{=NP^4ci;GG`!XDX2Tl|r41zw&o?~Vu-?<~WW!?(%Nmw8 zcpC0&nAb47;qHbR4O1I#Yq+W5lG9sG|MPUk>9q9em=eycfKbGqi|niDn0Y7W(W zU-M1P*ERpG`J(2tnu?mYYF?`G);v_Rtj1I0SzL2}&BB`bHTTxctC?Ffr)G9dUd^nU znKijJch=ldlT$OTW@^opnn^X+)nwL;tr=3&v!;7Zx0+Tp&1<4-T!*(De*JLC;lCeV zci4A0?{NCzk%!X`k2rkM;o*l<4-Y+@ayaR5_rr;YJ0I>;U03}}bxrjT)n8QauKv7w zSM|r$A636w{ja;L->Lp*_2%lgtKX_FuYR+-topU;SF2yCeyRG!>gTK1RXm&Dj3;DUvmw1UxE5ib)de7-N)XvDPe}6Kl0{+XuY6=X96*yr<^; zhbTMd_96PoxhlH)dBB@GPesq>=f3jQ^VX~6GUuye_49yt?tBWo#Y$4XV}6B{6TOQT zc9+w=#S8n(Y2~{YJ}9HtWvEoI5Z>AMxAV@rKLwrQ`|pwy%bPD6Bil}AUQ(?#HE_t9 z<;sakGUn79-u%UFk2A5nu@xNg+X~&|19gXsQ;o?H^w;d}A0ZgEvOMi~VQ zZ}g@tiEHzH;8*z&E++>LMZMu_8#BZH#yfe*@2V~nmv)Js-%Dkdq5893hl5?5Fj;t7 ztgDpaRLL7t9@pnklTww0Q+i*oU~*LKDyPEU<4fa)Ws4)a+GwdNF&@V1@sNzvZGSI@ z=&YSsYMh|g%4OW>O)Kb358quD*Ja{SmE721gU%zXJGF-klwbRxcXdHrhfs5$TYAX5 ztst(?eIZ+a8|%)flQjBTu~D3dSA3AwRR1I^!_^u2GOw{rjjSZ~vwZBbS(5R$Ww{zt z2bL$O=JGG^PuKT*sPouR*FR339@FjgtJ6-wXr;77Pg=qm`z|Bvk9YgS z-VRJ@@?OgO>sn1FuPfZSF}>_>y>~w{=*qQBManu@itQEH;?q*nYlA+2z{;cg&;CY^ z4$NxQN4`5*F{BX;b{{=?Q@q>KjyjZ1ObpHYp|bS1woD4&npwePnh2#I+BofJ1@->q*4pB(g%uZxG%Ao77bGz4zqmxHdQPol|xEgAAsL z!6xeXME@BF*s!ScZ>TOUrL>Q8{;BQ|bc$m|2To)dB^m3q9BoG*c^@6rk%#ql6g9Zf zbZY-Z+?6*5ttMkNUw5u!H7qEfg?vENGj#4c@s^H*g*t_4t@-Zxctevp^m}j2lilSv z<%6H>tp@8Y-aZW0N4$ElzU)=4cffn$fY4wqCYPRiuuf7w!}HXg$ZwCn6R)Ytt1-=+ zwx+wB=AE)8u0wS&BV~KBo?0B+2fVA-#P!KObyDY5OuoCUDR@w&ZsxnGT8^>xh5H@` z&H?Y2_?+lHv!)Bfyxmjk^F>cx$P}LQ)Wvk;#;1l{d1xT|)bcs3hU+=*W}WAK!5row ze^`&Ci&YdR5PB@Euckdm|3+_*r>A>QKfOy1Dc|mU!Z@!jJ5nLLxm}&5_ttgSmzS-Z z7u{i%ERqHE?7$Kgvl;c}2Px4l29Rx;8g@^UB+HYRul5LR7gkh1|#} zk1ThVCslrZ(0h{L^8f}~9ztx(j&(m!0=Vfso zMk-~rU}Gt9lWe^}NzOhkpNiEiJu&J`3(c8$p@`-k1mDIxwk6lwN_YGY$*9Rd2=_ht=k& ztzn>B-l%)-@?YRhr!*9271=$e=K^QME@4DB+B)M|#c@gt^sIeY&Dvhys`l~+J(m|e zxe14#JE{GGLyvaI)e)L;i8p0aT*n`rQrTUXDu+&KLALj{HSHR+QDZt{W?G`=El;S{ z=gxTr!Pa=tA03>>*Xl9XIFCmM=W$0Kn#U)j@66PWd|1%WEaYmYX4RXa#xCPPwRR8j zFj;3r4jIu$cZ2S7M_xYmt+i4fV#nHUuo0T%N|;K=>YanyCAo}s!AUU-`C_%e1ovFX zz1LK9_KvS;?frX2yAFqf2|3e++M7Ak#eLqR6&-qisbfcz)5nd&o{OJ4Suuh=P@yyI z%lmD9%yzXCU4$6s-M&4myz9RUdJlM8naeWsA#)sRE*Hr*Ilf;Xe{XF!esR4|(hqs} z9=+0P$*A@AICf!q=CM~LYmxu>D7nEq^2GSIq~>P>gpYkjl5v)m!)=WBZagun)k4Qp z)CfEcz|(!@XHJYVSnh}Z^12}ly)~!$x1vw5Y#!Cg{J=FFo$21B(<9_6@6^*LShcP{ zGfUp+-F~J|vwYc^CUhJ5-ZN)LHDg5*m1y5qKJx5kmdq|+^2fIZdx~595BF$Jrb7k} z9Wpqn`;dX{VqNl&o&yK=%<_2rcEP};o&yU!oAb+C2Ck948T&DA7eD>S$f2>u%T-S1 zKchxiyU5#ZOnqv({K3OnDht`=yiUWHF-ChCTN?K1Zv8;l;eDgE*~0WNZgjo<|3FXe z`q8W3rS(2mdVWgTq&o5qTK=h)vp3LVU+GtA`DaQVxPfzGp6mAOb-;XG@Rc@*!QkVd zqY+wOsSTDOpC3%{RW0AIT?BbR^Uh4vZrV!I*4w*!j`hL@9mcICSOd9{H@ED z`fHW4Y3Z7G!}U%kgCup#j%Hs)aw~bO70=lxTXk*aa<>}VvqziOtzz6=hqh_m%k660 zs=M!nw(^>a({1JLhSh_!)HkKQ%&GXOy=*V74(hnNgB<7U-%++3!|t@Cy!*6|kJIOEHe0OR^x;`sj1`^4_ z?Ao?#tD&Rh&|yOd4UB6S*RCz;5AK!JUv_ILeMz0=)uYK|9ud`&on(%5oCPD!N3Opj zn9N8731t$G{4K3N207pNDmLTEbSo`&)V!-4-rSv~j*NvB<1Unk-5vg>j>KhZB_^V? zkTDyYfAftU!bQj%D?S+_zr#OCeq>$J(A)U>kN1S|rCltaKcC?; zi1t?PKT7(JUo10y=_BQZT`p2d+XsU&)w#SwZU4>5!OE;0DQ`B04Q`?pzL;T7aI}Kf zj2){?_XYa8@3|y2LQe2yT_Oi~)CeL{Yo~VM?SrX%!&pe@P;am)YwePm;bYb`j*o|r z=Mkfqz0a9Y%+j!Yv8w}X+MS}7Hf4s=^7F~*1Eue=_XX)K1HV7yKDy-#; zITgk^0Rl(0KHY}?T4tbOPJmNN|E8e6-uJN>H`(v8TIro0cFw@PCWadaM^p=_@v9v= z14@0vMg=*;O3Ondy|IQ^;K>5^rlvZ`#g$ps*M?=VhlnoQYb!C7X# z5ur4zqINXjA@4K;bjn_;U8&UM8_b3sqbJ1lVoDeCgOFT|^EbD=QLVImntuuMQ;vSa zt!78H`Qn!BW=C6x6aMF{FRbsCe!%6=q~x^k_!Y9xj8;_1Z6A}T{KaHd7WjafWI9z< z+ikafT%0xwkar5~w>~r(IhLb;T&5e3gyh!8Vfl%me3Jh>>s9k{{2Xxn`|`)g#qQ97 zl_BqNR|QMvX2=`dOe-o4-|h_gnVW{^;Dm3(mGT33O|T?yteov;9BZ}OvGNJGTE~@5 z{#CMfmn7%FsIppqDbcqg>Yd zmni*)Q@ZJT*}uyb4X2onbmPUilzrIWvasE0Io#Z!?UEgTo?xKUa;$%O*x<9U!C9GU z9@PdJO%gbZ{zl}wFQPsQ^#udqwLoe}t}cuO`{;~(H!3qEkLWwkapMZ1W`J`$^^9>= z916+RWyqkT6EeoSG$?-~!qI6SQ>gh1`B~)uW1qQ;Z$BSfhhln}|B+K0Dj1`Tia_83 zUGTN#V(=PrWW$%C0>>a~B!QjbbHX>}Z;TjcD4g*1oh*wJ?K*=k2(6v0e6jmo6&3H^ zfeF`|=wqYe=wvxgderHo4#i4;Iw|VY#Z*fGLnL%;O~OnM8Oz`vTo2^>d@&B7$N9qG z*&z$e7RDch<8CI$xtzY)Q42Wc{6&8;XZ;d=9Hoy(a{MyKrpt0wY{`=M%dXCB${J(c zrxnlBiVHbj6txgX%_}C}B0oC6?<64_ZXsoU|L#|lgSgH*ZF${&1w&pY_DUKyG_IZ7 z<+gey_419)mHmASa^-bywT8N_oQmDKa=0a@R@k%U!@Vu$O6en(+WNLX$DXPE^D-`47Wz_Nk#QXgNj=mu52>|D^ii9vBVK&K}9#lZ@cpda}? zzL@1hHA@!q$nWvRJ!Si7QE)=NdSCqrQ^waT4;kjnH=)e9PAIQsj;LTAm&(=+NZu&GSKn$LXWU zyEh^EJZk1#iu_hxiu8ONh*A57;HAiUR72mvQTJ{ls`nalbq6O&=_z@zUFR_ZBlSZg z@HOO-`Wu4!Kj25*wMkNUca$GbuwXI;`ZkZc!4nZ!8>nqrRCgs;TUT9et*_-hn#g}3 zaAbf`V0EfQ`VS>K;s?ffq(N~wp-xQMKVV}G?GHw?j&`$Dq`sAA*pAR>mvPo#C#l0(gCzV zci31N-w-ViPM5Mfa((YC zs2{4I*4IPhVjccS$iLE8V>pU+5&ywCz$2DX@yGzdiW7jbq#MvlDAXX%-8eOA4AlWb zBfz;2r$)d;9UwFU9we~759jDN>7YKAM>U{h5UPPTP_vIxjSRz-sCu=JYNcRVI22`S zS)Z?Gtzk_Pn}vLUmfzS!u1=!)&fwPu;ml@Hpsy6GYs55FC^2;w=_||Xo?gTdnT0%3 zKh#o_86uJTp%F3*c}QPRqoIO334FWm>r@@U$Iws*g~C-zGx6`hfL%TYWL1XgHZcm6}*S|op0kN z*$HEa z3N-qk5WdWrq^_e!7&zZn)j5|HX&~m1(8H?Y#?x&@YnR|m(hc$)^5H5Wwn#1BmYu_U zpywC?x*&L8Gc*G9q!O_%hUBl2=?GN=c}bImx)PvFw|EboP^iYYAfKSm#nF-SH1;9` zo9tbl4sS&UHra|i9omWzc&vLS^Y?yVLIs<=>Ee5qKXx6ug6j0r4?|GFYbvNfce*TUP?IKd5rvd@rPZhFvpODfB zf)(oVpt{R#JgpvZ=k#!lol1?|%+}PY6iT|-xtM)VOp?o4b*uj*pP_UAvz#2L)1T#f z*Yy{2J>weHo<9X}wp~pexxXSIXDa@)+}TBiegKl+WK0E>KdoL*I)>J--yW7<*(mn} z0;;)!1{c@gqnlJ4G_Z&VJCa{3;h&qp+>pWLLvDR=ts6tNd6FVPh=B? z3Y4S9CUU78HTvvO^2ip7l=qJqq<@w>gET1jAE06xPK$aP;&jbERRJOjW<<*Cp9&kK z)mx4F^^b<-S4PSk`h?{d*AH#fZ!p91u|c`V37o77oKe~k-)P`(lwTDoS2wH7uOhnO zsMA6ba;FP|a`6QIBfB6Ze~9zH$tVpKoJJnm1tB^2;+k|pP|nK*BoxsFf0kdRs}+>% zLEV!Icp68wzRedd=;aEHYAvrnOkicu%avBoIn6xb$Uh3pudGjRlsC){%P+296d@lK zmXB3~ox7xtBR@Mw9xT-pMeuae0V3pAMaqLW_8QNEUxI_wx#8D1PyAW#%oC2>6S_mF z44kt&(jc-6BIS{1K~NsJNnO=XP>X7LeU*}Xf=zmDqe1=Nu)&qi zeMQHSzh_u}aYIU@e#5U}`Pc?^%`F%>c#E^Kh3bMWG>(>DMqD+M>OJM33!EnUv)pN+ zKg*rfEK(lXLXq-i5rY&tlT_(U#@Fbsr2h-hUHiOp{`52 z3`f2$EFb#^qbDS9cuUFk*t)9zrAE0(4|vqw-o_@X4>pl=7uabc<>t?Fr-lA3cUtJr za;JsU^3ML^RQ#!vr{#XO9l-z>2Twmo&L$!#AKOH}Q^|Exk8If57}&o!EWb+44YaBD<7s?; zKwPH9p`A?VxdNB*y&fas=Lv#(wZX0m$z29@V=OtVAa{v^dQBE1?gqPzAG9757gM;W zQ86@SGPhf{Ry?Q`!%q+d9Y)Rrv$S47>p7=Yqrc!F4nJw&V)ao8hMzD{{?zt~uqe)zzm(_yAMywP5BZV^xksO;QA>5x6Q*f^sDeMs)!+;!v@F8W z$_V-Lpu8m&P@B;tS3l(^>LEuS_^we-ohVr06f~@DEYR|YgYw7Ekw4t|*XtGvZM7QZG#z~# z+G;h*|E}d~tEF~Yjq+z4KOPG7A`|s2?%ht9;3#&wrua{Cwbg2L^pD1bn#iA1a$ZiF zsJB|7E_mLlSXk}}6>M+{>YqBt;Dw<4(R1V*9eG2akUZ+e$foAi&tTxFl1RBfS;-r_ zz!SxMtTR2QAnIjDF48g3Q?#*JIf`QO)HOa=zUTjt|M&lpGvVRK!}%Br5cRbRpu#i_ z5XIthu3Xh1n9w(o`VsPdjyy06|7wa3we+_^d2c0G>wl<#2~h>EuR6!zyP$mUIdZnq zO5Z;+B#-*ONmI8A%d48mcPe?X3)K1_#e}FGEsiKqa^^qX63$etZagqK(-I4t$hl7F zJP*i~17F#hXwC9C`T3U{$L0{XdJpsc)@3g6F!)e}S$WMa&1UD@S^6-|9Ff zbA7SJnaM&9cxY$4*^Dl9sp|!SfZ_5_G+PBWsL|qEwNnn`@&aO>Y8+vH;C_rS)I(0- zlEt0cZD_4(Je!X+%DGe$maDH|!C65)JJ%?u>%#KJc0${ctLddbk5h&XTtifW|2*oa zA4zoG)G%7t`(rKtM^NrE-c`p9$2iuHD56IrQ?F089wR`@UB-LrSUgM|ee)*RK4@vV z=Lu`O{^COeOZ836&2@=Sf`z9kb2iww->pjm%*v{@Xw(lFpH6G73pH-=%at02EY*#} zFeq;vhQWngu)=%zQdG(C`I|Nf7AOP#{G-d*;RMuMfyU+w={471svg6BK%{-+J8FV{?aXP6d!(m=_Kk89K<)_@H~|}*xT)jDCJxD?Nkl(XsCM=dP3*`U&tytfLJi+2 z{a_2X)}bj01jhN*RT@>`GPWy$znC}*^DipmRl z_*XqE>oVT)J+e!7@oZK`Q73{G){BR}%&X;%dpR1&d5l!c)s9YwarStP?Laz?Tb0kMCgm!{1-CjzMySyk}ffp@La{Fuq+|La;v;|7iCX>+$Rm%ZFw zVOgW`I~D!DlY^qD;ORrML$6?g^TKc7 zl>d;mP`wcB^63|agD(VQnBJ(oHu!dMcmF|al~yinqP*6Zk8&`|dS5XIW1KMS!F)nX50=dy! zX$B@+3!_T-)|W^aM?XV_JExoyzmH+TZ{O$fM(1W6HfY6)Q}M>@rn{%;EiU9<*PDq( zQjSy)K!Z`*b@I?#roJw_^&B`vzTTzRz@e|do_PJh)EgVNS>66Ppm2#nL*~u$zbO;k z=bwMkknz{}f0YS04Ht+8IEtuCp!_Y&h%L%vvX>1g9KLw4}Rj4?X-`i?OMRAh}YvfR-&X~npr`&Vqc z#)y~Bp*#A?it1~PH!Y7H+D^Cv?W|Ary)OM-$o^6AAE6xi$e3Qy>U+~prfW)&9|^SM zZ+4vJg)Hs=96zJcf3k_b_TzdlCMjC4D*Uwz<)1VBsF-XWj=Ci#$<4MT#vT2(G7ANc zFzBoe0^$dGuX!?RSV-SKiW?X0b)o#w+z@p~Fd?^=t4Hu$Vy^Y6>!WZ&xC*d|;O50zfo-H>!XnAe0s=AH!0)&6`f659L=*H9qIF4|nH}eE=ZdOSV z?lf{8o07pMKZS>^u4C3Hh&M{>%6wDti3Qc-_^?WR#(1 z{^o8ZVP6E7VaV z);jD;rdzM7cwm~rOaJ35hE6wbHQHwIheo<99qV$xu&TArMBmFZjQ*aRjm1tqmAR3l zi*DxJigjF~u3RQXBje{Sss*B1Q&qTdSy+0G+_6C$8&;S<*(62ZdQD@YaYs0RlKRU8 zw3~ArMJAT*+n8g#;?|eNqH`)H-C-K0@`RD(`|X6Wtzz>@qow5;N<*x-viU<( zT?E;+iA|7$29A_N2KSTQyRiliOptA3TkyFbvXN4{d%5G>y;{od{rNboSCIa4$SB!s zSlqB6qvW72a#)-@E=U*Iwxz_*z5kA_Gjg`xk^8Ug?0?-QS9bOc?UFDwq4Us$gkkc7 zp*LRG{PIylJ6+Xj=*TP1yKv&rl!WZg*V76ri)J!?*KXjrKXI#gj-JL)|PgCq`J7;$p zFmz%+l}E>MI*+~;J5C!<-O#gCd`Ablo0SF_KC0ox8FPpEEf3%JYW8Zd?A3|~t};(Y z#U=_7H)P;2-fb4a_a?IDI z$37!}@xRPdpslp`%Nxd7hmCmlNN3~@CAUxN?%v;!V;naoX?dmpL*$ohc~wJ!^|SGy zmRI`^BELfW>4YEk>~b&rw7l&v{hyYjk$V~g zvvRzDRYV1*1S@b>_Vd3RQGsmpX6^s1Oz>|H`S%2>8m0sToFyY=5DcImP`3(o&HiWd z>~N@s0!OXG)^aUBZNAVLfH#egN43%NQ`W#xfIt=J^3PF&wfuxN{v7|F&nP%6$CyXY z3BYq0s_B`f&&na@DNfz}Y{%}4O4IryteegWaI2Q5TWl$sRN#Pm_*wL5c(bYhD7WL^ z6XT{hvEkcbfSFM&W=P!r_U8l`rRA;sZ9)O~BSVX3b_lkBMsn#mrff z0DNbn0w)Z1x@zvB0<&E&A^+Kti=CF|PNx8aI10ETtqkNuvl6)zV1TNbks8G-22BDq z3kNuB^o>dm2Y4zR;H=mmwJGf14EsMTFOBNPsl?;w-SkTZjCP}39O9wt1Ds_1k*J12 z)^A1ypWI^T(=*NCzKdp>Q~#zX(1r)BEOQ#Z7VBKk$PWJfDn`RTtKQ5;{(vJl&To7s zo=4VsNZ)XY4u2iOcS^HV8TDyBnFTD`%gOc2v*~?VTk8c z4By_n&5wpVDW2wmnO!=?B~8rLiB{Fb{H&2A-f_%lnV)(b^RuGfU;7v4XXONCuAiCz zGK!b>>1eOP)S#Z7M?QrYN)89*os`^Oq2=nK{CBLH&@=WtntwyXmax9+CG^y=Y%P9l z_?rCe!1Ab@UAc6BvTxvQ^A!&l8_*|;b%w``TsE7ipxQL|ALLPIl!_KgUF+SAd2@FF zzp1)s>Wm43H#*dCwEDQ;L_S>0e-n>4`qlD_g7PBmzm5MbtIQ~4yJ7Y5-ExolsO;s|}%zvQF&xv95A!9Bak->id z9`hbOCmolA{CkiGCsqHR;FNS+j?!{HCCL;k-z;{aXP(vedTQY~$<#Y0CDoZ$TX&fo z-L289Lm&;`oO$NO9`iR<=s1Z|?*skb=!D}Wb&M2OTJHjDL(s_|je0muGC7XWOYuKv z76T5@4WD&+~B;XBrJ;r7}Ps)VGA_C7HjRH>9l7`VFZmelEl~Z%FZK2Ls*u8U3BgKd-~o`={dn zW#0Q~qn?AapC)NnVvXw|3!osi3t6SdrVN5uL>1@QmuA3=cAx&`#OG3TSt zxKRQ8)%EI(R4amIsgcdN(Sd*R=cz8B0zYdx<3`ExoTt8J?PZPnU7a#!rEkl8^9qlB z%;@B2!U(Nx^qpG$Lrc#w`Gx;EJx~jRtN$@s?dPwOga>L~aG)NOb^bi$&f4j`^mT`t z^hAxhf_T5`E~1{a)bIG;p%Sw_$7KtvJxv>W8%({*beZu;V?t`NRd0y}*TUm+oO(-4 z*L;pOC{%N-2AkK1Yp&$F=Ez4Xx#OR=%9x|%$VUGjak*a2KMn^tAydKuX7jq2G8kxH z-&kYSv{C9&@Dp;F**9F{(3?!XXwhdw(>#Hd{5SQ+lD$aR_?VF#_?$$Ka*Ah}LmJnS zW5)UZJ;8#=btEVczbeJtUh(Eaa}_(cV{*UMk+x;c3PrO1XpAH)t&Yke8E5gHUTDEO zCW}meP+o8OkUI+&fy}q@QybW4jWajmmtn*^Km^Bzuih zGie#m5J;VC+syZoKNXaBF{*;{pUraQPdjo^YkWxyaV5ZdOP_+ZG_S!Gld>h|)fK&$ zn5LXcz3)?l%A^ck{tM0%MUD^SGLzTl0=t7glI*_+<;zUIQmL~dsQ*k@U%d;S!30&o zJD4u>r;1fe&3E6Ds$wV$7<|s z49e@ZzTU7!oyXa6%-C;Tz-gSM{0H=o&?-jX*%5k<8CB+c!2q+P=1|~l36IJ7)|24? z>a=urgvaDjlNpbB%y|n_?WRnNwOGB4iT*Kq=dh*b2__o4^|(A}s(FIJZ_cK>)kO5A z-WwB#KYyanio<$BI4-X+c_~;0B0zNDAJ%)idrnl`z1)0{KhEImx55m_pDX%3Y<{R) zuEID&;66I=EB;nijoE_0>A{w`*0_+sbcJ!835u4Gwdc+sLHW;G&O}ArCa?W5Ec8ri zF5+574^BdL-nrZ^{%}F7fo+^qFs|JQ*|vMP{?fPXQ8Tk*&!c9JG|W@Jk&l^A8@!6U z_c3#ehjxf-xQlKMt|JZEdjFwXqqHHLN{99#h30JbA;EP7tAYMPDpBQMqo?=A*>seD z4f1=LG{?IW(EqQhv>EX8P%`pdHJNHT3k~wy0{)e{;Dk1KCuG0^Hd4#?XagnJ2FSbX zKVFdAkY|n83#1NUNw&Wq(@MDwH}FM4Eu4xxeCv7x_jm->=yCiWz0e zp%taCn>We|_Zw!J^u70{c}+#jax*&0lOx1k3t*2BxrvZ3#LVV^Y$n5WX1x%1XTwe* zX3^)fwhECK58H&8jn3>H{1tQT?kN^xjs>d$Uvtr!I~R5dF)tRf0GoU9eeVQ7es48* z7w)YWVty_VU_lC$2(b`@g*dt|8rnmV5clK!ew^ID8R~>s6a#&s5KalPI33ViT*aTw zO@uW#$HtQf1j;99{#GF##OA>a$c9qxA3msrd*G-LOE6dx4})PGptNKW;A}}L?124n zN{FS+p$DM56y2rhE=6}Kx=YbritbW$m!eyMZUMRlX)pnDp#X|}EB(wr?v_4bPmf;bKr9!!Pla= zwpxgFI9Z3@`YAx5qQO87ig5DxG}t86A8ZrP@cEfsI4Z=mSx_iMaWdfRAC&)tv z5tIq>yr&00RtvEq5w;5P0);PR1CBQmbRz~E3HT!N7sVIw{1SXh?(< z$N+rqSpcg6-96i&5^4ee|3&}5gX#bOlE8l_KsM}wYB(jtUYza4+1_-((cTqM2sqn| z&R%rBwgB1J$SPxD2kZyRzG)6UAPpt}iGPE9ABpWN72?|rm_+}7OY`i<(f({G0t)w| z_#LwEF#K*OR0?r`WDXQSoem{JJplP3><^Lb zp)$Z{btb6(Kb#G_g{VQHrbvh*7#)d+6;LZgZF^V=eEx9(RD$|kC&W*Az~}#w(Es@S zzkFB?JB2uEK`yAzRe=7n7)XXPK<+u7BgAo>9$x|5V7Cw_QUNC?qahJEKA8yxuttcV z+e0#t_%D?Ik^=QY{7T}#lIX7+V3QE1`a&9vgDfb9G9b>W-9nrmNB^H0EX0}7uvLh& zJz&2ObvUW36yi4=|Aw>Q>i7c;n}zrz6Q&4JkK=lr)FW>oP{R)P!Po={7T5*VaEh;L z+5C;&L|6nXVGmRTWyW9_%|DsKa~;y;AKNfdHn;K5H7pP^DjD)%hmfum$QRO$Bll+5 z4Yfi>X99o3zgaZ22W*<91M+6**)c%5jjde>WkB%r&^s>|Hh`y6$mXfA21ufMS~z$bc!Z09FGAZP0InejD`LpdX8VY%-)nHWUDriKTY2 zTVW3z6|$`b@h}+10lIA$36E@xa@$ha0Vnx4P*7@zQahB|<-$%NP+T5V0y^!ZArVp` z6VPj407b9~c0sj}9VqLN10>x6+m86|i0_X0=!B0>Tj~E!dxVTf7*D`>4C673uNSg& zEcAt1ArmqHy@aDecEM?v-9jeLg_W>b$gXKXpspm*729s@p$PU1*}VtgzdJs<=K(g| zw+h)K9y}=ZOoSDH(5?|NATuvd?NE`x3ZsDrCYYAuq(?g*d!WeclE8;V9G# z*{?a^xL>i5{juv$g8d7j1V}I?8VE8#0F@bl-9U~9aXe@O>=ANs3T&ePhu~-kNen?a zlthNb0FF~pNL>WALJprRgc$dQzd91QueTgXv- z9#sUVgiN0TWkO!k9#R3FOH=6oOS1qcmu?dBvK~M!MyCmRc{0!fSB!%?A;;h-BNmWd ziR?-OjvWovLSBXaRVRfUS1RPyiLgex!Ji_8 zG(i8>%|cFzg#}OwBzW5-Al7X=;1vBoHB-o``A`NZOiKoWPeV2h*)#%VBg-am_HMvv zdI}J1dZm!JXTc^RXHY(4n~*s%z~`JjLf(PS9rZ%qnFl36;&-J(G1Ll~JDUE_CA(a* z%SCZ!8Z3gXLf)MWnUD?W+`SSooRtV9Fbk)%s0CjMWgY?ZNNhH;+0{Ja*8{M-XTOkh z(4WKSIfbxO$hj8G1rnNjivFM19?FEgm*4ji%hhw1*VPfGMy5Rzrzz#Yg6?o})q*L_;E^LMG%uJ`_S3?1U<)6LMJ$Bttq(f;?CO z#jqK6L#>d@1+<40$bc!Z09Hc@Y=cS`(d8$Fd?*?ceR(_0XH^{^sT1P65S_vLKU18(i;uvd(ro% z!z9Rod|1sn-FXw1*VPfGMy5JgfOp0^6VxPV!hsw0g7yQXvy^ARh{$40b{l)baOzV;~vQVG`uQ z3Mhunup4THTq^+Gwdk%*g$zK~xBOGHt2znSWx^C#0L&iiN`aYyD+hAjDIwQ42d1m_ zgJB#nEv;V!=&s)Y+W_75=oX<{)C1B0-6C|0&@Do@s1$Ypx<%;z-C_{_J)RGPVKhvD zTquAd*aW+v8ZdaKIiUXx`p=-xC5!(z3ehhCTIQKLA)ifT5I#$DJWK7LCE&A_LKeqD zDxh49(my7_YN!?RIRZY1@pDIoe14q6hGHRK*b4PRZcK+PAmNSJzL*Tyzc?50@nWe% zNnasLvZ0DW_);e90&4g&&bSsLUm>Aa7QqIn6tc8A;J7po3ZM{hR=N%L0Lhh-z^gIP z15#le;OA9>zq$g7pbT~ZK3_d5emnXVL#}ujB)YZyy!1VlXTc zax=}g8N+|ZLpGGcDIvE|zGW_u;1=}XLGK;P-`OPO)->250E$2cI^jv~Ox4g!8aD}8{Y4`|L0 zaPnaaEC6gjiiS*B3A=>cN!d<1lho&HV7HL}X$~C!2i^aW;BEm_WOoVR=Zh@ZEaaE?_!1vq zs?W&3!se?oA@^9I`hU*`s1@?RB=XR?SQ-6)Y`2idV<8JR3wZ*?6DXY61gC^NIT}_7`7^Sgsl_iO@M|=rK_OHMd5Q|0 z!r`esLY|I=1%UiaI;??OAHr8nOX-`&bwUWy0t{5}h{-BcVND zpO7m&MgrM(p`Z%}T^0!=QNRi)2Ap@Ltm`D$0H=h}4d>l<3!{5HOabhBM8gCqf}_Id znFbv9%!L9#-V?o^yPz8Cg^?5seLeih030PP5JoQxb_gSxS|?+iya#ZYj6v__5D$Z4 z9Av{HSP5H&aRGiVs1-&ZlIy!h7<>&j`XTFweg9l21pM_sDU1~Srw}v6gM*Y!KuuFl z31dKeNP|g0*#OE0HiyxG!9bi0#K9mO3_><&H4uDIHPi`Xa4e+2ILLtlCbfGibxK^F;olVvOGX%bh0omPo)1ZC(sou zV4E<;kjR)E;B!WMz-h)VI3f}Oug-)8ut^x#a3R^arY}r@%}^(dYX`$zKp_)@%pzf27Yi!^*>(GcalHj8 zK+x-PcKsUIDva@^!kEw=b_rurr7&(P1U_fsCkwqSWH(O{#w{G*LXw_aCkW$KK1?Ok z?481xPD0aBoPJaow^Pd*1ixc2EP^s&+{y2|(g8=gxx$!95;NGTh1lFj!uQPuWcOzQ{ulS9{~yQ{#sjrvLScTqFdkefj3pVuSQ-sQ!YJ4z zjAa}z+b@je96yB4LxsXvLBcBtvI5(OR|w+~l6(aDqXc?%4V)6j%2HwQ)yr7b7qERi z4X{~_kJVMecp{7be-go(5@GN~!gxAM7`{AV6jGCQ&4sZZXX`01$`HoiW1v{@C<~N9 zoiLsyU@y#m-FjBNydAOG8@2;<*#g|P!4o*jk4_<({BalVtFpKKMzE`sgC z(Pzj%L;153Vf-go7+*vS<4YXvT_lW39DlP@82d7zP8i=63FCY8tFZkcTNnpd3*%58 zoDxR$B*5=s0i%Uc(_9$r7mOqM^#74fd^jnL+QEQf?G9o5$mgHpp;Q=bAdI86!Z=z%eS%PgxPkdFyqkU3bNUu zOqd;$fq!kcBf1^8!AW6u%7ARZXQv`S-U*-a02EeF$a~KQ+>0SV(um|de*`o)nfI4CJBoS6Vvu8e_({sNtllYue0=tFTD-rUb z5OxaF(+i_yvPnjmyaP@OlU2^_Jq0$vDPdla4lAKjn0@*J4*MYQyBcbRd0`5y5N1Dq z_rocxotcsW)xsPYBTN=5a}bFPZVt!?=K%=}-pt$BgX@JkBohcYgdjsULzOUxMnfv( z0Lnvm3Ue5ahpmCF!sJ4)nOZ8$;p1Qr92Mq87Lfc!g8}(P*{}$(xd`2hcEEl(CCm}c zp@)YbX)pnDp#X|t6YPR&s265hEcAuZkOgyLC2WALum_F`^I{UcxC}`4Vk$8bossB_ zL}w&Aqc|SL@hFa2;LLQ-YJQZ!HmHP?!n`CJ5`h|CvJ3VD&M&nf9tOiW$O3FGtrg~F zn_!19N9RH@RKqD@UXIP>*j$dy<)Z!W38l zD*&S_Hp6Z}e+>F#+CvIt0J>w)9kUur0NpVsg_#iziI57JkOTR^_dheEj1N1Z3hIP; zWeg-kI!uB*SOLX=E=#XDwp5r`r9cKufd#M{&>0s4*pI`0TqcyjHmHPJVY2L+*WlwC zK3~iCKl9r5fU|2efPk5N&fF}_>#|`HtN{XEw*&SF^Lq5IFA?T=nsq$QI({6WJ09Kf zD}_0M;|b{BkOmVV7Yd*VHo-2ahI(O6^u+R`FN}sPK>5a0peB>zfwD>JbEPo<#_``c z{@ZS0PR8+MoJ_{aP58J8`Azt^3HeQwXRQ|I&B$&}gB`F(n78CZA(X*RsG|RGsT1a{ zF^~-DFbVQtn=q%e53+&ZIJgamw-pF;>Q-S+Bj~guVP+%CUJ2+=$Io;EPAAB80^FVf zb73`<0~ zqEh@|EHRcE1;#RCx$%&(!g$ztM0_ju^A1>*_(pthJZh{o9y3-Mj~lCvCyXZzukXVs ztMXFutSL-s8m4JlW|ZkN-Db4e%(Tt(%;x6#{OevV%^0(l*_zkMW6ic=z1hx;GuxXT z%#LO!Gv4fMCR9|ptY2Jx#haqsRmjWlZ;J}C!?jLq5^sqQTSn2$02)^tVR+4XJ3u~W86uPe$CGPR= z3GN%*6WuquC-IL7tmBEh6Yk0Go7`FMo87mF7u>gsC*4!rx4Eafr@6D;(?yZ{cJ~Z- zj{6Qb|JbfO*FDpHw|ka5&pq3Hk9&@Lu6WTs&wa0ZzI%atq5D4f{q9BX#qI~(9(TU` zLH82(Qg?xSnR_|^TK4c2?uXrvxE~ddyH~m&bFUI>#8d9a-K*VCxSw=;-D})Wxu16X z+=cG7?se|p1o-pqG@!cQq{XOq9ct2)B*2K#@ZhG}o z-Y*fcc1^haiZScA?bwO&B+CCg@$!L#E5AxURm7+DC*OG6^|>FOeC0OY7m5Ui-FWw$ zr1hin!y>0v;A8mBxwiywJ9O!fIB1!O!Q;1Fe^;*f`CnSD;eEm_v+lh)C-=cB-WQ3r zVA}MXuAlawqa%~WT9H8cu;~bzKdxTp{W#wDoPOJ!c{hfy`!DaOi=37>>y8_*Kjrc7 zQp9@hu*exFZo7V7?kT1A1hL-RhknxS*9ULAX{Yy48G<^I?$74lao3#RZuxwTScga; z>#f|`H|6eq`PsjUXZTbR&r*zZd&$l=GrZ>aUH&&dRKj?j;o*5uU03ko7KIb#y80GwD-us*zWrg!fc66h{QTbUR-`@>!I?;s6so_ga`jJDtxl*~RcCdzx?4R97WoHx zp7U-l*zTXurhV6xuBlxocb(q#!LCcY{sni1U5g7k20jeB?o{Mg?Jn|NWJlzkNO`0* z@@nMeNO9z)$kxb~$fn4K$ePI0kx=BxNI_&pWO-y+EzTw})C&S0X--i!|zYFgVe|s|fW8Zr zRNr5HZ}mOZcU9j}eSP)S)mK$tT%A_kx4L(AkLvE#-Kx7(cdG7K-J!aDb-U^|)vc>r zRi9R!Sly!f)arz4f3;ohJy>_}#C}%167q(-&TE7^>x+0sxPbdR()9YLDkNxcdFj5T2u8@)nio;SIw=O zQ#HFPx9Ya4TdQuUy1weVs%xsIR!yn8s_M$B$yJl8E~~nk8@bKk7{rr?{LuUkI2ujiMGzP#hKFHT(>C=yk&p!ot-a%#eb zDwr&@Wt!Y1Gwc+ZC+j3vZnbZeyJe=om*mT8yH@V<_x1OaTjUz@_OJbc}Fpk z?5Xwud!U{y&Fx-tubpJ~wEGoQp4y|;HP$S-)0%G0ux84A)@|0U*0m*VTfCdC)|GsD z^Rw#GbL7#w$%(z>{%}~n2k^kn(%%C5gT4 zsQuhX7stNj!|A7~>$k`dH8&E8EMw8T$A4>Lvh>srXsZVK>^S+>IC+8pwwV5=IQi{y z`Ws6|&Wxzwy1C3G^65gD{iZm@gxMn5I{Y8xMgK#-^?%4Wy7Er=f6e%3#itruWT5sx zMw%8BIR$@^Z~Y(gjU{!nPEl%8LDKE*)E4uz$o$+|kcGsNZ!F2XJ)|g3&26WO%+Ian z=f;8@Eh(9o`+=pdDM-JootjmUeb+!Wvn2nnzLr{7ux;)H3hL%wr>-fPdiQA6YL;Gm zXqoKDciwyLn-h}*n+smLr`-jcsh7<#{X?miTh}y_kI+^|-q_n9EiY*?Z<8Wg*}d1P z;H$3PK%&jHThpyeV*9M zx>em6wJ_uH4)0tq;}v;Q)FKioca>Srw|=s3SihZnUs;%YyKv>)w(dR<$PHNRb}7v%y|Iwta+ zeK)o471&U6-~8Lu*jKwb?lLi3XqtlqfNqXnjyyJu1I68Rcm}fxuk{z(ra1~O+0yQU zm;X?@&`GYBw!){e>Oy1fcN?pfX%zgCbSCnJ-UoDJ6+HG}m%cB`Z6;kEBBc}@oYk416etJ0DyTQr%5Bfz;6aR_6Y2wEE z;a1)vUk%w7%Exj_qCG~3pc+nqz7#BxDQdQp5@V#6x%!2Zu4I}%?`!nWL7wAQV{`C_ z4x99p#EKb>w-%J1V>7a?Sp_fUbr~BSxmrHPbQR~0hLPJa!QGLImzbX%x2sw#=+gJr z8IHU)jXug=z(~oowVzubaOANCB=B;{h11oeoSd$W`C#5DWx+1)TMz91!4Sb zC~3RsCxxTtj|@yJ9GimbASa}pgQFZ~RI*h#Q_C-PQ#pi-|LX43nyiE`7UVwCuGO`z zokTCEG@?hmb!ExwM-(I8b>}QMdI7ksQ8S*)=!std1~<}oM*KI6+jV%wjEVTt6K488 zT+$+cnWdZJv4J$p$B(tUpzyCc-z!{40W#Wb@;%GRSJKR2UyasZYb?Si+eM~%1M)Ow14wqCDff|^gAI3dwWQ;_$!@6d~Whh|85Z{#bGU*hVYZS+TK zd1M1C*!Pb9sal^)n>c+v1<<3lH#*&!5cw8I&E2u{m!$(cylfV@b6qp$i+8=dhkUtI z?;++4q302Dy@!~El|3YJ*?C@v%g5HCQVZUGW^Tb*YnQ06OLnYnV|9Ac8mSi1QvV{=Z@kMmE@nrj zoBn;We9iJAtZ#{al~?fChI@n28ta-lE!1mr+&s~1u%qv+!BKs^ zcsTQlg&|H~FE&QsJ*Bw%nGK`X8HLP~ab}+AIZ$Z2AR9+41}&YQc1HPrma`nWR{fI^ zwNXZ@HjIVg1ut#v5p1cK3Ax1TU`mF`$=tR7^r;f-myk)zk$2gO` z$knvo%r7yyoXh%9U>0aSFxYHQ)EId-@_RY?M0cU6-017v)U#Tj+)U15^mT5kFg~}) zdyy)$-jbVhi0Gs4HI=CfXK>xbT($-ngXl=rhopLwZc)KYo1W>rMXojj&zwo@=_GWi z(Z8?GGJbSpWw`oxZ$69tZR_UV9ZIy0zK}ANan8s()}sZ-Hn;2Ww?8S>3-RLxUAMGz zZJEW!);WMWwj3y3+s37i?SnDf_!CZ=spF#sFU4#dmpZoJ#BAd?ZgbT^&Mme^<2EjJ zY)4UA^0BV(S#Hj&8Mz<1ac|eQe^Tn$uGO}tHR3mtCtTZ)V{sdoI<{d-3ym#%wP~v< z;efNNTO7V#jFz&|n$q=@>Mfb$X~DIWzW9eT=UvV)Em`{Fm8!$bf6__LWkvXJNq_4ebTVw* zB@L(Y%l=0W$$~}PY7omoRk%5vp_dU^!N9)6tO9!PjLkH6uVtnM^fs%Pfs%cHdp_Xn zYPO_>W!IGKFMCe;+ewlUJo?6sB}d<=?5o}^__#WxmKNN6=mMX|UFJK-Q^4MATMJ6o z{^xh49xhpZglp<&3vM_*@HF;iEbsMo@=oWVWOIe^-0{(BaLIw=T)NLJI99V*U0ZPX zj{}=64u7X>Yb`E#>BrIj>E`u}k`q5Z=~cIuJoYmVyOdn^>vdLd-B^B`pW&l;e$l(b z)6;$j&rj$`-tE3~eD!4Gw`LT4`TMus-jQ6jikZNw;I72o%vj!S0=!dDQP(}V$9Y|c zED{NS&0P7y=zQwR*Bjdo$X_$^y{^2{$X{nj6&U%Kj=bKqOL&g%E+gk`Lq6}+v0{+} zQM^ly+^O(8?dxCE1!^J&DgH2Hb_WKw^;5y}`ax<`$&Pw%U|d)-CDP3bn)4E6q!1es zdYzBT35C2{q}qGLgm}kz`a$>)`L&V%c+2AC$6fhN;mM8UKRR-qQ6u?J?Og-fx>2f; z(nL$0 z&We2RonoIU&7_0$UT7BollM~wAM?J2tEzRz$`dWi-a@Dwh;4RiePR5SZYBxG^ zchS=OMxJqhd+E0Rs#5W=C^A3%mT$7}b7?1>pFG_=sUaTKU9}qG>Cvi(hc0NZ#g{4xbtJ ztFCIxec?~kp!>pC;8dT-*mZLB*~!E0ABOw74~<-gBEMK)+tUlc%aMl?2dTxurA*Evq#6)u)x8xh!Ps1?hTg97)zJE7SB1a1%9~T)+xqwK zZ->*=KXAn}m>?Z{8BNHt?%4QgJ?wh48j`j`je1e7Qlsh@Ce#e684~`2A2kWS&+Ch< z?7Dl>!*$_W6;R%E?Pp4O^0_8>oFjh^fA=(fJ=Ksz!mhr%&Io^V2EP)b$&C7{xcIA4 zp$`VB^(~oELsWOqu(VX>XKGq#-e8r@ybSFbtonCz2HSZ$ahh-)nfGtF_2s#~wDS=4 zj5X2GVg)sW&pE#}jGn7q>t&2KeXCn9h}!;2|6l;wP*6W}_n&)_nC%n_SQd^`SR&Ax5x zlQnUw&2n%_;s|Fwh@B+FnXH^7^fX2NLD!*U(6D}N4CSV&c0qS8o5N8-qXxLZj0OS=4WVzRt2vGw=V{pdU2oHTVm9cDWAqiu#_Lz+xb?btCG zp&MwPtM9CPT(fw%=J~Uel;`&N`s;hiW}Vc-%H03ac9CH8Hb-oK(`F`c)WE$dqt&(C zta@=bWup43GXb7-E8uKKmuY>)5zZT?0=?Kj8EjNxHjb3M7M|m~Kja;uW^~&q7n>S$ z8;k(2;HaxpIt{~YoE7EbhgevUj)uP>}P;(1T{-s4$XE8ZmaN=_Tr zt}Pp!H!ZnWYG_l28W{Q_LtWn7YyUpb#Qmjo*ahkaujQ4})fcP%gM4RT$7UE**OY!8 zRLiY%&lahlX0mR}*8HlqkTVYl2v;^VQsdcS-IeI~-V&2dLhlzNn;F{tka}K?E4^f) z`kSvsN8vt{VvX?(@u&Jj%^y`am)`lPN)99hq&p=;2B!@p&F5CAtMxKcw?ZAf;8~q! z!v$Wrxp}COY&r6A)LFOB5gK$g4V}!jx7KF|*K+rU5glnQ2=ysYU4qX<3&Ml-oh0@z zvsGKJJaQyF)4SUDZw$6Hc7)vMyK<~dfQ2mX|I~r?a}lgq^x5KzM>zT&-$ZK_F zbTu03leE#_;_9=3=&Z(28^^$@Wi-Gy)W#U-`)l;`x=4o6*N;t%zD`ANZI2i~k&nZj z+yEOJB_zll{~O~Ik}g3C^z)ZwYh$D5HNB8K*L559sUz-rO$S$hb0ht+;SR3;<|g_) z-!Uz!pB5$S8LrbEtShab@m%FTGQucX2Z;IxxRbx zvbkvMqve5DL#a=)bVgTJ-Lv|EOLRQ40vj{7EwkiDDNocdt z@8?#a1@big%*Jx$9CeKUV=PeF{!{cs7=Qs&Ae8kK4N??YtdFETt{H3|*F=XXN~S?B zLw>qbL35!WT~UvPXS(`ZO#BA@nXdkpczwyDq4Yx@{2Mv_X&OYnr=WRU3$k>Xz}g_F zJ5b-*O0>Q2xpJ)^FMmI#Khq811a!(g&HOFn=QU?#;Imh@WV!MWXvXGo<0qz1ZC=x7Pj_XA z>g!>BC~kZXa%*YEXVgD~=Tg03=<#z1M~C79#0-!-&%~Ui=hB$|OjqA&mInQquD&C0 z(C_5xJFODc59;P}0yqV(fj$Cz--xTh5I68w9IIDEYd{NK?#T5qyU|*EmMeE|p_#ST z474kv`c#aiFsPf(tZgv^3O z@vmDb*znlSc?{REro?W>u@sGut1%}A6WB{&^GMF^`H`0%_sQVxh(`cB}ezLq=sjy$UW5iQi;%(f2Bv>M?C-b$vQ zn1r4QefhNNqPB!;pH>4^Q7C1Ny2@QFII%f>M!)or^;yHiz211A5;vD)`Z}uP+%&@! z$4}%={EUw4M-~a~KSIAVvKyw()$U^9-qCCrsod8z2F}yN1_N$u8u_;bc2}>~dR05u zk;@=zyWUBtmzG}>)1T?;JN+Kj4-R5LI0jCEYrvCxRvj}39r;CWfJ4;4-Su^i71wJf zp=AWtpQ(v1o80Kpaz5iV*gbweV_GPB{9J~gzxscjWbU}+ahbYBW?3HA&zK=|bgut7 zw&nX|j2cN@*l%#y1&7Xg=$S_6n@r@+dFYu?$F-^ppUlWLw|1P1+4iy1%dAk=TDDoz zG5%U$=WNeTg6{S#=OQ;xf841x*wxQQZl3Ab*!w+w*von*boR5Hz&FVtb0TmCgRTj~fVE_nuwv3A&P~qQwEYiS z?)%J5sfpY^<d1pSfG^o@2(Z7wz;||>{8)qBd&K`)ETIGcLw?+mo5zCP zjGx_9!0-Dk%t4dsq6bMgJE#Mj0{fJ3TU}6p#1zEjzRG$wEACjgXd*xA%HM4w-(P>f z(JyHtKURNBLts+@;_`shcOX8aXaVx$PD18>@@1w5)G4kD^nKt*YCo@h z={1ezG^vr-9d0c5Rn~b;3pH;dKkCXk>@@PfzmD?3H&rUF03cR^EmtP85}PZ#I|onzp3fwC!Zy1C58i50aLgI)k(OF+y1+^3fSXWL`Ef_?eqdHFTs-KBTPK_w zgfV%n3$#4wOasTj?E>S-=>kU{odp=UUEs*0vp~z8E^y@0b>bxg6qpwM(rwX|rlprP z$Ql1UW{fTrLmCQwU*a+Xd*xM`#-fje211Zwt}uB-|@OlrX`$bfCSJ_ z|KbKw6M3wKn#g_87HTR#N<-_GM((tb<3H$&HjyqcP2>iSHj#0pXMrn^wop^K+d`2Y zwA@nDLf@G&^jUq84jkcUyqqz21M*;`en{g2mQr`nHIYXL-HImi{m%3YKiNcn%$=?e zX}OukPC^Ijx0{5x4Dv1w#uXf|ztc34bF|`No^#}qv2N2v<+f$|);$+!J?hTsHmaxh zdHs0Twm4A7c1NveHlvuH-i(5dBHM}cXx#G`^WfSnnNdZvWIB4^8;5$~a6Thr=6h7n ztQ$tpV;em^h>MIrGl*k)TJGrigGSNxrB-zMIHnkt+n#{Y>qf>$bl>`V=o(vZuW<%d zgParopUThtA9B77)5O4?zqn@f_lh=sY@c`JDGhSxFzV~w)Q>Cg6EEl60h2j&>I(GL za^I)aU)LdE#Cy>?EldkUlS|Hpdco%I~H;>6LY$Sg$CU?5Py}GS`sEM3|i`oCf2Xukyf{WuF#mO&;mrGCd%gi9UN6W3Z zoi2-$&-)+pd;cJ3{_D|rU(76)Q>CY_}P$X zWCs;6OSCV@_-|;^NKvdHFJ4|hBqm?bNPb03&LZ33C%hsice-GqlW6$KCh|r45x$;& zx^K)H?Rz-hQ6w!Ue*a=F&`E3EjIGl!WGm7 z-uq$(v4W_9UhCsmH1nAw{Us0+z{kljE&y`hhw=JNzrLg|bxnnru>|Y;>g@lB;vUZG zg1FCa`66LfFug#za@%^>c~64QJsD#kokdnhJ}IWJ1I(QQ_LMurldZcV>)qa0(Q)rL9Pf7j6WoHBNlJd|Hc3r#WEpNQ!m|MSkUu!Ja z+e@-_xRG4%cZ<#U2+TehYr7G;6HI~ci+F=@DRtg&968syk$SV_M0~E?w%*f;hyTj^ zxX-frBF=F$_8B+Zdf&8JEpeR3O3tu!R~`vgd3TuW(O%r0(EaE4MHJU(rd2Y$JDl~< z_gTcO^>*{yb!)wkjkCUeW-RvdgnG5JiF0$UVQ8|I8$T0C(tJ(Gx!#HnO})7Xy&3)r zn#=6^zWN3O^XW6&`Y7f=f4VTL=MFt{IxyYl+JElYH~s#R{xF^PDq zVf;t`XhwZPi$prOa@+dABw|x@eRGY+YtI=bNeg7vEy~ z@M^}FX)!T}@S?aTi#P`E<$|8gNaAL*IoFsLGxBJQX??fF{$moar@vp->#Oy3~iXJMw4~uP~>0eP_4WB>1iC$C2wMM$$03!z^y`AC{zr zPuFpSu}@Lj);~<J=pfAwQ(sFedQ`C$VcZ!mZnvI;P>(+dSqvt*5$zkT0 zLn#$=wk$n`3rwPKyNMdPH^?o0=j7L9FT+5e{M^Muw~%upq=nq8foKak0g&6Cc>Qpd zxf0ZCfpZBOan9J0=*LNIYnRAK=I}9U9QS!qn#SD4i+zsNwwRa<#@+PkQr|Wley0QZ zJ`FA3rWSa(D-$YyRSj+UQOer|&AV(1>-Ete*rtZMb?!o>68*u%z_!pO<*J9;Ryw;} zUG7sOLhrw)CI-)mesV*OMt<~m^o*tbM@D6;yOB*oc5X~&;nC3>6_X{!^hU>I4Yuhq zSqmA;Cq~xbkMo)S6iJZoY@yEd>`+?}j)^IDmKQv)S-p{sjmd(M8J^2LHzQ+VbU%X9 zAUi)MYr)4-wp$PJv6RbVvR25-jf}h2u5AZo1Ivu?`lwKLa%ZX5n!^G=J1SGBq4<{3 zyQ*}|2Wp5lbql_v`-<;~f9HK(e@C45`?K$mTc%upM?6|Sr_p!J z2mYaaZlrVEchLJZ^>3f!lm}y9QjaEZ?w=;mEat#1w?{S#&`^QVe`?>5V6@yx@apKd zEy%TNzj=(=k%YIfF z-sb-6`OwoGL^Yx2zpINz*D&~d`L9B`?#db1m}SB9P~Nv2=3BU8Nh`ihLAmTLo5pYezCWUa4D)vc7`E*!FY z>u}iL=h&-Rj(zDcpEaOsDF0_Qr1YL1R$IS1Sh}>2^{u5YD!skGHP`CWk)`gmp=qb5 z4I47JZJXA1k28{c@qdpqJa(JZP-LJr=oBSm!)>jDG)KqK$W*J7C-pQdq*ATcq1$*@ z`e>>()$iB4wH4 z3(I_&V~kvnZ#&Y~`;l)Pa!21di^}b{IY>3v`Z}apyN<{d??K#F|heb0K|40N@8xK2^a`7Pm`Po){DErLP%+c0Sk6+is_WvW4KGu4&o2jm!EyW3~tE-@oC1xffXLwLkIGn9~N(wox+IuEp+m-JZpRC8U7aNh*kCnxwP2`RZ+Sst!{lO+VFfp!>Ka>axM|`j zKCwWk#UyKszm18QP+C68x@N#Ak4%gl^lYIwI`Nn^g(mIp;bX)e+s{bXA6!fuHd^t+ z{O{po`~2Uot^Sm>b(uOPH1TcKqovg%EqpS~JFf14vm~Be?fwUk#(6r-{|w(>-li@<25}rH$f~hi%)n8lZZd;q}{XyYUHd ze+%Wew&Pr#@}@eaYpXNPyI@GyW~a`WI%(78L$7@6rVqm>lUnx8oRHQwL3u6Ji8w1( z-?-$GtIiFz7-O}i{iL+>LhGq!$>}ob)12AYwH$d;y3yMFw{vm@$vD63{!;gaeRtrt z(uyV4n-(9>T)E6DXxE?9PCR3{8X6c`780_T95@ynTOg#zQ{r*#zIEu!bQO7UPSpK z7UYNN-G{MxBnjp~g~;L@*eQ~q4eQ~A$fKE11a%^hWdOb(PXKft-%CXv$LSI;%!f*m zCkXJw9+9OeFWoJ&3a7&I>3jAdv!suIveG zM4n89e37RFa)Fqk1V{<;V;)c#Dg+#a_P}A0RVc4&52=s=(;*MgTZP`L3aAnJYa*n; zaL9&SSPsRo3o4;jWHoxL(OaDk=&eR?bugbFI9y!@d*HCh(*n~W4^{z=p56tOP%E4r zAO+F^M{97jCLam`KWp%_=CH^!0_`CcG9U-$!Ez{qat>rLXa&4-^%Z;^MSs7 zah1qR_;{&8ej^D|KeIh$j0fQYFygLtSSx*SGGY5(Qo%eA1-YSvz6M-Nf;P3++e^A9XkHAMF&`oe3oUPZId&Ui$yz^&+3-itNdT8j*h?{1gYDjf9m@ zC$cvk%0xa#_W5$C75P78|F;UT`8NUny;r0n5wd{y73FXk(EVa4%z+A#FY)muc3++l z`Kl-V{}qK_O#>9ZS_5UU8!AQi;c#CPqyqA2v$RR z4dpev0Y5cIpibn+k&sFM|2UPu6)2Dh)bzg;{?r=!0YQGE{HHmv1lEh37z#yDD{^v; z$j`H&LgW_``vv=7b^-5elOPoqiToOX_AnnP`z;&L`<=gdD8J+U_gaxU9M$dQ>W~2S zna)*WJqGnFVJn~U9S-FjiTc4fAhE~^zTq*8s}=qrpUQ*7Tx0MD`K-NA#dj04VLKcV zuNS!g3&90{()hwik73E>OVVVN|E$umu5H5THc{tb!sa zgIz$4Tar{uoVM%<1Z{~UdQT-{leiVCI7_DhK2JL=>hzIND5@3jTU7%3t@Gi81XY{% zqS}x^8w%T0h-yns+AfD8AZR-Q9JHGU7`595J7KS=_LQ|xgf&3m_5|)Q97w7I?>kc7 zaXM@l)u}yHi0V8PGGQ82@Fm91WYYzMF7sgttOtU0O$8ix^Fn99kgox%Zi|5OZk3{v zkSArsPEp-c0Q>IvJ0k!|fZsFFJ)>4sk90t{M=lgWB?M9K*%MIgSqyce&dh-Aup9Ql z2~o)jK;UFv_ZkN)MWwWdd9VtwP1yxFO{o>tn*@4O-a8fW*E<`gLmr^t8~xts2YX}C z8-qR=^ueGH27NH-lLPZ$ITS$|V9*EsKIr#NgcL}JY{-RtC$8vz>j}J1 z>j%5|`=Q8(9}zVIUuTa5{GKxv=D|);BNG6dk#k_TsB?!y5&b_(fb2(=iyDoy(V2kb z^bEi_eF+foJe-a3!ZuN3aWIZroS!agd?N6E0_7PAP$BAqMWQZ5ej)OUc%9i9PKdgg z*O#Dk$zf3w>qKP*w~M-Ty{OA@bU8|wQO-JS%6qVB+FF8hzl&F2MybL&LiNlou0``I|3y-UJ?ls>XCA&0CHFy0Mr&^z8KewNoR2$tODFGCiLP;s1=o;2>pOm@^fGwEQcZ} zhYF|>^=JT+U^ryKbjX8Mr2c3zFLpsC)QWm65mF!>vLP4pp%BVo4;&WtxIlYIg$&4n zd9WOcpd2coM%0o3B*AdVg6WV4tLW_|#k|-Bl~60{i9|?&bjXHW$Ol^LiE_Z{6E&ii z1|SJ=x-<)>LmsSxV%Pw4#6URltTs7h$;v`5)6kdm=1Zc z3W{MDR6?z&m5Go7>5vV%kPn4W27BPJs3!&5Ln>rI4$On)^#7AZyeNkXs1fy40Fq!h zWWjXEgH=!ryPy(kMTHU}1=1lKav>iIp$zuGVNt6D+CwU2Kn~1<<@EomB3_h31=NW8 zYXFj9IApS=-YkO~=)1M^@x{r_|k zltTs7h*}eXBp41^Fdgz>IiSl0wOX?WDxp@?Gw45q{xhkN0ojlX*gUfeieVR^{|x$T z6CnlCA&Bx?l-K4%A(X)$I4tT}f%cFJ8IS|>U^x^)IaEN6sKNjw!Enfe>5vDjpcr;R zCDe*qmk244PXDjV=0z^#Lm`yG9yl!OIf3?&3K@_C^I$m?K{-@Fji~3*eIDKCQ(!nu z0~X@vmjF}u`R%Y5So_v{fpv6!Kl*?DI9^PGS&$EfPzEHi{;;SQaQs3d;P{1f$c9`% z_k~r!BKrcmFQB^t-3{#_70}&)?gn%>pu3?E$^hLBTDMlz#zgvmV+st149J0bupEk@ z94Y{VB7sCezX<&zYWV-fD)jMLv`^F~{A{A)n}P(}M6gXYqBds&3Y+(c+CtN9Z4K0J zD`hV(67|wlAfcCV@HcEU#Z{tSA+c9*_DVji7gaJ6vH+WsGT00F*p}de&uzSabqW3d znpf0oWcC`4OXr9xON4YFSQ!q=w!;Zguan&CIe^aV1bTf96vIxafFq*bAdxp(Lkf_@ z8(A<7sN@?2d!rDx!7kV*>hJorw;hG;wW8i!FX}Cf-r5ekMZKL1b)w1>pfmJ?Oqc~r zU@Po~Bck3(fPRn(vtS8q1(JJ*T|MEwine~ko!{c8!}s5fCZ!)1s)VKKf79Zd0 z*T^fesVsyOqV{Le|NB?+qC(UG5;>3udqjPQ5;s`Xck2PgDiSzIpo0Xdre@XiMIA~6 z93LW?!;^pjhbjL)3n>47J7D{t0Ca|autd}kUf2bPMIF)qzQK{9kOPHKDe5SSM+tar zI^+S4jvW!jy$*GpfX8`XgTtCdfc(c?s1o(xIih|d*a=OMsFPDg{hSHqqJF{lmtCT2 zM*_*#qFcKXg4_5}E9%#DSR?8;6n{hEH=6M`TIKf?m?erY0jN5XNNJM9*$Gl4tfvr8u6t7~iM30aU2#lY3R)eT48Q0kTos{o^Jm0~3k zJSi2j0jEiYKoZ@(KqB37(jC1scEVw?df=x=KfqUyS%AD}XP5+KVx36>z01YwlLXlJ znFCzyS$!$!i$UK-V)YBaawr0v_ou9X4s3-wu?FCL0JRy|6Q%?9sfjQZ*24+028{#W z4_XP>4cZC&fU>~}FbQVCBKm)DAuq^o@E);-U^KKdBP!0r7LoaO( zED>vXYZwREkH{74>};{l!N*8!Mm~9H7W_P8#ND#;jmbv1N8ssbY4sYf{tDf zyMV&<1i*3n8rTapVx5-)=$%Kx=OG)D1erjPG5LV~m~z+$wPKBJ4XJ?6*y*qc3Sm1` zzzO<)Tq2O|xO6xn*7;Rpjb8#Nj^74*K+AAA0f!UNosa?3U>+=ot*{HQ&!8+L2g<~{ z0R0Pje<40D$`&gV9~UFLm{=Fn8W#ui`LP~QxVT2FOOjwD;QW$2!0{zGz68e;6M?dc zIGRY=#5F+KM3T!&fE1Vnxv&bh!9J)H>(W%1Bi3aC=v-DN*5$?Y|0Duk(H^pZM6Re6 zYcj7V7m0NxPOqE_i-1J36M@&+d&RnnU{_@W@2|qqRRo$s@>8Y($xT@UBrs*SSXbx3 z5+LZ+m10c|z&POiZ%y6Kiz>0M$$)&=Db}@KK;c>puImTu#mean$Z}@EN+<_{UXQcu zdqSpIH;feP#;syan=aN(DS+>rNtRm`*7Vk}T&x-RnK2(oWM&@ye=7lQrGT5g)~rG} zEY@xLV%?6z+j)Qc9eJ8}af1X(L17bap z03`CjHbDO1P{8)VBB-OE`@vMm7b`Cbh>=Hm`#ddJ4@bmW&>GlaL;~AO|66X|=4pAB z$mE-5-!jW<$E?S#CDs$xQfryD+*%=D$v*j7D&-6LHnjPW^<}yh@rXxx zERVCVGeM?1^zWB0ZD+5K()kq|r89%K);huA~yv+QAZnmybeVV}*v{fk{||7!nc|8CdW z^|D(2D#z`x9pN7|;$sN%g5M*5@q7I~J_F(R2mH-sO=wSz)pew7^mp)g^mp=i_IL4j z^>_0p`Mdki;4iuL^q=WZ_V@Cq_xc@q z{Yhv1dg$z*tj(drKUpbfOS!xgSRZ&HupzK9P!!k{*c{jr*cx~-@KWG!f#Sf+fmZ@0 zfo*|T1Fr>217(5N18)TW9@rjuGw@bv+Y{C&9+g`9%`ety{%~Zd?QhnE4(I#l-aaFB z(75r=@AFgL--Al8{mnY0PCL)MA3S)B`+IC?e4W(|FW1&tGfr(b%!r4MNDGxW^W4(R zu^u{RP-#+g&oBOF!*%hX^HWEJ5>NM}ImLs{A2g^m{dCU+Pr#@TI)6-Qu#Ly=Jaq8+ ogN(u8^9P%>#t$2NmUb|H{P+>>Z<7x1O*;G@Tl(lA&qDA20|JgAPyhe` delta 24923 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 diff --git a/src/MacVim/dejavu-ttf-2.20/DejaVuSansMono-Oblique.ttf b/src/MacVim/dejavu-ttf/DejaVuSansMono-Oblique.ttf similarity index 72% rename from src/MacVim/dejavu-ttf-2.20/DejaVuSansMono-Oblique.ttf rename to src/MacVim/dejavu-ttf/DejaVuSansMono-Oblique.ttf index 8ce54344f2094e1848b50a356a900555e755db82..f36420f85c3c88267a1984c2c2782ed394a405e2 100644 GIT binary patch delta 26977 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�< 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 delta 26474 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 hn6>p;2lla24+#X~PmMu~tJMA-Nv%Dei z@p99>@~%8+50O{wbom=E!@VtkwTIcm?Gg4!dz3xe&alt6&#}+7$Jk@-arSw3rhUGB zL9kz(XFPk7;Ji4`X~9S1JYUX`68oT(+4c4}_96RQ`#bx4`!Ih~bB+AR{=q(C|Hp2y zf0XC#pX3SqXZxsq%>Kpx)ozrv_HXua`**v^Zsxxd5#~P*qkNXnURsYu}eBFILd_CncUoT&pueYp{)xk#F)7|!^`-b|4RiycNlg^TD!S-z^ z*|0XA4PL2~cYfDA20v_ diff --git a/src/MacVim/dejavu-ttf-2.20/DejaVuSansMono.ttf b/src/MacVim/dejavu-ttf/DejaVuSansMono.ttf similarity index 72% rename from src/MacVim/dejavu-ttf-2.20/DejaVuSansMono.ttf rename to src/MacVim/dejavu-ttf/DejaVuSansMono.ttf index 2346ad45611b2fdea83b98f320f9589b1dbe492c..72065d74136b55bebe8dc2619a5b8bc868444355 100644 GIT binary patch delta 41945 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 delta 37793 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 Dv0|Kv diff --git a/src/MacVim/dejavu-ttf-2.20/LICENSE b/src/MacVim/dejavu-ttf/LICENSE similarity index 97% rename from src/MacVim/dejavu-ttf-2.20/LICENSE rename to src/MacVim/dejavu-ttf/LICENSE index 635e609c8e..254e2cc42a 100644 --- a/src/MacVim/dejavu-ttf-2.20/LICENSE +++ b/src/MacVim/dejavu-ttf/LICENSE @@ -1,4 +1,5 @@ -Fonts are (c) Bitstream (see below). DejaVu changes are in public domain. Glyphs imported from Arev fonts are (c) Tavmjung Bah (see below) +Fonts are (c) Bitstream (see below). DejaVu changes are in public domain. +Glyphs imported from Arev fonts are (c) Tavmjong Bah (see below) Bitstream Vera Fonts Copyright ------------------------------ @@ -95,4 +96,4 @@ dealings in this Font Software without prior written authorization from Tavmjong Bah. For further information, contact: tavmjong @ free . fr. -$Id: LICENSE 778 2006-04-20 18:14:24Z moyogo $ +$Id: LICENSE 2133 2007-11-28 02:46:28Z lechimp $ diff --git a/src/MacVim/dejavu-ttf-2.20/NEWS b/src/MacVim/dejavu-ttf/NEWS similarity index 87% rename from src/MacVim/dejavu-ttf-2.20/NEWS rename to src/MacVim/dejavu-ttf/NEWS index 6e3ba2521d..174b0f88c2 100644 --- a/src/MacVim/dejavu-ttf-2.20/NEWS +++ b/src/MacVim/dejavu-ttf/NEWS @@ -1,3 +1,124 @@ +Changes from 2.24 to 2.25 +- moved/added U+2E18 (by Gee Fung Sit) +- added empty glyph for U+2064 in Sans and Serif (by Gee Fung Sit) +- added U+22CE-U+22CF to Sans (by Gee Fung Sit) +- Sans Oblique and Bold Oblique, Serif: reverted digits hinting instructions back to before revision 1590, which fixed mistaken debian bug #471024. This fixes Debian bug #411308. The original bug was in freetype not in the fonts (by Denis Jacquerye) +- added U+A726-U+A729, U+A730-U+A733, U+A738-U+A73F, U+A746-U+A74B, U+A74E-U+A74F, U+A780-U+A781, U+A7FB-U+A7FF to Sans (by Gee Fung Sit) +- added Macedonian italic glyph shape for U+0453 in Serif (by Ben Laenen) +- changed descenders in U+0446, U+0449, U+0497, U+04A3, U+04AD (by Andrey V. Panov) +- updated main SFD files to SplineFontDB 3.0 (Denis Jacquerye and Gee Fung Sit) +- moved U+0561 2 up since it wasn't aligned with the baseline well (by Ben Laenen) +- added U+2E2E to Sans (by Gee Fung Sit) +- replaced U+2699 with simpler version in Sans (by Gee Fung Sit) +- added a lot of hinting instructions to Latin Extended B, Greek and Coptic glyphs Sans Book (by Wesley Transue) +- differentiated U+2219 from U+22C5 and adjusted affected references in Sans and Mono (by Gee Fung Sit) +- made Hebrew narrower in Sans Bold and Sans Bold Oblique (by Denis Jacquerye) +- added Kurdish and Chuvash letters from Unicode 5.1 Cyrillic Extended block (by Wesley Transue) +- added U+1E9F, U+A644-U+A647, U+A64C-U+A64D, U+A650-U+A651, U+A654-U+A655, U+A712U+A716 to Sans (by Gee Fung Sit) +- added several glyphs to Sans ExtraLight (by Gee Fung Sit) +- added hinting instructions to U+046A-U+046B, U+0508-U+0509, U+050B, U+0512-U+0513 in Sans Book (by Wesley Transue) +- corrected width of U+027E in Sans Book (by Gee Fung Sit) +- added U+2C79, U+2C7B-U+2C7D to Sans (by Gee Fung Sit) +- added a bunch of glyphs+small corrections to Sans Light (by Gee Fung Sit) +- added U+0496, U+0497, U+04B0, U+04B1 (by Andrey V. Panov) +- updated U+0493, U+049B, U+04B3, U+04B7, U+04F7 (by Andrey V. Panov) +- further improvements in extended Cyrillic (by Andrey V. Panov) + +Changes from 2.23 to 2.24 +- instructions for U+05C0 ×€, U+05C3 ׃, U+05F3 ׳, and U+05F4 ×´ in DejaVu + Sans. (by Wesley Transue) +- instructions for U+2116 in Sans (by Andrey V. Panov) +- Unicode 5.1 update: moved U+F208 to U+2C6D, U+F25F to U+2C71, added + U+2C6E-U+2C6F, U+2C72-U+2C73, updated outline of U+2C71 in Sans. (by + Denis Jacquerye) +- updated and instructed U+0401 in Sans (by Andrey V. Panov) +- fixed the bug in Sans faces where U+02EC ˬ faced the wrong direction. + Also, added a few more glyph instructions. (by Wesley Transue) +- removed OS2Sub and OS2Strike that weren't intentional in Sans + ExtraLight. (by Denis Jacquerye) +- updated instructions for U+401, U+44F in Serif Book. (by Andrey V. + Panov) +- instructions for U+02C4 Ë„, U+02C5 Ë…, U+03D8 Ϙ, U+03D9 Ï™, U+0494 Ò”, and + U+0495 Ò• in Sans Book. (by Wesley Transue) +- instructions for U+01A6 Ʀ, U+0238 ȸ, U+0239 ȹ, U+02EC ˬ, and U+05C6 ׆ + in Sans Book. (by Wesley Transue) +- DejaVuSans.sfd DejaVuSerif.sfd: updated instructions for U+447 and + U+451 using code generated with xgridfit (by Andrey V. Panov) +- instructions for a few glyphs in the Latin Extended-B Block, Greek + Block, Cyrillic Block, and N'Ko block. (by Wesley Transue) +- updated sfdnormalize.pl, and SFD files to new SFD format with empty + lines. (by Denis Jacquerye) + +Changes from 2.22 to 2.23 + +- fixed bug which made Condensed fonts appear instead of normal width ones +- added U+20DB, U+20DC, and U+20E1 to Sans (by Roozbeh Pournader) +- added hinting instructions to U+01A7, U+01AA-U+01AC, U+01AE-U+01AF, + U+01BC-U+01BD, U+01BF, U+01F7, U+0277, U+027F, U+0285-U+0286, U+0297, U+02AF, + U+02B4-U+02B5, U+02BD, U+030D, U+0311, U+0329, U+04A0-U+04A1 in Sans Book (by + Wesley Transue) +- modified hinting instructions of U+04A2 in Sans Book (by Wesley Transue) +- added hinting instructions to U+237D, U+2423 in Mono Book and Mono Bold (by + Wesley Transue) +- added mathematical alphanumeric symbols to all styles (by Max Berger) +- added Unicode 5.1 U+2E18 as U+2E18.u51 (not yet usable) to Sans (by Roozbeh + Pournader) +- dereferenced all glyphs with mixed references and outlines (by Denis + Jacquerye) +- removed non-zero width from U+0344 in Sans (by Denis Jacquerye) + +Changes from 2.21 to 2.22 + +- directory structure has changed, we now use the Makefile +- modified Armenian U+0565 in Sans (by ÕÕ¡Õ°Õ¡Õ¯ ÕŠÕ¥Õ¿Ö€Õ¸Õ½ÕµÕ¡Õ¶) +- added double struck letters and numbers U+2102, U+210D, U+2115, + U+2119-U+211A, U+211D, U+2124, U+213C-U+2140, U+2145-U+2149, U+1D538-U+1D539, + U+1D53B-U+1D53E, U+1D540-U+1D544, U+1D546, U+1D54A-U+1D550, U+1D552-U+1D56B, + U+1D7D8-U+1D7E1 to Serif (by Stephen Hartke) +- added letterlike symbols U+2103, U+2109, U+2127, U+214B, U+2141-U+2144 to + Serif (by Ben Laenen) +- fixed outline direction of U+2143 in Sans Bold/Bold Oblique (by Ben Laenen) +- added arrow set in Serif: arrows: U+2194-U+21FF; dingbats: U+27A1; + supplemental arrows A: U+27F0-U+27FF; supplemental arrows B: U+2900-U+2975, + U+297A; miscellaneous symbols and arrows: U+2B00-U+2B11 (by Ben Laenen) +- added U+0180, U+01DE, U+01E0-01E1, U+022A, U+022C, U+0230, U+1E08-U+1E09, + U+1E10-U+1E11, U+1EB0-U+1EB1 to Mono (by Denis Jacquerye) +- adjusted U+01D5, U+01D7, U+01D9, U+1DB in Mono (by Denis Jacquerye) +- added Ogham in Sans (by Wesley Transue) +- added Yijing Hexagram Symbols in Sans (by Wesley Transue) +- hinting instructions added to Cyrillic U+0460, U+04A6-U+04A7, U+04AC-U+04AD, + U+04C7-U+04C8, U+04F6-U+04F7, U+04FA-U+04FB, U+050C-U+050D in Sans Book (by + Wesley Transue) +- adjusted Cyrillic letters U+042A, U+044A, U+044C, U+0459-U+045B, U+0462, + U+048C-U+048D in Serif (by Andrey V. Panov) +- hinting instructions added to Lao U+0EB7 in Sans (by Wesley Transue) +- added Roman numerals and Claudian letter U+2160-U+2184 in Serif (by Ben + Laenen) +- added U+FFF9-U+FFFD to Sans, Serif and Mono (by Lars Næsbye Christensen) +- added mathematical symbols to Serif: U+2200, U+2203-U+2204, U+2213-U+2214, + U+2217-U+2218, U+2223-U+2226, U+2250-U+2255, U+2295-U+22AF, U+22C5 (by Ben + Laenen) +- modified bullet symbol U+2219 in Serif (by Ben Laenen) + +Changes from 2.20 to 2.21 + +- added U+FE20-U+FE23 (half diacritics) to Sans (by Denis Jacquerye) +- added anchor "half" to position right half of double marks, U+FE21 or U+FE23 + to Sans (by Denis Jacquerye) +- shifted U+0360 up to avoid collision with some outlines in Sans (by Denis + Jacquerye) +- added anchor above-mark anchor to U+035D, U+035E, U+0360, U+0361 in Sans (by + Denis Jacquerye) +- added instructions for ff, ffi, ffl ligatures in Serif Bold (by Eugeniy + Meshcheryakov) +- added instructions to some N'Ko glyphs (by Wesley Transue) +- added instructions to some Lao glyphs (by Wesley Transue) +- cleaning up 'liga' Standard Ligature in Latin, in Sans and Sans Mono (by + Denis Jacquerye) +- added U+046A, U+046B (big yus) in Serif (by Andrey V. Panov) +- added box drawing symbols to Sans and Serif (by Lars Næsbye Christensen) +- added Makefile to improve font and packages generating (by Nicolas Mailhot) + Changes from 2.19 to 2.20 - removed TeX and TeXData tags from all sfd files (by Eugeniy Meshcheryakov) @@ -931,4 +1052,4 @@ Changes from 0.9 to 0.9.1: - proper caron shape for dcaron and tcaron - minor visual changes -$Id: NEWS 1998 2007-09-16 14:23:46Z ben_laenen $ +$Id: NEWS 2227 2008-05-19 06:41:46Z moyogo $ diff --git a/src/MacVim/dejavu-ttf-2.20/README b/src/MacVim/dejavu-ttf/README similarity index 70% rename from src/MacVim/dejavu-ttf-2.20/README rename to src/MacVim/dejavu-ttf/README index 494129e956..d6055a7e10 100644 --- a/src/MacVim/dejavu-ttf-2.20/README +++ b/src/MacVim/dejavu-ttf/README @@ -1,4 +1,4 @@ -DejaVu fonts 2.20 (c)2004-2007 DejaVu fonts team +DejaVu fonts 2.24 (c)2004-2008 DejaVu fonts team ------------------------------------------------ The DejaVu fonts are a font family based on the Bitstream Vera Fonts @@ -46,14 +46,14 @@ For more information go to http://dejavu.sourceforge.net/. Characters from Arev fonts, Copyright (c) 2006 by Tavmjong Bah: --------------------------- -U+01ba, U+01bf, U+01f7, U+021c, U+021d, U+0220, U+0222, U+0223, -U+02b9, U+02ba, U+02bd, U+02c2, U+02c3, U+02c4, U+02c5, U+02d4, -U+02d5, U+02d7, U+02ec, U+02ed, U+02ee, U+0346-034e, U+0360, U+0362, -U+03e2-03ef, U+0460-0463, U+0466-0486, U+0488-0489, U+04a8-04a9, -U+0500-050f, U+2055-205e, U+20B0, U+20B2-20B3, U+2102, U+210D, U+210f, -U+2111, U+2113, U+2115, U+2118-U+211A, U+211c-211d, U+2124,U+2135, -U+213C-U+2140, U+2295-2298, U+2308-230b, U+26A2-U+26B1, U+2701-2704, -U+2706-2709, U+270c-274b, U+2758-275a, U+2761-2775, U+2780-2794, -U+2798-27af, U+27b1-27be, U+fb05-fb06 - -$Id: README 1998 2007-09-16 14:23:46Z ben_laenen $ +U+01BA, U+01BF, U+01F7, U+021C-U+021D, U+0220, U+0222-U+0223, +U+02B9, U+02BA, U+02BD, U+02C2-U+02C5, U+02d4-U+02D5, +U+02D7, U+02EC-U+02EE, U+0346-U+034E, U+0360, U+0362, +U+03E2-03EF, U+0460-0463, U+0466-U+0486, U+0488-U+0489, U+04A8-U+04A9, +U+0500-U+050F, U+2055-205E, U+20B0, U+20B2-U+20B3, U+2102, U+210D, U+210F, +U+2111, U+2113, U+2115, U+2118-U+211A, U+211C-U+211D, U+2124, U+2135, +U+213C-U+2140, U+2295-U+2298, U+2308-U+230B, U+26A2-U+26B1, U+2701-U+2704, +U+2706-U+2709, U+270C-U+274B, U+2758-U+275A, U+2761-U+2775, U+2780-U+2794, +U+2798-U+27AF, U+27B1-U+27BE, U+FB05-U+FB06 + +$Id: README 2192 2008-03-09 21:25:29Z moyogo $ diff --git a/src/MacVim/dejavu-ttf-2.20/langcover.txt b/src/MacVim/dejavu-ttf/langcover.txt similarity index 88% rename from src/MacVim/dejavu-ttf-2.20/langcover.txt rename to src/MacVim/dejavu-ttf/langcover.txt index 1f3ba77d38..46ea2475a4 100644 --- a/src/MacVim/dejavu-ttf-2.20/langcover.txt +++ b/src/MacVim/dejavu-ttf/langcover.txt @@ -7,6 +7,7 @@ ab Abkhazia 100% (90/90) 93% (84/90) af Afrikaans 100% (69/69) 100% (69/69) 100% (69/69) am Amharic (0/264) (0/264) (0/264) ar Arabic 100% (125/125) (0/125) 100% (125/125) +as (0/89) (0/89) (0/89) ast Asturian 100% (72/72) 100% (72/72) 100% (72/72) ava Avaric 100% (67/67) 100% (67/67) 100% (67/67) ay Aymara 100% (60/60) 100% (60/60) 100% (60/60) @@ -30,25 +31,25 @@ ce Chechen 100% (67/67) 100% (67/67) ch Chamorro 100% (58/58) 100% (58/58) 100% (58/58) chm Mari (Lower Cheremis / Upper Cheremis) 100% (76/76) 100% (76/76) 97% (74/76) chr Cherokee (0/85) (0/85) (0/85) -co Corsican 100% (84/84) 100% (84/84) 100% (84/84) +co Corsican 100% (85/85) 100% (85/85) 100% (85/85) cs Czech 100% (82/82) 100% (82/82) 100% (82/82) -cu Old Church Slavonic 100% (103/103) 82% (85/103) 74% (77/103) +cu Old Church Slavonic 100% (103/103) 84% (87/103) 74% (77/103) cv Chuvash 100% (74/74) 100% (74/74) 100% (74/74) cy Welsh 100% (78/78) 100% (78/78) 100% (78/78) da Danish 100% (70/70) 100% (70/70) 100% (70/70) -de German 100% (59/59) 100% (59/59) 100% (59/59) +de German 100% (60/60) 100% (60/60) 100% (60/60) dz Dzongkha (0/95) (0/95) (0/95) -el Greek 100% (69/69) 100% (69/69) 100% (69/69) -en English 100% (72/72) 100% (72/72) 100% (72/72) +el Greek 100% (70/70) 100% (70/70) 100% (70/70) +en English 100% (73/73) 100% (73/73) 100% (73/73) eo Esperanto 100% (64/64) 100% (64/64) 100% (64/64) -es Spanish 100% (66/66) 100% (66/66) 100% (66/66) +es Spanish 100% (67/67) 100% (67/67) 100% (67/67) et Estonian 100% (64/64) 100% (64/64) 100% (64/64) eu Basque 100% (56/56) 100% (56/56) 100% (56/56) fa Persian 100% (129/129) (0/129) 100% (129/129) -fi Finnish 100% (62/62) 100% (62/62) 100% (62/62) +fi Finnish 100% (63/63) 100% (63/63) 100% (63/63) fj Fijian 100% (52/52) 100% (52/52) 100% (52/52) fo Faroese 100% (68/68) 100% (68/68) 100% (68/68) -fr French 100% (84/84) 100% (84/84) 100% (84/84) +fr French 100% (85/85) 100% (85/85) 100% (85/85) ful Fulah (Fula) 100% (62/62) 100% (62/62) 100% (62/62) fur Friulian 100% (66/66) 100% (66/66) 100% (66/66) fy Frisian 100% (75/75) 100% (75/75) 100% (75/75) @@ -74,10 +75,10 @@ ie Interlingue 100% (52/52) 100% (52/52) ik Inupiaq (Inupiak, Eskimo) 100% (68/68) 100% (68/68) 100% (68/68) io Ido 100% (52/52) 100% (52/52) 100% (52/52) is Icelandic 100% (70/70) 100% (70/70) 100% (70/70) -it Italian 100% (72/72) 100% (72/72) 100% (72/72) +it Italian 100% (73/73) 100% (73/73) 100% (73/73) iu Inuktitut 100% (161/161) (0/161) (0/161) ja Japanese (0/6538) (0/6538) (0/6538) -ka Georgian 100% (34/34) 100% (34/34) 100% (34/34) +ka Georgian 100% (33/33) 100% (33/33) 100% (33/33) kaa Kara-Kalpak (Karakalpak) 100% (78/78) 100% (78/78) 100% (78/78) ki Kikuyu 100% (56/56) 100% (56/56) 100% (56/56) kk Kazakh 100% (77/77) 100% (77/77) 100% (77/77) @@ -96,6 +97,7 @@ ky Kirgiz 100% (70/70) 100% (70/70) la Latin 100% (68/68) 100% (68/68) 100% (68/68) lb Luxembourgish (Letzeburgesch) 100% (75/75) 100% (75/75) 100% (75/75) lez Lezghian (Lezgian) 100% (67/67) 100% (67/67) 100% (67/67) +ln Lingala 100% (81/81) 100% (81/81) 100% (81/81) lo Lao 100% (65/65) (0/65) 70% (46/65) lt Lithuanian 100% (70/70) 100% (70/70) 100% (70/70) lv Latvian 100% (78/78) 100% (78/78) 100% (78/78) @@ -112,9 +114,11 @@ my Burmese (Myanmar) (0/48) (0/48) nb Norwegian Bokmal 100% (70/70) 100% (70/70) 100% (70/70) nds Low Saxon 100% (59/59) 100% (59/59) 100% (59/59) ne Nepali (Devanagari script) (0/68) (0/68) (0/68) -nl Dutch 100% (82/82) 100% (82/82) 100% (82/82) +nl Dutch 100% (83/83) 100% (83/83) 100% (83/83) nn Norwegian Nynorsk 100% (76/76) 100% (76/76) 100% (76/76) no Norwegian (Bokmal) 100% (70/70) 100% (70/70) 100% (70/70) +nr Ndebele, South 100% (52/52) 100% (52/52) 100% (52/52) +nso Northern Sotho 100% (58/58) 100% (58/58) 100% (58/58) ny Chichewa 100% (54/54) 100% (54/54) 100% (54/54) oc Occitan 100% (70/70) 100% (70/70) 100% (70/70) om Oromo or Galla 100% (52/52) 100% (52/52) 100% (52/52) @@ -124,7 +128,7 @@ pa Punjabi (Gurumukhi script) (0/63) (0/63) pl Polish 100% (70/70) 100% (70/70) 100% (70/70) ps-af Pashto in Afghanistan 83% (41/49) (0/49) 83% (41/49) ps-pk Pashto in Pakistan 81% (40/49) (0/49) 81% (40/49) -pt Portuguese 100% (82/82) 100% (82/82) 100% (82/82) +pt Portuguese 100% (83/83) 100% (83/83) 100% (83/83) rm Rhaeto-Romance (Romansch) 100% (66/66) 100% (66/66) 100% (66/66) ro Romanian 100% (62/62) 100% (62/62) 100% (62/62) ru Russian 100% (66/66) 100% (66/66) 100% (66/66) @@ -145,6 +149,8 @@ sms Skolt Sami 100% (80/80) 100% (80/80) so Somali 100% (52/52) 100% (52/52) 100% (52/52) sq Albanian 100% (56/56) 100% (56/56) 100% (56/56) sr Serbian 100% (76/76) 100% (76/76) 100% (76/76) +ss Swati 100% (52/52) 100% (52/52) 100% (52/52) +st Sotho, Southern 100% (52/52) 100% (52/52) 100% (52/52) sv Swedish 100% (68/68) 100% (68/68) 100% (68/68) sw Swahili 100% (52/52) 100% (52/52) 100% (52/52) syr Syriac (0/45) (0/45) (0/45) @@ -152,16 +158,16 @@ ta Tamil (0/48) (0/48) te Telugu (0/80) (0/80) (0/80) tg Tajik 100% (78/78) 100% (78/78) 97% (76/78) th Thai 1% (1/87) (0/87) (0/87) -ti-er Eritrean Tigrinya (0/256) (0/256) (0/256) -ti-et Ethiopian Tigrinya (0/282) (0/282) (0/282) +ti-er Eritrean Tigrinya (0/255) (0/255) (0/255) +ti-et Ethiopian Tigrinya (0/281) (0/281) (0/281) tig Tigre (0/221) (0/221) (0/221) -tk Turkmen 100% (74/74) 100% (74/74) 97% (72/74) +tk Turkmen 100% (74/74) 100% (74/74) 100% (74/74) tl Tagalog (0/19) (0/19) (0/19) -tn Tswana 100% (56/56) 100% (56/56) 100% (56/56) +tn Tswana 100% (58/58) 100% (58/58) 100% (58/58) to Tonga 100% (53/53) 100% (53/53) 100% (53/53) tr Turkish 100% (70/70) 100% (70/70) 100% (70/70) ts Tsonga 100% (52/52) 100% (52/52) 100% (52/52) -tt Tatar 100% (76/76) 100% (76/76) 97% (74/76) +tt Tatar 100% (76/76) 100% (76/76) 100% (76/76) tw Twi 100% (73/73) 100% (73/73) 100% (73/73) tyv Tuvinian 100% (70/70) 100% (70/70) 100% (70/70) ug Uighur 100% (125/125) (0/125) 100% (125/125) @@ -169,7 +175,7 @@ uk Ukrainian 100% (72/72) 100% (72/72) ur Urdu 94% (137/145) (0/145) 97% (141/145) uz Uzbek 100% (68/68) 100% (68/68) 100% (68/68) ven Venda 100% (62/62) 100% (62/62) 100% (62/62) -vi Vietnamese 100% (194/194) 77% (150/194) 62% (122/194) +vi Vietnamese 100% (194/194) 77% (150/194) 63% (124/194) vo Volapuk 100% (54/54) 100% (54/54) 100% (54/54) vot Votic 100% (62/62) 100% (62/62) 100% (62/62) wa Walloon 100% (70/70) 100% (70/70) 100% (70/70) @@ -181,7 +187,7 @@ yi Yiddish 100% (27/27) (0/27) yo Yoruba 100% (119/119) 100% (119/119) 100% (119/119) zh-cn Chinese (simplified) 0% (2/6765) 0% (2/6765) 0% (2/6765) zh-hk Chinese Hong Kong Supplementary Character Set (0/2213) (0/2213) (0/2213) -zh-mo Chinese in Macau (0/13063) (0/13063) (0/13063) +zh-mo Chinese in Macau (0/2213) (0/2213) (0/2213) zh-sg Chinese in Singapore 0% (2/6765) 0% (2/6765) 0% (2/6765) zh-tw Chinese (traditional) (0/13063) (0/13063) (0/13063) zu Zulu 100% (52/52) 100% (52/52) 100% (52/52) diff --git a/src/MacVim/dejavu-ttf/status.txt b/src/MacVim/dejavu-ttf/status.txt new file mode 100644 index 0000000000..0ee0488aba --- /dev/null +++ b/src/MacVim/dejavu-ttf/status.txt @@ -0,0 +1,6038 @@ +U+0020 space 2.25 +U+0021 exclam 2.25 +U+0022 quotedbl 2.25 +U+0023 numbersign 2.25 +U+0024 dollar 2.25 +U+0025 percent 2.25 +U+0026 ampersand 2.25 +U+0027 quotesingle 2.25 +U+0028 parenleft 2.25 +U+0029 parenright 2.25 +U+002a asterisk 2.25 +U+002b plus 2.25 +U+002c comma 2.25 +U+002d hyphen 2.25 +U+002e period 2.25 +U+002f slash 2.25 +U+0030 zero 2.25 +U+0031 one 2.25 +U+0032 two 2.25 +U+0033 three 2.25 +U+0034 four 2.25 +U+0035 five 2.25 +U+0036 six 2.25 +U+0037 seven 2.25 +U+0038 eight 2.25 +U+0039 nine 2.25 +U+003a colon 2.25 +U+003b semicolon 2.25 +U+003c less 2.25 +U+003d equal 2.25 +U+003e greater 2.25 +U+003f question 2.25 +U+0040 at 2.25 +U+0041 A 2.25 +U+0042 B 2.25 +U+0043 C 2.25 +U+0044 D 2.25 +U+0045 E 2.25 +U+0046 F 2.25 +U+0047 G 2.25 +U+0048 H 2.25 +U+0049 I 2.25 +U+004a J 2.25 +U+004b K 2.25 +U+004c L 2.25 +U+004d M 2.25 +U+004e N 2.25 +U+004f O 2.25 +U+0050 P 2.25 +U+0051 Q 2.25 +U+0052 R 2.25 +U+0053 S 2.25 +U+0054 T 2.25 +U+0055 U 2.25 +U+0056 V 2.25 +U+0057 W 2.25 +U+0058 X 2.25 +U+0059 Y 2.25 +U+005a Z 2.25 +U+005b bracketleft 2.25 +U+005c backslash 2.25 +U+005d bracketright 2.25 +U+005e asciicircum 2.25 +U+005f underscore 2.25 +U+0060 grave 2.25 +U+0061 a 2.25 +U+0062 b 2.25 +U+0063 c 2.25 +U+0064 d 2.25 +U+0065 e 2.25 +U+0066 f 2.25 +U+0067 g 2.25 +U+0068 h 2.25 +U+0069 i 2.25 +U+006a j 2.25 +U+006b k 2.25 +U+006c l 2.25 +U+006d m 2.25 +U+006e n 2.25 +U+006f o 2.25 +U+0070 p 2.25 +U+0071 q 2.25 +U+0072 r 2.25 +U+0073 s 2.25 +U+0074 t 2.25 +U+0075 u 2.25 +U+0076 v 2.25 +U+0077 w 2.25 +U+0078 x 2.25 +U+0079 y 2.25 +U+007a z 2.25 +U+007b braceleft 2.25 +U+007c bar 2.25 +U+007d braceright 2.25 +U+007e asciitilde 2.25 +U+00a0 nonbreakingspace 2.25 +U+00a1 exclamdown 2.25 +U+00a2 cent 2.25 +U+00a3 sterling 2.25 +U+00a4 currency 2.25 +U+00a5 yen 2.25 +U+00a6 brokenbar 2.25 +U+00a7 section 2.25 +U+00a8 dieresis 2.25 +U+00a9 copyright 2.25 +U+00aa ordfeminine 2.25 +U+00ab guillemotleft 2.25 +U+00ac logicalnot 2.25 +U+00ad sfthyphen 2.25 +U+00ae registered 2.25 +U+00af macron 2.25 +U+00b0 degree 2.25 +U+00b1 plusminus 2.25 +U+00b2 twosuperior 2.25 +U+00b3 threesuperior 2.25 +U+00b4 acute 2.25 +U+00b5 mu 2.25 +U+00b6 paragraph 2.25 +U+00b7 periodcentered 2.25 +U+00b8 cedilla 2.25 +U+00b9 onesuperior 2.25 +U+00ba ordmasculine 2.25 +U+00bb guillemotright 2.25 +U+00bc onequarter 2.25 +U+00bd onehalf 2.25 +U+00be threequarters 2.25 +U+00bf questiondown 2.25 +U+00c0 Agrave 2.25 +U+00c1 Aacute 2.25 +U+00c2 Acircumflex 2.25 +U+00c3 Atilde 2.25 +U+00c4 Adieresis 2.25 +U+00c5 Aring 2.25 +U+00c6 AE 2.25 +U+00c7 Ccedilla 2.25 +U+00c8 Egrave 2.25 +U+00c9 Eacute 2.25 +U+00ca Ecircumflex 2.25 +U+00cb Edieresis 2.25 +U+00cc Igrave 2.25 +U+00cd Iacute 2.25 +U+00ce Icircumflex 2.25 +U+00cf Idieresis 2.25 +U+00d0 Eth 2.25 +U+00d1 Ntilde 2.25 +U+00d2 Ograve 2.25 +U+00d3 Oacute 2.25 +U+00d4 Ocircumflex 2.25 +U+00d5 Otilde 2.25 +U+00d6 Odieresis 2.25 +U+00d7 multiply 2.25 +U+00d8 Oslash 2.25 +U+00d9 Ugrave 2.25 +U+00da Uacute 2.25 +U+00db Ucircumflex 2.25 +U+00dc Udieresis 2.25 +U+00dd Yacute 2.25 +U+00de Thorn 2.25 +U+00df germandbls 2.25 +U+00e0 agrave 2.25 +U+00e1 aacute 2.25 +U+00e2 acircumflex 2.25 +U+00e3 atilde 2.25 +U+00e4 adieresis 2.25 +U+00e5 aring 2.25 +U+00e6 ae 2.25 +U+00e7 ccedilla 2.25 +U+00e8 egrave 2.25 +U+00e9 eacute 2.25 +U+00ea ecircumflex 2.25 +U+00eb edieresis 2.25 +U+00ec igrave 2.25 +U+00ed iacute 2.25 +U+00ee icircumflex 2.25 +U+00ef idieresis 2.25 +U+00f0 eth 2.25 +U+00f1 ntilde 2.25 +U+00f2 ograve 2.25 +U+00f3 oacute 2.25 +U+00f4 ocircumflex 2.25 +U+00f5 otilde 2.25 +U+00f6 odieresis 2.25 +U+00f7 divide 2.25 +U+00f8 oslash 2.25 +U+00f9 ugrave 2.25 +U+00fa uacute 2.25 +U+00fb ucircumflex 2.25 +U+00fc udieresis 2.25 +U+00fd yacute 2.25 +U+00fe thorn 2.25 +U+00ff ydieresis 2.25 +U+0100 Amacron 2.25 +U+0101 amacron 2.25 +U+0102 Abreve 2.25 +U+0103 abreve 2.25 +U+0104 Aogonek 2.25 +U+0105 aogonek 2.25 +U+0106 Cacute 2.25 +U+0107 cacute 2.25 +U+0108 Ccircumflex 2.25 +U+0109 ccircumflex 2.25 +U+010a Cdotaccent 2.25 +U+010b cdotaccent 2.25 +U+010c Ccaron 2.25 +U+010d ccaron 2.25 +U+010e Dcaron 2.25 +U+010f dcaron 2.25 +U+0110 Dcroat 2.25 +U+0111 dcroat 2.25 +U+0112 Emacron 2.25 +U+0113 emacron 2.25 +U+0114 Ebreve 2.25 +U+0115 ebreve 2.25 +U+0116 Edotaccent 2.25 +U+0117 edotaccent 2.25 +U+0118 Eogonek 2.25 +U+0119 eogonek 2.25 +U+011a Ecaron 2.25 +U+011b ecaron 2.25 +U+011c Gcircumflex 2.25 +U+011d gcircumflex 2.25 +U+011e Gbreve 2.25 +U+011f gbreve 2.25 +U+0120 Gdotaccent 2.25 +U+0121 gdotaccent 2.25 +U+0122 Gcommaaccent 2.25 +U+0123 gcommaaccent 2.25 +U+0124 Hcircumflex 2.25 +U+0125 hcircumflex 2.25 +U+0126 Hbar 2.25 +U+0127 hbar 2.25 +U+0128 Itilde 2.25 +U+0129 itilde 2.25 +U+012a Imacron 2.25 +U+012b imacron 2.25 +U+012c Ibreve 2.25 +U+012d ibreve 2.25 +U+012e Iogonek 2.25 +U+012f iogonek 2.25 +U+0130 Idotaccent 2.25 +U+0131 dotlessi 2.25 +U+0132 IJ 2.25 +U+0133 ij 2.25 +U+0134 Jcircumflex 2.25 +U+0135 jcircumflex 2.25 +U+0136 Kcommaaccent 2.25 +U+0137 kcommaaccent 2.25 +U+0138 kgreenlandic 2.25 +U+0139 Lacute 2.25 +U+013a lacute 2.25 +U+013b Lcommaaccent 2.25 +U+013c lcommaaccent 2.25 +U+013d Lcaron 2.25 +U+013e lcaron 2.25 +U+013f Ldot 2.25 +U+0140 ldot 2.25 +U+0141 Lslash 2.25 +U+0142 lslash 2.25 +U+0143 Nacute 2.25 +U+0144 nacute 2.25 +U+0145 Ncommaaccent 2.25 +U+0146 ncommaaccent 2.25 +U+0147 Ncaron 2.25 +U+0148 ncaron 2.25 +U+0149 napostrophe 2.25 +U+014a Eng 2.25 +U+014b eng 2.25 +U+014c Omacron 2.25 +U+014d omacron 2.25 +U+014e Obreve 2.25 +U+014f obreve 2.25 +U+0150 Ohungarumlaut 2.25 +U+0151 ohungarumlaut 2.25 +U+0152 OE 2.25 +U+0153 oe 2.25 +U+0154 Racute 2.25 +U+0155 racute 2.25 +U+0156 Rcommaaccent 2.25 +U+0157 rcommaaccent 2.25 +U+0158 Rcaron 2.25 +U+0159 rcaron 2.25 +U+015a Sacute 2.25 +U+015b sacute 2.25 +U+015c Scircumflex 2.25 +U+015d scircumflex 2.25 +U+015e Scedilla 2.25 +U+015f scedilla 2.25 +U+0160 Scaron 2.25 +U+0161 scaron 2.25 +U+0162 Tcommaaccent 2.25 +U+0163 tcommaaccent 2.25 +U+0164 Tcaron 2.25 +U+0165 tcaron 2.25 +U+0166 Tbar 2.25 +U+0167 tbar 2.25 +U+0168 Utilde 2.25 +U+0169 utilde 2.25 +U+016a Umacron 2.25 +U+016b umacron 2.25 +U+016c Ubreve 2.25 +U+016d ubreve 2.25 +U+016e Uring 2.25 +U+016f uring 2.25 +U+0170 Uhungarumlaut 2.25 +U+0171 uhungarumlaut 2.25 +U+0172 Uogonek 2.25 +U+0173 uogonek 2.25 +U+0174 Wcircumflex 2.25 +U+0175 wcircumflex 2.25 +U+0176 Ycircumflex 2.25 +U+0177 ycircumflex 2.25 +U+0178 Ydieresis 2.25 +U+0179 Zacute 2.25 +U+017a zacute 2.25 +U+017b Zdotaccent 2.25 +U+017c zdotaccent 2.25 +U+017d Zcaron 2.25 +U+017e zcaron 2.25 +U+017f longs 2.25 +U+0180 uni0180 2.25 +U+0181 uni0181 2.25 +U+0182 uni0182 2.25 +U+0183 uni0183 2.25 +U+0184 uni0184 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+0185 uni0185 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+0186 uni0186 2.25 +U+0187 uni0187 2.25 +U+0188 uni0188 2.25 +U+0189 uni0189 2.25 +U+018a uni018A 2.25 +U+018b uni018B 2.25 +U+018c uni018C 2.25 +U+018d uni018D 2.25 +U+018e uni018E 2.25 +U+018f uni018F 2.25 +U+0190 uni0190 2.25 +U+0191 uni0191 2.25 +U+0192 florin 2.25 +U+0193 uni0193 2.25 +U+0194 uni0194 2.25 +U+0195 uni0195 2.25 +U+0196 uni0196 2.25 +U+0197 uni0197 2.25 +U+0198 uni0198 2.25 +U+0199 uni0199 2.25 +U+019a uni019A 2.25 +U+019b uni019B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+019c uni019C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+019d uni019D 2.25 +U+019e uni019E 2.25 +U+019f uni019F 2.25 +U+01a0 Ohorn 2.25 +U+01a1 ohorn 2.25 +U+01a2 uni01A2 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+01a3 uni01A3 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+01a4 uni01A4 2.25 +U+01a5 uni01A5 2.25 +U+01a6 uni01A6 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+01a7 uni01A7 2.25 +U+01a8 uni01A8 2.25 +U+01a9 uni01A9 2.25 +U+01aa uni01AA 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+01ab uni01AB 2.25 +U+01ac uni01AC 2.25 +U+01ad uni01AD 2.25 +U+01ae uni01AE 2.25 +U+01af Uhorn 2.25 +U+01b0 uhorn 2.25 +U+01b1 uni01B1 2.25 +U+01b2 uni01B2 2.25 +U+01b3 uni01B3 2.25 +U+01b4 uni01B4 2.25 +U+01b5 uni01B5 2.25 +U+01b6 uni01B6 2.25 +U+01b7 uni01B7 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+01b8 uni01B8 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+01b9 uni01B9 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+01ba uni01BA 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+01bb uni01BB 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+01bc uni01BC 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+01bd uni01BD 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+01be uni01BE 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+01bf uni01BF 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+01c0 uni01C0 2.25 +U+01c1 uni01C1 2.25 +U+01c2 uni01C2 2.25 +U+01c3 uni01C3 2.25 +U+01c4 uni01C4 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+01c5 uni01C5 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+01c6 uni01C6 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+01c7 uni01C7 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+01c8 uni01C8 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+01c9 uni01C9 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+01ca uni01CA 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+01cb uni01CB 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+01cc uni01CC 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+01cd uni01CD 2.25 +U+01ce uni01CE 2.25 +U+01cf uni01CF 2.25 +U+01d0 uni01D0 2.25 +U+01d1 uni01D1 2.25 +U+01d2 uni01D2 2.25 +U+01d3 uni01D3 2.25 +U+01d4 uni01D4 2.25 +U+01d5 uni01D5 2.25 +U+01d6 uni01D6 2.25 +U+01d7 uni01D7 2.25 +U+01d8 uni01D8 2.25 +U+01d9 uni01D9 2.25 +U+01da uni01DA 2.25 +U+01db uni01DB 2.25 +U+01dc uni01DC 2.25 +U+01dd uni01DD 2.25 +U+01de uni01DE 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+01df uni01DF 2.25 +U+01e0 uni01E0 2.25 +U+01e1 uni01E1 2.25 +U+01e2 uni01E2 2.25 +U+01e3 uni01E3 2.25 +U+01e4 uni01E4 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+01e5 uni01E5 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+01e6 Gcaron 2.25 +U+01e7 gcaron 2.25 +U+01e8 uni01E8 2.25 +U+01e9 uni01E9 2.25 +U+01ea uni01EA 2.25 +U+01eb uni01EB 2.25 +U+01ec uni01EC 2.25 +U+01ed uni01ED 2.25 +U+01ee uni01EE 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+01ef uni01EF 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+01f0 uni01F0 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+01f1 uni01F1 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+01f2 uni01F2 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+01f3 uni01F3 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+01f4 uni01F4 2.25 +U+01f5 uni01F5 2.25 +U+01f6 uni01F6 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+01f7 uni01F7 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+01f8 uni01F8 2.25 +U+01f9 uni01F9 2.25 +U+01fa Aringacute 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+01fb aringacute 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+01fc AEacute 2.25 +U+01fd aeacute 2.25 +U+01fe Oslashacute 2.25 +U+01ff oslashacute 2.25 +U+0200 uni0200 2.25 +U+0201 uni0201 2.25 +U+0202 uni0202 2.25 +U+0203 uni0203 2.25 +U+0204 uni0204 2.25 +U+0205 uni0205 2.25 +U+0206 uni0206 2.25 +U+0207 uni0207 2.25 +U+0208 uni0208 2.25 +U+0209 uni0209 2.25 +U+020a uni020A 2.25 +U+020b uni020B 2.25 +U+020c uni020C 2.25 +U+020d uni020D 2.25 +U+020e uni020E 2.25 +U+020f uni020F 2.25 +U+0210 uni0210 2.25 +U+0211 uni0211 2.25 +U+0212 uni0212 2.25 +U+0213 uni0213 2.25 +U+0214 uni0214 2.25 +U+0215 uni0215 2.25 +U+0216 uni0216 2.25 +U+0217 uni0217 2.25 +U+0218 Scommaaccent 2.25 +U+0219 scommaaccent 2.25 +U+021a uni021A 2.25 +U+021b uni021B 2.25 +U+021c uni021C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+021d uni021D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+021e uni021E 2.25 +U+021f uni021F 2.25 +U+0220 uni0220 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+0221 uni0221 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+0222 uni0222 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0223 uni0223 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0224 uni0224 2.25 +U+0225 uni0225 2.25 +U+0226 uni0226 2.25 +U+0227 uni0227 2.25 +U+0228 uni0228 2.25 +U+0229 uni0229 2.25 +U+022a uni022A 2.25 +U+022b uni022B 2.25 +U+022c uni022C 2.25 +U+022d uni022D 2.25 +U+022e uni022E 2.25 +U+022f uni022F 2.25 +U+0230 uni0230 2.25 +U+0231 uni0231 2.25 +U+0232 uni0232 2.25 +U+0233 uni0233 2.25 +U+0234 uni0234 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+0235 uni0235 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+0236 uni0236 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+0237 dotlessj 2.25 +U+0238 uni0238 2.25 +U+0239 uni0239 2.25 +U+023a uni023A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+023b uni023B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+023c uni023C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+023d uni023D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+023e uni023E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+023f uni023F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+0240 uni0240 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+0241 uni0241 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+0242 uni0242 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+0243 uni0243 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0244 uni0244 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0245 uni0245 2.25 +U+0246 uni0246 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0247 uni0247 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0248 uni0248 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+0249 uni0249 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+024a uni024A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+024b uni024B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+024c uni024C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+024d uni024D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+024e uni024E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+024f uni024F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0250 uni0250 2.25 +U+0251 uni0251 2.25 +U+0252 uni0252 2.25 +U+0253 uni0253 2.25 +U+0254 uni0254 2.25 +U+0255 uni0255 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+0256 uni0256 2.25 +U+0257 uni0257 2.25 +U+0258 uni0258 2.25 +U+0259 uni0259 2.25 +U+025a uni025A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+025b uni025B 2.25 +U+025c uni025C 2.25 +U+025d uni025D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+025e uni025E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+025f uni025F 2.25 +U+0260 uni0260 2.25 +U+0261 uni0261 2.25 +U+0262 uni0262 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+0263 uni0263 2.25 +U+0264 uni0264 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+0265 uni0265 2.25 +U+0266 uni0266 2.25 +U+0267 uni0267 2.25 +U+0268 uni0268 2.25 +U+0269 uni0269 2.25 +U+026a uni026A 2.25 +U+026b uni026B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+026c uni026C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+026d uni026D 2.25 +U+026e uni026E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+026f uni026F 2.25 +U+0270 uni0270 2.25 +U+0271 uni0271 2.25 +U+0272 uni0272 2.25 +U+0273 uni0273 2.25 +U+0274 uni0274 2.25 +U+0275 uni0275 2.25 +U+0276 uni0276 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+0277 uni0277 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+0278 uni0278 2.25 +U+0279 uni0279 2.25 +U+027a uni027A 2.25 +U+027b uni027B 2.25 +U+027c uni027C 2.25 +U+027d uni027D 2.25 +U+027e uni027E 2.25 +U+027f uni027F 2.25 +U+0280 uni0280 2.25 +U+0281 uni0281 2.25 +U+0282 uni0282 2.25 +U+0283 uni0283 2.25 +U+0284 uni0284 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+0285 uni0285 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+0286 uni0286 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+0287 uni0287 2.25 +U+0288 uni0288 2.25 +U+0289 uni0289 2.25 +U+028a uni028A 2.25 +U+028b uni028B 2.25 +U+028c uni028C 2.25 +U+028d uni028D 2.25 +U+028e uni028E 2.25 +U+028f uni028F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+0290 uni0290 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+0291 uni0291 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+0292 uni0292 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+0293 uni0293 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+0294 uni0294 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+0295 uni0295 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+0296 uni0296 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+0297 uni0297 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+0298 uni0298 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+0299 uni0299 2.25 +U+029a uni029A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+029b uni029B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+029c uni029C 2.25 +U+029d uni029D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+029e uni029E 2.25 +U+029f uni029F 2.25 +U+02a0 uni02A0 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+02a1 uni02A1 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+02a2 uni02A2 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+02a3 uni02A3 2.25 +U+02a4 uni02A4 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+02a5 uni02A5 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+02a6 uni02A6 2.25 +U+02a7 uni02A7 2.25 +U+02a8 uni02A8 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+02a9 uni02A9 2.25 +U+02aa uni02AA 2.25 +U+02ab uni02AB 2.25 +U+02ac uni02AC 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+02ad uni02AD 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+02ae uni02AE 2.25 +U+02af uni02AF 2.25 +U+02b0 uni02B0 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+02b1 uni02B1 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+02b2 uni02B2 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+02b3 uni02B3 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+02b4 uni02B4 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+02b5 uni02B5 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+02b6 uni02B6 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+02b7 uni02B7 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+02b8 uni02B8 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+02b9 uni02B9 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+02ba uni02BA 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+02bb uni02BB 2.25 +U+02bc uni02BC 2.25 +U+02bd uni02BD 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+02be uni02BE 2.25 +U+02bf uni02BF 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+02c0 uni02C0 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+02c1 uni02C1 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+02c2 uni02C2 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+02c3 uni02C3 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+02c4 uni02C4 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+02c5 uni02C5 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+02c6 circumflex 2.25 +U+02c7 caron 2.25 +U+02c8 uni02C8 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+02c9 uni02C9 2.25 +U+02ca uni02CA 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+02cb uni02CB 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+02cc uni02CC 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+02cd uni02CD 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+02ce uni02CE 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+02cf uni02CF 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+02d0 uni02D0 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+02d1 uni02D1 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+02d2 uni02D2 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+02d3 uni02D3 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+02d4 uni02D4 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+02d5 uni02D5 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+02d6 uni02D6 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+02d7 uni02D7 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+02d8 breve 2.25 +U+02d9 dotaccent 2.25 +U+02da ring 2.25 +U+02db ogonek 2.25 +U+02dc tilde 2.25 +U+02dd hungarumlaut 2.25 +U+02de uni02DE 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+02df uni02DF 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+02e0 uni02E0 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+02e1 uni02E1 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+02e2 uni02E2 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+02e3 uni02E3 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+02e4 uni02E4 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+02e5 uni02E5 2.25 +U+02e6 uni02E6 2.25 +U+02e7 uni02E7 2.25 +U+02e8 uni02E8 2.25 +U+02e9 uni02E9 2.25 +U+02ec uni02EC 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+02ed uni02ED 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+02ee uni02EE 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+02f3 uni02F3 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+02f7 uni02F7 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+0300 gravecomb 2.25 +U+0301 acutecomb 2.25 +U+0302 uni0302 2.25 +U+0303 tildecomb 2.25 +U+0304 uni0304 2.25 +U+0305 uni0305 2.25 +U+0306 uni0306 2.25 +U+0307 uni0307 2.25 +U+0308 uni0308 2.25 +U+0309 hookabovecomb 2.25 +U+030a uni030A 2.25 +U+030b uni030B 2.25 +U+030c uni030C 2.25 +U+030d uni030D 2.25 +U+030e uni030E 2.25 +U+030f uni030F 2.25 +U+0310 uni0310 2.25 +U+0311 uni0311 2.25 +U+0312 uni0312 2.25 +U+0313 uni0313 2.25 +U+0314 uni0314 2.25 +U+0315 uni0315 2.25 +U+0316 uni0316 2.25 +U+0317 uni0317 2.25 +U+0318 uni0318 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+0319 uni0319 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+031a uni031A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+031b uni031B 2.25 +U+031c uni031C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+031d uni031D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+031e uni031E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+031f uni031F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+0320 uni0320 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+0321 uni0321 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+0322 uni0322 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+0323 dotbelowcomb 2.25 +U+0324 uni0324 2.25 +U+0325 uni0325 2.25 +U+0326 uni0326 2.25 +U+0327 uni0327 2.25 +U+0328 uni0328 2.25 +U+0329 uni0329 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+032a uni032A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+032b uni032B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+032c uni032C 2.25 +U+032d uni032D 2.25 +U+032e uni032E 2.25 +U+032f uni032F 2.25 +U+0330 uni0330 2.25 +U+0331 uni0331 2.25 +U+0332 uni0332 2.25 +U+0333 uni0333 2.25 +U+0334 uni0334 2.25 +U+0335 uni0335 2.25 +U+0336 uni0336 2.25 +U+0337 uni0337 2.25 +U+0338 uni0338 2.25 +U+0339 uni0339 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+033a uni033A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+033b uni033B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+033c uni033C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+033d uni033D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+033e uni033E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+033f uni033F 2.25 +U+0340 uni0340 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0341 uni0341 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0342 uni0342 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0343 uni0343 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+0344 uni0344 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0345 uni0345 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0346 uni0346 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0347 uni0347 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0348 uni0348 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0349 uni0349 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+034a uni034A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+034b uni034B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+034c uni034C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+034d uni034D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+034e uni034E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+034f uni034F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+0351 uni0351 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0352 uni0352 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique) +U+0353 uni0353 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+0357 uni0357 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0358 uni0358 2.25 +U+035c uni035C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+035d uni035D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+035e uni035E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+035f uni035F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0360 uni0360 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0361 uni0361 2.25 +U+0362 uni0362 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0374 uni0374 2.25 +U+0375 uni0375 2.25 +U+037a uni037A 2.25 +U+037b uni037B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+037c uni037C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+037d uni037D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+037e uni037E 2.25 +U+0384 tonos 2.25 +U+0385 dieresistonos 2.25 +U+0386 Alphatonos 2.25 +U+0387 anoteleia 2.25 +U+0388 Epsilontonos 2.25 +U+0389 Etatonos 2.25 +U+038a Iotatonos 2.25 +U+038c Omicrontonos 2.25 +U+038e Upsilontonos 2.25 +U+038f Omegatonos 2.25 +U+0390 iotadieresistonos 2.25 +U+0391 Alpha 2.25 +U+0392 Beta 2.25 +U+0393 Gamma 2.25 +U+0394 uni0394 2.25 +U+0395 Epsilon 2.25 +U+0396 Zeta 2.25 +U+0397 Eta 2.25 +U+0398 Theta 2.25 +U+0399 Iota 2.25 +U+039a Kappa 2.25 +U+039b Lambda 2.25 +U+039c Mu 2.25 +U+039d Nu 2.25 +U+039e Xi 2.25 +U+039f Omicron 2.25 +U+03a0 Pi 2.25 +U+03a1 Rho 2.25 +U+03a3 Sigma 2.25 +U+03a4 Tau 2.25 +U+03a5 Upsilon 2.25 +U+03a6 Phi 2.25 +U+03a7 Chi 2.25 +U+03a8 Psi 2.25 +U+03a9 Omega 2.25 +U+03aa Iotadieresis 2.25 +U+03ab Upsilondieresis 2.25 +U+03ac alphatonos 2.25 +U+03ad epsilontonos 2.25 +U+03ae etatonos 2.25 +U+03af iotatonos 2.25 +U+03b0 upsilondieresistonos 2.25 +U+03b1 alpha 2.25 +U+03b2 beta 2.25 +U+03b3 gamma 2.25 +U+03b4 delta 2.25 +U+03b5 epsilon 2.25 +U+03b6 zeta 2.25 +U+03b7 eta 2.25 +U+03b8 theta 2.25 +U+03b9 iota 2.25 +U+03ba kappa 2.25 +U+03bb lambda 2.25 +U+03bc uni03BC 2.25 +U+03bd nu 2.25 +U+03be xi 2.25 +U+03bf omicron 2.25 +U+03c0 pi 2.25 +U+03c1 rho 2.25 +U+03c2 sigma1 2.25 +U+03c3 sigma 2.25 +U+03c4 tau 2.25 +U+03c5 upsilon 2.25 +U+03c6 phi 2.25 +U+03c7 chi 2.25 +U+03c8 psi 2.25 +U+03c9 omega 2.25 +U+03ca iotadieresis 2.25 +U+03cb upsilondieresis 2.25 +U+03cc omicrontonos 2.25 +U+03cd upsilontonos 2.25 +U+03ce omegatonos 2.25 +U+03d0 uni03D0 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+03d1 theta1 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+03d2 Upsilon1 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+03d3 uni03D3 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+03d4 uni03D4 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+03d5 phi1 2.25 +U+03d6 omega1 2.25 +U+03d7 uni03D7 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+03d8 uni03D8 2.25 +U+03d9 uni03D9 2.25 +U+03da uni03DA 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+03db uni03DB 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+03dc uni03DC 2.25 +U+03dd uni03DD 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+03de uni03DE 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+03df uni03DF 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+03e0 uni03E0 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+03e1 uni03E1 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+03e2 uni03E2 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+03e3 uni03E3 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+03e4 uni03E4 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+03e5 uni03E5 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+03e6 uni03E6 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+03e7 uni03E7 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+03e8 uni03E8 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+03e9 uni03E9 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+03ea uni03EA 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+03eb uni03EB 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+03ec uni03EC 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+03ed uni03ED 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+03ee uni03EE 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+03ef uni03EF 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+03f0 uni03F0 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+03f1 uni03F1 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+03f2 uni03F2 2.25 +U+03f3 uni03F3 2.25 +U+03f4 uni03F4 2.25 +U+03f5 uni03F5 2.25 +U+03f6 uni03F6 2.25 +U+03f7 uni03F7 2.25 +U+03f8 uni03F8 2.25 +U+03f9 uni03F9 2.25 +U+03fa uni03FA 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+03fb uni03FB 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+03fc uni03FC 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+03fd uni03FD 2.25 +U+03fe uni03FE 2.25 +U+03ff uni03FF 2.25 +U+0400 uni0400 2.25 +U+0401 uni0401 2.25 +U+0402 uni0402 2.25 +U+0403 uni0403 2.25 +U+0404 uni0404 2.25 +U+0405 uni0405 2.25 +U+0406 uni0406 2.25 +U+0407 uni0407 2.25 +U+0408 uni0408 2.25 +U+0409 uni0409 2.25 +U+040a uni040A 2.25 +U+040b uni040B 2.25 +U+040c uni040C 2.25 +U+040d uni040D 2.25 +U+040e uni040E 2.25 +U+040f uni040F 2.25 +U+0410 uni0410 2.25 +U+0411 uni0411 2.25 +U+0412 uni0412 2.25 +U+0413 uni0413 2.25 +U+0414 uni0414 2.25 +U+0415 uni0415 2.25 +U+0416 uni0416 2.25 +U+0417 uni0417 2.25 +U+0418 uni0418 2.25 +U+0419 uni0419 2.25 +U+041a uni041A 2.25 +U+041b uni041B 2.25 +U+041c uni041C 2.25 +U+041d uni041D 2.25 +U+041e uni041E 2.25 +U+041f uni041F 2.25 +U+0420 uni0420 2.25 +U+0421 uni0421 2.25 +U+0422 uni0422 2.25 +U+0423 uni0423 2.25 +U+0424 uni0424 2.25 +U+0425 uni0425 2.25 +U+0426 uni0426 2.25 +U+0427 uni0427 2.25 +U+0428 uni0428 2.25 +U+0429 uni0429 2.25 +U+042a uni042A 2.25 +U+042b uni042B 2.25 +U+042c uni042C 2.25 +U+042d uni042D 2.25 +U+042e uni042E 2.25 +U+042f uni042F 2.25 +U+0430 uni0430 2.25 +U+0431 uni0431 2.25 +U+0432 uni0432 2.25 +U+0433 uni0433 2.25 +U+0434 uni0434 2.25 +U+0435 uni0435 2.25 +U+0436 uni0436 2.25 +U+0437 uni0437 2.25 +U+0438 uni0438 2.25 +U+0439 uni0439 2.25 +U+043a uni043A 2.25 +U+043b uni043B 2.25 +U+043c uni043C 2.25 +U+043d uni043D 2.25 +U+043e uni043E 2.25 +U+043f uni043F 2.25 +U+0440 uni0440 2.25 +U+0441 uni0441 2.25 +U+0442 uni0442 2.25 +U+0443 uni0443 2.25 +U+0444 uni0444 2.25 +U+0445 uni0445 2.25 +U+0446 uni0446 2.25 +U+0447 uni0447 2.25 +U+0448 uni0448 2.25 +U+0449 uni0449 2.25 +U+044a uni044A 2.25 +U+044b uni044B 2.25 +U+044c uni044C 2.25 +U+044d uni044D 2.25 +U+044e uni044E 2.25 +U+044f uni044F 2.25 +U+0450 uni0450 2.25 +U+0451 uni0451 2.25 +U+0452 uni0452 2.25 +U+0453 uni0453 2.25 +U+0454 uni0454 2.25 +U+0455 uni0455 2.25 +U+0456 uni0456 2.25 +U+0457 uni0457 2.25 +U+0458 uni0458 2.25 +U+0459 uni0459 2.25 +U+045a uni045A 2.25 +U+045b uni045B 2.25 +U+045c uni045C 2.25 +U+045d uni045D 2.25 +U+045e uni045E 2.25 +U+045f uni045F 2.25 +U+0460 uni0460 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0461 uni0461 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+0462 uni0462 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+0463 uni0463 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+0464 uni0464 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+0465 uni0465 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+0466 uni0466 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0467 uni0467 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0468 uni0468 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0469 uni0469 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+046a uni046A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+046b uni046B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+046c uni046C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+046d uni046D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+046e uni046E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+046f uni046F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0470 uni0470 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+0471 uni0471 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+0472 uni0472 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+0473 uni0473 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+0474 uni0474 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+0475 uni0475 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+0476 uni0476 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0477 uni0477 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0478 uni0478 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0479 uni0479 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+047a uni047A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+047b uni047B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+047c uni047C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+047d uni047D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+047e uni047E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+047f uni047F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0480 uni0480 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0481 uni0481 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0482 uni0482 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0483 uni0483 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0484 uni0484 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0485 uni0485 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0486 uni0486 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0488 uni0488 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0489 uni0489 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+048a uni048A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+048b uni048B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+048c uni048C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+048d uni048D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+048e uni048E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+048f uni048F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0490 uni0490 2.25 +U+0491 uni0491 2.25 +U+0492 uni0492 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+0493 uni0493 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+0494 uni0494 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+0495 uni0495 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+0496 uni0496 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+0497 uni0497 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+0498 uni0498 2.25 +U+0499 uni0499 2.25 +U+049a uni049A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+049b uni049B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+049c uni049C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+049d uni049D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+049e uni049E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+049f uni049F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+04a0 uni04A0 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+04a1 uni04A1 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+04a2 uni04A2 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+04a3 uni04A3 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+04a4 uni04A4 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+04a5 uni04A5 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+04a6 uni04A6 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+04a7 uni04A7 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+04a8 uni04A8 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+04a9 uni04A9 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+04aa uni04AA 2.25 +U+04ab uni04AB 2.25 +U+04ac uni04AC 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+04ad uni04AD 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+04ae uni04AE 2.25 +U+04af uni04AF 2.25 +U+04b0 uni04B0 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+04b1 uni04B1 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+04b2 uni04B2 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+04b3 uni04B3 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+04b4 uni04B4 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+04b5 uni04B5 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+04b6 uni04B6 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+04b7 uni04B7 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+04b8 uni04B8 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+04b9 uni04B9 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+04ba uni04BA 2.25 +U+04bb uni04BB 2.25 +U+04bc uni04BC 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+04bd uni04BD 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+04be uni04BE 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+04bf uni04BF 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+04c0 uni04C0 2.25 +U+04c1 uni04C1 2.25 +U+04c2 uni04C2 2.25 +U+04c3 uni04C3 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+04c4 uni04C4 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+04c5 uni04C5 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+04c6 uni04C6 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+04c7 uni04C7 2.25 +U+04c8 uni04C8 2.25 +U+04c9 uni04C9 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+04ca uni04CA 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+04cb uni04CB 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+04cc uni04CC 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+04cd uni04CD 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+04ce uni04CE 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+04cf uni04CF 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+04d0 uni04D0 2.25 +U+04d1 uni04D1 2.25 +U+04d2 uni04D2 2.25 +U+04d3 uni04D3 2.25 +U+04d4 uni04D4 2.25 +U+04d5 uni04D5 2.25 +U+04d6 uni04D6 2.25 +U+04d7 uni04D7 2.25 +U+04d8 uni04D8 2.25 +U+04d9 uni04D9 2.25 +U+04da uni04DA 2.25 +U+04db uni04DB 2.25 +U+04dc uni04DC 2.25 +U+04dd uni04DD 2.25 +U+04de uni04DE 2.25 +U+04df uni04DF 2.25 +U+04e0 uni04E0 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+04e1 uni04E1 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+04e2 uni04E2 2.25 +U+04e3 uni04E3 2.25 +U+04e4 uni04E4 2.25 +U+04e5 uni04E5 2.25 +U+04e6 uni04E6 2.25 +U+04e7 uni04E7 2.25 +U+04e8 uni04E8 2.25 +U+04e9 uni04E9 2.25 +U+04ea uni04EA 2.25 +U+04eb uni04EB 2.25 +U+04ec uni04EC 2.25 +U+04ed uni04ED 2.25 +U+04ee uni04EE 2.25 +U+04ef uni04EF 2.25 +U+04f0 uni04F0 2.25 +U+04f1 uni04F1 2.25 +U+04f2 uni04F2 2.25 +U+04f3 uni04F3 2.25 +U+04f4 uni04F4 2.25 +U+04f5 uni04F5 2.25 +U+04f6 uni04F6 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+04f7 uni04F7 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+04f8 uni04F8 2.25 +U+04f9 uni04F9 2.25 +U+04fa uni04FA 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+04fb uni04FB 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+04fc uni04FC 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+04fd uni04FD 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+04fe uni04FE 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+04ff uni04FF 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+0500 uni0500 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+0501 uni0501 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+0502 uni0502 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0503 uni0503 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0504 uni0504 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0505 uni0505 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0506 uni0506 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0507 uni0507 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0508 uni0508 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0509 uni0509 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+050a uni050A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+050b uni050B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+050c uni050C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+050d uni050D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+050e uni050E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+050f uni050F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0510 uni0510 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+0511 uni0511 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+0512 uni0512 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+0513 uni0513 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+051a uni051A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+051b uni051B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+051c uni051C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+051d uni051D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+0520 uni0520 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0521 uni0521 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0522 uni0522 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0523 uni0523 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0531 uni0531 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0532 uni0532 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0533 uni0533 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0534 uni0534 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0535 uni0535 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0536 uni0536 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0537 uni0537 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0538 uni0538 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0539 uni0539 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+053a uni053A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+053b uni053B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+053c uni053C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+053d uni053D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+053e uni053E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+053f uni053F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0540 uni0540 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0541 uni0541 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0542 uni0542 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0543 uni0543 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0544 uni0544 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0545 uni0545 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0546 uni0546 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0547 uni0547 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0548 uni0548 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+0549 uni0549 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+054a uni054A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+054b uni054B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+054c uni054C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+054d uni054D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+054e uni054E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+054f uni054F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+0550 uni0550 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+0551 uni0551 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0552 uni0552 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0553 uni0553 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+0554 uni0554 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0555 uni0555 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+0556 uni0556 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0559 uni0559 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+055a uni055A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+055b uni055B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+055c uni055C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+055d uni055D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+055e uni055E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+055f uni055F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0561 uni0561 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+0562 uni0562 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+0563 uni0563 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+0564 uni0564 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+0565 uni0565 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+0566 uni0566 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+0567 uni0567 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0568 uni0568 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+0569 uni0569 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+056a uni056A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+056b uni056B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+056c uni056C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+056d uni056D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+056e uni056E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+056f uni056F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+0570 uni0570 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+0571 uni0571 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0572 uni0572 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+0573 uni0573 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0574 uni0574 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0575 uni0575 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+0576 uni0576 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0577 uni0577 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0578 uni0578 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+0579 uni0579 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+057a uni057A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+057b uni057B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+057c uni057C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+057d uni057D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+057e uni057E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+057f uni057F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+0580 uni0580 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+0581 uni0581 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+0582 uni0582 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+0583 uni0583 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+0584 uni0584 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0585 uni0585 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+0586 uni0586 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0587 uni0587 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+0589 uni0589 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+058a uni058A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05b0 uni05B0 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05b1 uni05B1 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05b2 uni05B2 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05b3 uni05B3 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05b4 uni05B4 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05b5 uni05B5 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05b6 uni05B6 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05b7 uni05B7 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05b8 uni05B8 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05b9 uni05B9 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05ba uni05BA 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05bb uni05BB 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05bc uni05BC 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05bd uni05BD 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05be uni05BE 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05bf uni05BF 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05c0 uni05C0 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05c1 uni05C1 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05c2 uni05C2 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05c3 uni05C3 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05c6 uni05C6 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05c7 uni05C7 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05d0 uni05D0 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05d1 uni05D1 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05d2 uni05D2 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05d3 uni05D3 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05d4 uni05D4 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05d5 uni05D5 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05d6 uni05D6 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05d7 uni05D7 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05d8 uni05D8 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05d9 uni05D9 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05da uni05DA 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05db uni05DB 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05dc uni05DC 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05dd uni05DD 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05de uni05DE 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05df uni05DF 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05e0 uni05E0 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05e1 uni05E1 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05e2 uni05E2 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05e3 uni05E3 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05e4 uni05E4 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05e5 uni05E5 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05e6 uni05E6 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05e7 uni05E7 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05e8 uni05E8 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05e9 uni05E9 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05ea uni05EA 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05ef uni05EF 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+05f0 uni05F0 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05f1 uni05F1 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05f2 uni05F2 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05f3 uni05F3 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05f4 uni05F4 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+060c uni060C 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+0615 uni0615 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+061b uni061B 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+061f uni061F 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+0621 uni0621 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+0622 uni0622 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+0623 uni0623 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+0624 uni0624 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+0625 uni0625 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+0626 uni0626 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+0627 uni0627 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+0628 uni0628 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+0629 uni0629 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+062a uni062A 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+062b uni062B 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+062c uni062C 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+062d uni062D 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+062e uni062E 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+062f uni062F 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+0630 uni0630 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+0631 uni0631 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+0632 uni0632 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+0633 uni0633 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+0634 uni0634 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+0635 uni0635 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+0636 uni0636 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+0637 uni0637 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+0638 uni0638 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+0639 uni0639 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+063a uni063A 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+0640 uni0640 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+0641 uni0641 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+0642 uni0642 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+0643 uni0643 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+0644 uni0644 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+0645 uni0645 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+0646 uni0646 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+0647 uni0647 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+0648 uni0648 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+0649 uni0649 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+064a uni064A 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+064b uni064B 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+064c uni064C 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+064d uni064D 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+064e uni064E 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+064f uni064F 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+0650 uni0650 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+0651 uni0651 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+0652 uni0652 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+0653 uni0653 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+0654 uni0654 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+0655 uni0655 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+065a uni065A 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+0660 uni0660 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+0661 uni0661 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+0662 uni0662 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+0663 uni0663 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+0664 uni0664 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+0665 uni0665 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+0666 uni0666 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+0667 uni0667 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+0668 uni0668 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+0669 uni0669 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+066a uni066A 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+066b uni066B 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+066c uni066C 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+066d uni066D 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+066e uni066E 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+066f uni066F 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+0674 uni0674 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans ExtraLight, Sans Mono, Sans Mono Bold) +U+0679 uni0679 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+067a uni067A 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+067b uni067B 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+067c uni067C 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+067d uni067D 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+067e uni067E 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+067f uni067F 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+0680 uni0680 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+0681 uni0681 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+0682 uni0682 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+0683 uni0683 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+0684 uni0684 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+0685 uni0685 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+0686 uni0686 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+0687 uni0687 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+0691 uni0691 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+0692 uni0692 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+0695 uni0695 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+0698 uni0698 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+06a1 uni06A1 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+06a4 uni06A4 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+06a6 uni06A6 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+06a9 uni06A9 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+06af uni06AF 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+06b5 uni06B5 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+06ba uni06BA 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+06be uni06BE 2.25 (Sans Mono, Sans Mono Bold) +U+06bf uni06BF 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+06c6 uni06C6 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+06cc uni06CC 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+06ce uni06CE 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+06d5 uni06D5 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+06f0 uni06F0 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+06f1 uni06F1 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+06f2 uni06F2 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+06f3 uni06F3 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+06f4 uni06F4 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+06f5 uni06F5 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+06f6 uni06F6 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+06f7 uni06F7 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+06f8 uni06F8 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+06f9 uni06F9 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+07c0 uni07C0 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07c1 uni07C1 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07c2 uni07C2 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07c3 uni07C3 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07c4 uni07C4 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07c5 uni07C5 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07c6 uni07C6 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07c7 uni07C7 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07c8 uni07C8 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07c9 uni07C9 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07ca uni07CA 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07cb uni07CB 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07cc uni07CC 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07cd uni07CD 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07ce uni07CE 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07cf uni07CF 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07d0 uni07D0 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07d1 uni07D1 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07d2 uni07D2 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07d3 uni07D3 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07d4 uni07D4 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07d5 uni07D5 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07d6 uni07D6 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07d7 uni07D7 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07d8 uni07D8 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07d9 uni07D9 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07da uni07DA 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07db uni07DB 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07dc uni07DC 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07dd uni07DD 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07de uni07DE 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07df uni07DF 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07e0 uni07E0 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07e1 uni07E1 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07e2 uni07E2 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07e3 uni07E3 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07e4 uni07E4 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07e5 uni07E5 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07e6 uni07E6 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07e7 uni07E7 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07eb uni07EB 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07ec uni07EC 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07ed uni07ED 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07ee uni07EE 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07ef uni07EF 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07f0 uni07F0 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07f1 uni07F1 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07f2 uni07F2 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07f3 uni07F3 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07f4 uni07F4 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07f5 uni07F5 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07f8 uni07F8 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07f9 uni07F9 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07fa uni07FA 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+0e3f uni0E3F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0e81 uni0E81 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+0e82 uni0E82 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+0e84 uni0E84 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+0e87 uni0E87 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+0e88 uni0E88 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+0e8a uni0E8A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+0e8d uni0E8D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+0e94 uni0E94 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+0e95 uni0E95 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+0e96 uni0E96 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+0e97 uni0E97 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+0e99 uni0E99 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+0e9a uni0E9A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+0e9b uni0E9B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+0e9c uni0E9C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+0e9d uni0E9D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+0e9e uni0E9E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+0e9f uni0E9F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+0ea1 uni0EA1 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+0ea2 uni0EA2 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+0ea3 uni0EA3 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+0ea5 uni0EA5 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+0ea7 uni0EA7 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+0eaa uni0EAA 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+0eab uni0EAB 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+0ead uni0EAD 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+0eae uni0EAE 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+0eaf uni0EAF 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+0eb0 uni0EB0 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+0eb1 uni0EB1 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+0eb2 uni0EB2 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+0eb3 uni0EB3 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+0eb4 uni0EB4 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+0eb5 uni0EB5 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+0eb6 uni0EB6 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+0eb7 uni0EB7 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+0eb8 uni0EB8 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+0eb9 uni0EB9 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+0ebb uni0EBB 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+0ebc uni0EBC 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+0ebd uni0EBD 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0ec0 uni0EC0 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0ec1 uni0EC1 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0ec2 uni0EC2 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0ec3 uni0EC3 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0ec4 uni0EC4 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0ec6 uni0EC6 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0ec8 uni0EC8 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+0ec9 uni0EC9 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+0eca uni0ECA 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+0ecb uni0ECB 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+0ecc uni0ECC 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+0ecd uni0ECD 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+0ed0 uni0ED0 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0ed1 uni0ED1 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0ed2 uni0ED2 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0ed3 uni0ED3 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0ed4 uni0ED4 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0ed5 uni0ED5 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0ed6 uni0ED6 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0ed7 uni0ED7 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0ed8 uni0ED8 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0ed9 uni0ED9 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0edc uni0EDC 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0edd uni0EDD 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+10a0 uni10A0 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+10a1 uni10A1 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+10a2 uni10A2 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+10a3 uni10A3 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+10a4 uni10A4 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+10a5 uni10A5 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+10a6 uni10A6 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+10a7 uni10A7 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+10a8 uni10A8 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+10a9 uni10A9 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+10aa uni10AA 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+10ab uni10AB 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+10ac uni10AC 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+10ad uni10AD 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+10ae uni10AE 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+10af uni10AF 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+10b0 uni10B0 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+10b1 uni10B1 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+10b2 uni10B2 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+10b3 uni10B3 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+10b4 uni10B4 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+10b5 uni10B5 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+10b6 uni10B6 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+10b7 uni10B7 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+10b8 uni10B8 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+10b9 uni10B9 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+10ba uni10BA 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+10bb uni10BB 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+10bc uni10BC 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+10bd uni10BD 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+10be uni10BE 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+10bf uni10BF 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+10c0 uni10C0 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+10c1 uni10C1 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+10c2 uni10C2 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+10c3 uni10C3 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+10c4 uni10C4 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+10c5 uni10C5 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+10d0 uni10D0 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+10d1 uni10D1 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+10d2 uni10D2 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+10d3 uni10D3 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+10d4 uni10D4 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+10d5 uni10D5 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+10d6 uni10D6 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+10d7 uni10D7 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+10d8 uni10D8 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+10d9 uni10D9 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+10da uni10DA 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+10db uni10DB 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+10dc uni10DC 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+10dd uni10DD 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+10de uni10DE 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+10df uni10DF 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+10e0 uni10E0 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+10e1 uni10E1 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+10e2 uni10E2 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+10e3 uni10E3 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+10e4 uni10E4 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+10e5 uni10E5 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+10e6 uni10E6 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+10e7 uni10E7 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+10e8 uni10E8 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+10e9 uni10E9 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+10ea uni10EA 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+10eb uni10EB 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+10ec uni10EC 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+10ed uni10ED 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+10ee uni10EE 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+10ef uni10EF 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+10f0 uni10F0 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+10f1 uni10F1 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+10f2 uni10F2 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+10f3 uni10F3 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+10f4 uni10F4 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+10f5 uni10F5 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+10f6 uni10F6 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+10f7 uni10F7 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+10f8 uni10F8 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+10f9 uni10F9 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+10fa uni10FA 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+10fb uni10FB 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+10fc uni10FC 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1401 uni1401 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1402 uni1402 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1403 uni1403 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1404 uni1404 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1405 uni1405 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1406 uni1406 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1407 uni1407 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1409 uni1409 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+140a uni140A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+140b uni140B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+140c uni140C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+140d uni140D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+140e uni140E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+140f uni140F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1410 uni1410 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1411 uni1411 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1412 uni1412 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1413 uni1413 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1414 uni1414 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1415 uni1415 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1416 uni1416 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1417 uni1417 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1418 uni1418 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1419 uni1419 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+141a uni141A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+141b uni141B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+141d uni141D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+141e uni141E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+141f uni141F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1420 uni1420 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1421 uni1421 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1422 uni1422 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1423 uni1423 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1424 uni1424 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1425 uni1425 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1426 uni1426 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1427 uni1427 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1428 uni1428 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1429 uni1429 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+142a uni142A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+142b uni142B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+142c uni142C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+142d uni142D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+142e uni142E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+142f uni142F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1430 uni1430 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1431 uni1431 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1432 uni1432 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1433 uni1433 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1434 uni1434 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1435 uni1435 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1437 uni1437 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1438 uni1438 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1439 uni1439 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+143a uni143A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+143b uni143B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+143c uni143C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+143d uni143D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+143e uni143E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+143f uni143F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1440 uni1440 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1441 uni1441 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1442 uni1442 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1443 uni1443 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1444 uni1444 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1445 uni1445 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1446 uni1446 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1447 uni1447 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1448 uni1448 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1449 uni1449 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+144a uni144A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+144c uni144C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+144d uni144D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+144e uni144E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+144f uni144F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1450 uni1450 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1451 uni1451 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1452 uni1452 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1454 uni1454 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1455 uni1455 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1456 uni1456 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1457 uni1457 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1458 uni1458 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1459 uni1459 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+145a uni145A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+145b uni145B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+145c uni145C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+145d uni145D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+145e uni145E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+145f uni145F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1460 uni1460 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1461 uni1461 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1462 uni1462 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1463 uni1463 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1464 uni1464 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1465 uni1465 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1466 uni1466 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1467 uni1467 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1468 uni1468 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1469 uni1469 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+146a uni146A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+146b uni146B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+146c uni146C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+146d uni146D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+146e uni146E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+146f uni146F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1470 uni1470 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1471 uni1471 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1472 uni1472 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1473 uni1473 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1474 uni1474 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1475 uni1475 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1476 uni1476 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1477 uni1477 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1478 uni1478 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1479 uni1479 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+147a uni147A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+147b uni147B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+147c uni147C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+147d uni147D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+147e uni147E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+147f uni147F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1480 uni1480 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1481 uni1481 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1482 uni1482 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1483 uni1483 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1484 uni1484 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1485 uni1485 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1486 uni1486 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1487 uni1487 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1488 uni1488 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1489 uni1489 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+148a uni148A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+148b uni148B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+148c uni148C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+148d uni148D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+148e uni148E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+148f uni148F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1490 uni1490 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1491 uni1491 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1492 uni1492 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1493 uni1493 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1494 uni1494 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1495 uni1495 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1496 uni1496 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1497 uni1497 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1498 uni1498 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1499 uni1499 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+149a uni149A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+149b uni149B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+149c uni149C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+149d uni149D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+149e uni149E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+149f uni149F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14a0 uni14A0 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14a1 uni14A1 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14a2 uni14A2 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14a3 uni14A3 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14a4 uni14A4 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14a5 uni14A5 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14a6 uni14A6 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14a7 uni14A7 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14a8 uni14A8 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14a9 uni14A9 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14aa uni14AA 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14ab uni14AB 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14ac uni14AC 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14ad uni14AD 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14ae uni14AE 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14af uni14AF 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14b0 uni14B0 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14b1 uni14B1 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14b2 uni14B2 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14b3 uni14B3 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14b4 uni14B4 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14b5 uni14B5 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14b6 uni14B6 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14b7 uni14B7 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14b8 uni14B8 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14b9 uni14B9 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14ba uni14BA 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14bb uni14BB 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14bc uni14BC 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14bd uni14BD 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14c0 uni14C0 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14c1 uni14C1 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14c2 uni14C2 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14c3 uni14C3 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14c4 uni14C4 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14c5 uni14C5 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14c6 uni14C6 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14c7 uni14C7 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14c8 uni14C8 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14c9 uni14C9 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14ca uni14CA 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14cb uni14CB 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14cc uni14CC 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14cd uni14CD 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14ce uni14CE 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14cf uni14CF 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14d0 uni14D0 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14d1 uni14D1 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14d2 uni14D2 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14d3 uni14D3 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14d4 uni14D4 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14d5 uni14D5 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14d6 uni14D6 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14d7 uni14D7 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14d8 uni14D8 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14d9 uni14D9 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14da uni14DA 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14db uni14DB 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14dc uni14DC 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14dd uni14DD 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14de uni14DE 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14df uni14DF 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14e0 uni14E0 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14e1 uni14E1 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14e2 uni14E2 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14e3 uni14E3 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14e4 uni14E4 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14e5 uni14E5 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14e6 uni14E6 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14e7 uni14E7 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14e8 uni14E8 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14e9 uni14E9 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14ea uni14EA 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14ec uni14EC 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14ed uni14ED 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14ee uni14EE 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14ef uni14EF 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14f0 uni14F0 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14f1 uni14F1 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14f2 uni14F2 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14f3 uni14F3 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14f4 uni14F4 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14f5 uni14F5 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14f6 uni14F6 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14f7 uni14F7 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14f8 uni14F8 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14f9 uni14F9 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14fa uni14FA 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14fb uni14FB 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14fc uni14FC 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14fd uni14FD 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14fe uni14FE 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14ff uni14FF 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1500 uni1500 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1501 uni1501 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1502 uni1502 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1503 uni1503 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1504 uni1504 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1505 uni1505 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1506 uni1506 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1507 uni1507 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1510 uni1510 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1511 uni1511 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1512 uni1512 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1513 uni1513 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1514 uni1514 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1515 uni1515 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1516 uni1516 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1517 uni1517 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1518 uni1518 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1519 uni1519 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+151a uni151A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+151b uni151B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+151c uni151C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+151d uni151D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+151e uni151E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+151f uni151F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1520 uni1520 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1521 uni1521 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1522 uni1522 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1523 uni1523 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1524 uni1524 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1525 uni1525 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1526 uni1526 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1527 uni1527 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1528 uni1528 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1529 uni1529 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+152a uni152A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+152b uni152B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+152c uni152C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+152d uni152D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+152e uni152E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+152f uni152F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1530 uni1530 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1531 uni1531 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1532 uni1532 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1533 uni1533 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1534 uni1534 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1535 uni1535 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1536 uni1536 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1537 uni1537 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1538 uni1538 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1539 uni1539 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+153a uni153A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+153b uni153B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+153c uni153C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+153d uni153D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+153e uni153E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1540 uni1540 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1541 uni1541 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1542 uni1542 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1543 uni1543 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1544 uni1544 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1545 uni1545 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1546 uni1546 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1547 uni1547 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1548 uni1548 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1549 uni1549 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+154a uni154A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+154b uni154B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+154c uni154C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+154d uni154D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+154e uni154E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+154f uni154F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1550 uni1550 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1552 uni1552 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1553 uni1553 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1554 uni1554 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1555 uni1555 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1556 uni1556 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1557 uni1557 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1558 uni1558 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1559 uni1559 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+155a uni155A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+155b uni155B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+155c uni155C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+155d uni155D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+155e uni155E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+155f uni155F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1560 uni1560 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1561 uni1561 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1562 uni1562 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1563 uni1563 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1564 uni1564 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1565 uni1565 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1566 uni1566 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1567 uni1567 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1568 uni1568 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1569 uni1569 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+156a uni156A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1574 uni1574 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1575 uni1575 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1576 uni1576 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1577 uni1577 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1578 uni1578 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1579 uni1579 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+157a uni157A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+157b uni157B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+157c uni157C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+157d uni157D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+157e uni157E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+157f uni157F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1580 uni1580 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1581 uni1581 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1582 uni1582 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1583 uni1583 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1584 uni1584 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1585 uni1585 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+158a uni158A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+158b uni158B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+158c uni158C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+158d uni158D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+158e uni158E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+158f uni158F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1590 uni1590 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1591 uni1591 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1592 uni1592 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1593 uni1593 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1594 uni1594 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1595 uni1595 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1596 uni1596 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+15a0 uni15A0 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+15a1 uni15A1 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+15a2 uni15A2 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+15a3 uni15A3 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+15a4 uni15A4 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+15a5 uni15A5 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+15a6 uni15A6 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+15a7 uni15A7 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+15a8 uni15A8 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+15a9 uni15A9 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+15aa uni15AA 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+15ab uni15AB 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+15ac uni15AC 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+15ad uni15AD 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+15ae uni15AE 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+15af uni15AF 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+15de uni15DE 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+15e1 uni15E1 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1646 uni1646 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1647 uni1647 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+166e uni166E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+166f uni166F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1670 uni1670 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1671 uni1671 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1672 uni1672 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1673 uni1673 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1674 uni1674 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1675 uni1675 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1676 uni1676 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1680 uni1680 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+1681 uni1681 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+1682 uni1682 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+1683 uni1683 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+1684 uni1684 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+1685 uni1685 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+1686 uni1686 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+1687 uni1687 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+1688 uni1688 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+1689 uni1689 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+168a uni168A 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+168b uni168B 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+168c uni168C 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+168d uni168D 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+168e uni168E 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+168f uni168F 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+1690 uni1690 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+1691 uni1691 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+1692 uni1692 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+1693 uni1693 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+1694 uni1694 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+1695 uni1695 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+1696 uni1696 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+1697 uni1697 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+1698 uni1698 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+1699 uni1699 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+169a uni169A 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+169b uni169B 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+169c uni169C 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+1d00 uni1D00 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d01 uni1D01 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d02 uni1D02 2.25 +U+1d03 uni1D03 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d04 uni1D04 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1d05 uni1D05 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d06 uni1D06 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d07 uni1D07 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d08 uni1D08 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1d09 uni1D09 2.25 +U+1d0a uni1D0A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d0b uni1D0B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1d0c uni1D0C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d0d uni1D0D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1d0e uni1D0E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1d0f uni1D0F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1d10 uni1D10 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1d11 uni1D11 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1d12 uni1D12 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1d13 uni1D13 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1d14 uni1D14 2.25 +U+1d16 uni1D16 2.25 +U+1d17 uni1D17 2.25 +U+1d18 uni1D18 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d19 uni1D19 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1d1a uni1D1A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1d1b uni1D1B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d1c uni1D1C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d1d uni1D1D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1d1e uni1D1E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1d1f uni1D1F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1d20 uni1D20 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1d21 uni1D21 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1d22 uni1D22 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1d23 uni1D23 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d26 uni1D26 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1d27 uni1D27 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1d28 uni1D28 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1d29 uni1D29 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d2a uni1D2A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d2b uni1D2B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1d2c uni1D2C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1d2d uni1D2D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1d2e uni1D2E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1d30 uni1D30 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1d31 uni1D31 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1d32 uni1D32 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1d33 uni1D33 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1d34 uni1D34 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1d35 uni1D35 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1d36 uni1D36 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1d37 uni1D37 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1d38 uni1D38 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1d39 uni1D39 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1d3a uni1D3A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1d3b uni1D3B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1d3c uni1D3C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1d3d uni1D3D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Oblique, Sans Oblique) +U+1d3e uni1D3E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1d3f uni1D3F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1d40 uni1D40 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1d41 uni1D41 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1d42 uni1D42 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1d43 uni1D43 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1d44 uni1D44 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1d45 uni1D45 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1d46 uni1D46 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1d47 uni1D47 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1d48 uni1D48 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1d49 uni1D49 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1d4a uni1D4A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1d4b uni1D4B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1d4c uni1D4C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1d4d uni1D4D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1d4e uni1D4E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1d4f uni1D4F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1d50 uni1D50 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1d51 uni1D51 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1d52 uni1D52 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1d53 uni1D53 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1d54 uni1D54 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1d55 uni1D55 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1d56 uni1D56 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1d57 uni1D57 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1d58 uni1D58 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1d59 uni1D59 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1d5a uni1D5A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1d5b uni1D5B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1d5d uni1D5D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d5e uni1D5E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d5f uni1D5F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d60 uni1D60 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d61 uni1D61 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d62 uni1D62 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1d63 uni1D63 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1d64 uni1D64 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1d65 uni1D65 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1d66 uni1D66 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d67 uni1D67 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d68 uni1D68 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d69 uni1D69 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d6a uni1D6A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d77 uni1D77 2.25 +U+1d78 uni1D78 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1d7b uni1D7B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1d85 uni1D85 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1d9b uni1D9B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1d9c uni1D9C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1d9d uni1D9D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1d9e uni1D9E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1d9f uni1D9F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1da0 uni1DA0 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1da1 uni1DA1 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1da2 uni1DA2 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1da3 uni1DA3 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1da4 uni1DA4 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1da5 uni1DA5 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1da6 uni1DA6 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1da7 uni1DA7 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1da8 uni1DA8 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1da9 uni1DA9 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1daa uni1DAA 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1dab uni1DAB 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1dac uni1DAC 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1dad uni1DAD 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1dae uni1DAE 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1daf uni1DAF 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1db0 uni1DB0 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1db1 uni1DB1 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1db2 uni1DB2 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1db3 uni1DB3 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1db4 uni1DB4 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1db5 uni1DB5 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1db6 uni1DB6 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1db7 uni1DB7 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1db8 uni1DB8 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1db9 uni1DB9 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1dba uni1DBA 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1dbb uni1DBB 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1dbc uni1DBC 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1dbd uni1DBD 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1dbe uni1DBE 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1dbf uni1DBF 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1dc4 uni1DC4 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1dc5 uni1DC5 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1dc6 uni1DC6 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1dc7 uni1DC7 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1dc8 uni1DC8 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1dc9 uni1DC9 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1e00 uni1E00 2.25 +U+1e01 uni1E01 2.25 +U+1e02 uni1E02 2.25 +U+1e03 uni1E03 2.25 +U+1e04 uni1E04 2.25 +U+1e05 uni1E05 2.25 +U+1e06 uni1E06 2.25 +U+1e07 uni1E07 2.25 +U+1e08 uni1E08 2.25 +U+1e09 uni1E09 2.25 +U+1e0a uni1E0A 2.25 +U+1e0b uni1E0B 2.25 +U+1e0c uni1E0C 2.25 +U+1e0d uni1E0D 2.25 +U+1e0e uni1E0E 2.25 +U+1e0f uni1E0F 2.25 +U+1e10 uni1E10 2.25 +U+1e11 uni1E11 2.25 +U+1e12 uni1E12 2.25 +U+1e13 uni1E13 2.25 +U+1e14 uni1E14 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1e15 uni1E15 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1e16 uni1E16 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1e17 uni1E17 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1e18 uni1E18 2.25 +U+1e19 uni1E19 2.25 +U+1e1a uni1E1A 2.25 +U+1e1b uni1E1B 2.25 +U+1e1c uni1E1C 2.25 +U+1e1d uni1E1D 2.25 +U+1e1e uni1E1E 2.25 +U+1e1f uni1E1F 2.25 +U+1e20 uni1E20 2.25 +U+1e21 uni1E21 2.25 +U+1e22 uni1E22 2.25 +U+1e23 uni1E23 2.25 +U+1e24 uni1E24 2.25 +U+1e25 uni1E25 2.25 +U+1e26 uni1E26 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1e27 uni1E27 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1e28 uni1E28 2.25 +U+1e29 uni1E29 2.25 +U+1e2a uni1E2A 2.25 +U+1e2b uni1E2B 2.25 +U+1e2c uni1E2C 2.25 +U+1e2d uni1E2D 2.25 +U+1e2e uni1E2E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1e2f uni1E2F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1e30 uni1E30 2.25 +U+1e31 uni1E31 2.25 +U+1e32 uni1E32 2.25 +U+1e33 uni1E33 2.25 +U+1e34 uni1E34 2.25 +U+1e35 uni1E35 2.25 +U+1e36 uni1E36 2.25 +U+1e37 uni1E37 2.25 +U+1e38 uni1E38 2.25 +U+1e39 uni1E39 2.25 +U+1e3a uni1E3A 2.25 +U+1e3b uni1E3B 2.25 +U+1e3c uni1E3C 2.25 +U+1e3d uni1E3D 2.25 +U+1e3e uni1E3E 2.25 +U+1e3f uni1E3F 2.25 +U+1e40 uni1E40 2.25 +U+1e41 uni1E41 2.25 +U+1e42 uni1E42 2.25 +U+1e43 uni1E43 2.25 +U+1e44 uni1E44 2.25 +U+1e45 uni1E45 2.25 +U+1e46 uni1E46 2.25 +U+1e47 uni1E47 2.25 +U+1e48 uni1E48 2.25 +U+1e49 uni1E49 2.25 +U+1e4a uni1E4A 2.25 +U+1e4b uni1E4B 2.25 +U+1e4c uni1E4C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1e4d uni1E4D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1e4e uni1E4E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1e4f uni1E4F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1e50 uni1E50 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1e51 uni1E51 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1e52 uni1E52 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1e53 uni1E53 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1e54 uni1E54 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1e55 uni1E55 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1e56 uni1E56 2.25 +U+1e57 uni1E57 2.25 +U+1e58 uni1E58 2.25 +U+1e59 uni1E59 2.25 +U+1e5a uni1E5A 2.25 +U+1e5b uni1E5B 2.25 +U+1e5c uni1E5C 2.25 +U+1e5d uni1E5D 2.25 +U+1e5e uni1E5E 2.25 +U+1e5f uni1E5F 2.25 +U+1e60 uni1E60 2.25 +U+1e61 uni1E61 2.25 +U+1e62 uni1E62 2.25 +U+1e63 uni1E63 2.25 +U+1e64 uni1E64 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1e65 uni1E65 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1e66 uni1E66 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1e67 uni1E67 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1e68 uni1E68 2.25 +U+1e69 uni1E69 2.25 +U+1e6a uni1E6A 2.25 +U+1e6b uni1E6B 2.25 +U+1e6c uni1E6C 2.25 +U+1e6d uni1E6D 2.25 +U+1e6e uni1E6E 2.25 +U+1e6f uni1E6F 2.25 +U+1e70 uni1E70 2.25 +U+1e71 uni1E71 2.25 +U+1e72 uni1E72 2.25 +U+1e73 uni1E73 2.25 +U+1e74 uni1E74 2.25 +U+1e75 uni1E75 2.25 +U+1e76 uni1E76 2.25 +U+1e77 uni1E77 2.25 +U+1e78 uni1E78 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1e79 uni1E79 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1e7a uni1E7A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1e7b uni1E7B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1e7c uni1E7C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1e7d uni1E7D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1e7e uni1E7E 2.25 +U+1e7f uni1E7F 2.25 +U+1e80 Wgrave 2.25 +U+1e81 wgrave 2.25 +U+1e82 Wacute 2.25 +U+1e83 wacute 2.25 +U+1e84 Wdieresis 2.25 +U+1e85 wdieresis 2.25 +U+1e86 uni1E86 2.25 +U+1e87 uni1E87 2.25 +U+1e88 uni1E88 2.25 +U+1e89 uni1E89 2.25 +U+1e8a uni1E8A 2.25 +U+1e8b uni1E8B 2.25 +U+1e8c uni1E8C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1e8d uni1E8D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1e8e uni1E8E 2.25 +U+1e8f uni1E8F 2.25 +U+1e90 uni1E90 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1e91 uni1E91 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1e92 uni1E92 2.25 +U+1e93 uni1E93 2.25 +U+1e94 uni1E94 2.25 +U+1e95 uni1E95 2.25 +U+1e96 uni1E96 2.25 +U+1e97 uni1E97 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1e98 uni1E98 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1e99 uni1E99 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1e9a uni1E9A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1e9b uni1E9B 2.25 +U+1e9f uni1E9F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1ea0 uni1EA0 2.25 +U+1ea1 uni1EA1 2.25 +U+1ea2 uni1EA2 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1ea3 uni1EA3 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1ea4 uni1EA4 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1ea5 uni1EA5 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1ea6 uni1EA6 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1ea7 uni1EA7 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1ea8 uni1EA8 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1ea9 uni1EA9 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1eaa uni1EAA 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1eab uni1EAB 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1eac uni1EAC 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1ead uni1EAD 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1eae uni1EAE 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1eaf uni1EAF 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1eb0 uni1EB0 2.25 +U+1eb1 uni1EB1 2.25 +U+1eb2 uni1EB2 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1eb3 uni1EB3 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1eb4 uni1EB4 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1eb5 uni1EB5 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1eb6 uni1EB6 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1eb7 uni1EB7 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1eb8 uni1EB8 2.25 +U+1eb9 uni1EB9 2.25 +U+1eba uni1EBA 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1ebb uni1EBB 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1ebc uni1EBC 2.25 +U+1ebd uni1EBD 2.25 +U+1ebe uni1EBE 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1ebf uni1EBF 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1ec0 uni1EC0 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1ec1 uni1EC1 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1ec2 uni1EC2 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1ec3 uni1EC3 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1ec4 uni1EC4 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1ec5 uni1EC5 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1ec6 uni1EC6 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1ec7 uni1EC7 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1ec8 uni1EC8 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1ec9 uni1EC9 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1eca uni1ECA 2.25 +U+1ecb uni1ECB 2.25 +U+1ecc uni1ECC 2.25 +U+1ecd uni1ECD 2.25 +U+1ece uni1ECE 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1ecf uni1ECF 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1ed0 uni1ED0 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1ed1 uni1ED1 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1ed2 uni1ED2 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1ed3 uni1ED3 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1ed4 uni1ED4 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1ed5 uni1ED5 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1ed6 uni1ED6 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1ed7 uni1ED7 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1ed8 uni1ED8 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1ed9 uni1ED9 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1eda uni1EDA 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1edb uni1EDB 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1edc uni1EDC 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1edd uni1EDD 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1ede uni1EDE 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1edf uni1EDF 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1ee0 uni1EE0 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1ee1 uni1EE1 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1ee2 uni1EE2 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1ee3 uni1EE3 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1ee4 uni1EE4 2.25 +U+1ee5 uni1EE5 2.25 +U+1ee6 uni1EE6 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1ee7 uni1EE7 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1ee8 uni1EE8 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1ee9 uni1EE9 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1eea uni1EEA 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1eeb uni1EEB 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1eec uni1EEC 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1eed uni1EED 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1eee uni1EEE 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1eef uni1EEF 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1ef0 uni1EF0 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1ef1 uni1EF1 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1ef2 Ygrave 2.25 +U+1ef3 ygrave 2.25 +U+1ef4 uni1EF4 2.25 +U+1ef5 uni1EF5 2.25 +U+1ef6 uni1EF6 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1ef7 uni1EF7 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1ef8 uni1EF8 2.25 +U+1ef9 uni1EF9 2.25 +U+1f00 uni1F00 2.25 +U+1f01 uni1F01 2.25 +U+1f02 uni1F02 2.25 +U+1f03 uni1F03 2.25 +U+1f04 uni1F04 2.25 +U+1f05 uni1F05 2.25 +U+1f06 uni1F06 2.25 +U+1f07 uni1F07 2.25 +U+1f08 uni1F08 2.25 +U+1f09 uni1F09 2.25 +U+1f0a uni1F0A 2.25 +U+1f0b uni1F0B 2.25 +U+1f0c uni1F0C 2.25 +U+1f0d uni1F0D 2.25 +U+1f0e uni1F0E 2.25 +U+1f0f uni1F0F 2.25 +U+1f10 uni1F10 2.25 +U+1f11 uni1F11 2.25 +U+1f12 uni1F12 2.25 +U+1f13 uni1F13 2.25 +U+1f14 uni1F14 2.25 +U+1f15 uni1F15 2.25 +U+1f18 uni1F18 2.25 +U+1f19 uni1F19 2.25 +U+1f1a uni1F1A 2.25 +U+1f1b uni1F1B 2.25 +U+1f1c uni1F1C 2.25 +U+1f1d uni1F1D 2.25 +U+1f20 uni1F20 2.25 +U+1f21 uni1F21 2.25 +U+1f22 uni1F22 2.25 +U+1f23 uni1F23 2.25 +U+1f24 uni1F24 2.25 +U+1f25 uni1F25 2.25 +U+1f26 uni1F26 2.25 +U+1f27 uni1F27 2.25 +U+1f28 uni1F28 2.25 +U+1f29 uni1F29 2.25 +U+1f2a uni1F2A 2.25 +U+1f2b uni1F2B 2.25 +U+1f2c uni1F2C 2.25 +U+1f2d uni1F2D 2.25 +U+1f2e uni1F2E 2.25 +U+1f2f uni1F2F 2.25 +U+1f30 uni1F30 2.25 +U+1f31 uni1F31 2.25 +U+1f32 uni1F32 2.25 +U+1f33 uni1F33 2.25 +U+1f34 uni1F34 2.25 +U+1f35 uni1F35 2.25 +U+1f36 uni1F36 2.25 +U+1f37 uni1F37 2.25 +U+1f38 uni1F38 2.25 +U+1f39 uni1F39 2.25 +U+1f3a uni1F3A 2.25 +U+1f3b uni1F3B 2.25 +U+1f3c uni1F3C 2.25 +U+1f3d uni1F3D 2.25 +U+1f3e uni1F3E 2.25 +U+1f3f uni1F3F 2.25 +U+1f40 uni1F40 2.25 +U+1f41 uni1F41 2.25 +U+1f42 uni1F42 2.25 +U+1f43 uni1F43 2.25 +U+1f44 uni1F44 2.25 +U+1f45 uni1F45 2.25 +U+1f48 uni1F48 2.25 +U+1f49 uni1F49 2.25 +U+1f4a uni1F4A 2.25 +U+1f4b uni1F4B 2.25 +U+1f4c uni1F4C 2.25 +U+1f4d uni1F4D 2.25 +U+1f50 uni1F50 2.25 +U+1f51 uni1F51 2.25 +U+1f52 uni1F52 2.25 +U+1f53 uni1F53 2.25 +U+1f54 uni1F54 2.25 +U+1f55 uni1F55 2.25 +U+1f56 uni1F56 2.25 +U+1f57 uni1F57 2.25 +U+1f59 uni1F59 2.25 +U+1f5b uni1F5B 2.25 +U+1f5d uni1F5D 2.25 +U+1f5f uni1F5F 2.25 +U+1f60 uni1F60 2.25 +U+1f61 uni1F61 2.25 +U+1f62 uni1F62 2.25 +U+1f63 uni1F63 2.25 +U+1f64 uni1F64 2.25 +U+1f65 uni1F65 2.25 +U+1f66 uni1F66 2.25 +U+1f67 uni1F67 2.25 +U+1f68 uni1F68 2.25 +U+1f69 uni1F69 2.25 +U+1f6a uni1F6A 2.25 +U+1f6b uni1F6B 2.25 +U+1f6c uni1F6C 2.25 +U+1f6d uni1F6D 2.25 +U+1f6e uni1F6E 2.25 +U+1f6f uni1F6F 2.25 +U+1f70 uni1F70 2.25 +U+1f71 uni1F71 2.25 +U+1f72 uni1F72 2.25 +U+1f73 uni1F73 2.25 +U+1f74 uni1F74 2.25 +U+1f75 uni1F75 2.25 +U+1f76 uni1F76 2.25 +U+1f77 uni1F77 2.25 +U+1f78 uni1F78 2.25 +U+1f79 uni1F79 2.25 +U+1f7a uni1F7A 2.25 +U+1f7b uni1F7B 2.25 +U+1f7c uni1F7C 2.25 +U+1f7d uni1F7D 2.25 +U+1f80 uni1F80 2.25 +U+1f81 uni1F81 2.25 +U+1f82 uni1F82 2.25 +U+1f83 uni1F83 2.25 +U+1f84 uni1F84 2.25 +U+1f85 uni1F85 2.25 +U+1f86 uni1F86 2.25 +U+1f87 uni1F87 2.25 +U+1f88 uni1F88 2.25 +U+1f89 uni1F89 2.25 +U+1f8a uni1F8A 2.25 +U+1f8b uni1F8B 2.25 +U+1f8c uni1F8C 2.25 +U+1f8d uni1F8D 2.25 +U+1f8e uni1F8E 2.25 +U+1f8f uni1F8F 2.25 +U+1f90 uni1F90 2.25 +U+1f91 uni1F91 2.25 +U+1f92 uni1F92 2.25 +U+1f93 uni1F93 2.25 +U+1f94 uni1F94 2.25 +U+1f95 uni1F95 2.25 +U+1f96 uni1F96 2.25 +U+1f97 uni1F97 2.25 +U+1f98 uni1F98 2.25 +U+1f99 uni1F99 2.25 +U+1f9a uni1F9A 2.25 +U+1f9b uni1F9B 2.25 +U+1f9c uni1F9C 2.25 +U+1f9d uni1F9D 2.25 +U+1f9e uni1F9E 2.25 +U+1f9f uni1F9F 2.25 +U+1fa0 uni1FA0 2.25 +U+1fa1 uni1FA1 2.25 +U+1fa2 uni1FA2 2.25 +U+1fa3 uni1FA3 2.25 +U+1fa4 uni1FA4 2.25 +U+1fa5 uni1FA5 2.25 +U+1fa6 uni1FA6 2.25 +U+1fa7 uni1FA7 2.25 +U+1fa8 uni1FA8 2.25 +U+1fa9 uni1FA9 2.25 +U+1faa uni1FAA 2.25 +U+1fab uni1FAB 2.25 +U+1fac uni1FAC 2.25 +U+1fad uni1FAD 2.25 +U+1fae uni1FAE 2.25 +U+1faf uni1FAF 2.25 +U+1fb0 uni1FB0 2.25 +U+1fb1 uni1FB1 2.25 +U+1fb2 uni1FB2 2.25 +U+1fb3 uni1FB3 2.25 +U+1fb4 uni1FB4 2.25 +U+1fb6 uni1FB6 2.25 +U+1fb7 uni1FB7 2.25 +U+1fb8 uni1FB8 2.25 +U+1fb9 uni1FB9 2.25 +U+1fba uni1FBA 2.25 +U+1fbb uni1FBB 2.25 +U+1fbc uni1FBC 2.25 +U+1fbd uni1FBD 2.25 +U+1fbe uni1FBE 2.25 +U+1fbf uni1FBF 2.25 +U+1fc0 uni1FC0 2.25 +U+1fc1 uni1FC1 2.25 +U+1fc2 uni1FC2 2.25 +U+1fc3 uni1FC3 2.25 +U+1fc4 uni1FC4 2.25 +U+1fc6 uni1FC6 2.25 +U+1fc7 uni1FC7 2.25 +U+1fc8 uni1FC8 2.25 +U+1fc9 uni1FC9 2.25 +U+1fca uni1FCA 2.25 +U+1fcb uni1FCB 2.25 +U+1fcc uni1FCC 2.25 +U+1fcd uni1FCD 2.25 +U+1fce uni1FCE 2.25 +U+1fcf uni1FCF 2.25 +U+1fd0 uni1FD0 2.25 +U+1fd1 uni1FD1 2.25 +U+1fd2 uni1FD2 2.25 +U+1fd3 uni1FD3 2.25 +U+1fd6 uni1FD6 2.25 +U+1fd7 uni1FD7 2.25 +U+1fd8 uni1FD8 2.25 +U+1fd9 uni1FD9 2.25 +U+1fda uni1FDA 2.25 +U+1fdb uni1FDB 2.25 +U+1fdd uni1FDD 2.25 +U+1fde uni1FDE 2.25 +U+1fdf uni1FDF 2.25 +U+1fe0 uni1FE0 2.25 +U+1fe1 uni1FE1 2.25 +U+1fe2 uni1FE2 2.25 +U+1fe3 uni1FE3 2.25 +U+1fe4 uni1FE4 2.25 +U+1fe5 uni1FE5 2.25 +U+1fe6 uni1FE6 2.25 +U+1fe7 uni1FE7 2.25 +U+1fe8 uni1FE8 2.25 +U+1fe9 uni1FE9 2.25 +U+1fea uni1FEA 2.25 +U+1feb uni1FEB 2.25 +U+1fec uni1FEC 2.25 +U+1fed uni1FED 2.25 +U+1fee uni1FEE 2.25 +U+1fef uni1FEF 2.25 +U+1ff2 uni1FF2 2.25 +U+1ff3 uni1FF3 2.25 +U+1ff4 uni1FF4 2.25 +U+1ff6 uni1FF6 2.25 +U+1ff7 uni1FF7 2.25 +U+1ff8 uni1FF8 2.25 +U+1ff9 uni1FF9 2.25 +U+1ffa uni1FFA 2.25 +U+1ffb uni1FFB 2.25 +U+1ffc uni1FFC 2.25 +U+1ffd uni1FFD 2.25 +U+1ffe uni1FFE 2.25 +U+2000 uni2000 2.25 +U+2001 uni2001 2.25 +U+2002 uni2002 2.25 +U+2003 uni2003 2.25 +U+2004 uni2004 2.25 +U+2005 uni2005 2.25 +U+2006 uni2006 2.25 +U+2007 uni2007 2.25 +U+2008 uni2008 2.25 +U+2009 uni2009 2.25 +U+200a uni200A 2.25 +U+200b uni200B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+200c uni200C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+200d uni200D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+200e uni200E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+200f uni200F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2010 uni2010 2.25 +U+2011 uni2011 2.25 +U+2012 figuredash 2.25 +U+2013 endash 2.25 +U+2014 emdash 2.25 +U+2015 uni2015 2.25 +U+2016 uni2016 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+2017 underscoredbl 2.25 +U+2018 quoteleft 2.25 +U+2019 quoteright 2.25 +U+201a quotesinglbase 2.25 +U+201b quotereversed 2.25 +U+201c quotedblleft 2.25 +U+201d quotedblright 2.25 +U+201e quotedblbase 2.25 +U+201f uni201F 2.25 +U+2020 dagger 2.25 +U+2021 daggerdbl 2.25 +U+2022 bullet 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2023 uni2023 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2024 onedotenleader 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2025 twodotenleader 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2026 ellipsis 2.25 +U+2027 uni2027 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+202a uni202A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+202b uni202B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+202c uni202C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+202d uni202D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+202e uni202E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+202f uni202F 2.25 +U+2030 perthousand 2.25 +U+2031 uni2031 2.25 +U+2032 minute 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2033 second 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2034 uni2034 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2035 uni2035 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2036 uni2036 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2037 uni2037 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2038 uni2038 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2039 guilsinglleft 2.25 +U+203a guilsinglright 2.25 +U+203b uni203B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+203c exclamdbl 2.25 +U+203d uni203D 2.25 +U+203e uni203E 2.25 +U+203f uni203F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+2040 uni2040 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+2041 uni2041 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2042 uni2042 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+2043 uni2043 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+2044 fraction 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+2045 uni2045 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2046 uni2046 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2047 uni2047 2.25 +U+2048 uni2048 2.25 +U+2049 uni2049 2.25 +U+204a uni204A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+204b uni204B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+204c uni204C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+204d uni204D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+204e uni204E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+204f uni204F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+2050 uni2050 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+2051 uni2051 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+2052 uni2052 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+2053 uni2053 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+2054 uni2054 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+2055 uni2055 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2056 uni2056 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2057 uni2057 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2058 uni2058 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2059 uni2059 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+205a uni205A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+205b uni205B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+205c uni205C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+205d uni205D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+205e uni205E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+205f uni205F 2.25 +U+2060 uni2060 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2061 uni2061 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2062 uni2062 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2063 uni2063 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2064 uni2064 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+206a uni206A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+206b uni206B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+206c uni206C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+206d uni206D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+206e uni206E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+206f uni206F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2070 uni2070 2.25 +U+2071 uni2071 2.25 +U+2074 uni2074 2.25 +U+2075 uni2075 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2076 uni2076 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2077 uni2077 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2078 uni2078 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2079 uni2079 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+207a uni207A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+207b uni207B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+207c uni207C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+207d uni207D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+207e uni207E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+207f uni207F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2080 uni2080 2.25 +U+2081 uni2081 2.25 +U+2082 uni2082 2.25 +U+2083 uni2083 2.25 +U+2084 uni2084 2.25 +U+2085 uni2085 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2086 uni2086 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2087 uni2087 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2088 uni2088 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2089 uni2089 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+208a uni208A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+208b uni208B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+208c uni208C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+208d uni208D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+208e uni208E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2090 uni2090 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2091 uni2091 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2092 uni2092 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2093 uni2093 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2094 uni2094 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+20a0 uni20A0 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+20a1 colonmonetary 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+20a2 uni20A2 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+20a3 franc 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+20a4 lira 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+20a5 uni20A5 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+20a6 uni20A6 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+20a7 peseta 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+20a8 uni20A8 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+20a9 uni20A9 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+20aa uni20AA 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+20ab dong 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+20ac Euro 2.25 +U+20ad uni20AD 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+20ae uni20AE 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+20af uni20AF 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+20b0 uni20B0 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+20b1 uni20B1 2.25 +U+20b2 uni20B2 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+20b3 uni20B3 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+20b4 uni20B4 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+20b5 uni20B5 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+20d0 uni20D0 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+20d1 uni20D1 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+20d6 uni20D6 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+20d7 uni20D7 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+20db uni20DB 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+20dc uni20DC 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+20e1 uni20E1 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2100 uni2100 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2101 uni2101 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2102 uni2102 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed) +U+2103 uni2103 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2104 uni2104 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2105 uni2105 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2106 uni2106 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2107 uni2107 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2108 uni2108 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2109 uni2109 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+210b uni210B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+210c uni210C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+210d uni210D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed) +U+210e uni210E 2.25 +U+210f uni210F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2110 uni2110 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2111 Ifraktur 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2112 uni2112 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2113 uni2113 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2114 uni2114 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2115 uni2115 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed) +U+2116 uni2116 2.25 +U+2117 uni2117 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+2118 weierstrass 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2119 uni2119 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed) +U+211a uni211A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed) +U+211b uni211B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+211c Rfraktur 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+211d uni211D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed) +U+211e prescription 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+211f uni211F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2120 uni2120 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2121 uni2121 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2122 trademark 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2123 uni2123 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2124 uni2124 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed) +U+2125 uni2125 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2126 uni2126 2.25 +U+2127 uni2127 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2128 uni2128 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2129 uni2129 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+212a uni212A 2.25 +U+212b uni212B 2.25 +U+212c uni212C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+212d uni212D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+212e estimated 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+212f uni212F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2130 uni2130 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2131 uni2131 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2132 uni2132 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+2133 uni2133 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2134 uni2134 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+2135 aleph 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2136 uni2136 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2137 uni2137 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2138 uni2138 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2139 uni2139 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+213a uni213A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+213b uni213B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+213c uni213C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed) +U+213d uni213D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed) +U+213e uni213E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed) +U+213f uni213F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed) +U+2140 uni2140 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed) +U+2141 uni2141 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2142 uni2142 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2143 uni2143 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2144 uni2144 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2145 uni2145 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed) +U+2146 uni2146 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed) +U+2147 uni2147 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed) +U+2148 uni2148 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed) +U+2149 uni2149 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed) +U+214b uni214B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+214e uni214E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2153 onethird 2.25 +U+2154 twothirds 2.25 +U+2155 uni2155 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2156 uni2156 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2157 uni2157 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2158 uni2158 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2159 uni2159 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+215a uni215A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+215b oneeighth 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+215c threeeighths 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+215d fiveeighths 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+215e seveneighths 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+215f uni215F 2.25 +U+2160 uni2160 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2161 uni2161 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2162 uni2162 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2163 uni2163 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2164 uni2164 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2165 uni2165 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2166 uni2166 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2167 uni2167 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2168 uni2168 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2169 uni2169 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+216a uni216A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+216b uni216B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+216c uni216C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+216d uni216D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+216e uni216E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+216f uni216F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2170 uni2170 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2171 uni2171 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2172 uni2172 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2173 uni2173 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2174 uni2174 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2175 uni2175 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2176 uni2176 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2177 uni2177 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2178 uni2178 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2179 uni2179 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+217a uni217A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+217b uni217B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+217c uni217C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+217d uni217D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+217e uni217E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+217f uni217F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2180 uni2180 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2181 uni2181 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2182 uni2182 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2183 uni2183 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2184 uni2184 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2190 arrowleft 2.25 +U+2191 arrowup 2.25 +U+2192 arrowright 2.25 +U+2193 arrowdown 2.25 +U+2194 arrowboth 2.25 +U+2195 arrowupdn 2.25 +U+2196 uni2196 2.25 +U+2197 uni2197 2.25 +U+2198 uni2198 2.25 +U+2199 uni2199 2.25 +U+219a uni219A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+219b uni219B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+219c uni219C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+219d uni219D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+219e uni219E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+219f uni219F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+21a0 uni21A0 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+21a1 uni21A1 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+21a2 uni21A2 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+21a3 uni21A3 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+21a4 uni21A4 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+21a5 uni21A5 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+21a6 uni21A6 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+21a7 uni21A7 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+21a8 arrowupdnbse 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+21a9 uni21A9 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+21aa uni21AA 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+21ab uni21AB 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+21ac uni21AC 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+21ad uni21AD 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+21ae uni21AE 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+21af uni21AF 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+21b0 uni21B0 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+21b1 uni21B1 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+21b2 uni21B2 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+21b3 uni21B3 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+21b4 uni21B4 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+21b5 carriagereturn 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+21b6 uni21B6 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+21b7 uni21B7 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+21b8 uni21B8 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+21b9 uni21B9 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+21ba uni21BA 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+21bb uni21BB 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+21bc uni21BC 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+21bd uni21BD 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+21be uni21BE 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+21bf uni21BF 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+21c0 uni21C0 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+21c1 uni21C1 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+21c2 uni21C2 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+21c3 uni21C3 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+21c4 uni21C4 2.25 +U+21c5 uni21C5 2.25 +U+21c6 uni21C6 2.25 +U+21c7 uni21C7 2.25 +U+21c8 uni21C8 2.25 +U+21c9 uni21C9 2.25 +U+21ca uni21CA 2.25 +U+21cb uni21CB 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+21cc uni21CC 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+21cd uni21CD 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+21ce uni21CE 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+21cf uni21CF 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+21d0 arrowdblleft 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+21d1 arrowdblup 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+21d2 arrowdblright 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+21d3 arrowdbldown 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+21d4 arrowdblboth 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+21d5 uni21D5 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+21d6 uni21D6 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+21d7 uni21D7 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+21d8 uni21D8 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+21d9 uni21D9 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+21da uni21DA 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+21db uni21DB 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+21dc uni21DC 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+21dd uni21DD 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+21de uni21DE 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+21df uni21DF 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+21e0 uni21E0 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+21e1 uni21E1 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+21e2 uni21E2 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+21e3 uni21E3 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+21e4 uni21E4 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+21e5 uni21E5 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+21e6 uni21E6 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+21e7 uni21E7 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+21e8 uni21E8 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+21e9 uni21E9 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+21ea uni21EA 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+21eb uni21EB 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+21ec uni21EC 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+21ed uni21ED 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+21ee uni21EE 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+21ef uni21EF 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+21f0 uni21F0 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+21f1 uni21F1 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+21f2 uni21F2 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+21f3 uni21F3 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+21f4 uni21F4 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+21f5 uni21F5 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+21f6 uni21F6 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+21f7 uni21F7 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+21f8 uni21F8 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+21f9 uni21F9 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+21fa uni21FA 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+21fb uni21FB 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+21fc uni21FC 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+21fd uni21FD 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+21fe uni21FE 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+21ff uni21FF 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2200 universal 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2201 uni2201 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2202 partialdiff 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2203 existential 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2204 uni2204 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2205 emptyset 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2206 Delta 2.25 +U+2207 gradient 2.25 +U+2208 element 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2209 notelement 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+220a uni220A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+220b suchthat 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+220c uni220C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+220d uni220D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+220e uni220E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+220f product 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2210 uni2210 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2211 summation 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2212 minus 2.25 +U+2213 uni2213 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2214 uni2214 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2215 uni2215 2.25 +U+2216 uni2216 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+2217 asteriskmath 2.25 +U+2218 uni2218 2.25 +U+2219 uni2219 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+221a radical 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+221b uni221B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+221c uni221C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+221d proportional 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+221e infinity 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+221f orthogonal 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2220 angle 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2221 uni2221 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2222 uni2222 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2223 uni2223 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2224 uni2224 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2225 uni2225 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2226 uni2226 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2227 logicaland 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2228 logicalor 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2229 intersection 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+222a union 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+222b integral 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+222c uni222C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+222d uni222D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+222e uni222E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+222f uni222F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2230 uni2230 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2231 uni2231 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2232 uni2232 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2233 uni2233 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2234 therefore 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+2235 uni2235 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+2236 uni2236 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+2237 uni2237 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+2238 uni2238 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2239 uni2239 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+223a uni223A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+223b uni223B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+223c similar 2.25 +U+223d uni223D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+223e uni223E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+223f uni223F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2240 uni2240 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2241 uni2241 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2242 uni2242 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2243 uni2243 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2244 uni2244 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2245 congruent 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2246 uni2246 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2247 uni2247 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2248 approxequal 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2249 uni2249 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+224a uni224A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+224b uni224B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+224c uni224C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+224d uni224D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+224e uni224E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+224f uni224F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2250 uni2250 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2251 uni2251 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2252 uni2252 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2253 uni2253 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2254 uni2254 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2255 uni2255 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2256 uni2256 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2257 uni2257 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2258 uni2258 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2259 uni2259 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+225a uni225A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+225b uni225B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+225c uni225C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+225d uni225D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+225e uni225E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+225f uni225F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2260 notequal 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2261 equivalence 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2262 uni2262 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2263 uni2263 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2264 lessequal 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2265 greaterequal 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2266 uni2266 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2267 uni2267 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2268 uni2268 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2269 uni2269 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+226a uni226A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+226b uni226B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+226c uni226C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+226d uni226D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+226e uni226E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+226f uni226F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2270 uni2270 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2271 uni2271 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2272 uni2272 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2273 uni2273 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2274 uni2274 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2275 uni2275 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2276 uni2276 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2277 uni2277 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2278 uni2278 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2279 uni2279 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+227a uni227A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+227b uni227B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+227c uni227C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+227d uni227D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+227e uni227E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+227f uni227F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2280 uni2280 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2281 uni2281 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2282 propersubset 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2283 propersuperset 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2284 notsubset 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2285 uni2285 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2286 reflexsubset 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2287 reflexsuperset 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2288 uni2288 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2289 uni2289 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+228a uni228A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+228b uni228B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+228c uni228C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+228d uni228D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+228e uni228E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+228f uni228F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2290 uni2290 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2291 uni2291 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2292 uni2292 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2293 uni2293 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2294 uni2294 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2295 circleplus 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2296 uni2296 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2297 circlemultiply 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2298 uni2298 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2299 uni2299 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+229a uni229A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+229b uni229B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+229c uni229C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+229d uni229D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+229e uni229E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+229f uni229F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+22a0 uni22A0 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+22a1 uni22A1 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+22a2 uni22A2 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+22a3 uni22A3 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+22a4 uni22A4 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+22a5 perpendicular 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+22a6 uni22A6 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+22a7 uni22A7 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+22a8 uni22A8 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+22a9 uni22A9 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+22aa uni22AA 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+22ab uni22AB 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+22ac uni22AC 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+22ad uni22AD 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+22ae uni22AE 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+22af uni22AF 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+22b2 uni22B2 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22b3 uni22B3 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22b4 uni22B4 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22b5 uni22B5 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22b6 uni22B6 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22b7 uni22B7 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22b8 uni22B8 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22b9 uni22B9 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22ba uni22BA 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22bb uni22BB 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22bc uni22BC 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22bd uni22BD 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22be uni22BE 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22bf uni22BF 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22c0 uni22C0 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22c1 uni22C1 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22c2 uni22C2 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22c3 uni22C3 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22c4 uni22C4 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22c5 dotmath 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+22c6 uni22C6 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+22c8 uni22C8 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22c9 uni22C9 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22ca uni22CA 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22cb uni22CB 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22cc uni22CC 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22cd uni22CD 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+22ce uni22CE 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22cf uni22CF 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22d6 uni22D6 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22d7 uni22D7 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22d8 uni22D8 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22d9 uni22D9 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22da uni22DA 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+22db uni22DB 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+22dc uni22DC 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+22dd uni22DD 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+22de uni22DE 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+22df uni22DF 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+22e0 uni22E0 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+22e1 uni22E1 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+22e2 uni22E2 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+22e3 uni22E3 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+22e4 uni22E4 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+22e5 uni22E5 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+22e6 uni22E6 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+22e7 uni22E7 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+22e8 uni22E8 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+22e9 uni22E9 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+22ea uni22EA 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22eb uni22EB 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22ec uni22EC 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22ed uni22ED 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22ee uni22EE 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22ef uni22EF 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+22f0 uni22F0 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22f1 uni22F1 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22f2 uni22F2 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22f3 uni22F3 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22f4 uni22F4 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22f5 uni22F5 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22f6 uni22F6 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22f7 uni22F7 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22f8 uni22F8 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22f9 uni22F9 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22fa uni22FA 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22fb uni22FB 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22fc uni22FC 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22fd uni22FD 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22fe uni22FE 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22ff uni22FF 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2300 uni2300 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2301 uni2301 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2302 house 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2303 uni2303 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2304 uni2304 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2305 uni2305 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2306 uni2306 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2307 uni2307 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2308 uni2308 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2309 uni2309 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+230a uni230A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+230b uni230B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+230c uni230C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+230d uni230D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+230e uni230E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+230f uni230F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2310 revlogicalnot 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2311 uni2311 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2312 uni2312 2.25 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2313 uni2313 2.25 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2314 uni2314 2.25 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2315 uni2315 2.25 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2318 uni2318 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2319 uni2319 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+231c uni231C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+231d uni231D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+231e uni231E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+231f uni231F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2320 integraltp 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2321 integralbt 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2324 uni2324 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2325 uni2325 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2326 uni2326 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2327 uni2327 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2328 uni2328 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+232b uni232B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+232c uni232C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2335 uni2335 2.25 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2337 uni2337 2.25 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2338 uni2338 2.25 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2339 uni2339 2.25 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+233a uni233A 2.25 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+233b uni233B 2.25 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+233c uni233C 2.25 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+233d uni233D 2.25 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+233e uni233E 2.25 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2341 uni2341 2.25 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2342 uni2342 2.25 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2343 uni2343 2.25 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2344 uni2344 2.25 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2347 uni2347 2.25 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2348 uni2348 2.25 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2349 uni2349 2.25 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+234b uni234B 2.25 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+234c uni234C 2.25 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+234d uni234D 2.25 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2350 uni2350 2.25 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2352 uni2352 2.25 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2353 uni2353 2.25 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2354 uni2354 2.25 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2357 uni2357 2.25 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2358 uni2358 2.25 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2359 uni2359 2.25 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+235a uni235A 2.25 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+235b uni235B 2.25 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+235c uni235C 2.25 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+235e uni235E 2.25 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+235f uni235F 2.25 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2360 uni2360 2.25 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2363 uni2363 2.25 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2364 uni2364 2.25 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2365 uni2365 2.25 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2368 uni2368 2.25 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2369 uni2369 2.25 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+236b uni236B 2.25 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+236c uni236C 2.25 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+236d uni236D 2.25 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+236e uni236E 2.25 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+236f uni236F 2.25 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2370 uni2370 2.25 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2373 uni2373 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2374 uni2374 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2375 uni2375 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2376 uni2376 2.25 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2377 uni2377 2.25 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2378 uni2378 2.25 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2379 uni2379 2.25 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+237a uni237A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+237d uni237D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2380 uni2380 2.25 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2381 uni2381 2.25 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2382 uni2382 2.25 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2383 uni2383 2.25 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2387 uni2387 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2388 uni2388 2.25 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2389 uni2389 2.25 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+238a uni238A 2.25 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+238b uni238B 2.25 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2394 uni2394 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2395 uni2395 2.25 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+239b uni239B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+239c uni239C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+239d uni239D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+239e uni239E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+239f uni239F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+23a0 uni23A0 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+23a1 uni23A1 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+23a2 uni23A2 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+23a3 uni23A3 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+23a4 uni23A4 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+23a5 uni23A5 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+23a6 uni23A6 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+23a7 uni23A7 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+23a8 uni23A8 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+23a9 uni23A9 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+23aa uni23AA 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+23ab uni23AB 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+23ac uni23AC 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+23ad uni23AD 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+23ae uni23AE 2.25 +U+23ce uni23CE 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+23cf uni23CF 2.25 +U+23e3 uni23E3 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+23e5 uni23E5 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2422 uni2422 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2423 uni2423 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2460 uni2460 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2461 uni2461 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2462 uni2462 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2463 uni2463 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2464 uni2464 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2465 uni2465 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2466 uni2466 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2467 uni2467 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2468 uni2468 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2469 uni2469 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2500 SF100000 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+2501 uni2501 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+2502 SF110000 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+2503 uni2503 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+2504 uni2504 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+2505 uni2505 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+2506 uni2506 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+2507 uni2507 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+2508 uni2508 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+2509 uni2509 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+250a uni250A 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+250b uni250B 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+250c SF010000 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+250d uni250D 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+250e uni250E 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+250f uni250F 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+2510 SF030000 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+2511 uni2511 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+2512 uni2512 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+2513 uni2513 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+2514 SF020000 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+2515 uni2515 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+2516 uni2516 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+2517 uni2517 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+2518 SF040000 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+2519 uni2519 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+251a uni251A 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+251b uni251B 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+251c SF080000 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+251d uni251D 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+251e uni251E 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+251f uni251F 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+2520 uni2520 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+2521 uni2521 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+2522 uni2522 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+2523 uni2523 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+2524 SF090000 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+2525 uni2525 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+2526 uni2526 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+2527 uni2527 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+2528 uni2528 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+2529 uni2529 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+252a uni252A 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+252b uni252B 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+252c SF060000 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+252d uni252D 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+252e uni252E 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+252f uni252F 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+2530 uni2530 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+2531 uni2531 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+2532 uni2532 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+2533 uni2533 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+2534 SF070000 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+2535 uni2535 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+2536 uni2536 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+2537 uni2537 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+2538 uni2538 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+2539 uni2539 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+253a uni253A 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+253b uni253B 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+253c SF050000 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+253d uni253D 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+253e uni253E 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+253f uni253F 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+2540 uni2540 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+2541 uni2541 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+2542 uni2542 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+2543 uni2543 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+2544 uni2544 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+2545 uni2545 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+2546 uni2546 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+2547 uni2547 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+2548 uni2548 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+2549 uni2549 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+254a uni254A 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+254b uni254B 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+254c uni254C 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+254d uni254D 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+254e uni254E 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+254f uni254F 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+2550 SF430000 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+2551 SF240000 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+2552 SF510000 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+2553 SF520000 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+2554 SF390000 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+2555 SF220000 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+2556 SF210000 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+2557 SF250000 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+2558 SF500000 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+2559 SF490000 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+255a SF380000 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+255b SF280000 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+255c SF270000 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+255d SF260000 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+255e SF360000 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+255f SF370000 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+2560 SF420000 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+2561 SF190000 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+2562 SF200000 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+2563 SF230000 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+2564 SF470000 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+2565 SF480000 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+2566 SF410000 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+2567 SF450000 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+2568 SF460000 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+2569 SF400000 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+256a SF540000 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+256b SF530000 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+256c SF440000 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+256d uni256D 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+256e uni256E 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+256f uni256F 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+2570 uni2570 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+2571 uni2571 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+2572 uni2572 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+2573 uni2573 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+2574 uni2574 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+2575 uni2575 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+2576 uni2576 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+2577 uni2577 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+2578 uni2578 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+2579 uni2579 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+257a uni257A 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+257b uni257B 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+257c uni257C 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+257d uni257D 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+257e uni257E 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+257f uni257F 2.25 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Mono, Sans Mono Oblique, Sans Oblique, Serif, Serif Condensed, Serif Italic, Serif Italic Condensed) +U+2580 upblock 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2581 uni2581 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2582 uni2582 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2583 uni2583 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2584 dnblock 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2585 uni2585 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2586 uni2586 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2587 uni2587 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2588 block 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2589 uni2589 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+258a uni258A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+258b uni258B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+258c lfblock 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+258d uni258D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+258e uni258E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+258f uni258F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2590 rtblock 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2591 ltshade 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2592 shade 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2593 dkshade 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2594 uni2594 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2595 uni2595 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2596 uni2596 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2597 uni2597 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2598 uni2598 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2599 uni2599 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+259a uni259A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+259b uni259B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+259c uni259C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+259d uni259D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+259e uni259E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+259f uni259F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25a0 filledbox 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25a1 H22073 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25a2 uni25A2 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25a3 uni25A3 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25a4 uni25A4 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25a5 uni25A5 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25a6 uni25A6 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25a7 uni25A7 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25a8 uni25A8 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25a9 uni25A9 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25aa H18543 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25ab H18551 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25ac filledrect 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25ad uni25AD 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25ae uni25AE 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25af uni25AF 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25b0 uni25B0 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25b1 uni25B1 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25b2 triagup 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25b3 uni25B3 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25b4 uni25B4 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25b5 uni25B5 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25b6 uni25B6 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25b7 uni25B7 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25b8 uni25B8 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25b9 uni25B9 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25ba triagrt 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25bb uni25BB 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25bc triagdn 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25bd uni25BD 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25be uni25BE 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25bf uni25BF 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25c0 uni25C0 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25c1 uni25C1 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25c2 uni25C2 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25c3 uni25C3 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25c4 triaglf 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25c5 uni25C5 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25c6 uni25C6 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25c7 uni25C7 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25c8 uni25C8 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25c9 uni25C9 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25ca lozenge 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25cb circle 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25cc uni25CC 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25cd uni25CD 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25ce uni25CE 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25cf H18533 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25d0 uni25D0 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25d1 uni25D1 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25d2 uni25D2 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25d3 uni25D3 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25d4 uni25D4 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25d5 uni25D5 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25d6 uni25D6 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25d7 uni25D7 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25d8 invbullet 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25d9 invcircle 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25da uni25DA 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25db uni25DB 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25dc uni25DC 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25dd uni25DD 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25de uni25DE 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25df uni25DF 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25e0 uni25E0 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25e1 uni25E1 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25e2 uni25E2 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25e3 uni25E3 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25e4 uni25E4 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25e5 uni25E5 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25e6 openbullet 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25e7 uni25E7 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25e8 uni25E8 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25e9 uni25E9 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25ea uni25EA 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25eb uni25EB 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25ec uni25EC 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25ed uni25ED 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25ee uni25EE 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25ef uni25EF 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25f0 uni25F0 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25f1 uni25F1 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25f2 uni25F2 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25f3 uni25F3 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25f4 uni25F4 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25f5 uni25F5 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25f6 uni25F6 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25f7 uni25F7 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25f8 uni25F8 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25f9 uni25F9 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25fa uni25FA 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25fb uni25FB 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25fc uni25FC 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25fd uni25FD 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25fe uni25FE 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+25ff uni25FF 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2600 uni2600 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2601 uni2601 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2602 uni2602 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2603 uni2603 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2604 uni2604 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2605 uni2605 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2606 uni2606 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2607 uni2607 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2608 uni2608 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2609 uni2609 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+260a uni260A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+260b uni260B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+260c uni260C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+260d uni260D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+260e uni260E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+260f uni260F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2610 uni2610 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2611 uni2611 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2612 uni2612 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2613 uni2613 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2614 uni2614 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2615 uni2615 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2616 uni2616 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2617 uni2617 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2618 uni2618 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2619 uni2619 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+261a uni261A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+261b uni261B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+261c uni261C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+261d uni261D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+261e uni261E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+261f uni261F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2620 uni2620 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2621 uni2621 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2622 uni2622 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2623 uni2623 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2624 uni2624 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2625 uni2625 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2626 uni2626 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2627 uni2627 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2628 uni2628 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2629 uni2629 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+262a uni262A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+262b uni262B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+262c uni262C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+262d uni262D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+262e uni262E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+262f uni262F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2630 uni2630 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2631 uni2631 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2632 uni2632 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2633 uni2633 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2634 uni2634 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2635 uni2635 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2636 uni2636 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2637 uni2637 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2638 uni2638 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2639 uni2639 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+263a smileface 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+263b invsmileface 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+263c sun 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+263d uni263D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+263e uni263E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+263f uni263F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2640 female 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2641 uni2641 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2642 male 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2643 uni2643 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2644 uni2644 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2645 uni2645 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2646 uni2646 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2647 uni2647 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2648 uni2648 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2649 uni2649 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+264a uni264A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+264b uni264B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+264c uni264C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+264d uni264D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+264e uni264E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+264f uni264F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2650 uni2650 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2651 uni2651 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2652 uni2652 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2653 uni2653 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2654 uni2654 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2655 uni2655 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2656 uni2656 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2657 uni2657 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2658 uni2658 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2659 uni2659 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+265a uni265A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+265b uni265B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+265c uni265C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+265d uni265D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+265e uni265E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+265f uni265F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2660 spade 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2661 uni2661 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2662 uni2662 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2663 club 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2664 uni2664 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2665 heart 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2666 diamond 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2667 uni2667 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2668 uni2668 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2669 uni2669 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+266a musicalnote 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+266b musicalnotedbl 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+266c uni266C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+266d uni266D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+266e uni266E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+266f uni266F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2670 uni2670 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2671 uni2671 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2672 uni2672 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2673 uni2673 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2674 uni2674 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2675 uni2675 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2676 uni2676 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2677 uni2677 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2678 uni2678 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2679 uni2679 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+267a uni267A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+267b uni267B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+267c uni267C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+267d uni267D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+267e uni267E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+267f uni267F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2680 uni2680 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2681 uni2681 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2682 uni2682 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2683 uni2683 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2684 uni2684 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2685 uni2685 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2686 uni2686 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2687 uni2687 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2688 uni2688 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2689 uni2689 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+268a uni268A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+268b uni268B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+268c uni268C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+268d uni268D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+268e uni268E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+268f uni268F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2690 uni2690 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2691 uni2691 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2692 uni2692 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2693 uni2693 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2694 uni2694 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2695 uni2695 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2696 uni2696 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2697 uni2697 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2698 uni2698 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2699 uni2699 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+269a uni269A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+269b uni269B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+269c uni269C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+26a0 uni26A0 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+26a1 uni26A1 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+26a2 uni26A2 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+26a3 uni26A3 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+26a4 uni26A4 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+26a5 uni26A5 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+26a6 uni26A6 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+26a7 uni26A7 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+26a8 uni26A8 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+26a9 uni26A9 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+26aa uni26AA 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+26ab uni26AB 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+26ac uni26AC 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+26ad uni26AD 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+26ae uni26AE 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+26af uni26AF 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+26b0 uni26B0 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+26b1 uni26B1 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+26b2 uni26B2 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2701 uni2701 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2702 uni2702 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2703 uni2703 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2704 uni2704 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2706 uni2706 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2707 uni2707 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2708 uni2708 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2709 uni2709 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+270c uni270C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+270d uni270D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+270e uni270E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+270f uni270F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2710 uni2710 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2711 uni2711 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2712 uni2712 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2713 uni2713 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2714 uni2714 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2715 uni2715 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2716 uni2716 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2717 uni2717 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2718 uni2718 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2719 uni2719 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+271a uni271A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+271b uni271B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+271c uni271C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+271d uni271D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+271e uni271E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+271f uni271F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2720 uni2720 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2721 uni2721 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2722 uni2722 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2723 uni2723 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2724 uni2724 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2725 uni2725 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2726 uni2726 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2727 uni2727 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2729 uni2729 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+272a uni272A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+272b uni272B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+272c uni272C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+272d uni272D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+272e uni272E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+272f uni272F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2730 uni2730 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2731 uni2731 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2732 uni2732 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2733 uni2733 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2734 uni2734 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2735 uni2735 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2736 uni2736 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2737 uni2737 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2738 uni2738 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2739 uni2739 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+273a uni273A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+273b uni273B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+273c uni273C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+273d uni273D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+273e uni273E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+273f uni273F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2740 uni2740 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2741 uni2741 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2742 uni2742 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2743 uni2743 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2744 uni2744 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2745 uni2745 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2746 uni2746 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2747 uni2747 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2748 uni2748 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2749 uni2749 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+274a uni274A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+274b uni274B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+274d uni274D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+274f uni274F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2750 uni2750 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2751 uni2751 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2752 uni2752 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2756 uni2756 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2758 uni2758 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2759 uni2759 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+275a uni275A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+275b uni275B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+275c uni275C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+275d uni275D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+275e uni275E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2761 uni2761 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2762 uni2762 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2763 uni2763 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2764 uni2764 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2765 uni2765 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2766 uni2766 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2767 uni2767 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2768 uni2768 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2769 uni2769 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+276a uni276A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+276b uni276B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+276c uni276C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+276d uni276D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+276e uni276E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+276f uni276F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2770 uni2770 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2771 uni2771 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2772 uni2772 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2773 uni2773 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2774 uni2774 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2775 uni2775 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2776 uni2776 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2777 uni2777 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2778 uni2778 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2779 uni2779 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+277a uni277A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+277b uni277B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+277c uni277C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+277d uni277D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+277e uni277E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+277f uni277F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2780 uni2780 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2781 uni2781 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2782 uni2782 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2783 uni2783 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2784 uni2784 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2785 uni2785 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2786 uni2786 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2787 uni2787 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2788 uni2788 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2789 uni2789 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+278a uni278A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+278b uni278B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+278c uni278C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+278d uni278D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+278e uni278E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+278f uni278F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2790 uni2790 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2791 uni2791 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2792 uni2792 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2793 uni2793 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2794 uni2794 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2798 uni2798 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+2799 uni2799 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+279a uni279A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+279b uni279B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+279c uni279C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+279d uni279D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+279e uni279E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+279f uni279F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+27a0 uni27A0 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+27a1 uni27A1 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+27a2 uni27A2 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+27a3 uni27A3 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+27a4 uni27A4 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+27a5 uni27A5 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+27a6 uni27A6 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+27a7 uni27A7 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+27a8 uni27A8 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+27a9 uni27A9 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+27aa uni27AA 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+27ab uni27AB 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+27ac uni27AC 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+27ad uni27AD 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+27ae uni27AE 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+27af uni27AF 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+27b1 uni27B1 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+27b2 uni27B2 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+27b3 uni27B3 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+27b4 uni27B4 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+27b5 uni27B5 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+27b6 uni27B6 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+27b7 uni27B7 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+27b8 uni27B8 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+27b9 uni27B9 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+27ba uni27BA 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+27bb uni27BB 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+27bc uni27BC 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+27bd uni27BD 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+27be uni27BE 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Oblique) +U+27bf uni27BF 2.25 (Sans Mono Bold) +U+27e0 uni27E0 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+27e6 uni27E6 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+27e7 uni27E7 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+27e8 uni27E8 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+27e9 uni27E9 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+27ea uni27EA 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+27eb uni27EB 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+27f0 uni27F0 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+27f1 uni27F1 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+27f2 uni27F2 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+27f3 uni27F3 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+27f4 uni27F4 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+27f5 uni27F5 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+27f6 uni27F6 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+27f7 uni27F7 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+27f8 uni27F8 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+27f9 uni27F9 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+27fa uni27FA 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+27fb uni27FB 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+27fc uni27FC 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+27fd uni27FD 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+27fe uni27FE 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+27ff uni27FF 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2800 uni2800 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2801 uni2801 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2802 uni2802 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2803 uni2803 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2804 uni2804 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2805 uni2805 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2806 uni2806 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2807 uni2807 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2808 uni2808 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2809 uni2809 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+280a uni280A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+280b uni280B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+280c uni280C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+280d uni280D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+280e uni280E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+280f uni280F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2810 uni2810 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2811 uni2811 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2812 uni2812 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2813 uni2813 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2814 uni2814 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2815 uni2815 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2816 uni2816 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2817 uni2817 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2818 uni2818 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2819 uni2819 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+281a uni281A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+281b uni281B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+281c uni281C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+281d uni281D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+281e uni281E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+281f uni281F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2820 uni2820 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2821 uni2821 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2822 uni2822 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2823 uni2823 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2824 uni2824 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2825 uni2825 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2826 uni2826 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2827 uni2827 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2828 uni2828 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2829 uni2829 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+282a uni282A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+282b uni282B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+282c uni282C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+282d uni282D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+282e uni282E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+282f uni282F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2830 uni2830 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2831 uni2831 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2832 uni2832 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2833 uni2833 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2834 uni2834 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2835 uni2835 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2836 uni2836 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2837 uni2837 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2838 uni2838 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2839 uni2839 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+283a uni283A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+283b uni283B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+283c uni283C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+283d uni283D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+283e uni283E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+283f uni283F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2840 uni2840 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2841 uni2841 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2842 uni2842 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2843 uni2843 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2844 uni2844 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2845 uni2845 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2846 uni2846 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2847 uni2847 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2848 uni2848 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2849 uni2849 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+284a uni284A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+284b uni284B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+284c uni284C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+284d uni284D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+284e uni284E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+284f uni284F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2850 uni2850 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2851 uni2851 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2852 uni2852 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2853 uni2853 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2854 uni2854 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2855 uni2855 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2856 uni2856 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2857 uni2857 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2858 uni2858 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2859 uni2859 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+285a uni285A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+285b uni285B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+285c uni285C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+285d uni285D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+285e uni285E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+285f uni285F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2860 uni2860 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2861 uni2861 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2862 uni2862 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2863 uni2863 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2864 uni2864 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2865 uni2865 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2866 uni2866 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2867 uni2867 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2868 uni2868 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2869 uni2869 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+286a uni286A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+286b uni286B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+286c uni286C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+286d uni286D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+286e uni286E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+286f uni286F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2870 uni2870 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2871 uni2871 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2872 uni2872 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2873 uni2873 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2874 uni2874 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2875 uni2875 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2876 uni2876 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2877 uni2877 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2878 uni2878 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2879 uni2879 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+287a uni287A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+287b uni287B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+287c uni287C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+287d uni287D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+287e uni287E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+287f uni287F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2880 uni2880 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2881 uni2881 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2882 uni2882 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2883 uni2883 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2884 uni2884 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2885 uni2885 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2886 uni2886 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2887 uni2887 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2888 uni2888 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2889 uni2889 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+288a uni288A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+288b uni288B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+288c uni288C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+288d uni288D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+288e uni288E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+288f uni288F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2890 uni2890 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2891 uni2891 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2892 uni2892 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2893 uni2893 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2894 uni2894 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2895 uni2895 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2896 uni2896 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2897 uni2897 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2898 uni2898 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2899 uni2899 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+289a uni289A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+289b uni289B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+289c uni289C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+289d uni289D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+289e uni289E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+289f uni289F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28a0 uni28A0 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28a1 uni28A1 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28a2 uni28A2 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28a3 uni28A3 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28a4 uni28A4 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28a5 uni28A5 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28a6 uni28A6 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28a7 uni28A7 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28a8 uni28A8 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28a9 uni28A9 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28aa uni28AA 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28ab uni28AB 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28ac uni28AC 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28ad uni28AD 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28ae uni28AE 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28af uni28AF 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28b0 uni28B0 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28b1 uni28B1 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28b2 uni28B2 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28b3 uni28B3 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28b4 uni28B4 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28b5 uni28B5 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28b6 uni28B6 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28b7 uni28B7 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28b8 uni28B8 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28b9 uni28B9 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28ba uni28BA 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28bb uni28BB 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28bc uni28BC 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28bd uni28BD 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28be uni28BE 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28bf uni28BF 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28c0 uni28C0 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28c1 uni28C1 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28c2 uni28C2 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28c3 uni28C3 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28c4 uni28C4 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28c5 uni28C5 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28c6 uni28C6 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28c7 uni28C7 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28c8 uni28C8 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28c9 uni28C9 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28ca uni28CA 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28cb uni28CB 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28cc uni28CC 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28cd uni28CD 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28ce uni28CE 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28cf uni28CF 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28d0 uni28D0 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28d1 uni28D1 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28d2 uni28D2 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28d3 uni28D3 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28d4 uni28D4 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28d5 uni28D5 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28d6 uni28D6 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28d7 uni28D7 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28d8 uni28D8 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28d9 uni28D9 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28da uni28DA 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28db uni28DB 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28dc uni28DC 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28dd uni28DD 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28de uni28DE 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28df uni28DF 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28e0 uni28E0 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28e1 uni28E1 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28e2 uni28E2 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28e3 uni28E3 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28e4 uni28E4 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28e5 uni28E5 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28e6 uni28E6 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28e7 uni28E7 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28e8 uni28E8 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28e9 uni28E9 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28ea uni28EA 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28eb uni28EB 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28ec uni28EC 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28ed uni28ED 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28ee uni28EE 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28ef uni28EF 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28f0 uni28F0 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28f1 uni28F1 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28f2 uni28F2 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28f3 uni28F3 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28f4 uni28F4 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28f5 uni28F5 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28f6 uni28F6 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28f7 uni28F7 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28f8 uni28F8 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28f9 uni28F9 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28fa uni28FA 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28fb uni28FB 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28fc uni28FC 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28fd uni28FD 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28fe uni28FE 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+28ff uni28FF 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2900 uni2900 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2901 uni2901 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2902 uni2902 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2903 uni2903 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2904 uni2904 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2905 uni2905 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2906 uni2906 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2907 uni2907 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2908 uni2908 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2909 uni2909 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+290a uni290A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+290b uni290B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+290c uni290C 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+290d uni290D 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+290e uni290E 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+290f uni290F 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2910 uni2910 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2911 uni2911 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2912 uni2912 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2913 uni2913 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2914 uni2914 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2915 uni2915 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2916 uni2916 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2917 uni2917 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2918 uni2918 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2919 uni2919 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+291a uni291A 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+291b uni291B 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+291c uni291C 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+291d uni291D 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+291e uni291E 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+291f uni291F 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2920 uni2920 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2921 uni2921 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2922 uni2922 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2923 uni2923 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2924 uni2924 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2925 uni2925 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2926 uni2926 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2927 uni2927 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2928 uni2928 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2929 uni2929 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+292a uni292A 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+292b uni292B 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+292c uni292C 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+292d uni292D 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+292e uni292E 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+292f uni292F 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2930 uni2930 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2931 uni2931 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2932 uni2932 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2933 uni2933 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2934 uni2934 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2935 uni2935 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2936 uni2936 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2937 uni2937 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2938 uni2938 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2939 uni2939 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+293a uni293A 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+293b uni293B 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+293c uni293C 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+293d uni293D 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+293e uni293E 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+293f uni293F 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2940 uni2940 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2941 uni2941 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2942 uni2942 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2943 uni2943 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2944 uni2944 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2945 uni2945 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2946 uni2946 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2947 uni2947 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2948 uni2948 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2949 uni2949 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+294a uni294A 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+294b uni294B 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+294c uni294C 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+294d uni294D 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+294e uni294E 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+294f uni294F 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2950 uni2950 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2951 uni2951 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2952 uni2952 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2953 uni2953 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2954 uni2954 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2955 uni2955 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2956 uni2956 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2957 uni2957 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2958 uni2958 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2959 uni2959 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+295a uni295A 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+295b uni295B 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+295c uni295C 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+295d uni295D 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+295e uni295E 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+295f uni295F 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2960 uni2960 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2961 uni2961 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2962 uni2962 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2963 uni2963 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2964 uni2964 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2965 uni2965 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2966 uni2966 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2967 uni2967 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2968 uni2968 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2969 uni2969 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+296a uni296A 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+296b uni296B 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+296c uni296C 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+296d uni296D 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+296e uni296E 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+296f uni296F 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2970 uni2970 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2971 uni2971 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2972 uni2972 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2973 uni2973 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2974 uni2974 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2975 uni2975 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2976 uni2976 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2977 uni2977 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2978 uni2978 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2979 uni2979 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+297a uni297A 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+297b uni297B 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+297c uni297C 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+297d uni297D 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+297e uni297E 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+297f uni297F 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2983 uni2983 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2984 uni2984 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+29ce uni29CE 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+29cf uni29CF 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+29d0 uni29D0 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+29d1 uni29D1 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+29d2 uni29D2 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+29d3 uni29D3 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+29d4 uni29D4 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+29d5 uni29D5 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+29eb uni29EB 2.25 +U+29fa uni29FA 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+29fb uni29FB 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2a00 uni2A00 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a01 uni2A01 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a02 uni2A02 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a0c uni2A0C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2a0d uni2A0D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2a0e uni2A0E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2a0f uni2A0F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a10 uni2A10 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a11 uni2A11 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a12 uni2A12 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a13 uni2A13 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a14 uni2A14 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a15 uni2A15 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a16 uni2A16 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a17 uni2A17 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a18 uni2A18 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a19 uni2A19 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a1a uni2A1A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a1b uni2A1B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a1c uni2A1C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a2f uni2A2F 2.25 +U+2a7d uni2A7D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a7e uni2A7E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a7f uni2A7F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a80 uni2A80 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a81 uni2A81 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a82 uni2A82 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a83 uni2A83 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a84 uni2A84 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a85 uni2A85 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a86 uni2A86 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a87 uni2A87 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a88 uni2A88 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a89 uni2A89 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a8a uni2A8A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a8b uni2A8B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a8c uni2A8C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a8d uni2A8D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a8e uni2A8E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a8f uni2A8F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a90 uni2A90 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a91 uni2A91 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a92 uni2A92 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a93 uni2A93 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a94 uni2A94 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a95 uni2A95 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a96 uni2A96 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a97 uni2A97 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a98 uni2A98 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a99 uni2A99 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a9a uni2A9A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a9b uni2A9B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a9c uni2A9C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a9d uni2A9D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a9e uni2A9E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a9f uni2A9F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2aa0 uni2AA0 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2aae uni2AAE 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2aaf uni2AAF 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2ab0 uni2AB0 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2ab1 uni2AB1 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2ab2 uni2AB2 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2ab3 uni2AB3 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2ab4 uni2AB4 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2ab5 uni2AB5 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2ab6 uni2AB6 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2ab7 uni2AB7 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2ab8 uni2AB8 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2ab9 uni2AB9 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2aba uni2ABA 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2af9 uni2AF9 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2afa uni2AFA 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2b00 uni2B00 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2b01 uni2B01 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2b02 uni2B02 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2b03 uni2B03 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2b04 uni2B04 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2b05 uni2B05 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2b06 uni2B06 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2b07 uni2B07 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2b08 uni2B08 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2b09 uni2B09 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2b0a uni2B0A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2b0b uni2B0B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2b0c uni2B0C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2b0d uni2B0D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2b0e uni2B0E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2b0f uni2B0F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2b10 uni2B10 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2b11 uni2B11 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2b12 uni2B12 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2b13 uni2B13 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2b14 uni2B14 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2b15 uni2B15 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2b16 uni2B16 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2b17 uni2B17 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2b18 uni2B18 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2b19 uni2B19 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2b1a uni2B1A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2b20 uni2B20 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2b21 uni2B21 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2b22 uni2B22 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2b23 uni2B23 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2c60 uni2C60 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2c61 uni2C61 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2c62 uni2C62 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2c63 uni2C63 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2c64 uni2C64 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2c65 uni2C65 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2c66 uni2C66 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2c67 uni2C67 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2c68 uni2C68 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2c69 uni2C69 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2c6a uni2C6A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2c6b uni2C6B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2c6c uni2C6C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2c6d uni2C6D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2c6e uni2C6E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+2c6f uni2C6F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+2c71 uni2C71 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2c72 uni2C72 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2c73 uni2C73 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2c74 uni2C74 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2c75 uni2C75 2.25 +U+2c76 uni2C76 2.25 +U+2c77 uni2C77 2.25 +U+2c79 uni2C79 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2c7b uni2C7B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2c7c uni2C7C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2c7d uni2C7D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2d30 uni2D30 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d31 uni2D31 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d32 uni2D32 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d33 uni2D33 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d34 uni2D34 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d35 uni2D35 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d36 uni2D36 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d37 uni2D37 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d38 uni2D38 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d39 uni2D39 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d3a uni2D3A 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d3b uni2D3B 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d3c uni2D3C 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d3d uni2D3D 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d3e uni2D3E 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d3f uni2D3F 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d40 uni2D40 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d41 uni2D41 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d42 uni2D42 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d43 uni2D43 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d44 uni2D44 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d45 uni2D45 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d46 uni2D46 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d47 uni2D47 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d48 uni2D48 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d49 uni2D49 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d4a uni2D4A 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d4b uni2D4B 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d4c uni2D4C 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d4d uni2D4D 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d4e uni2D4E 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d4f uni2D4F 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d50 uni2D50 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d51 uni2D51 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d52 uni2D52 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d53 uni2D53 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d54 uni2D54 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d55 uni2D55 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d56 uni2D56 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d57 uni2D57 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d58 uni2D58 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d59 uni2D59 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d5a uni2D5A 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d5b uni2D5B 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d5c uni2D5C 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d5d uni2D5D 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d5e uni2D5E 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d5f uni2D5F 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d60 uni2D60 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d61 uni2D61 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d62 uni2D62 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d63 uni2D63 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d64 uni2D64 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d65 uni2D65 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d6f uni2D6F 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2e18 uni2E18 2.25 +U+2e2e uni2E2E 2.25 +U+4dc0 uni4DC0 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dc1 uni4DC1 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dc2 uni4DC2 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dc3 uni4DC3 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dc4 uni4DC4 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dc5 uni4DC5 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dc6 uni4DC6 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dc7 uni4DC7 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dc8 uni4DC8 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dc9 uni4DC9 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dca uni4DCA 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dcb uni4DCB 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dcc uni4DCC 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dcd uni4DCD 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dce uni4DCE 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dcf uni4DCF 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dd0 uni4DD0 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dd1 uni4DD1 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dd2 uni4DD2 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dd3 uni4DD3 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dd4 uni4DD4 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dd5 uni4DD5 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dd6 uni4DD6 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dd7 uni4DD7 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dd8 uni4DD8 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dd9 uni4DD9 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dda uni4DDA 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4ddb uni4DDB 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4ddc uni4DDC 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4ddd uni4DDD 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dde uni4DDE 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4ddf uni4DDF 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4de0 uni4DE0 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4de1 uni4DE1 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4de2 uni4DE2 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4de3 uni4DE3 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4de4 uni4DE4 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4de5 uni4DE5 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4de6 uni4DE6 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4de7 uni4DE7 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4de8 uni4DE8 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4de9 uni4DE9 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dea uni4DEA 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4deb uni4DEB 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dec uni4DEC 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4ded uni4DED 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dee uni4DEE 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4def uni4DEF 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4df0 uni4DF0 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4df1 uni4DF1 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4df2 uni4DF2 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4df3 uni4DF3 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4df4 uni4DF4 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4df5 uni4DF5 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4df6 uni4DF6 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4df7 uni4DF7 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4df8 uni4DF8 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4df9 uni4DF9 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dfa uni4DFA 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dfb uni4DFB 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dfc uni4DFC 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dfd uni4DFD 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dfe uni4DFE 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dff uni4DFF 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+a644 uniA644 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a645 uniA645 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a646 uniA646 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a647 uniA647 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a64c uniA64C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+a64d uniA64D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+a650 uniA650 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a651 uniA651 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a654 uniA654 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a655 uniA655 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a712 uniA712 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a713 uniA713 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a714 uniA714 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a715 uniA715 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a716 uniA716 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a726 uniA726 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a727 uniA727 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a728 uniA728 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+a729 uniA729 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+a730 uniA730 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a731 uniA731 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a732 uniA732 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a733 uniA733 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a738 uniA738 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+a739 uniA739 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+a73a uniA73A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+a73b uniA73B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+a73c uniA73C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+a73d uniA73D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+a73e uniA73E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a73f uniA73F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a746 uniA746 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a747 uniA747 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a748 uniA748 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+a749 uniA749 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+a74a uniA74A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+a74b uniA74B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+a74e uniA74E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a74f uniA74F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a780 uniA780 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a781 uniA781 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a7fb uniA7FB 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a7fc uniA7FC 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a7fd uniA7FD 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a7fe uniA7FE 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a7ff uniA7FF 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+e000 uniE000 2.25 (Sans ExtraLight) +U+e001 uniE001 2.25 (Sans ExtraLight) +U+e002 uniE002 2.25 (Sans ExtraLight) +U+e003 uniE003 2.25 (Sans ExtraLight) +U+e004 uniE004 2.25 (Sans ExtraLight) +U+e005 uniE005 2.25 (Sans ExtraLight) +U+e007 uniE007 2.25 (Sans ExtraLight) +U+e008 uniE008 2.25 (Sans ExtraLight) +U+e009 uniE009 2.25 (Sans ExtraLight) +U+e00a uniE00A 2.25 (Sans ExtraLight) +U+e00b uniE00B 2.25 (Sans ExtraLight) +U+e00c uniE00C 2.25 (Sans ExtraLight) +U+e00d uniE00D 2.25 (Sans ExtraLight) +U+e00e uniE00E 2.25 (Sans ExtraLight) +U+e00f uniE00F 2.25 (Sans ExtraLight) +U+e010 uniE010 2.25 (Sans ExtraLight) +U+e011 uniE011 2.25 (Sans ExtraLight) +U+e012 uniE012 2.25 (Sans ExtraLight) +U+e013 uniE013 2.25 (Sans ExtraLight) +U+e014 uniE014 2.25 (Sans ExtraLight) +U+f000 uniF000 2.25 (Sans, Sans Condensed) +U+f001 uniF001 2.25 (Sans, Sans Condensed) +U+f5c5 uniF5C5 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+f6c4 uniF6C4 2.25 (Serif Bold Italic, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+f6c5 uniF6C5 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+f6c6 uniF6C6 2.25 (Serif Bold Italic, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+f6c7 uniF6C7 2.25 (Serif Bold Italic, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+f6c8 uniF6C8 2.25 (Serif Bold Italic, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+f6d1 cyrBreve 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+f6d4 cyrbreve 2.25 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+fb00 uniFB00 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+fb01 fi 2.25 +U+fb02 fl 2.25 +U+fb03 uniFB03 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+fb04 uniFB04 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+fb05 uniFB05 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+fb06 uniFB06 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+fb13 uniFB13 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb14 uniFB14 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb15 uniFB15 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb16 uniFB16 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb17 uniFB17 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb1d uniFB1D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb1e uniFB1E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb1f uniFB1F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb20 uniFB20 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb21 uniFB21 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb22 uniFB22 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb23 uniFB23 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb24 uniFB24 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb25 uniFB25 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb26 uniFB26 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb27 uniFB27 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb28 uniFB28 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb29 uniFB29 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+fb2a uniFB2A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb2b uniFB2B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb2c uniFB2C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb2d uniFB2D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb2e uniFB2E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb2f uniFB2F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb30 uniFB30 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb31 uniFB31 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb32 uniFB32 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb33 uniFB33 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb34 uniFB34 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb35 uniFB35 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb36 uniFB36 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb37 uniFB37 2.25 (Sans Condensed Oblique, Sans Oblique) +U+fb38 uniFB38 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb39 uniFB39 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb3a uniFB3A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb3b uniFB3B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb3c uniFB3C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb3e uniFB3E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb40 uniFB40 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb41 uniFB41 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb43 uniFB43 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb44 uniFB44 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb46 uniFB46 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb47 uniFB47 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb48 uniFB48 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb49 uniFB49 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb4a uniFB4A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb4b uniFB4B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb4c uniFB4C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb4d uniFB4D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb4e uniFB4E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb4f uniFB4F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb52 uniFB52 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fb53 uniFB53 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fb54 uniFB54 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fb55 uniFB55 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fb56 uniFB56 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fb57 uniFB57 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fb58 uniFB58 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fb59 uniFB59 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fb5a uniFB5A 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fb5b uniFB5B 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fb5c uniFB5C 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fb5d uniFB5D 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fb5e uniFB5E 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fb5f uniFB5F 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fb60 uniFB60 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fb61 uniFB61 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fb62 uniFB62 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fb63 uniFB63 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fb64 uniFB64 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fb65 uniFB65 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fb66 uniFB66 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fb67 uniFB67 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fb68 uniFB68 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fb69 uniFB69 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fb6a uniFB6A 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fb6b uniFB6B 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fb6c uniFB6C 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fb6d uniFB6D 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fb6e uniFB6E 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fb6f uniFB6F 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fb70 uniFB70 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fb71 uniFB71 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fb72 uniFB72 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fb73 uniFB73 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fb74 uniFB74 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fb75 uniFB75 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fb76 uniFB76 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fb77 uniFB77 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fb78 uniFB78 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fb79 uniFB79 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fb7a uniFB7A 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fb7b uniFB7B 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fb7c uniFB7C 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fb7d uniFB7D 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fb7e uniFB7E 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fb7f uniFB7F 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fb80 uniFB80 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fb81 uniFB81 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fb8a uniFB8A 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fb8b uniFB8B 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fb8c uniFB8C 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fb8d uniFB8D 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fb8e uniFB8E 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fb8f uniFB8F 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fb90 uniFB90 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fb91 uniFB91 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fb92 uniFB92 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fb93 uniFB93 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fb94 uniFB94 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fb95 uniFB95 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fb9e uniFB9E 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fb9f uniFB9F 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fbaa uniFBAA 2.25 (Sans Mono, Sans Mono Bold) +U+fbab uniFBAB 2.25 (Sans Mono, Sans Mono Bold) +U+fbac uniFBAC 2.25 (Sans Mono, Sans Mono Bold) +U+fbad uniFBAD 2.25 (Sans Mono, Sans Mono Bold) +U+fbd9 uniFBD9 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fbda uniFBDA 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fbe8 uniFBE8 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fbe9 uniFBE9 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fbfc uniFBFC 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fbfd uniFBFD 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fbfe uniFBFE 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fbff uniFBFF 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fe00 uniFE00 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+fe01 uniFE01 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+fe02 uniFE02 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+fe03 uniFE03 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+fe04 uniFE04 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+fe05 uniFE05 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+fe06 uniFE06 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+fe07 uniFE07 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+fe08 uniFE08 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+fe09 uniFE09 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+fe0a uniFE0A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+fe0b uniFE0B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+fe0c uniFE0C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+fe0d uniFE0D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+fe0e uniFE0E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+fe0f uniFE0F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+fe20 uniFE20 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fe21 uniFE21 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fe22 uniFE22 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fe23 uniFE23 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fe70 uniFE70 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fe71 uniFE71 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fe72 uniFE72 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fe73 uniFE73 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fe74 uniFE74 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fe76 uniFE76 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fe77 uniFE77 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fe78 uniFE78 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fe79 uniFE79 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fe7a uniFE7A 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fe7b uniFE7B 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fe7c uniFE7C 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fe7d uniFE7D 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fe7e uniFE7E 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fe7f uniFE7F 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fe80 uniFE80 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fe81 uniFE81 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fe82 uniFE82 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fe83 uniFE83 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fe84 uniFE84 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fe85 uniFE85 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fe86 uniFE86 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fe87 uniFE87 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fe88 uniFE88 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fe89 uniFE89 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fe8a uniFE8A 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fe8b uniFE8B 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fe8c uniFE8C 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fe8d uniFE8D 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fe8e uniFE8E 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fe8f uniFE8F 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fe90 uniFE90 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fe91 uniFE91 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fe92 uniFE92 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fe93 uniFE93 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fe94 uniFE94 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fe95 uniFE95 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fe96 uniFE96 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fe97 uniFE97 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fe98 uniFE98 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fe99 uniFE99 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fe9a uniFE9A 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fe9b uniFE9B 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fe9c uniFE9C 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fe9d uniFE9D 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fe9e uniFE9E 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fe9f uniFE9F 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fea0 uniFEA0 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fea1 uniFEA1 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fea2 uniFEA2 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fea3 uniFEA3 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fea4 uniFEA4 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fea5 uniFEA5 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fea6 uniFEA6 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fea7 uniFEA7 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fea8 uniFEA8 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fea9 uniFEA9 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+feaa uniFEAA 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+feab uniFEAB 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+feac uniFEAC 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fead uniFEAD 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+feae uniFEAE 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+feaf uniFEAF 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+feb0 uniFEB0 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+feb1 uniFEB1 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+feb2 uniFEB2 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+feb3 uniFEB3 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+feb4 uniFEB4 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+feb5 uniFEB5 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+feb6 uniFEB6 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+feb7 uniFEB7 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+feb8 uniFEB8 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+feb9 uniFEB9 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+feba uniFEBA 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+febb uniFEBB 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+febc uniFEBC 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+febd uniFEBD 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+febe uniFEBE 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+febf uniFEBF 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fec0 uniFEC0 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fec1 uniFEC1 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fec2 uniFEC2 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fec3 uniFEC3 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fec4 uniFEC4 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fec5 uniFEC5 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fec6 uniFEC6 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fec7 uniFEC7 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fec8 uniFEC8 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fec9 uniFEC9 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+feca uniFECA 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fecb uniFECB 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fecc uniFECC 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fecd uniFECD 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fece uniFECE 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fecf uniFECF 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fed0 uniFED0 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fed1 uniFED1 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fed2 uniFED2 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fed3 uniFED3 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fed4 uniFED4 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fed5 uniFED5 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fed6 uniFED6 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fed7 uniFED7 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fed8 uniFED8 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fed9 uniFED9 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+feda uniFEDA 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fedb uniFEDB 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fedc uniFEDC 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fedd uniFEDD 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fede uniFEDE 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fedf uniFEDF 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fee0 uniFEE0 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fee1 uniFEE1 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fee2 uniFEE2 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fee3 uniFEE3 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fee4 uniFEE4 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fee5 uniFEE5 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fee6 uniFEE6 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fee7 uniFEE7 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fee8 uniFEE8 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fee9 uniFEE9 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+feea uniFEEA 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+feeb uniFEEB 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+feec uniFEEC 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+feed uniFEED 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+feee uniFEEE 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+feef uniFEEF 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fef0 uniFEF0 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fef1 uniFEF1 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fef2 uniFEF2 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fef3 uniFEF3 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fef4 uniFEF4 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fef5 uniFEF5 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fef6 uniFEF6 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fef7 uniFEF7 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fef8 uniFEF8 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fef9 uniFEF9 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fefa uniFEFA 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fefb uniFEFB 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fefc uniFEFC 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+feff uniFEFF 2.25 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+fff9 uniFFF9 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+fffa uniFFFA 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+fffb uniFFFB 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+fffc uniFFFC 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+fffd uniFFFD 2.25 +U+1d300 u1D300 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d301 u1D301 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d302 u1D302 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d303 u1D303 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d304 u1D304 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d305 u1D305 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d306 u1D306 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d307 u1D307 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d308 u1D308 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d309 u1D309 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d30a u1D30A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d30b u1D30B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d30c u1D30C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d30d u1D30D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d30e u1D30E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d30f u1D30F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d310 u1D310 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d311 u1D311 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d312 u1D312 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d313 u1D313 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d314 u1D314 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d315 u1D315 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d316 u1D316 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d317 u1D317 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d318 u1D318 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d319 u1D319 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d31a u1D31A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d31b u1D31B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d31c u1D31C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d31d u1D31D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d31e u1D31E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d31f u1D31F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d320 u1D320 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d321 u1D321 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d322 u1D322 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d323 u1D323 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d324 u1D324 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d325 u1D325 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d326 u1D326 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d327 u1D327 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d328 u1D328 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d329 u1D329 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d32a u1D32A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d32b u1D32B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d32c u1D32C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d32d u1D32D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d32e u1D32E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d32f u1D32F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d330 u1D330 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d331 u1D331 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d332 u1D332 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d333 u1D333 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d334 u1D334 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d335 u1D335 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d336 u1D336 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d337 u1D337 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d338 u1D338 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d339 u1D339 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d33a u1D33A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d33b u1D33B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d33c u1D33C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d33d u1D33D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d33e u1D33E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d33f u1D33F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d340 u1D340 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d341 u1D341 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d342 u1D342 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d343 u1D343 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d344 u1D344 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d345 u1D345 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d346 u1D346 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d347 u1D347 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d348 u1D348 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d349 u1D349 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d34a u1D34A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d34b u1D34B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d34c u1D34C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d34d u1D34D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d34e u1D34E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d34f u1D34F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d350 u1D350 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d351 u1D351 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d352 u1D352 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d353 u1D353 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d354 u1D354 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d355 u1D355 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d356 u1D356 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d400 u1D400 2.25 (Serif Bold, Serif Condensed Bold) +U+1d401 u1D401 2.25 (Serif Bold, Serif Condensed Bold) +U+1d402 u1D402 2.25 (Serif Bold, Serif Condensed Bold) +U+1d403 u1D403 2.25 (Serif Bold, Serif Condensed Bold) +U+1d404 u1D404 2.25 (Serif Bold, Serif Condensed Bold) +U+1d405 u1D405 2.25 (Serif Bold, Serif Condensed Bold) +U+1d406 u1D406 2.25 (Serif Bold, Serif Condensed Bold) +U+1d407 u1D407 2.25 (Serif Bold, Serif Condensed Bold) +U+1d408 u1D408 2.25 (Serif Bold, Serif Condensed Bold) +U+1d409 u1D409 2.25 (Serif Bold, Serif Condensed Bold) +U+1d40a u1D40A 2.25 (Serif Bold, Serif Condensed Bold) +U+1d40b u1D40B 2.25 (Serif Bold, Serif Condensed Bold) +U+1d40c u1D40C 2.25 (Serif Bold, Serif Condensed Bold) +U+1d40d u1D40D 2.25 (Serif Bold, Serif Condensed Bold) +U+1d40e u1D40E 2.25 (Serif Bold, Serif Condensed Bold) +U+1d40f u1D40F 2.25 (Serif Bold, Serif Condensed Bold) +U+1d410 u1D410 2.25 (Serif Bold, Serif Condensed Bold) +U+1d411 u1D411 2.25 (Serif Bold, Serif Condensed Bold) +U+1d412 u1D412 2.25 (Serif Bold, Serif Condensed Bold) +U+1d413 u1D413 2.25 (Serif Bold, Serif Condensed Bold) +U+1d414 u1D414 2.25 (Serif Bold, Serif Condensed Bold) +U+1d415 u1D415 2.25 (Serif Bold, Serif Condensed Bold) +U+1d416 u1D416 2.25 (Serif Bold, Serif Condensed Bold) +U+1d417 u1D417 2.25 (Serif Bold, Serif Condensed Bold) +U+1d418 u1D418 2.25 (Serif Bold, Serif Condensed Bold) +U+1d419 u1D419 2.25 (Serif Bold, Serif Condensed Bold) +U+1d41a u1D41A 2.25 (Serif Bold, Serif Condensed Bold) +U+1d41b u1D41B 2.25 (Serif Bold, Serif Condensed Bold) +U+1d41c u1D41C 2.25 (Serif Bold, Serif Condensed Bold) +U+1d41d u1D41D 2.25 (Serif Bold, Serif Condensed Bold) +U+1d41e u1D41E 2.25 (Serif Bold, Serif Condensed Bold) +U+1d41f u1D41F 2.25 (Serif Bold, Serif Condensed Bold) +U+1d420 u1D420 2.25 (Serif Bold, Serif Condensed Bold) +U+1d421 u1D421 2.25 (Serif Bold, Serif Condensed Bold) +U+1d422 u1D422 2.25 (Serif Bold, Serif Condensed Bold) +U+1d423 u1D423 2.25 (Serif Bold, Serif Condensed Bold) +U+1d424 u1D424 2.25 (Serif Bold, Serif Condensed Bold) +U+1d425 u1D425 2.25 (Serif Bold, Serif Condensed Bold) +U+1d426 u1D426 2.25 (Serif Bold, Serif Condensed Bold) +U+1d427 u1D427 2.25 (Serif Bold, Serif Condensed Bold) +U+1d428 u1D428 2.25 (Serif Bold, Serif Condensed Bold) +U+1d429 u1D429 2.25 (Serif Bold, Serif Condensed Bold) +U+1d42a u1D42A 2.25 (Serif Bold, Serif Condensed Bold) +U+1d42b u1D42B 2.25 (Serif Bold, Serif Condensed Bold) +U+1d42c u1D42C 2.25 (Serif Bold, Serif Condensed Bold) +U+1d42d u1D42D 2.25 (Serif Bold, Serif Condensed Bold) +U+1d42e u1D42E 2.25 (Serif Bold, Serif Condensed Bold) +U+1d42f u1D42F 2.25 (Serif Bold, Serif Condensed Bold) +U+1d430 u1D430 2.25 (Serif Bold, Serif Condensed Bold) +U+1d431 u1D431 2.25 (Serif Bold, Serif Condensed Bold) +U+1d432 u1D432 2.25 (Serif Bold, Serif Condensed Bold) +U+1d433 u1D433 2.25 (Serif Bold, Serif Condensed Bold) +U+1d434 u1D434 2.25 (Serif Italic, Serif Italic Condensed) +U+1d435 u1D435 2.25 (Serif Italic, Serif Italic Condensed) +U+1d436 u1D436 2.25 (Serif Italic, Serif Italic Condensed) +U+1d437 u1D437 2.25 (Serif Italic, Serif Italic Condensed) +U+1d438 u1D438 2.25 (Serif Italic, Serif Italic Condensed) +U+1d439 u1D439 2.25 (Serif Italic, Serif Italic Condensed) +U+1d43a u1D43A 2.25 (Serif Italic, Serif Italic Condensed) +U+1d43b u1D43B 2.25 (Serif Italic, Serif Italic Condensed) +U+1d43c u1D43C 2.25 (Serif Italic, Serif Italic Condensed) +U+1d43d u1D43D 2.25 (Serif Italic, Serif Italic Condensed) +U+1d43e u1D43E 2.25 (Serif Italic, Serif Italic Condensed) +U+1d43f u1D43F 2.25 (Serif Italic, Serif Italic Condensed) +U+1d440 u1D440 2.25 (Serif Italic, Serif Italic Condensed) +U+1d441 u1D441 2.25 (Serif Italic, Serif Italic Condensed) +U+1d442 u1D442 2.25 (Serif Italic, Serif Italic Condensed) +U+1d443 u1D443 2.25 (Serif Italic, Serif Italic Condensed) +U+1d444 u1D444 2.25 (Serif Italic, Serif Italic Condensed) +U+1d445 u1D445 2.25 (Serif Italic, Serif Italic Condensed) +U+1d446 u1D446 2.25 (Serif Italic, Serif Italic Condensed) +U+1d447 u1D447 2.25 (Serif Italic, Serif Italic Condensed) +U+1d448 u1D448 2.25 (Serif Italic, Serif Italic Condensed) +U+1d449 u1D449 2.25 (Serif Italic, Serif Italic Condensed) +U+1d44a u1D44A 2.25 (Serif Italic, Serif Italic Condensed) +U+1d44b u1D44B 2.25 (Serif Italic, Serif Italic Condensed) +U+1d44c u1D44C 2.25 (Serif Italic, Serif Italic Condensed) +U+1d44d u1D44D 2.25 (Serif Italic, Serif Italic Condensed) +U+1d44e u1D44E 2.25 (Serif Italic, Serif Italic Condensed) +U+1d44f u1D44F 2.25 (Serif Italic, Serif Italic Condensed) +U+1d450 u1D450 2.25 (Serif Italic, Serif Italic Condensed) +U+1d451 u1D451 2.25 (Serif Italic, Serif Italic Condensed) +U+1d452 u1D452 2.25 (Serif Italic, Serif Italic Condensed) +U+1d453 u1D453 2.25 (Serif Italic, Serif Italic Condensed) +U+1d454 u1D454 2.25 (Serif Italic, Serif Italic Condensed) +U+1d456 u1D456 2.25 (Serif Italic, Serif Italic Condensed) +U+1d457 u1D457 2.25 (Serif Italic, Serif Italic Condensed) +U+1d458 u1D458 2.25 (Serif Italic, Serif Italic Condensed) +U+1d459 u1D459 2.25 (Serif Italic, Serif Italic Condensed) +U+1d45a u1D45A 2.25 (Serif Italic, Serif Italic Condensed) +U+1d45b u1D45B 2.25 (Serif Italic, Serif Italic Condensed) +U+1d45c u1D45C 2.25 (Serif Italic, Serif Italic Condensed) +U+1d45d u1D45D 2.25 (Serif Italic, Serif Italic Condensed) +U+1d45e u1D45E 2.25 (Serif Italic, Serif Italic Condensed) +U+1d45f u1D45F 2.25 (Serif Italic, Serif Italic Condensed) +U+1d460 u1D460 2.25 (Serif Italic, Serif Italic Condensed) +U+1d461 u1D461 2.25 (Serif Italic, Serif Italic Condensed) +U+1d462 u1D462 2.25 (Serif Italic, Serif Italic Condensed) +U+1d463 u1D463 2.25 (Serif Italic, Serif Italic Condensed) +U+1d464 u1D464 2.25 (Serif Italic, Serif Italic Condensed) +U+1d465 u1D465 2.25 (Serif Italic, Serif Italic Condensed) +U+1d466 u1D466 2.25 (Serif Italic, Serif Italic Condensed) +U+1d467 u1D467 2.25 (Serif Italic, Serif Italic Condensed) +U+1d468 u1D468 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d469 u1D469 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d46a u1D46A 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d46b u1D46B 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d46c u1D46C 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d46d u1D46D 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d46e u1D46E 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d46f u1D46F 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d470 u1D470 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d471 u1D471 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d472 u1D472 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d473 u1D473 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d474 u1D474 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d475 u1D475 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d476 u1D476 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d477 u1D477 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d478 u1D478 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d479 u1D479 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d47a u1D47A 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d47b u1D47B 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d47c u1D47C 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d47d u1D47D 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d47e u1D47E 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d47f u1D47F 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d480 u1D480 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d481 u1D481 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d482 u1D482 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d483 u1D483 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d484 u1D484 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d485 u1D485 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d486 u1D486 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d487 u1D487 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d488 u1D488 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d489 u1D489 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d48a u1D48A 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d48b u1D48B 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d48c u1D48C 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d48d u1D48D 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d48e u1D48E 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d48f u1D48F 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d490 u1D490 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d491 u1D491 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d492 u1D492 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d493 u1D493 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d494 u1D494 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d495 u1D495 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d496 u1D496 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d497 u1D497 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d498 u1D498 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d499 u1D499 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d49a u1D49A 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d49b u1D49B 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d538 u1D538 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed) +U+1d539 u1D539 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed) +U+1d53b u1D53B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed) +U+1d53c u1D53C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed) +U+1d53d u1D53D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed) +U+1d53e u1D53E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed) +U+1d540 u1D540 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed) +U+1d541 u1D541 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed) +U+1d542 u1D542 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed) +U+1d543 u1D543 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed) +U+1d544 u1D544 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed) +U+1d546 u1D546 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed) +U+1d54a u1D54A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed) +U+1d54b u1D54B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed) +U+1d54c u1D54C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed) +U+1d54d u1D54D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed) +U+1d54e u1D54E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed) +U+1d54f u1D54F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed) +U+1d550 u1D550 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed) +U+1d552 u1D552 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed) +U+1d553 u1D553 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed) +U+1d554 u1D554 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed) +U+1d555 u1D555 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed) +U+1d556 u1D556 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed) +U+1d557 u1D557 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed) +U+1d558 u1D558 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed) +U+1d559 u1D559 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed) +U+1d55a u1D55A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed) +U+1d55b u1D55B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed) +U+1d55c u1D55C 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed) +U+1d55d u1D55D 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed) +U+1d55e u1D55E 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed) +U+1d55f u1D55F 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed) +U+1d560 u1D560 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed) +U+1d561 u1D561 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed) +U+1d562 u1D562 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed) +U+1d563 u1D563 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed) +U+1d564 u1D564 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed) +U+1d565 u1D565 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed) +U+1d566 u1D566 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed) +U+1d567 u1D567 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed) +U+1d568 u1D568 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed) +U+1d569 u1D569 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed) +U+1d56a u1D56A 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed) +U+1d56b u1D56B 2.25 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed) +U+1d5a0 u1D5A0 2.25 (Sans, Sans Condensed) +U+1d5a1 u1D5A1 2.25 (Sans, Sans Condensed) +U+1d5a2 u1D5A2 2.25 (Sans, Sans Condensed) +U+1d5a3 u1D5A3 2.25 (Sans, Sans Condensed) +U+1d5a4 u1D5A4 2.25 (Sans, Sans Condensed) +U+1d5a5 u1D5A5 2.25 (Sans, Sans Condensed) +U+1d5a6 u1D5A6 2.25 (Sans, Sans Condensed) +U+1d5a7 u1D5A7 2.25 (Sans, Sans Condensed) +U+1d5a8 u1D5A8 2.25 (Sans, Sans Condensed) +U+1d5a9 u1D5A9 2.25 (Sans, Sans Condensed) +U+1d5aa u1D5AA 2.25 (Sans, Sans Condensed) +U+1d5ab u1D5AB 2.25 (Sans, Sans Condensed) +U+1d5ac u1D5AC 2.25 (Sans, Sans Condensed) +U+1d5ad u1D5AD 2.25 (Sans, Sans Condensed) +U+1d5ae u1D5AE 2.25 (Sans, Sans Condensed) +U+1d5af u1D5AF 2.25 (Sans, Sans Condensed) +U+1d5b0 u1D5B0 2.25 (Sans, Sans Condensed) +U+1d5b1 u1D5B1 2.25 (Sans, Sans Condensed) +U+1d5b2 u1D5B2 2.25 (Sans, Sans Condensed) +U+1d5b3 u1D5B3 2.25 (Sans, Sans Condensed) +U+1d5b4 u1D5B4 2.25 (Sans, Sans Condensed) +U+1d5b5 u1D5B5 2.25 (Sans, Sans Condensed) +U+1d5b6 u1D5B6 2.25 (Sans, Sans Condensed) +U+1d5b7 u1D5B7 2.25 (Sans, Sans Condensed) +U+1d5b8 u1D5B8 2.25 (Sans, Sans Condensed) +U+1d5b9 u1D5B9 2.25 (Sans, Sans Condensed) +U+1d5ba u1D5BA 2.25 (Sans, Sans Condensed) +U+1d5bb u1D5BB 2.25 (Sans, Sans Condensed) +U+1d5bc u1D5BC 2.25 (Sans, Sans Condensed) +U+1d5bd u1D5BD 2.25 (Sans, Sans Condensed) +U+1d5be u1D5BE 2.25 (Sans, Sans Condensed) +U+1d5bf u1D5BF 2.25 (Sans, Sans Condensed) +U+1d5c0 u1D5C0 2.25 (Sans, Sans Condensed) +U+1d5c1 u1D5C1 2.25 (Sans, Sans Condensed) +U+1d5c2 u1D5C2 2.25 (Sans, Sans Condensed) +U+1d5c3 u1D5C3 2.25 (Sans, Sans Condensed) +U+1d5c4 u1D5C4 2.25 (Sans, Sans Condensed) +U+1d5c5 u1D5C5 2.25 (Sans, Sans Condensed) +U+1d5c6 u1D5C6 2.25 (Sans, Sans Condensed) +U+1d5c7 u1D5C7 2.25 (Sans, Sans Condensed) +U+1d5c8 u1D5C8 2.25 (Sans, Sans Condensed) +U+1d5c9 u1D5C9 2.25 (Sans, Sans Condensed) +U+1d5ca u1D5CA 2.25 (Sans, Sans Condensed) +U+1d5cb u1D5CB 2.25 (Sans, Sans Condensed) +U+1d5cc u1D5CC 2.25 (Sans, Sans Condensed) +U+1d5cd u1D5CD 2.25 (Sans, Sans Condensed) +U+1d5ce u1D5CE 2.25 (Sans, Sans Condensed) +U+1d5cf u1D5CF 2.25 (Sans, Sans Condensed) +U+1d5d0 u1D5D0 2.25 (Sans, Sans Condensed) +U+1d5d1 u1D5D1 2.25 (Sans, Sans Condensed) +U+1d5d2 u1D5D2 2.25 (Sans, Sans Condensed) +U+1d5d3 u1D5D3 2.25 (Sans, Sans Condensed) +U+1d5d4 u1D5D4 2.25 (Sans Bold, Sans Condensed Bold) +U+1d5d5 u1D5D5 2.25 (Sans Bold, Sans Condensed Bold) +U+1d5d6 u1D5D6 2.25 (Sans Bold, Sans Condensed Bold) +U+1d5d7 u1D5D7 2.25 (Sans Bold, Sans Condensed Bold) +U+1d5d8 u1D5D8 2.25 (Sans Bold, Sans Condensed Bold) +U+1d5d9 u1D5D9 2.25 (Sans Bold, Sans Condensed Bold) +U+1d5da u1D5DA 2.25 (Sans Bold, Sans Condensed Bold) +U+1d5db u1D5DB 2.25 (Sans Bold, Sans Condensed Bold) +U+1d5dc u1D5DC 2.25 (Sans Bold, Sans Condensed Bold) +U+1d5dd u1D5DD 2.25 (Sans Bold, Sans Condensed Bold) +U+1d5de u1D5DE 2.25 (Sans Bold, Sans Condensed Bold) +U+1d5df u1D5DF 2.25 (Sans Bold, Sans Condensed Bold) +U+1d5e0 u1D5E0 2.25 (Sans Bold, Sans Condensed Bold) +U+1d5e1 u1D5E1 2.25 (Sans Bold, Sans Condensed Bold) +U+1d5e2 u1D5E2 2.25 (Sans Bold, Sans Condensed Bold) +U+1d5e3 u1D5E3 2.25 (Sans Bold, Sans Condensed Bold) +U+1d5e4 u1D5E4 2.25 (Sans Bold, Sans Condensed Bold) +U+1d5e5 u1D5E5 2.25 (Sans Bold, Sans Condensed Bold) +U+1d5e6 u1D5E6 2.25 (Sans Bold, Sans Condensed Bold) +U+1d5e7 u1D5E7 2.25 (Sans Bold, Sans Condensed Bold) +U+1d5e8 u1D5E8 2.25 (Sans Bold, Sans Condensed Bold) +U+1d5e9 u1D5E9 2.25 (Sans Bold, Sans Condensed Bold) +U+1d5ea u1D5EA 2.25 (Sans Bold, Sans Condensed Bold) +U+1d5eb u1D5EB 2.25 (Sans Bold, Sans Condensed Bold) +U+1d5ec u1D5EC 2.25 (Sans Bold, Sans Condensed Bold) +U+1d5ed u1D5ED 2.25 (Sans Bold, Sans Condensed Bold) +U+1d5ee u1D5EE 2.25 (Sans Bold, Sans Condensed Bold) +U+1d5ef u1D5EF 2.25 (Sans Bold, Sans Condensed Bold) +U+1d5f0 u1D5F0 2.25 (Sans Bold, Sans Condensed Bold) +U+1d5f1 u1D5F1 2.25 (Sans Bold, Sans Condensed Bold) +U+1d5f2 u1D5F2 2.25 (Sans Bold, Sans Condensed Bold) +U+1d5f3 u1D5F3 2.25 (Sans Bold, Sans Condensed Bold) +U+1d5f4 u1D5F4 2.25 (Sans Bold, Sans Condensed Bold) +U+1d5f5 u1D5F5 2.25 (Sans Bold, Sans Condensed Bold) +U+1d5f6 u1D5F6 2.25 (Sans Bold, Sans Condensed Bold) +U+1d5f7 u1D5F7 2.25 (Sans Bold, Sans Condensed Bold) +U+1d5f8 u1D5F8 2.25 (Sans Bold, Sans Condensed Bold) +U+1d5f9 u1D5F9 2.25 (Sans Bold, Sans Condensed Bold) +U+1d5fa u1D5FA 2.25 (Sans Bold, Sans Condensed Bold) +U+1d5fb u1D5FB 2.25 (Sans Bold, Sans Condensed Bold) +U+1d5fc u1D5FC 2.25 (Sans Bold, Sans Condensed Bold) +U+1d5fd u1D5FD 2.25 (Sans Bold, Sans Condensed Bold) +U+1d5fe u1D5FE 2.25 (Sans Bold, Sans Condensed Bold) +U+1d5ff u1D5FF 2.25 (Sans Bold, Sans Condensed Bold) +U+1d600 u1D600 2.25 (Sans Bold, Sans Condensed Bold) +U+1d601 u1D601 2.25 (Sans Bold, Sans Condensed Bold) +U+1d602 u1D602 2.25 (Sans Bold, Sans Condensed Bold) +U+1d603 u1D603 2.25 (Sans Bold, Sans Condensed Bold) +U+1d604 u1D604 2.25 (Sans Bold, Sans Condensed Bold) +U+1d605 u1D605 2.25 (Sans Bold, Sans Condensed Bold) +U+1d606 u1D606 2.25 (Sans Bold, Sans Condensed Bold) +U+1d607 u1D607 2.25 (Sans Bold, Sans Condensed Bold) +U+1d608 u1D608 2.25 (Sans Condensed Oblique, Sans Oblique) +U+1d609 u1D609 2.25 (Sans Condensed Oblique, Sans Oblique) +U+1d60a u1D60A 2.25 (Sans Condensed Oblique, Sans Oblique) +U+1d60b u1D60B 2.25 (Sans Condensed Oblique, Sans Oblique) +U+1d60c u1D60C 2.25 (Sans Condensed Oblique, Sans Oblique) +U+1d60d u1D60D 2.25 (Sans Condensed Oblique, Sans Oblique) +U+1d60e u1D60E 2.25 (Sans Condensed Oblique, Sans Oblique) +U+1d60f u1D60F 2.25 (Sans Condensed Oblique, Sans Oblique) +U+1d610 u1D610 2.25 (Sans Condensed Oblique, Sans Oblique) +U+1d611 u1D611 2.25 (Sans Condensed Oblique, Sans Oblique) +U+1d612 u1D612 2.25 (Sans Condensed Oblique, Sans Oblique) +U+1d613 u1D613 2.25 (Sans Condensed Oblique, Sans Oblique) +U+1d614 u1D614 2.25 (Sans Condensed Oblique, Sans Oblique) +U+1d615 u1D615 2.25 (Sans Condensed Oblique, Sans Oblique) +U+1d616 u1D616 2.25 (Sans Condensed Oblique, Sans Oblique) +U+1d617 u1D617 2.25 (Sans Condensed Oblique, Sans Oblique) +U+1d618 u1D618 2.25 (Sans Condensed Oblique, Sans Oblique) +U+1d619 u1D619 2.25 (Sans Condensed Oblique, Sans Oblique) +U+1d61a u1D61A 2.25 (Sans Condensed Oblique, Sans Oblique) +U+1d61b u1D61B 2.25 (Sans Condensed Oblique, Sans Oblique) +U+1d61c u1D61C 2.25 (Sans Condensed Oblique, Sans Oblique) +U+1d61d u1D61D 2.25 (Sans Condensed Oblique, Sans Oblique) +U+1d61e u1D61E 2.25 (Sans Condensed Oblique, Sans Oblique) +U+1d61f u1D61F 2.25 (Sans Condensed Oblique, Sans Oblique) +U+1d620 u1D620 2.25 (Sans Condensed Oblique, Sans Oblique) +U+1d621 u1D621 2.25 (Sans Condensed Oblique, Sans Oblique) +U+1d622 u1D622 2.25 (Sans Condensed Oblique, Sans Oblique) +U+1d623 u1D623 2.25 (Sans Condensed Oblique, Sans Oblique) +U+1d624 u1D624 2.25 (Sans Condensed Oblique, Sans Oblique) +U+1d625 u1D625 2.25 (Sans Condensed Oblique, Sans Oblique) +U+1d626 u1D626 2.25 (Sans Condensed Oblique, Sans Oblique) +U+1d627 u1D627 2.25 (Sans Condensed Oblique, Sans Oblique) +U+1d628 u1D628 2.25 (Sans Condensed Oblique, Sans Oblique) +U+1d629 u1D629 2.25 (Sans Condensed Oblique, Sans Oblique) +U+1d62a u1D62A 2.25 (Sans Condensed Oblique, Sans Oblique) +U+1d62b u1D62B 2.25 (Sans Condensed Oblique, Sans Oblique) +U+1d62c u1D62C 2.25 (Sans Condensed Oblique, Sans Oblique) +U+1d62d u1D62D 2.25 (Sans Condensed Oblique, Sans Oblique) +U+1d62e u1D62E 2.25 (Sans Condensed Oblique, Sans Oblique) +U+1d62f u1D62F 2.25 (Sans Condensed Oblique, Sans Oblique) +U+1d630 u1D630 2.25 (Sans Condensed Oblique, Sans Oblique) +U+1d631 u1D631 2.25 (Sans Condensed Oblique, Sans Oblique) +U+1d632 u1D632 2.25 (Sans Condensed Oblique, Sans Oblique) +U+1d633 u1D633 2.25 (Sans Condensed Oblique, Sans Oblique) +U+1d634 u1D634 2.25 (Sans Condensed Oblique, Sans Oblique) +U+1d635 u1D635 2.25 (Sans Condensed Oblique, Sans Oblique) +U+1d636 u1D636 2.25 (Sans Condensed Oblique, Sans Oblique) +U+1d637 u1D637 2.25 (Sans Condensed Oblique, Sans Oblique) +U+1d638 u1D638 2.25 (Sans Condensed Oblique, Sans Oblique) +U+1d639 u1D639 2.25 (Sans Condensed Oblique, Sans Oblique) +U+1d63a u1D63A 2.25 (Sans Condensed Oblique, Sans Oblique) +U+1d63b u1D63B 2.25 (Sans Condensed Oblique, Sans Oblique) +U+1d63c u1D63C 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d63d u1D63D 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d63e u1D63E 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d63f u1D63F 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d640 u1D640 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d641 u1D641 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d642 u1D642 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d643 u1D643 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d644 u1D644 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d645 u1D645 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d646 u1D646 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d647 u1D647 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d648 u1D648 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d649 u1D649 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d64a u1D64A 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d64b u1D64B 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d64c u1D64C 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d64d u1D64D 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d64e u1D64E 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d64f u1D64F 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d650 u1D650 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d651 u1D651 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d652 u1D652 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d653 u1D653 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d654 u1D654 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d655 u1D655 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d656 u1D656 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d657 u1D657 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d658 u1D658 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d659 u1D659 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d65a u1D65A 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d65b u1D65B 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d65c u1D65C 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d65d u1D65D 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d65e u1D65E 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d65f u1D65F 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d660 u1D660 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d661 u1D661 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d662 u1D662 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d663 u1D663 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d664 u1D664 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d665 u1D665 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d666 u1D666 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d667 u1D667 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d668 u1D668 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d669 u1D669 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d66a u1D66A 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d66b u1D66B 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d66c u1D66C 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d66d u1D66D 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d66e u1D66E 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d66f u1D66F 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d670 u1D670 2.25 (Sans Mono) +U+1d671 u1D671 2.25 (Sans Mono) +U+1d672 u1D672 2.25 (Sans Mono) +U+1d673 u1D673 2.25 (Sans Mono) +U+1d674 u1D674 2.25 (Sans Mono) +U+1d675 u1D675 2.25 (Sans Mono) +U+1d676 u1D676 2.25 (Sans Mono) +U+1d677 u1D677 2.25 (Sans Mono) +U+1d678 u1D678 2.25 (Sans Mono) +U+1d679 u1D679 2.25 (Sans Mono) +U+1d67a u1D67A 2.25 (Sans Mono) +U+1d67b u1D67B 2.25 (Sans Mono) +U+1d67c u1D67C 2.25 (Sans Mono) +U+1d67d u1D67D 2.25 (Sans Mono) +U+1d67e u1D67E 2.25 (Sans Mono) +U+1d67f u1D67F 2.25 (Sans Mono) +U+1d680 u1D680 2.25 (Sans Mono) +U+1d681 u1D681 2.25 (Sans Mono) +U+1d682 u1D682 2.25 (Sans Mono) +U+1d683 u1D683 2.25 (Sans Mono) +U+1d684 u1D684 2.25 (Sans Mono) +U+1d685 u1D685 2.25 (Sans Mono) +U+1d686 u1D686 2.25 (Sans Mono) +U+1d687 u1D687 2.25 (Sans Mono) +U+1d688 u1D688 2.25 (Sans Mono) +U+1d689 u1D689 2.25 (Sans Mono) +U+1d68a u1D68A 2.25 (Sans Mono) +U+1d68b u1D68B 2.25 (Sans Mono) +U+1d68c u1D68C 2.25 (Sans Mono) +U+1d68d u1D68D 2.25 (Sans Mono) +U+1d68e u1D68E 2.25 (Sans Mono) +U+1d68f u1D68F 2.25 (Sans Mono) +U+1d690 u1D690 2.25 (Sans Mono) +U+1d691 u1D691 2.25 (Sans Mono) +U+1d692 u1D692 2.25 (Sans Mono) +U+1d693 u1D693 2.25 (Sans Mono) +U+1d694 u1D694 2.25 (Sans Mono) +U+1d695 u1D695 2.25 (Sans Mono) +U+1d696 u1D696 2.25 (Sans Mono) +U+1d697 u1D697 2.25 (Sans Mono) +U+1d698 u1D698 2.25 (Sans Mono) +U+1d699 u1D699 2.25 (Sans Mono) +U+1d69a u1D69A 2.25 (Sans Mono) +U+1d69b u1D69B 2.25 (Sans Mono) +U+1d69c u1D69C 2.25 (Sans Mono) +U+1d69d u1D69D 2.25 (Sans Mono) +U+1d69e u1D69E 2.25 (Sans Mono) +U+1d69f u1D69F 2.25 (Sans Mono) +U+1d6a0 u1D6A0 2.25 (Sans Mono) +U+1d6a1 u1D6A1 2.25 (Sans Mono) +U+1d6a2 u1D6A2 2.25 (Sans Mono) +U+1d6a3 u1D6A3 2.25 (Sans Mono) +U+1d6a4 u1D6A4 2.25 (Serif Italic, Serif Italic Condensed) +U+1d6a5 u1D6A5 2.25 (Serif Italic, Serif Italic Condensed) +U+1d6a8 u1D6A8 2.25 (Serif Bold, Serif Condensed Bold) +U+1d6a9 u1D6A9 2.25 (Serif Bold, Serif Condensed Bold) +U+1d6aa u1D6AA 2.25 (Serif Bold, Serif Condensed Bold) +U+1d6ab u1D6AB 2.25 (Serif Bold, Serif Condensed Bold) +U+1d6ac u1D6AC 2.25 (Serif Bold, Serif Condensed Bold) +U+1d6ad u1D6AD 2.25 (Serif Bold, Serif Condensed Bold) +U+1d6ae u1D6AE 2.25 (Serif Bold, Serif Condensed Bold) +U+1d6af u1D6AF 2.25 (Serif Bold, Serif Condensed Bold) +U+1d6b0 u1D6B0 2.25 (Serif Bold, Serif Condensed Bold) +U+1d6b1 u1D6B1 2.25 (Serif Bold, Serif Condensed Bold) +U+1d6b2 u1D6B2 2.25 (Serif Bold, Serif Condensed Bold) +U+1d6b3 u1D6B3 2.25 (Serif Bold, Serif Condensed Bold) +U+1d6b4 u1D6B4 2.25 (Serif Bold, Serif Condensed Bold) +U+1d6b5 u1D6B5 2.25 (Serif Bold, Serif Condensed Bold) +U+1d6b6 u1D6B6 2.25 (Serif Bold, Serif Condensed Bold) +U+1d6b7 u1D6B7 2.25 (Serif Bold, Serif Condensed Bold) +U+1d6b8 u1D6B8 2.25 (Serif Bold, Serif Condensed Bold) +U+1d6b9 u1D6B9 2.25 (Serif Bold, Serif Condensed Bold) +U+1d6ba u1D6BA 2.25 (Serif Bold, Serif Condensed Bold) +U+1d6bb u1D6BB 2.25 (Serif Bold, Serif Condensed Bold) +U+1d6bc u1D6BC 2.25 (Serif Bold, Serif Condensed Bold) +U+1d6bd u1D6BD 2.25 (Serif Bold, Serif Condensed Bold) +U+1d6be u1D6BE 2.25 (Serif Bold, Serif Condensed Bold) +U+1d6bf u1D6BF 2.25 (Serif Bold, Serif Condensed Bold) +U+1d6c0 u1D6C0 2.25 (Serif Bold, Serif Condensed Bold) +U+1d6c1 u1D6C1 2.25 (Serif Bold, Serif Condensed Bold) +U+1d6c2 u1D6C2 2.25 (Serif Bold, Serif Condensed Bold) +U+1d6c3 u1D6C3 2.25 (Serif Bold, Serif Condensed Bold) +U+1d6c4 u1D6C4 2.25 (Serif Bold, Serif Condensed Bold) +U+1d6c5 u1D6C5 2.25 (Serif Bold, Serif Condensed Bold) +U+1d6c6 u1D6C6 2.25 (Serif Bold, Serif Condensed Bold) +U+1d6c7 u1D6C7 2.25 (Serif Bold, Serif Condensed Bold) +U+1d6c8 u1D6C8 2.25 (Serif Bold, Serif Condensed Bold) +U+1d6c9 u1D6C9 2.25 (Serif Bold, Serif Condensed Bold) +U+1d6ca u1D6CA 2.25 (Serif Bold, Serif Condensed Bold) +U+1d6cb u1D6CB 2.25 (Serif Bold, Serif Condensed Bold) +U+1d6cc u1D6CC 2.25 (Serif Bold, Serif Condensed Bold) +U+1d6cd u1D6CD 2.25 (Serif Bold, Serif Condensed Bold) +U+1d6ce u1D6CE 2.25 (Serif Bold, Serif Condensed Bold) +U+1d6cf u1D6CF 2.25 (Serif Bold, Serif Condensed Bold) +U+1d6d0 u1D6D0 2.25 (Serif Bold, Serif Condensed Bold) +U+1d6d1 u1D6D1 2.25 (Serif Bold, Serif Condensed Bold) +U+1d6d2 u1D6D2 2.25 (Serif Bold, Serif Condensed Bold) +U+1d6d3 u1D6D3 2.25 (Serif Bold, Serif Condensed Bold) +U+1d6d4 u1D6D4 2.25 (Serif Bold, Serif Condensed Bold) +U+1d6d5 u1D6D5 2.25 (Serif Bold, Serif Condensed Bold) +U+1d6d6 u1D6D6 2.25 (Serif Bold, Serif Condensed Bold) +U+1d6d7 u1D6D7 2.25 (Serif Bold, Serif Condensed Bold) +U+1d6d8 u1D6D8 2.25 (Serif Bold, Serif Condensed Bold) +U+1d6d9 u1D6D9 2.25 (Serif Bold, Serif Condensed Bold) +U+1d6da u1D6DA 2.25 (Serif Bold, Serif Condensed Bold) +U+1d6db u1D6DB 2.25 (Serif Bold, Serif Condensed Bold) +U+1d6dc u1D6DC 2.25 (Serif Bold, Serif Condensed Bold) +U+1d6dd u1D6DD 2.25 (Serif Bold, Serif Condensed Bold) +U+1d6de u1D6DE 2.25 (Serif Bold, Serif Condensed Bold) +U+1d6df u1D6DF 2.25 (Serif Bold, Serif Condensed Bold) +U+1d6e0 u1D6E0 2.25 (Serif Bold, Serif Condensed Bold) +U+1d6e1 u1D6E1 2.25 (Serif Bold, Serif Condensed Bold) +U+1d6e2 u1D6E2 2.25 (Serif Italic, Serif Italic Condensed) +U+1d6e3 u1D6E3 2.25 (Serif Italic, Serif Italic Condensed) +U+1d6e4 u1D6E4 2.25 (Serif Italic, Serif Italic Condensed) +U+1d6e5 u1D6E5 2.25 (Serif Italic, Serif Italic Condensed) +U+1d6e6 u1D6E6 2.25 (Serif Italic, Serif Italic Condensed) +U+1d6e7 u1D6E7 2.25 (Serif Italic, Serif Italic Condensed) +U+1d6e8 u1D6E8 2.25 (Serif Italic, Serif Italic Condensed) +U+1d6e9 u1D6E9 2.25 (Serif Italic, Serif Italic Condensed) +U+1d6ea u1D6EA 2.25 (Serif Italic, Serif Italic Condensed) +U+1d6eb u1D6EB 2.25 (Serif Italic, Serif Italic Condensed) +U+1d6ec u1D6EC 2.25 (Serif Italic, Serif Italic Condensed) +U+1d6ed u1D6ED 2.25 (Serif Italic, Serif Italic Condensed) +U+1d6ee u1D6EE 2.25 (Serif Italic, Serif Italic Condensed) +U+1d6ef u1D6EF 2.25 (Serif Italic, Serif Italic Condensed) +U+1d6f0 u1D6F0 2.25 (Serif Italic, Serif Italic Condensed) +U+1d6f1 u1D6F1 2.25 (Serif Italic, Serif Italic Condensed) +U+1d6f2 u1D6F2 2.25 (Serif Italic, Serif Italic Condensed) +U+1d6f3 u1D6F3 2.25 (Serif Italic, Serif Italic Condensed) +U+1d6f4 u1D6F4 2.25 (Serif Italic, Serif Italic Condensed) +U+1d6f5 u1D6F5 2.25 (Serif Italic, Serif Italic Condensed) +U+1d6f6 u1D6F6 2.25 (Serif Italic, Serif Italic Condensed) +U+1d6f7 u1D6F7 2.25 (Serif Italic, Serif Italic Condensed) +U+1d6f8 u1D6F8 2.25 (Serif Italic, Serif Italic Condensed) +U+1d6f9 u1D6F9 2.25 (Serif Italic, Serif Italic Condensed) +U+1d6fa u1D6FA 2.25 (Serif Italic, Serif Italic Condensed) +U+1d6fb u1D6FB 2.25 (Serif Italic, Serif Italic Condensed) +U+1d6fc u1D6FC 2.25 (Serif Italic, Serif Italic Condensed) +U+1d6fd u1D6FD 2.25 (Serif Italic, Serif Italic Condensed) +U+1d6fe u1D6FE 2.25 (Serif Italic, Serif Italic Condensed) +U+1d6ff u1D6FF 2.25 (Serif Italic, Serif Italic Condensed) +U+1d700 u1D700 2.25 (Serif Italic, Serif Italic Condensed) +U+1d701 u1D701 2.25 (Serif Italic, Serif Italic Condensed) +U+1d702 u1D702 2.25 (Serif Italic, Serif Italic Condensed) +U+1d703 u1D703 2.25 (Serif Italic, Serif Italic Condensed) +U+1d704 u1D704 2.25 (Serif Italic, Serif Italic Condensed) +U+1d705 u1D705 2.25 (Serif Italic, Serif Italic Condensed) +U+1d706 u1D706 2.25 (Serif Italic, Serif Italic Condensed) +U+1d707 u1D707 2.25 (Serif Italic, Serif Italic Condensed) +U+1d708 u1D708 2.25 (Serif Italic, Serif Italic Condensed) +U+1d709 u1D709 2.25 (Serif Italic, Serif Italic Condensed) +U+1d70a u1D70A 2.25 (Serif Italic, Serif Italic Condensed) +U+1d70b u1D70B 2.25 (Serif Italic, Serif Italic Condensed) +U+1d70c u1D70C 2.25 (Serif Italic, Serif Italic Condensed) +U+1d70d u1D70D 2.25 (Serif Italic, Serif Italic Condensed) +U+1d70e u1D70E 2.25 (Serif Italic, Serif Italic Condensed) +U+1d70f u1D70F 2.25 (Serif Italic, Serif Italic Condensed) +U+1d710 u1D710 2.25 (Serif Italic, Serif Italic Condensed) +U+1d711 u1D711 2.25 (Serif Italic, Serif Italic Condensed) +U+1d712 u1D712 2.25 (Serif Italic, Serif Italic Condensed) +U+1d713 u1D713 2.25 (Serif Italic, Serif Italic Condensed) +U+1d714 u1D714 2.25 (Serif Italic, Serif Italic Condensed) +U+1d715 u1D715 2.25 (Serif Italic, Serif Italic Condensed) +U+1d716 u1D716 2.25 (Serif Italic, Serif Italic Condensed) +U+1d717 u1D717 2.25 (Serif Italic, Serif Italic Condensed) +U+1d718 u1D718 2.25 (Serif Italic, Serif Italic Condensed) +U+1d719 u1D719 2.25 (Serif Italic, Serif Italic Condensed) +U+1d71a u1D71A 2.25 (Serif Italic, Serif Italic Condensed) +U+1d71b u1D71B 2.25 (Serif Italic, Serif Italic Condensed) +U+1d71c u1D71C 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d71d u1D71D 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d71e u1D71E 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d71f u1D71F 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d720 u1D720 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d721 u1D721 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d722 u1D722 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d723 u1D723 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d724 u1D724 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d725 u1D725 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d726 u1D726 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d727 u1D727 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d728 u1D728 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d729 u1D729 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d72a u1D72A 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d72b u1D72B 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d72c u1D72C 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d72d u1D72D 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d72e u1D72E 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d72f u1D72F 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d730 u1D730 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d731 u1D731 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d732 u1D732 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d733 u1D733 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d734 u1D734 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d735 u1D735 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d736 u1D736 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d737 u1D737 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d738 u1D738 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d739 u1D739 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d73a u1D73A 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d73b u1D73B 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d73c u1D73C 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d73d u1D73D 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d73e u1D73E 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d73f u1D73F 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d740 u1D740 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d741 u1D741 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d742 u1D742 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d743 u1D743 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d744 u1D744 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d745 u1D745 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d746 u1D746 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d747 u1D747 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d748 u1D748 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d749 u1D749 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d74a u1D74A 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d74b u1D74B 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d74c u1D74C 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d74d u1D74D 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d74e u1D74E 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d74f u1D74F 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d750 u1D750 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d751 u1D751 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d752 u1D752 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d753 u1D753 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d754 u1D754 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d755 u1D755 2.25 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d756 u1D756 2.25 (Sans Bold, Sans Condensed Bold) +U+1d757 u1D757 2.25 (Sans Bold, Sans Condensed Bold) +U+1d758 u1D758 2.25 (Sans Bold, Sans Condensed Bold) +U+1d759 u1D759 2.25 (Sans Bold, Sans Condensed Bold) +U+1d75a u1D75A 2.25 (Sans Bold, Sans Condensed Bold) +U+1d75b u1D75B 2.25 (Sans Bold, Sans Condensed Bold) +U+1d75c u1D75C 2.25 (Sans Bold, Sans Condensed Bold) +U+1d75d u1D75D 2.25 (Sans Bold, Sans Condensed Bold) +U+1d75e u1D75E 2.25 (Sans Bold, Sans Condensed Bold) +U+1d75f u1D75F 2.25 (Sans Bold, Sans Condensed Bold) +U+1d760 u1D760 2.25 (Sans Bold, Sans Condensed Bold) +U+1d761 u1D761 2.25 (Sans Bold, Sans Condensed Bold) +U+1d762 u1D762 2.25 (Sans Bold, Sans Condensed Bold) +U+1d763 u1D763 2.25 (Sans Bold, Sans Condensed Bold) +U+1d764 u1D764 2.25 (Sans Bold, Sans Condensed Bold) +U+1d765 u1D765 2.25 (Sans Bold, Sans Condensed Bold) +U+1d766 u1D766 2.25 (Sans Bold, Sans Condensed Bold) +U+1d767 u1D767 2.25 (Sans Bold, Sans Condensed Bold) +U+1d768 u1D768 2.25 (Sans Bold, Sans Condensed Bold) +U+1d769 u1D769 2.25 (Sans Bold, Sans Condensed Bold) +U+1d76a u1D76A 2.25 (Sans Bold, Sans Condensed Bold) +U+1d76b u1D76B 2.25 (Sans Bold, Sans Condensed Bold) +U+1d76c u1D76C 2.25 (Sans Bold, Sans Condensed Bold) +U+1d76d u1D76D 2.25 (Sans Bold, Sans Condensed Bold) +U+1d76e u1D76E 2.25 (Sans Bold, Sans Condensed Bold) +U+1d76f u1D76F 2.25 (Sans Bold, Sans Condensed Bold) +U+1d770 u1D770 2.25 (Sans Bold, Sans Condensed Bold) +U+1d771 u1D771 2.25 (Sans Bold, Sans Condensed Bold) +U+1d772 u1D772 2.25 (Sans Bold, Sans Condensed Bold) +U+1d773 u1D773 2.25 (Sans Bold, Sans Condensed Bold) +U+1d774 u1D774 2.25 (Sans Bold, Sans Condensed Bold) +U+1d775 u1D775 2.25 (Sans Bold, Sans Condensed Bold) +U+1d776 u1D776 2.25 (Sans Bold, Sans Condensed Bold) +U+1d777 u1D777 2.25 (Sans Bold, Sans Condensed Bold) +U+1d778 u1D778 2.25 (Sans Bold, Sans Condensed Bold) +U+1d779 u1D779 2.25 (Sans Bold, Sans Condensed Bold) +U+1d77a u1D77A 2.25 (Sans Bold, Sans Condensed Bold) +U+1d77b u1D77B 2.25 (Sans Bold, Sans Condensed Bold) +U+1d77c u1D77C 2.25 (Sans Bold, Sans Condensed Bold) +U+1d77d u1D77D 2.25 (Sans Bold, Sans Condensed Bold) +U+1d77e u1D77E 2.25 (Sans Bold, Sans Condensed Bold) +U+1d77f u1D77F 2.25 (Sans Bold, Sans Condensed Bold) +U+1d780 u1D780 2.25 (Sans Bold, Sans Condensed Bold) +U+1d781 u1D781 2.25 (Sans Bold, Sans Condensed Bold) +U+1d782 u1D782 2.25 (Sans Bold, Sans Condensed Bold) +U+1d783 u1D783 2.25 (Sans Bold, Sans Condensed Bold) +U+1d784 u1D784 2.25 (Sans Bold, Sans Condensed Bold) +U+1d785 u1D785 2.25 (Sans Bold, Sans Condensed Bold) +U+1d786 u1D786 2.25 (Sans Bold, Sans Condensed Bold) +U+1d787 u1D787 2.25 (Sans Bold, Sans Condensed Bold) +U+1d788 u1D788 2.25 (Sans Bold, Sans Condensed Bold) +U+1d789 u1D789 2.25 (Sans Bold, Sans Condensed Bold) +U+1d78a u1D78A 2.25 (Sans Bold, Sans Condensed Bold) +U+1d78b u1D78B 2.25 (Sans Bold, Sans Condensed Bold) +U+1d78c u1D78C 2.25 (Sans Bold, Sans Condensed Bold) +U+1d78d u1D78D 2.25 (Sans Bold, Sans Condensed Bold) +U+1d78e u1D78E 2.25 (Sans Bold, Sans Condensed Bold) +U+1d78f u1D78F 2.25 (Sans Bold, Sans Condensed Bold) +U+1d790 u1D790 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d791 u1D791 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d792 u1D792 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d793 u1D793 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d794 u1D794 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d795 u1D795 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d796 u1D796 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d797 u1D797 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d798 u1D798 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d799 u1D799 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d79a u1D79A 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d79b u1D79B 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d79c u1D79C 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d79d u1D79D 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d79e u1D79E 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d79f u1D79F 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7a0 u1D7A0 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7a1 u1D7A1 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7a2 u1D7A2 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7a3 u1D7A3 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7a4 u1D7A4 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7a5 u1D7A5 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7a6 u1D7A6 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7a7 u1D7A7 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7a8 u1D7A8 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7a9 u1D7A9 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7aa u1D7AA 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7ab u1D7AB 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7ac u1D7AC 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7ad u1D7AD 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7ae u1D7AE 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7af u1D7AF 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7b0 u1D7B0 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7b1 u1D7B1 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7b2 u1D7B2 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7b3 u1D7B3 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7b4 u1D7B4 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7b5 u1D7B5 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7b6 u1D7B6 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7b7 u1D7B7 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7b8 u1D7B8 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7b9 u1D7B9 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7ba u1D7BA 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7bb u1D7BB 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7bc u1D7BC 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7bd u1D7BD 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7be u1D7BE 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7bf u1D7BF 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7c0 u1D7C0 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7c1 u1D7C1 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7c2 u1D7C2 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7c3 u1D7C3 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7c4 u1D7C4 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7c5 u1D7C5 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7c6 u1D7C6 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7c7 u1D7C7 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7c8 u1D7C8 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7c9 u1D7C9 2.25 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7ca u1D7CA 2.25 (Serif Bold, Serif Condensed Bold) +U+1d7cb u1D7CB 2.25 (Serif Bold, Serif Condensed Bold) +U+1d7ce u1D7CE 2.25 (Serif Bold, Serif Condensed Bold) +U+1d7cf u1D7CF 2.25 (Serif Bold, Serif Condensed Bold) +U+1d7d0 u1D7D0 2.25 (Serif Bold, Serif Condensed Bold) +U+1d7d1 u1D7D1 2.25 (Serif Bold, Serif Condensed Bold) +U+1d7d2 u1D7D2 2.25 (Serif Bold, Serif Condensed Bold) +U+1d7d3 u1D7D3 2.25 (Serif Bold, Serif Condensed Bold) +U+1d7d4 u1D7D4 2.25 (Serif Bold, Serif Condensed Bold) +U+1d7d5 u1D7D5 2.25 (Serif Bold, Serif Condensed Bold) +U+1d7d6 u1D7D6 2.25 (Serif Bold, Serif Condensed Bold) +U+1d7d7 u1D7D7 2.25 (Serif Bold, Serif Condensed Bold) +U+1d7d8 u1D7D8 2.25 (Serif, Serif Condensed) +U+1d7d9 u1D7D9 2.25 (Serif, Serif Condensed) +U+1d7da u1D7DA 2.25 (Serif, Serif Condensed) +U+1d7db u1D7DB 2.25 (Serif, Serif Condensed) +U+1d7dc u1D7DC 2.25 (Serif, Serif Condensed) +U+1d7dd u1D7DD 2.25 (Serif, Serif Condensed) +U+1d7de u1D7DE 2.25 (Serif, Serif Condensed) +U+1d7df u1D7DF 2.25 (Serif, Serif Condensed) +U+1d7e0 u1D7E0 2.25 (Serif, Serif Condensed) +U+1d7e1 u1D7E1 2.25 (Serif, Serif Condensed) +U+1d7e2 u1D7E2 2.25 (Sans, Sans Condensed) +U+1d7e3 u1D7E3 2.25 (Sans, Sans Condensed) +U+1d7e4 u1D7E4 2.25 (Sans, Sans Condensed) +U+1d7e5 u1D7E5 2.25 (Sans, Sans Condensed) +U+1d7e6 u1D7E6 2.25 (Sans, Sans Condensed) +U+1d7e7 u1D7E7 2.25 (Sans, Sans Condensed) +U+1d7e8 u1D7E8 2.25 (Sans, Sans Condensed) +U+1d7e9 u1D7E9 2.25 (Sans, Sans Condensed) +U+1d7ea u1D7EA 2.25 (Sans, Sans Condensed) +U+1d7eb u1D7EB 2.25 (Sans, Sans Condensed) +U+1d7ec u1D7EC 2.25 (Sans Bold, Sans Condensed Bold) +U+1d7ed u1D7ED 2.25 (Sans Bold, Sans Condensed Bold) +U+1d7ee u1D7EE 2.25 (Sans Bold, Sans Condensed Bold) +U+1d7ef u1D7EF 2.25 (Sans Bold, Sans Condensed Bold) +U+1d7f0 u1D7F0 2.25 (Sans Bold, Sans Condensed Bold) +U+1d7f1 u1D7F1 2.25 (Sans Bold, Sans Condensed Bold) +U+1d7f2 u1D7F2 2.25 (Sans Bold, Sans Condensed Bold) +U+1d7f3 u1D7F3 2.25 (Sans Bold, Sans Condensed Bold) +U+1d7f4 u1D7F4 2.25 (Sans Bold, Sans Condensed Bold) +U+1d7f5 u1D7F5 2.25 (Sans Bold, Sans Condensed Bold) +U+1d7f6 u1D7F6 2.25 (Sans Mono) +U+1d7f7 u1D7F7 2.25 (Sans Mono) +U+1d7f8 u1D7F8 2.25 (Sans Mono) +U+1d7f9 u1D7F9 2.25 (Sans Mono) +U+1d7fa u1D7FA 2.25 (Sans Mono) +U+1d7fb u1D7FB 2.25 (Sans Mono) +U+1d7fc u1D7FC 2.25 (Sans Mono) +U+1d7fd u1D7FD 2.25 (Sans Mono) +U+1d7fe u1D7FE 2.25 (Sans Mono) +U+1d7ff u1D7FF 2.25 (Sans Mono) diff --git a/src/MacVim/dejavu-ttf-2.20/unicover.txt b/src/MacVim/dejavu-ttf/unicover.txt similarity index 92% rename from src/MacVim/dejavu-ttf-2.20/unicover.txt rename to src/MacVim/dejavu-ttf/unicover.txt index 39860cefb3..a892d966e0 100644 --- a/src/MacVim/dejavu-ttf-2.20/unicover.txt +++ b/src/MacVim/dejavu-ttf/unicover.txt @@ -1,5 +1,5 @@ This is the Unicode coverage file for DejaVu fonts -($Id: unicover.txt 2000 2007-09-16 14:34:23Z ben_laenen $) +($Id$) Control and similar characters are discounted from totals. @@ -7,12 +7,12 @@ Control and similar characters are discounted from totals. U+0000 Basic Latin 100% (95/95) 100% (95/95) 100% (95/95) U+0080 Latin-1 Supplement 100% (96/96) 100% (96/96) 100% (96/96) U+0100 Latin Extended-A 100% (128/128) 100% (128/128) 100% (128/128) -U+0180 Latin Extended-B 100% (208/208) 90% (189/208) 78% (164/208) +U+0180 Latin Extended-B 100% (208/208) 90% (189/208) 82% (172/208) U+0250 IPA Extensions 100% (96/96) 100% (96/96) 100% (96/96) U+02b0 Spacing Modifier Letters 78% (63/80) 56% (45/80) 57% (46/80) U+0300 Combining Diacritical Marks 82% (92/112) 60% (68/112) 59% (67/112) U+0370 Greek and Coptic 100% (127/127) 86% (110/127) 86% (110/127) -U+0400 Cyrillic 100% (255/255) 76% (194/255) 66% (170/255) +U+0400 Cyrillic 100% (255/255) 77% (198/255) 68% (174/255) U+0500 Cyrillic Supplement 100% (20/20) (0/20) (0/20) U+0530 Armenian 100% (86/86) (0/86) (0/86) U+0590 Hebrew 62% (54/87) (0/87) (0/87) @@ -41,7 +41,7 @@ U+1200 Ethiopic (0/356) (0/356) U+1380 Ethiopic Supplement (0/26) (0/26) (0/26) U+13a0 Cherokee (0/85) (0/85) (0/85) U+1400 Unified Canadian Aboriginal Syllabics 64% (404/630) (0/630) (0/630) -U+1680 Ogham (0/29) (0/29) (0/29) +U+1680 Ogham 100% (29/29) (0/29) (0/29) U+16a0 Runic (0/81) (0/81) (0/81) U+1700 Tagalog (0/20) (0/20) (0/20) U+1720 Hanunoo (0/23) (0/23) (0/23) @@ -58,32 +58,32 @@ U+1b00 Balinese (0/121) (0/121) U+1d00 Phonetic Extensions 82% (105/128) 48% (62/128) 48% (62/128) U+1d80 Phonetic Extensions Supplement 59% (38/64) 57% (37/64) 57% (37/64) U+1dc0 Combining Diacritical Marks Supplement 46% (6/13) (0/13) (0/13) -U+1e00 Latin Extended Additional 100% (246/246) 78% (192/246) 54% (134/246) +U+1e00 Latin Extended Additional 100% (246/246) 78% (192/246) 56% (140/246) U+1f00 Greek Extended 100% (233/233) 100% (233/233) 100% (233/233) U+2000 General Punctuation 98% (104/106) 61% (65/106) 42% (45/106) U+2070 Superscripts and Subscripts 100% (34/34) 100% (34/34) 100% (34/34) U+20a0 Currency Symbols 100% (22/22) 27% (6/22) 22% (5/22) -U+20d0 Combining Diacritical Marks for Symbols 12% (4/32) (0/32) (0/32) -U+2100 Letterlike Symbols 94% (75/79) 7% (6/79) 8% (7/79) -U+2150 Number Forms 100% (50/50) 26% (13/50) 26% (13/50) -U+2190 Arrows 100% (112/112) 3% (4/112) 100% (112/112) -U+2200 Mathematical Operators 95% (245/256) 11% (30/256) 56% (145/256) +U+20d0 Combining Diacritical Marks for Symbols 21% (7/32) (0/32) (0/32) +U+2100 Letterlike Symbols 94% (75/79) 39% (31/79) 8% (7/79) +U+2150 Number Forms 100% (50/50) 100% (50/50) 26% (13/50) +U+2190 Arrows 100% (112/112) 100% (112/112) 100% (112/112) +U+2200 Mathematical Operators 96% (247/256) 39% (100/256) 56% (145/256) U+2300 Miscellaneous Technical 27% (64/232) 6% (16/232) 50% (117/232) U+2400 Control Pictures 5% (2/39) 2% (1/39) 2% (1/39) U+2440 Optical Character Recognition (0/11) (0/11) (0/11) U+2460 Enclosed Alphanumerics 6% (10/160) (0/160) (0/160) -U+2500 Box Drawing (0/128) (0/128) 100% (128/128) +U+2500 Box Drawing 100% (128/128) 100% (128/128) 100% (128/128) U+2580 Block Elements 100% (32/32) 100% (32/32) 100% (32/32) U+25a0 Geometric Shapes 100% (96/96) 100% (96/96) 100% (96/96) U+2600 Miscellaneous Symbols 100% (176/176) 17% (30/176) 84% (149/176) -U+2700 Dingbats 100% (174/174) (0/174) 82% (144/174) +U+2700 Dingbats 100% (174/174) 0% (1/174) 82% (144/174) U+27c0 Miscellaneous Mathematical Symbols-A 17% (7/39) 7% (3/39) 7% (3/39) -U+27f0 Supplemental Arrows-A 100% (16/16) (0/16) (0/16) +U+27f0 Supplemental Arrows-A 100% (16/16) 100% (16/16) (0/16) U+2800 Braille Patterns 100% (256/256) 100% (256/256) (0/256) -U+2900 Supplemental Arrows-B 4% (6/128) (0/128) (0/128) +U+2900 Supplemental Arrows-B 4% (6/128) 100% (128/128) (0/128) U+2980 Miscellaneous Mathematical Symbols-B 10% (13/128) 0% (1/128) 2% (3/128) U+2a00 Supplemental Mathematical Operators 28% (72/256) 1% (4/256) 0% (1/256) -U+2b00 Miscellaneous Symbols and Arrows 100% (31/31) 29% (9/31) 29% (9/31) +U+2b00 Miscellaneous Symbols and Arrows 100% (31/31) 87% (27/31) 29% (9/31) U+2c00 Glagolitic (0/94) (0/94) (0/94) U+2c60 Latin Extended-C 100% (17/17) 52% (9/17) 17% (3/17) U+2c80 Coptic (0/114) (0/114) (0/114) @@ -106,11 +106,11 @@ U+31f0 Katakana Phonetic Extensions (0/16) (0/16) U+3200 Enclosed CJK Letters and Months (0/242) (0/242) (0/242) U+3300 CJK Compatibility (0/256) (0/256) (0/256) U+3400 CJK Unified Ideographs Extension A (0/0) (0/0) (0/0) -U+4dc0 Yijing Hexagram Symbols (0/64) (0/64) (0/64) +U+4dc0 Yijing Hexagram Symbols 100% (64/64) (0/64) (0/64) U+4e00 CJK Unified Ideographs (0/0) (0/0) (0/0) U+a000 Yi Syllables (0/1165) (0/1165) (0/1165) U+a490 Yi Radicals (0/55) (0/55) (0/55) -U+a700 Modifier Tone Letters (0/27) (0/27) (0/27) +U+a700 Modifier Tone Letters 18% (5/27) (0/27) (0/27) U+a720 Latin Extended-D (0/2) (0/2) (0/2) U+a800 Syloti Nagri (0/44) (0/44) (0/44) U+a840 Phags-pa (0/56) (0/56) (0/56) @@ -124,12 +124,12 @@ U+fb00 Alphabetic Presentation Forms 100% (58/58) 12% (7/58) U+fb50 Arabic Presentation Forms-A 11% (70/595) (0/595) 12% (72/595) U+fe00 Variation Selectors 100% (16/16) 100% (16/16) (0/16) U+fe10 Vertical Forms (0/10) (0/10) (0/10) -U+fe20 Combining Half Marks (0/4) (0/4) (0/4) +U+fe20 Combining Half Marks 100% (4/4) (0/4) (0/4) U+fe30 CJK Compatibility Forms (0/32) (0/32) (0/32) U+fe50 Small Form Variants (0/26) (0/26) (0/26) U+fe70 Arabic Presentation Forms-B 100% (141/141) (0/141) 100% (141/141) U+ff00 Halfwidth and Fullwidth Forms (0/225) (0/225) (0/225) -U+fff0 Specials 20% (1/5) 20% (1/5) 20% (1/5) +U+fff0 Specials 100% (5/5) 100% (5/5) 100% (5/5) U+10000 Linear B Syllabary (0/88) (0/88) (0/88) U+10080 Linear B Ideograms (0/123) (0/123) (0/123) U+10100 Aegean Numbers (0/57) (0/57) (0/57) @@ -151,7 +151,7 @@ U+1d100 Musical Symbols (0/219) (0/219) U+1d200 Ancient Greek Musical Notation (0/70) (0/70) (0/70) U+1d300 Tai Xuan Jing Symbols 100% (87/87) (0/87) (0/87) U+1d360 Counting Rod Numerals (0/18) (0/18) (0/18) -U+1d400 Mathematical Alphanumeric Symbols 4% (45/996) (0/996) (0/996) +U+1d400 Mathematical Alphanumeric Symbols 10% (107/996) 5% (55/996) 6% (62/996) U+20000 CJK Unified Ideographs Extension B (0/0) (0/0) (0/0) U+2f800 CJK Compatibility Ideographs Supplement (0/542) (0/542) (0/542) U+e0000 Tags (0/98) (0/98) (0/98) From 3b966f9e01fdb34d47cdc1412196a7e86ab6d74a Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Fri, 13 Jun 2008 16:35:31 +0200 Subject: [PATCH 0524/1156] Snapshot 31 --- src/MacVim/Info.plist | 2 +- src/MacVim/MacVim.xcodeproj/project.pbxproj | 6 ++-- src/MacVim/macvim_latest.xml | 38 +++++++++++++++++++++ 3 files changed, 42 insertions(+), 4 deletions(-) diff --git a/src/MacVim/Info.plist b/src/MacVim/Info.plist index 9b47d0c47e..1e3055da0f 100644 --- a/src/MacVim/Info.plist +++ b/src/MacVim/Info.plist @@ -574,7 +574,7 @@ CFBundleSignature VIMM CFBundleVersion - 30 + 31 NSMainNibFile MainMenu NSPrincipalClass diff --git a/src/MacVim/MacVim.xcodeproj/project.pbxproj b/src/MacVim/MacVim.xcodeproj/project.pbxproj index 99d6277586..8391e025e6 100644 --- a/src/MacVim/MacVim.xcodeproj/project.pbxproj +++ b/src/MacVim/MacVim.xcodeproj/project.pbxproj @@ -698,7 +698,7 @@ i386, ); COPY_PHASE_STRIP = YES; - CURRENT_PROJECT_VERSION = 30; + CURRENT_PROJECT_VERSION = 31; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "$(FRAMEWORK_SEARCH_PATHS_QUOTED_1)", @@ -739,7 +739,7 @@ buildSettings = { ARCHS = "$(NATIVE_ARCH)"; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 30; + CURRENT_PROJECT_VERSION = 31; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "$(FRAMEWORK_SEARCH_PATHS_QUOTED_1)", @@ -770,7 +770,7 @@ buildSettings = { ARCHS = "$(NATIVE_ARCH)"; COPY_PHASE_STRIP = YES; - CURRENT_PROJECT_VERSION = 30; + CURRENT_PROJECT_VERSION = 31; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "$(FRAMEWORK_SEARCH_PATHS_QUOTED_1)", diff --git a/src/MacVim/macvim_latest.xml b/src/MacVim/macvim_latest.xml index 621c3b8217..2cd862f12c 100644 --- a/src/MacVim/macvim_latest.xml +++ b/src/MacVim/macvim_latest.xml @@ -40,6 +40,44 @@ Sparkle supports updates in zip, tar, tbz, tgz, or dmg format. --> + + Snapshot 31 released + MacVim snapshot 31 released +

    Changes since snapshot 30: +

      +
    • Fixed problems with menus on OS X 10.4 and a related crash.
    • +
    • Dialog box handling has been updated. This fixes a problem where the + "swap file warning" dialog would pop up before the informational text in + the editor window updated. Hopefully this will also cure various other + problems with dialogs (e.g. nothing happening when opening files from a + dialog box).
    • +
    • Added dock menu with "New Window" item. This is useful with "Spaces" on + OS X 10.5 since you can use this menu to open a new MacVim window on any + "space" when another editor window is already open. (Also, now there is + always a way to open a new window, even if the menus are customized, + or if "-u NONE" is used.)
    • +
    • I have started trying to fix "modeless selection" and it sort of works + on my machine, but I've had one report stating that its not quite + working so you mileage may vary. Make sure to let me know what works + and doesn't so that I can fix this properly. (Try selecting text from + the command line.)
    • +
    • The default font (DejaVu Sans Mono) has been updated to version 2.25. +
    • +
    • Latest Vim source code merged
    • +
    +

    + ]]> + Fri, 13 Jun 2008 16:00 CET + + + + Snapshot 30 released Date: Fri, 13 Jun 2008 19:01:56 +0200 Subject: [PATCH 0525/1156] Flush output queue even when 'exiting' flag is set There are legitimate instances when the queue should flush even though Vim is exiting, e.g. to display a 'confirm quit' dialog with 'go+=c'. This patch has the negative side-effect that the "dropping DO message" warning may occur more frequently. Another fix for this problem has to be devised. --- src/MacVim/MMBackend.m | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/MacVim/MMBackend.m b/src/MacVim/MMBackend.m index 91a8e098ae..21c84ed55b 100644 --- a/src/MacVim/MMBackend.m +++ b/src/MacVim/MMBackend.m @@ -462,10 +462,9 @@ - (void)flushQueue:(BOOL)force // NOTE! This method gets called a lot; if we were to flush every time it // got called MacVim would feel unresponsive. So there is a time out which // ensures that the queue isn't flushed too often. - if (exiting || - (!force && lastFlushDate && - -[lastFlushDate timeIntervalSinceNow] < MMFlushTimeoutInterval && - [drawData length] < MMFlushQueueLenHint)) + if (!force && lastFlushDate + && -[lastFlushDate timeIntervalSinceNow] < MMFlushTimeoutInterval + && [drawData length] < MMFlushQueueLenHint) return; if ([drawData length] > 0) { @@ -1847,6 +1846,9 @@ - (void)handleKeyDown:(NSString *)key modifiers:(int)mods - (void)queueMessage:(int)msgid data:(NSData *)data { + //if (msgid != EnableMenuItemMsgID) + // NSLog(@"queueMessage:%s", MessageStrings[msgid]); + [outputQueue addObject:[NSData dataWithBytes:&msgid length:sizeof(int)]]; if (data) [outputQueue addObject:data]; From aed4648a3df88629f218637eb694953e1723e079 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Fri, 13 Jun 2008 19:12:55 +0200 Subject: [PATCH 0526/1156] Make background processes work --- src/os_unix.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/os_unix.c b/src/os_unix.c index 1b1564fb63..607cdef21b 100644 --- a/src/os_unix.c +++ b/src/os_unix.c @@ -3886,7 +3886,7 @@ mch_call_shell(cmd, options) /* push stream discipline modules */ if (options & SHELL_COOKED) SetupSlavePTY(pty_slave_fd); -# ifdef TIOCSCTTY +# if defined(TIOCSCTTY) && !defined(FEAT_GUI_MACVIM) /* Try to become controlling tty (probably doesn't work, * unless run by root) */ ioctl(pty_slave_fd, TIOCSCTTY, (char *)NULL); From 634ef3b803478dbd411b357a4ae22213a7d8b72b Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Fri, 13 Jun 2008 19:27:56 +0200 Subject: [PATCH 0527/1156] Never translate Ctrl-click if Alt, Shift, or Cmd are pressed --- src/MacVim/MMTextView.m | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/MacVim/MMTextView.m b/src/MacVim/MMTextView.m index 2307d16684..a562854f10 100644 --- a/src/MacVim/MMTextView.m +++ b/src/MacVim/MMTextView.m @@ -853,9 +853,12 @@ - (void)mouseDown:(NSEvent *)event NSMutableData *data = [NSMutableData data]; // If desired, intepret Ctrl-Click as a right mouse click. - if ([[NSUserDefaults standardUserDefaults] - boolForKey:MMTranslateCtrlClickKey] - && button == 0 && flags & NSControlKeyMask) { + BOOL translateCtrlClick = [[NSUserDefaults standardUserDefaults] + boolForKey:MMTranslateCtrlClickKey]; + flags = flags & NSDeviceIndependentModifierFlagsMask; + if (translateCtrlClick && button == 0 && + (flags == NSControlKeyMask || + flags == (NSControlKeyMask|NSAlphaShiftKeyMask))) { button = 1; flags &= ~NSControlKeyMask; } From 9ca5f6bcdb2a2529b0ec989c679444e4e986a22b Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sun, 15 Jun 2008 16:11:38 +0200 Subject: [PATCH 0528/1156] Guard against reentrant calls to processCommandQueue: If processCommandQueue: is called when inProcessCommandQueue is set we add the input to a receive queue and return. This is to ensure that processCommandQueue: can only be called "once at a time". Reentrant calls can be caused by calling a synchronous DO message or by entering a modal loop in the frontend. --- src/MacVim/MMVimController.h | 10 +- src/MacVim/MMVimController.m | 162 +++++++++++++++----------------- src/MacVim/MMWindowController.m | 3 + 3 files changed, 78 insertions(+), 97 deletions(-) diff --git a/src/MacVim/MMVimController.h b/src/MacVim/MMVimController.h index a48ae7429a..87e3845ef4 100644 --- a/src/MacVim/MMVimController.h +++ b/src/MacVim/MMVimController.h @@ -12,10 +12,6 @@ #import "MacVim.h" -// If sendMessage: fails, store the message and resend after a delay. -#define MM_RESEND_LAST_FAILURE 0 - - @class MMWindowController; @@ -27,17 +23,13 @@ id backendProxy; BOOL inProcessCommandQueue; NSMutableArray *sendQueue; + NSMutableArray *receiveQueue; NSMenu *mainMenu; NSMutableArray *popupMenuItems; NSToolbar *toolbar; NSMutableDictionary *toolbarItemDict; int pid; NSString *serverName; -#ifdef MM_RESEND_LAST_FAILURE - NSTimer *resendTimer; - int resendMsgid; - NSData *resendData; -#endif NSDictionary *vimState; } diff --git a/src/MacVim/MMVimController.m b/src/MacVim/MMVimController.m index 78eba7a266..068c74835d 100644 --- a/src/MacVim/MMVimController.m +++ b/src/MacVim/MMVimController.m @@ -41,14 +41,13 @@ // sendMessage: to actually reach Vim. static NSTimeInterval MMBackendProxyRequestTimeout = 0; -#if MM_RESEND_LAST_FAILURE -// If a message send fails, the message will be resent after this many seconds -// have passed. (No queue is kept, only the very last message is resent.) -static NSTimeInterval MMResendInterval = 0.5; -#endif - +// Timeout used for setDialogReturn:. static NSTimeInterval MMSetDialogReturnTimeout = 1.0; +// Maximum number of items in the receiveQueue. (It is hard to predict what +// consequences changing this number will have.) +static int MMReceiveQueueCap = 100; + @interface MMAlert : NSAlert { NSTextField *textField; @@ -59,6 +58,7 @@ - (NSTextField *)textField; @interface MMVimController (Private) +- (void)doProcessCommandQueue:(NSArray *)queue; - (void)handleMessage:(int)msgid data:(NSData *)data; - (void)savePanelDidEnd:(NSSavePanel *)panel code:(int)code context:(void *)context; @@ -86,9 +86,6 @@ - (void)popupMenuWithDescriptor:(NSArray *)desc atRow:(NSNumber *)row column:(NSNumber *)col; - (void)connectionDidDie:(NSNotification *)notification; -#if MM_RESEND_LAST_FAILURE -- (void)resendTimerFired:(NSTimer *)timer; -#endif @end @@ -110,6 +107,7 @@ - (id)initWithBackend:(id)backend pid:(int)processIdentifier [[MMWindowController alloc] initWithVimController:self]; backendProxy = [backend retain]; sendQueue = [NSMutableArray new]; + receiveQueue = [NSMutableArray new]; popupMenuItems = [[NSMutableArray alloc] init]; toolbarItemDict = [[NSMutableDictionary alloc] init]; pid = processIdentifier; @@ -154,13 +152,10 @@ - (void)dealloc //NSLog(@"%@ %s", [self className], _cmd); isInitialized = NO; -#if MM_RESEND_LAST_FAILURE - [resendData release]; resendData = nil; -#endif - [serverName release]; serverName = nil; [backendProxy release]; backendProxy = nil; [sendQueue release]; sendQueue = nil; + [receiveQueue release]; receiveQueue = nil; [toolbarItemDict release]; toolbarItemDict = nil; [toolbar release]; toolbar = nil; @@ -311,42 +306,12 @@ - (void)sendMessage:(int)msgid data:(NSData *)data return; } -#if MM_RESEND_LAST_FAILURE - if (resendTimer) { - //NSLog(@"cancelling scheduled resend of %s", - // MessageStrings[resendMsgid]); - - [resendTimer invalidate]; - [resendTimer release]; - resendTimer = nil; - } - - if (resendData) { - [resendData release]; - resendData = nil; - } -#endif - @try { [backendProxy processInput:msgid data:data]; } @catch (NSException *e) { //NSLog(@"%@ %s Exception caught during DO call: %@", // [self className], _cmd, e); -#if MM_RESEND_LAST_FAILURE - //NSLog(@"%s failed, scheduling message %s for resend", _cmd, - // MessageStrings[msgid]); - - resendMsgid = msgid; - resendData = [data retain]; - resendTimer = [NSTimer - scheduledTimerWithTimeInterval:MMResendInterval - target:self - selector:@selector(resendTimerFired:) - userInfo:nil - repeats:NO]; - [resendTimer retain]; -#endif } } @@ -528,34 +493,43 @@ - (oneway void)processCommandQueue:(in bycopy NSArray *)queue { if (!isInitialized) return; - @try { - unsigned i, count = [queue count]; - if (count % 2) { - NSLog(@"WARNING: Uneven number of components (%d) in flush queue " - "message; ignoring this message.", count); - return; - } - - inProcessCommandQueue = YES; - - //NSLog(@"======== %s BEGIN ========", _cmd); - for (i = 0; i < count; i += 2) { - NSData *value = [queue objectAtIndex:i]; - NSData *data = [queue objectAtIndex:i+1]; - - int msgid = *((int*)[value bytes]); - //NSLog(@"%s%s", _cmd, MessageStrings[msgid]); - - [self handleMessage:msgid data:data]; - } - //NSLog(@"======== %s END ========", _cmd); + if (inProcessCommandQueue) { + // NOTE! If a synchronous DO call is made during + // doProcessCommandQueue: below it may happen that this method is + // called a second time while the synchronous message is waiting for a + // reply (could also happen if doProcessCommandQueue: enters a modal + // loop, see comment below). Since this method cannot be considered + // reentrant, we queue the input and return immediately. + // + // If doProcessCommandQueue: enters a modal loop (happens e.g. on + // ShowPopupMenuMsgID) then the receiveQueue could grow to become + // arbitrarily large because DO calls still get processed. To avoid + // this we set a cap on the size of the queue and simply clear it if it + // becomes too large. (That is messages will be dropped and hence Vim + // and MacVim will at least temporarily be out of sync.) + if ([receiveQueue count] >= MMReceiveQueueCap) + [receiveQueue removeAllObjects]; + + [receiveQueue addObject:queue]; + return; } - @catch (NSException *e) { - NSLog(@"Exception caught whilst processing command queue: %@", e); + + inProcessCommandQueue = YES; + [self doProcessCommandQueue:queue]; + + int i; + for (i = 0; i < [receiveQueue count]; ++i) { + // Note that doProcessCommandQueue: may cause the receiveQueue to grow + // or get cleared (due to cap being hit). Make sure to retain the item + // to process or it may get released from under us. + NSArray *q = [[receiveQueue objectAtIndex:i] retain]; + [self doProcessCommandQueue:q]; + [q release]; } - [windowController processCommandQueueDidFinish]; - inProcessCommandQueue = NO; + // We assume that the remaining calls make no synchronous DO calls. If + // that did happen anyway, the command queue could get processed out of + // order. if ([sendQueue count] > 0) { @try { @@ -568,6 +542,10 @@ - (oneway void)processCommandQueue:(in bycopy NSArray *)queue [sendQueue removeAllObjects]; } + + [windowController processCommandQueueDidFinish]; + [receiveQueue removeAllObjects]; + inProcessCommandQueue = NO; } - (NSToolbarItem *)toolbar:(NSToolbar *)theToolbar @@ -598,6 +576,34 @@ - (NSArray *)toolbarDefaultItemIdentifiers:(NSToolbar *)theToolbar @implementation MMVimController (Private) +- (void)doProcessCommandQueue:(NSArray *)queue +{ + @try { + unsigned i, count = [queue count]; + if (count % 2) { + NSLog(@"WARNING: Uneven number of components (%d) in command " + "queue. Skipping...", count); + return; + } + + //NSLog(@"======== %s BEGIN ========", _cmd); + for (i = 0; i < count; i += 2) { + NSData *value = [queue objectAtIndex:i]; + NSData *data = [queue objectAtIndex:i+1]; + + int msgid = *((int*)[value bytes]); + //NSLog(@"%s%s", _cmd, MessageStrings[msgid]); + + [self handleMessage:msgid data:data]; + } + //NSLog(@"======== %s END ========", _cmd); + } + @catch (NSException *e) { + NSLog(@"Exception caught whilst processing command queue: %@", e); + } + +} + - (void)handleMessage:(int)msgid data:(NSData *)data { //if (msgid != AddMenuMsgID && msgid != AddMenuItemMsgID) @@ -1236,26 +1242,6 @@ - (NSString *)description return [NSString stringWithFormat:@"%@ : isInitialized=%d inProcessCommandQueue=%d mainMenu=%@ popupMenuItems=%@ toolbar=%@", [self className], isInitialized, inProcessCommandQueue, mainMenu, popupMenuItems, toolbar]; } -#if MM_RESEND_LAST_FAILURE -- (void)resendTimerFired:(NSTimer *)timer -{ - int msgid = resendMsgid; - NSData *data = nil; - - [resendTimer release]; - resendTimer = nil; - - if (!isInitialized) - return; - - if (resendData) - data = [resendData copy]; - - //NSLog(@"Resending message: %s", MessageStrings[msgid]); - [self sendMessage:msgid data:data]; -} -#endif - @end // MMVimController (Private) diff --git a/src/MacVim/MMWindowController.m b/src/MacVim/MMWindowController.m index dca72db0d7..476ecd48fe 100644 --- a/src/MacVim/MMWindowController.m +++ b/src/MacVim/MMWindowController.m @@ -387,6 +387,9 @@ - (void)setWideFont:(NSFont *)font - (void)processCommandQueueDidFinish { + // IMPORTANT! No synchronous DO calls are allowed in this method. They + // may cause the command queue to get processed out of order. + // NOTE: Resizing is delayed until after all commands have been processed // since it often happens that more than one command will cause a resize. // If we were to immediately resize then the vim view size would jitter From 59ad683558b7f348a86f10ee619df59e67f04d7b Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Fri, 20 Jun 2008 19:33:34 +0200 Subject: [PATCH 0529/1156] Ensure vim controllers are released in default run loop mode Vim controllers are released when NSConnectionDidDieNotification is received. This notification can arrive in pretty much any run loop mode so we take care not to act on it until the run loop mode is back to default. Otherwise we run the risk of releasing objects which Cocoa is currently using (e.g. view items) and this leads to crashes. --- src/MacVim/MMAppController.m | 1 + src/MacVim/MMVimController.m | 15 +++++++++++---- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/MacVim/MMAppController.m b/src/MacVim/MMAppController.m index 7e3396fb00..a124416872 100644 --- a/src/MacVim/MMAppController.m +++ b/src/MacVim/MMAppController.m @@ -570,6 +570,7 @@ - (void)removeVimController:(id)controller { //NSLog(@"%s%@", _cmd, controller); + [controller cleanup]; [[controller windowController] close]; [vimControllers removeObject:controller]; diff --git a/src/MacVim/MMVimController.m b/src/MacVim/MMVimController.m index 068c74835d..ae2480f617 100644 --- a/src/MacVim/MMVimController.m +++ b/src/MacVim/MMVimController.m @@ -1229,12 +1229,19 @@ - (void)connectionDidDie:(NSNotification *)notification { //NSLog(@"%@ %s%@", [self className], _cmd, notification); - [self cleanup]; - - // NOTE! This causes the call to removeVimController: to be delayed. + // NOTE! This notification can arrive at pretty much anytime, e.g. while + // the run loop is the 'event tracking' mode. This means that Cocoa may + // well be in the middle of processing some message while this message is + // received. If we were to remove the vim controller straight away we may + // free objects that Cocoa is currently using (e.g. view objects). The + // following call ensures that the vim controller is not released until the + // run loop is back in the 'default' mode. [[MMAppController sharedInstance] performSelectorOnMainThread:@selector(removeVimController:) - withObject:self waitUntilDone:NO]; + withObject:self + waitUntilDone:NO + modes:[NSArray arrayWithObject: + NSDefaultRunLoopMode]]; } - (NSString *)description From 11a1c2cb92d494ded68eef73432b484c9478eac0 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Fri, 20 Jun 2008 19:36:34 +0200 Subject: [PATCH 0530/1156] Never delete toolbar --- src/MacVim/MMVimController.m | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/MacVim/MMVimController.m b/src/MacVim/MMVimController.m index ae2480f617..9cc3a31415 100644 --- a/src/MacVim/MMVimController.m +++ b/src/MacVim/MMVimController.m @@ -606,7 +606,8 @@ - (void)doProcessCommandQueue:(NSArray *)queue - (void)handleMessage:(int)msgid data:(NSData *)data { - //if (msgid != AddMenuMsgID && msgid != AddMenuItemMsgID) + //if (msgid != AddMenuMsgID && msgid != AddMenuItemMsgID && + // msgid != EnableMenuItemMsgID) // NSLog(@"%@ %s%s", [self className], _cmd, MessageStrings[msgid]); if (OpenVimWindowMsgID == msgid) { @@ -1074,10 +1075,9 @@ - (void)removeMenuItemWithDescriptor:(NSArray *)desc NSString *rootName = [desc objectAtIndex:0]; if ([rootName isEqual:@"ToolBar"]) { if (toolbar) { - if ([desc count] == 1) { - [windowController setToolbar:nil]; - [toolbar release]; toolbar = nil; - } else if ([desc count] == 2) { + // Only remove toolbar items, never actually remove the toolbar + // itself or strange things may happen. + if ([desc count] == 2) { int idx = [toolbar indexOfItemWithItemIdentifier:title]; if (idx != NSNotFound) [toolbar removeItemAtIndex:idx]; From 9338c9c55c870d148c006854e86c4eaea2bdcb2c Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Fri, 20 Jun 2008 19:50:22 +0200 Subject: [PATCH 0531/1156] Fall back on latin-1 if Vim strings are not valid utf-8 --- src/MacVim/gui_macvim.m | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/MacVim/gui_macvim.m b/src/MacVim/gui_macvim.m index beb5e2e033..e59080e321 100644 --- a/src/MacVim/gui_macvim.m +++ b/src/MacVim/gui_macvim.m @@ -2017,17 +2017,26 @@ static int vimModMaskToEventModifierFlags(int mods) @implementation NSString (VimStrings) + (id)stringWithVimString:(char_u *)s { + // This method ensures a non-nil string is returned. If 's' cannot be + // converted to a utf-8 string it is assumed to be latin-1. If conversion + // still fails an empty NSString is returned. + NSString *string = nil; if (s) { #ifdef FEAT_MBYTE s = CONVERT_TO_UTF8(s); #endif - NSString *string = [NSString stringWithUTF8String:(char*)s]; + string = [NSString stringWithUTF8String:(char*)s]; + if (!string) { + // HACK! Apparently 's' is not a valid utf-8 string, maybe it is + // latin-1? + string = [NSString stringWithCString:(char*)s + encoding:NSISOLatin1StringEncoding]; + } #ifdef FEAT_MBYTE CONVERT_TO_UTF8_FREE(s); #endif - return string; } - return [NSString string]; + return string != nil ? string : [NSString string]; } @end From a4e3a7370b1647afb5fa60c930b44e1036192e06 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sat, 21 Jun 2008 18:14:36 +0200 Subject: [PATCH 0532/1156] Search for toolbar icons in 'runtimepath' --- src/MacVim/MMVimController.m | 11 ++++++++--- src/MacVim/gui_macvim.m | 17 ++++++++++++----- src/gui.c | 3 ++- 3 files changed, 22 insertions(+), 9 deletions(-) diff --git a/src/MacVim/MMVimController.m b/src/MacVim/MMVimController.m index 9cc3a31415..374998e58d 100644 --- a/src/MacVim/MMVimController.m +++ b/src/MacVim/MMVimController.m @@ -1131,7 +1131,8 @@ - (void)enableMenuItemWithDescriptor:(NSArray *)desc state:(BOOL)on } - (void)addToolbarItemToDictionaryWithLabel:(NSString *)title - toolTip:(NSString *)tip icon:(NSString *)icon + toolTip:(NSString *)tip + icon:(NSString *)icon { // If the item corresponds to a separator then do nothing, since it is // already defined by Cocoa. @@ -1147,6 +1148,8 @@ - (void)addToolbarItemToDictionaryWithLabel:(NSString *)title [item setAutovalidates:NO]; NSImage *img = [NSImage imageNamed:icon]; + if (!img) + img = [[[NSImage alloc] initByReferencingFile:icon] autorelease]; if (!img) { NSLog(@"WARNING: Could not find image with name '%@' to use as toolbar" " image for identifier '%@';" @@ -1163,8 +1166,10 @@ - (void)addToolbarItemToDictionaryWithLabel:(NSString *)title [item release]; } -- (void)addToolbarItemWithLabel:(NSString *)label tip:(NSString - *)tip icon:(NSString *)icon atIndex:(int)idx +- (void)addToolbarItemWithLabel:(NSString *)label + tip:(NSString *)tip + icon:(NSString *)icon + atIndex:(int)idx { if (!toolbar) return; diff --git a/src/MacVim/gui_macvim.m b/src/MacVim/gui_macvim.m index e59080e321..e18268f28b 100644 --- a/src/MacVim/gui_macvim.m +++ b/src/MacVim/gui_macvim.m @@ -691,11 +691,6 @@ + (id)stringWithVimString:(char_u *)s; void gui_mch_add_menu_item(vimmenu_T *menu, int idx) { - // NOTE! If 'iconfile' is not set but 'iconidx' is, use the name of the - // menu item. (Should correspond to a stock item.) - char_u *icon = menu->iconfile ? menu->iconfile : - menu->iconidx >= 0 ? menu->dname : - NULL; char_u *tip = menu->strings[MENU_INDEX_TIP] ? menu->strings[MENU_INDEX_TIP] : menu->actext; NSArray *desc = descriptor_for_menu(menu); @@ -703,6 +698,18 @@ + (id)stringWithVimString:(char_u *)s; ? [NSString stringWithFormat:@"%C", specialKeyToNSKey(menu->mac_key)] : [NSString string]; int modifierMask = vimModMaskToEventModifierFlags(menu->mac_mods); + char_u *icon = NULL; + + if (menu_is_toolbar(menu->parent->name)) { + char_u fname[MAXPATHL]; + + // TODO: Ensure menu->iconfile exists (if != NULL) + icon = menu->iconfile; + if (!icon && gui_find_bitmap(menu->name, fname, "bmp") == OK) + icon = fname; + if (!icon && menu->iconidx >= 0) + icon = menu->dname; + } [[MMBackend sharedInstance] queueMessage:AddMenuItemMsgID properties: [NSDictionary dictionaryWithObjectsAndKeys: diff --git a/src/gui.c b/src/gui.c index 1065f1ff70..3a65f8224b 100644 --- a/src/gui.c +++ b/src/gui.c @@ -4836,7 +4836,8 @@ ex_gui(eap) } #if ((defined(FEAT_GUI_X11) || defined(FEAT_GUI_GTK) || defined(FEAT_GUI_W32) \ - || defined(FEAT_GUI_PHOTON)) && defined(FEAT_TOOLBAR)) || defined(PROTO) + || defined(FEAT_GUI_PHOTON)) && defined(FEAT_TOOLBAR) \ + || defined(FEAT_GUI_MACVIM)) || defined(PROTO) /* * This is shared between Athena, Motif and GTK. */ From 40056b05c30ad7554be3c9e426566f8299c08be9 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sat, 21 Jun 2008 20:32:37 +0200 Subject: [PATCH 0533/1156] Delay processing unsafe command queue items Unsafe messages are defined in isUnsafeMessage(). If a message is unsafe it should only be handled in the default run loop mode. This is e.g. to avoid deleting Cocoa objects when a Cocoa message may be busy processing it (which may happen due to the nature of distributed objects and the fact that we process DO message in 'event tracking' mode). --- src/MacVim/MMVimController.m | 73 +++++++++++++++++++++++++++++++++++- src/MacVim/MacVim.h | 5 +++ 2 files changed, 77 insertions(+), 1 deletion(-) diff --git a/src/MacVim/MMVimController.m b/src/MacVim/MMVimController.m index 374998e58d..e174fb6aca 100644 --- a/src/MacVim/MMVimController.m +++ b/src/MacVim/MMVimController.m @@ -48,6 +48,8 @@ // consequences changing this number will have.) static int MMReceiveQueueCap = 100; +static BOOL isUnsafeMessage(int msgid); + @interface MMAlert : NSAlert { NSTextField *textField; @@ -390,6 +392,7 @@ - (oneway void)showSavePanelForDirectory:(in bycopy NSString *)dir title:(in bycopy NSString *)title saving:(int)saving { + // TODO: Delay call until run loop is in default mode. if (!isInitialized) return; if (!dir) { @@ -424,6 +427,7 @@ - (oneway void)presentDialogWithStyle:(int)style buttonTitles:(in bycopy NSArray *)buttonTitles textFieldString:(in bycopy NSString *)textFieldString { + // TODO: Delay call until run loop is in default mode. if (!(windowController && buttonTitles && [buttonTitles count])) return; MMAlert *alert = [[MMAlert alloc] init]; @@ -578,6 +582,8 @@ @implementation MMVimController (Private) - (void)doProcessCommandQueue:(NSArray *)queue { + NSMutableArray *delayQueue = nil; + @try { unsigned i, count = [queue count]; if (count % 2) { @@ -594,7 +600,33 @@ - (void)doProcessCommandQueue:(NSArray *)queue int msgid = *((int*)[value bytes]); //NSLog(@"%s%s", _cmd, MessageStrings[msgid]); - [self handleMessage:msgid data:data]; + BOOL inDefaultMode = [[[NSRunLoop currentRunLoop] currentMode] + isEqual:NSDefaultRunLoopMode]; + if (!inDefaultMode && isUnsafeMessage(msgid)) { + // NOTE: Because we listen to DO messages in 'event tracking' + // mode we have to take extra care when doing things like + // releasing view items (and other Cocoa objects). Messages + // that may be potentially "unsafe" are delayed until the run + // loop is back to default mode at which time they are safe to + // call again. + // A problem with this approach is that it is hard to + // classify which messages are unsafe. As a rule of thumb, if + // a message may release an object used by the Cocoa framework + // (e.g. views) then the message should be considered unsafe. + // Delaying messages may have undesired side-effects since it + // means that messages may not be processed in the order Vim + // sent them, so beware. + if (!delayQueue) + delayQueue = [NSMutableArray array]; + + //NSLog(@"Adding unsafe message '%s' to delay queue (mode=%@)", + // MessageStrings[msgid], + // [[NSRunLoop currentRunLoop] currentMode]); + [delayQueue addObject:value]; + [delayQueue addObject:data]; + } else { + [self handleMessage:msgid data:data]; + } } //NSLog(@"======== %s END ========", _cmd); } @@ -602,6 +634,14 @@ - (void)doProcessCommandQueue:(NSArray *)queue NSLog(@"Exception caught whilst processing command queue: %@", e); } + if (delayQueue) { + //NSLog(@" Flushing delay queue (%d items)", [delayQueue count]/2); + [self performSelectorOnMainThread:@selector(processCommandQueue:) + withObject:delayQueue + waitUntilDone:NO + modes:[NSArray arrayWithObject: + NSDefaultRunLoopMode]]; + } } - (void)handleMessage:(int)msgid data:(NSData *)data @@ -813,6 +853,8 @@ - (void)handleMessage:(int)msgid data:(NSData *)data [vimState release]; vimState = [dict retain]; } + // IMPORTANT: When adding a new message, make sure to update + // isUnsafeMessage() if necessary! } else { NSLog(@"WARNING: Unknown message received (msgid=%d)", msgid); } @@ -1358,3 +1400,32 @@ - (void)beginSheetModalForWindow:(NSWindow *)window } @end // MMAlert + + + + + static BOOL +isUnsafeMessage(int msgid) +{ + // Messages that may release Cocoa objects must be added to this list. For + // example, UpdateTabBarMsgID may delete NSTabViewItem objects so it goes + // on this list. + static int unsafeMessages[] = { // REASON MESSAGE IS ON THIS LIST: + OpenVimWindowMsgID, // Changes lots of state + UpdateTabBarMsgID, // May delete NSTabViewItem + RemoveMenuItemMsgID, // Deletes NSMenuItem + DestroyScrollbarMsgID, // Deletes NSScroller + ExecuteActionMsgID, // Impossible to predict + ShowPopupMenuMsgID, // Enters modal loop + ActivateMsgID, // ? + EnterFullscreenMsgID, // Modifies delegate of window controller + LeaveFullscreenMsgID, // Modifies delegate of window controller + }; + + int i, count = sizeof(unsafeMessages)/sizeof(unsafeMessages[0]); + for (i = 0; i < count; ++i) + if (msgid == unsafeMessages[i]) + return YES; + + return NO; +} diff --git a/src/MacVim/MacVim.h b/src/MacVim/MacVim.h index 45f5bb8213..09f3970673 100644 --- a/src/MacVim/MacVim.h +++ b/src/MacVim/MacVim.h @@ -38,6 +38,11 @@ // // This is the protocol MMVimController implements. // +// Be very careful if you want to add methods to this protocol. Since DO +// messages may arrive while Cocoa is in the middle of processing some other +// message be sure to consider reentrancy issues. Look at processCommandQueue: +// to see an example of how to deal with this. +// @protocol MMFrontendProtocol - (oneway void)processCommandQueue:(in bycopy NSArray *)queue; - (oneway void)showSavePanelForDirectory:(in bycopy NSString *)dir From d98996d31cf4826967b303d9ba7bee3cc96e030f Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sat, 21 Jun 2008 21:18:17 +0200 Subject: [PATCH 0534/1156] Code cleanup --- src/MacVim/MMVimView.h | 1 - src/MacVim/MMVimView.m | 13 ++++--------- src/MacVim/MMWindowController.m | 7 ++++--- 3 files changed, 8 insertions(+), 13 deletions(-) diff --git a/src/MacVim/MMVimView.h b/src/MacVim/MMVimView.h index 676e5ab815..a87ec98de1 100644 --- a/src/MacVim/MMVimView.h +++ b/src/MacVim/MMVimView.h @@ -30,7 +30,6 @@ - (MMVimView *)initWithFrame:(NSRect)frame vimController:(MMVimController *)c; - (MMTextView *)textView; -- (NSMutableArray *)scrollbars; - (void)cleanup; - (NSSize)desiredSize; diff --git a/src/MacVim/MMVimView.m b/src/MacVim/MMVimView.m index f43c6c4bc5..743af3aec1 100644 --- a/src/MacVim/MMVimView.m +++ b/src/MacVim/MMVimView.m @@ -208,11 +208,6 @@ - (MMTextView *)textView return textView; } -- (NSMutableArray *)scrollbars -{ - return scrollbars; -} - - (PSMTabBarControl *)tabBarControl { return tabBarControl; @@ -374,7 +369,7 @@ - (void)createScrollbarWithIdentifier:(long)ident type:(int)type [scroller setAction:@selector(scroll:)]; [self addSubview:scroller]; - [[self scrollbars] addObject:scroller]; + [scrollbars addObject:scroller]; [scroller release]; } @@ -387,7 +382,7 @@ - (BOOL)destroyScrollbarWithIdentifier:(long)ident if (!scroller) return NO; [scroller removeFromSuperview]; - [[self scrollbars] removeObjectAtIndex:idx]; + [scrollbars removeObjectAtIndex:idx]; // If a visible scroller was removed then the vim view must resize. This // is handled by the window controller (the vim view never resizes itself). @@ -719,9 +714,9 @@ - (int)representedIndexOfTabViewItem:(NSTabViewItem *)tvi - (MMScroller *)scrollbarForIdentifier:(long)ident index:(unsigned *)idx { - unsigned i, count = [[self scrollbars] count]; + unsigned i, count = [scrollbars count]; for (i = 0; i < count; ++i) { - MMScroller *scroller = [[self scrollbars] objectAtIndex:i]; + MMScroller *scroller = [scrollbars objectAtIndex:i]; if ([scroller identifier] == ident) { if (idx) *idx = i; return scroller; diff --git a/src/MacVim/MMWindowController.m b/src/MacVim/MMWindowController.m index 476ecd48fe..4aab9aa004 100644 --- a/src/MacVim/MMWindowController.m +++ b/src/MacVim/MMWindowController.m @@ -289,9 +289,10 @@ - (void)setTextDimensionsWithRows:(int)rows columns:(int)cols live:(BOOL)live //NSLog(@"setTextDimensionsWithRows:%d columns:%d live:%s", rows, cols, // live ? "YES" : "NO"); - // NOTE: This is the only place where the (rows,columns) of the vim view - // are modified. Setting these values have no immediate effect, the actual - // resizing of the view is done in processCommandQueueDidFinish. + // NOTE: The only place where the (rows,columns) of the vim view are + // modified is here and when entering/leaving full-screen. Setting these + // values have no immediate effect, the actual resizing of the view is done + // in processCommandQueueDidFinish. // // The 'live' flag indicates that this resize originated from a live // resize; it may very well happen that the view is no longer in live From e7b9c110896b5c6c75445c7a6655e7c3b23b9d4c Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sat, 21 Jun 2008 21:23:30 +0200 Subject: [PATCH 0535/1156] Delay display of popup menu The popup menu enters a modal loop so it is not displayed immediately to avoid blocking inside processCommandQueue:. --- src/MacVim/MMVimController.m | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/src/MacVim/MMVimController.m b/src/MacVim/MMVimController.m index e174fb6aca..6a861f0378 100644 --- a/src/MacVim/MMVimController.m +++ b/src/MacVim/MMVimController.m @@ -87,6 +87,7 @@ - (void)addToolbarItemWithLabel:(NSString *)label - (void)popupMenuWithDescriptor:(NSArray *)desc atRow:(NSNumber *)row column:(NSNumber *)col; +- (void)popupMenuWithAttributes:(NSDictionary *)attrs; - (void)connectionDidDie:(NSNotification *)notification; @end @@ -804,9 +805,14 @@ - (void)handleMessage:(int)msgid data:(NSData *)data [actionName release]; } else if (ShowPopupMenuMsgID == msgid) { NSDictionary *attrs = [NSDictionary dictionaryWithData:data]; - [self popupMenuWithDescriptor:[attrs objectForKey:@"descriptor"] - atRow:[attrs objectForKey:@"row"] - column:[attrs objectForKey:@"column"]]; + + // The popup menu enters a modal loop so delay this call so that we + // don't block inside processCommandQueue:. + [self performSelectorOnMainThread:@selector(popupMenuWithAttributes:) + withObject:attrs + waitUntilDone:NO + modes:[NSArray arrayWithObject: + NSDefaultRunLoopMode]]; } else if (SetMouseShapeMsgID == msgid) { const void *bytes = [data bytes]; int shape = *((int*)bytes); bytes += sizeof(int); @@ -1272,6 +1278,15 @@ - (void)popupMenuWithDescriptor:(NSArray *)desc [NSMenu popUpContextMenu:menu withEvent:event forView:textView]; } +- (void)popupMenuWithAttributes:(NSDictionary *)attrs +{ + if (!attrs) return; + + [self popupMenuWithDescriptor:[attrs objectForKey:@"descriptor"] + atRow:[attrs objectForKey:@"row"] + column:[attrs objectForKey:@"column"]]; +} + - (void)connectionDidDie:(NSNotification *)notification { //NSLog(@"%@ %s%@", [self className], _cmd, notification); From ab9df03d0d0bbc233179d8989f6b8b0afd90507e Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Sun, 22 Jun 2008 14:30:09 +0200 Subject: [PATCH 0536/1156] Snapshot 32 --- src/MacVim/Info.plist | 2 +- src/MacVim/MacVim.xcodeproj/project.pbxproj | 6 ++-- src/MacVim/macvim_latest.xml | 31 +++++++++++++++++++++ 3 files changed, 35 insertions(+), 4 deletions(-) diff --git a/src/MacVim/Info.plist b/src/MacVim/Info.plist index 1e3055da0f..7a85a25195 100644 --- a/src/MacVim/Info.plist +++ b/src/MacVim/Info.plist @@ -574,7 +574,7 @@ CFBundleSignature VIMM CFBundleVersion - 31 + 32 NSMainNibFile MainMenu NSPrincipalClass diff --git a/src/MacVim/MacVim.xcodeproj/project.pbxproj b/src/MacVim/MacVim.xcodeproj/project.pbxproj index 8391e025e6..e9f26a4a0c 100644 --- a/src/MacVim/MacVim.xcodeproj/project.pbxproj +++ b/src/MacVim/MacVim.xcodeproj/project.pbxproj @@ -698,7 +698,7 @@ i386, ); COPY_PHASE_STRIP = YES; - CURRENT_PROJECT_VERSION = 31; + CURRENT_PROJECT_VERSION = 32; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "$(FRAMEWORK_SEARCH_PATHS_QUOTED_1)", @@ -739,7 +739,7 @@ buildSettings = { ARCHS = "$(NATIVE_ARCH)"; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 31; + CURRENT_PROJECT_VERSION = 32; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "$(FRAMEWORK_SEARCH_PATHS_QUOTED_1)", @@ -770,7 +770,7 @@ buildSettings = { ARCHS = "$(NATIVE_ARCH)"; COPY_PHASE_STRIP = YES; - CURRENT_PROJECT_VERSION = 31; + CURRENT_PROJECT_VERSION = 32; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "$(FRAMEWORK_SEARCH_PATHS_QUOTED_1)", diff --git a/src/MacVim/macvim_latest.xml b/src/MacVim/macvim_latest.xml index 2cd862f12c..aef54bc674 100644 --- a/src/MacVim/macvim_latest.xml +++ b/src/MacVim/macvim_latest.xml @@ -40,6 +40,37 @@ Sparkle supports updates in zip, tar, tbz, tgz, or dmg format. --> + + Snapshot 32 released + MacVim snapshot 32 released + +

    This snapshot contains fixes for several severe bugs; I strongly suggest +that you update now!

    + +

    Changes since snapshot 31: +

      +
    • Fix several bugs that caused MacVim to crash
    • +
    • Console dialogs work once again (set go+=c)
    • +
    • Background processes work (:sh ... &)
    • +
    • Ctrl-Shift can be used for modeless selection
    • +
    • No crashes with HTML plugin
    • +
    • Toolbar is a bit better at finding icons (this still needs some work) +
    • +
    • Latest Vim source code and runtime files merged
    • +
    +

    + ]]>
    + Fri, 22 Jun 2008 13:13 CET + +
    + + Snapshot 31 released Date: Sun, 22 Jun 2008 17:08:38 +0200 Subject: [PATCH 0537/1156] Update README file --- src/MacVim/README | 360 +++++++++++++++++++++------------------------- 1 file changed, 164 insertions(+), 196 deletions(-) diff --git a/src/MacVim/README b/src/MacVim/README index bba32775dd..4c7ec2b382 100644 --- a/src/MacVim/README +++ b/src/MacVim/README @@ -1,196 +1,164 @@ -Compiling: - -- To build the project: - + patch vim7 src with MacVim patch - + make vim7 src with --enable-gui=macvim - + build MacVim.xcodeproj -- To install: - + copy MacVim.app to /Applications (or anywhere you want it) - + in ~/.profile add this line: - alias gvim='/Applications/MacVim.app/Contents/MacOS/Vim -g' -- To run: - + Double click MacVim icon - + with the above alias you can type 'gvim' in terminal to open MacVim - (if the -g switch is left out, then Vim is started in terminal mode) - + in terminal mode of Vim, type :gui and MacVim will start -- Technical notes: - + to build a universal binary, the compiler AND linker needs the flags - '-isysroot /Developer/SDKs/MacOSX10.4u.sdk -arch ppc -arch i386'; also, - make needs argument --with-mac-arch=both - + vim runtime files are copied to - 'MacVim.app/Contents/Resources/vim/runtime/' - -Weirdness: - -- [obsolete] When the text system (Cocoa) comes across multi byte characters it - automatically chooses a font for those characters; this font may not be the - same height as the one set on the text storage and hence the program must - account for the fact that lines may have differing heights. - We get around this problem by resizing the window to fit the text storage - after the layout manager has performed layout. As a side-effect the user - sees how the window resizes when certain multi byte characters are being - displayed. -- [obsolete] Remember to set 'inputReceived = YES' in MMBackend - handlePortMessage:, otherwise Vim will not inform MMVimController of - changes it makes (e.g. in response to a key down event). -- The way delegate messages from the tab bar are handled are based on lots of - assumptions on how the code works. See comments in tabView:... delegate - messages in MMWindowController. -- [obsolete] The insertion point is automatically moved to wherever changes are - made in the text storage. To set the position manually (via - setSelectedRange:), first call endEditing on the text storage. -- Delegate messages from the tab view need to be able to differentiate whether - the message was sent due to the user clicking a tab with the mouse, or if the - vim task initiated the change. To facilitate this, flags must be set - whenever the vim task does something that results in these delegate messages - being sent. See comments in the tabView:...Item: messages in - MMWindowController. -- In Vim the first tab has index 1, in the gui the first tab has index 0. This - is compensated for in MMBackend.m. -- The PSMTabBarControl does not reorder the NSTabView when a user drags tabs - around, so we must rely on [PSMTabBarControl representedItems] to get the - correct order of tabs (the order which the user can 'see'). WARNING! This - means that the code cannot rely on calls like - [NSTabView selectTabViewItemAtIndex:] etc. since the NSTabView has the - 'wrong' order. -- The MMVimController is added to the NSEventTrackingRunLoopMode, otherwise - updates from Vim would not reach the MMVimController while the user - resizes the window using the mouse. -- It seems that (oneway void) DO messages can arrive when another such message - is being processed. For this reason, no input is sent to Vim whilst in - processCommandQueue:. Instead, messages are queued and sent when - processCommandQueue: has finished. Otherwise the invariant that all Vim - messages must appear in the same order they were issued will be violated. -- Text storage dimensions are not ever directly modified, instead a message is - sent to Vim asking it to change the "shell size". Otherwise, a message - asking Vim to change the shell size might get lost and Vim and MacVim will - have inconsistent states. -- gui_mch_browse() and gui_mch_dialog() are blocking calls, but you can't put - up dialogs in Cocoa which block until the user dismisses them (it uses - callbacks). This complicates the browsing somewhat. -- When binding menus to :action note that that action will be used for all - modes. The reason for this is that MacVim needs to be able to execute such - menu items even when no windows are open (e.g. newVimWindow:) and the default - menu action relies on Vim to deal with it. -- The 'help' key is treated as a special key by Cocoa; when the user presses - this key the mouse cursor changes to a question mark and the application is - put into 'context help mode'. The key down event is never sent down the - responder chain. To get around this problem we are forced to subclass - NSApplication and look for the 'help' key in sendEvent: (see MMApplication). - - -Design decisions: - -- Output is queued and sent to the MMVimController only when - [MMBackend flushQueue] is called in order to minimize the amount of - messages sent back and forth between the task and gui. Also, this makes sure - that commands reach MacVim in the same order they were issued by Vim. -- Drawing commands are stored in a buffer (drawData) and put on the output - queue whenever [MMBackend flush] is called. This buffer might no - longer be needed now that there is a general output queue. However, the - existing code works, so why change it? -- [obsolete] The gui listens for tasks on a named port whose name is derived - from CFBundleIdentifier (which is defined inside Info.plist of the app - bundle). In order to run two different copies of MacVim at the same time, - they need to have differing bundle identifiers; otherwise one copy will not - be able to create the named listening port and all tasks will connect to the - first copy. -- The gui creates a named NSConnection which vends the MMAppController object. -- All tabs share one text view and its associated text storage. There used to - be one text view per tab, but this only complicated the code since Vim has no - concept of different views (as in NSView). -- Vim holds the actual state. MacVim should never change Vim related states - directly, instead it must ask Vim to change the state and wait for Vim to - reply with an actual state change command. -- If MacVim wants to change the state of Vim it must go through - processInput:data:, this is an asynchronous call. -- MacVim can query state information synchronously by adding a suitable message - to MMBackendProtocol, however this must not change the state of Vim! -- If MacVim or Vim dies, the NSConnection is invalidated and connectionDidDie: - is invoked. -- Input may reach the backend whenever the run loop is updated. This can cause - problems if more input is received whilst already processing other input. At - the moment new input is dropped if the backend is already processing other - input. - - -Keyboard stuff: - -- input ends up in one of the following methods - (1) insertText: - (2) doCommandBySelector: - (3) performKeyEquivalent: - -- (1) handles: printable keys (a, Space, 1, ...) and (also ). - if Ctrl+Option is held [NSEvents characters] will translate the input to - control characters; note that if the translation fails, then Shift and Option - modifiers are NOT includeded in [NSEvent characters], but they are included - in [NSEvent charactersIgnoringModifiers]. e.g. given , characters - returns 1, charactersIgnoringModifiers returns . -- (2) handles: Ctrl+key, enter, backspace, escape. - same note on translation of Ctrl+key as above holds true. - come Ctrl+key combos are by default mapped to several commands, so Ctrl+keys - must be intercepted in keyDown: -- (3) handles: Cmd+key, arrow keys, function keys, help key - Cmd+letter keys never reach the app if this method isn't overridden (but - Cmd+function keys do) - Cmd+function key must not be intercepted here or input methods won't work -- and are two different characters (the former is 0xa0) -- Cocoa translates to Ctrl-C so this must be taken care of -- with various modifiers is very special, check MMBackend how it is - handled - - -Bugs: - -- Using NSString initWithBytesNoCopy:::: causes crash when trying to set window - title. -- NSTabViewItem setInitialFirstResponder: seems to have no effect, so we - manually set the first responder when the tab item selection changes. -- PSMTabBarControl never removes itself as an observer, which can cause all - sort of weird problems (crashes etc.), so this is taken care of at cleanup. -- PSMTabBarControl retains its delegate, so the delegate is forcibly set to nil - at cleanup, else there will be a memory leak. - - -Features (!supp indicates that a feature is not supported): - -- Multiple top-level windows: each window runs its own vim process (they are - completely independent) -- Tabs: uses PSMTabBarControl to show tabs, can reorder tabs by dragging them, - has overflow menu, new tab button on tabline -- Menubar: accelerators !supp, actext hint displayed as tool tip - instead of on menu, each window has its own menu, set key equivalents with - :menukeyequiv command -- Toolbar: toolbariconsize supported (tiny&small equiv to 24x24 px, - medium&large equiv to 32x32 px), toolbar supports 'icons' and 'text' options - (but not 'tooltip' which is always on), each window has its own toolbar, - custom toolbar items -- Cocoa input protocols: input managers, character palette input etc. - supported, marked text partially supported, cocoa key bindings - (DefaultKeyBinding.dict) are disabled -- Mouse: resize (vim) windows, selection, different mouse cursors, - autoscrolling whilst selecting (horizontal autoscroll !supp) -- Drag and Drop: drag files onto dock icon to open in tabs, drag text and files - onto text view -- Zoom: Command-click to zoom to fill window, otherwise only zoom height, - hold down Option to zoom all windows -- Resize: live resize (although terribly slow), :set lines will not make window - higher than can fit the screen (no such restrictions on width at the moment) -- Pasteboard: star-register works with the mac os x pasteboard -- Open/Save dialog: use with :browse -- Gui dialogs -- Fonts: bold/italic/underline traits supported, font changes with ':set gfn', - or use font panel -- File type associations: add more associations by editing Info.plist -- Start GUI from terminal, type :gui -- Scroll bars -- Wide characters: but composed characters !supp -- Printing: !supp -- Find/Replace dialog: !supp -- External editor protocol: !supp -- Services menu: some simple minded provider entries -- Encodings: !supp (enc, tenc always set to utf-8) -- Autosave window position -- Smart cascading of new windows -- Client/server support (only gui window can become server) +This README contains an overview of the MacVim source code and a very short +description on how to build the application. + +The information in here is not meant to be exhaustive. A lot more information +can be found in the source code comments. + + +Source code overview: + +MacVim.app consists of two executables: MacVim and Vim. MacVim is a Cocoa app +which does all the window management including drawing and receiving input. +Vim is the actual editor which receives input from MacVim and sends output +back when there is something to draw. + +As far as the source code files goes, MacVim.[m|h] contains code shared +between MacVim and Vim, gui_macvim.m and MMBackend.[m|h] belongs to Vim, +everything else belongs to MacVim. (The source code is all Objective-C which +is very easy to pick up if you know C and some object oriented programming.) + +Each editor window in MacVim runs its own Vim process (but there is always +only one MacVim process). Communication between MacVim and a Vim process is +done using Distributed Objects (DO). Each Vim process is represented by a +backend object (MMBackend) and it communicates with a frontend object in the +Vim process (MMVimController). The interface between the backend and frontend +is defined in MacVim.h. + +The frontend sends input to the backend by calling +-[MMBackend processInput:data:]. The backend queues output on a command queue +and sends it to the frontend at opportune times by calling +-[MMVimController processCommandQueue:]. These are both asynchronous calls so +MacVim can keep drawing and receiving input while Vim is working away, thus +always keeping the user interface responsive. + +The state of each editor window is kept entirely in the Vim process. MacVim +should remain "ignorant" in the sense that it knows nothing of the actual +state of a Vim process. Typically this is not a problem, but sometimes MacVim +must change state without going via Vim, and sometimes MacVim needs immediate +access to the state from Vim. The former happens e.g. when the user drags to +resize a window (MacVim changes the window dimensions immediately without +asking Vim first), the second can happen when some option variable affects the +way something is presented visually (e.g. MacVim needs immediate access to the +'mousehide' option so that it can hide the mouse cursor when input is +received). State information that may be required in this way can be "pushed" +to MacVim inside -[MMBackend queueVimStateMessage]. + + +Vim: + +Hooks from within Vim are implmented in gui_macvim.m, the name of such +functions usually start with "gui_mch_" and they should simply put a message +on the output queue, by calling queueMessage:properties: on the singleton +MMBackend object [MMBackend sharedInstance] (see e.g. gui_mch_destroy_menu()). +The output queue is flushed when requested (in -[MMBackend flushQueue]) or +before Vim takes a nap whilst waiting for new input (in +-[MMBackend waitForInput]). + +Note that each Vim process has its own run loop (it is required for DO) and +since Vim is in charge of its thread it needs to "update" the run loop +manually. This can happen in -[MMBackend update], which returns immediately +if nothing is pending on the run loop, or in -[MMBackend waitForInput], which +can possibly block until input appears on the run loop. In any case, if Vim +for some reason fails to update the run loop then incoming DO calls will not +be processed and for this reason it is best to avoid making synchronous DO +calls from MacVim. (If synchronous calls must be made then it is important to +set proper timeouts so that MacVim doesn't "hang", see +-[MMVimConroller sendMessageNow:::] to see how this can be done.) + + +MacVim: + +The main nib of MacVim.app is MainMenu.nib which contains the default menu and +an instance of MMAppController, which is connected as the delegate of +NSApplication. That mens, when MacVim starts it will load this nib file and +automatically create an instance of the MMAppController singleton. + +A new editor window is opened by calling +-[MMAppController launchVimProcessWithArguments:]. This functions starts a +new Vim process (by executing the Vim binary). The Vim process lets MacVim +know when it has launched by calling -[MMAppController connectBackend:pid:] +and MacVim responds to this message by calling a new frontend object +(MMVimController) and returns a proxy to this object back to the Vim process. +From this point onward the Vim process communicates directly with the +MMVimController. + +The MMVimController represents the frontend of a Vim process inside MacVim. +It coordinates all communication with the Vim process and delegates output +that affects visual presentation to a MMWindowController object. Read the +Cocoa documentation on the responsibilities of a window controller. + +Input (keyboard & mouse) handling and drawing is handled by a MMTextView +object. + + +Distributed Object dangers: + +Distributed Object messages are handled whenever the run loop is updated. +Since the run loop can be updated at unpredictable times some care has to be +taken when implementing DO messages. Some unexpected examples of when the run +loop is updated: + +1. When a synchronous DO message is sent. The run loop goes into a loop +waiting for a return to the synchronous message; During this wait another DO +message may arrive. + +2. When a modal loop is entered. For example, when a user presses a Cmd-key +the menu flashes briefly. During this "flash" a modal loop is entered. + +Item 1 can cause a problem if MacVim sends a synchronous message and before a +reply reacheds MacVim another message is received. From the source code it +looks like the synchronous message blocks but in fact the other message is +executed during this "block". If the other message changes state radically +something may go wrong after the synchronous DO message returns. + +Item 2 can cause similar problems but it may happen deep inside a Cocoa call +which may be even more puzzling. + +One way to alleviate these problems is to ensure a DO message isn't entered +twice by setting a boolean at the beginning of the message and clearing it +afterwards. If the boolean is already set when entering the call must somehow +be delayed. See -[MMVimController processCommandQueue:] for a concrete +example. + +Another danger is that we must take care when releasing objects that Cocoa may +be using. See -[MMVimController connectionDidDie:] how MacVim releases +MMVimControllers when the Vim process they control exits. + + +Source code file organisation: + +Here is an incomplete list of source code files with a short explanation of +what they contain: + + MMAppController.* Everything related to running the application + MMBackend.* Object representing a Vim process in backend + MMTextView.* Handles input and drawing + MMVimController.* Object representing a Vim Process in frontend + MMVimView.* Cocoa view object + MMWindowController.* Coordinates visual presentation + MacVim.* Code shared between MacVim and Vim + gui_macvim.m Hooks from Vim + + +Building: + +You will need to install the Xcode tools before building the source code. +Nothing else needs to be installed in order to build MacVim. + +Steps to build MacVim.app (the text before the '$' shows the folder you should +be in when executing these commands): + +1. Configure Vim + src/$ configure --enable-gui=macvim + +2. Build Vim executable + src/$ make + +3. Build MacVim.app application bundle + src/MacVim/$ xcodebuild + +The application bundle can be found inside "src/MacVim/build/Release". + + +Bjorn Winckler +June 22, 2008 From 53f258bb6fa1371074d3b1cafb8a61749eda1797 Mon Sep 17 00:00:00 2001 From: Kyle Lippincott Date: Tue, 24 Jun 2008 20:28:40 +0200 Subject: [PATCH 0538/1156] Add proxy icon support --- src/MacVim/MMBackend.h | 1 + src/MacVim/MMBackend.m | 12 ++++++++++++ src/MacVim/MMVimController.m | 14 ++++++++++++++ src/MacVim/MMWindowController.h | 1 + src/MacVim/MMWindowController.m | 6 ++++++ src/MacVim/MacVim.h | 1 + src/MacVim/MacVim.m | 1 + src/MacVim/gui_macvim.m | 8 +++++++- 8 files changed, 43 insertions(+), 1 deletion(-) diff --git a/src/MacVim/MMBackend.h b/src/MacVim/MMBackend.h index f518b25ab1..96e7688029 100644 --- a/src/MacVim/MMBackend.h +++ b/src/MacVim/MMBackend.h @@ -83,6 +83,7 @@ - (void)showTabBar:(BOOL)enable; - (void)setRows:(int)rows columns:(int)cols; - (void)setWindowTitle:(char *)title; +- (void)setDocumentFilename:(char *)filename; - (char *)browseForFileInDirectory:(char *)dir title:(char *)title saving:(int)saving; - (int)presentDialogWithType:(int)type title:(char *)title message:(char *)msg diff --git a/src/MacVim/MMBackend.m b/src/MacVim/MMBackend.m index 21c84ed55b..b385357dc9 100644 --- a/src/MacVim/MMBackend.m +++ b/src/MacVim/MMBackend.m @@ -641,6 +641,18 @@ - (void)setWindowTitle:(char *)title [self queueMessage:SetWindowTitleMsgID data:data]; } +- (void)setDocumentFilename:(char *)filename +{ + NSMutableData *data = [NSMutableData data]; + int len = filename ? strlen(filename) : 0; + + [data appendBytes:&len length:sizeof(int)]; + if (len > 0) + [data appendBytes:filename length:len]; + + [self queueMessage:SetDocumentFilenameMsgID data:data]; +} + - (char *)browseForFileInDirectory:(char *)dir title:(char *)title saving:(int)saving { diff --git a/src/MacVim/MMVimController.m b/src/MacVim/MMVimController.m index 6a861f0378..b053a567bd 100644 --- a/src/MacVim/MMVimController.m +++ b/src/MacVim/MMVimController.m @@ -685,6 +685,20 @@ - (void)handleMessage:(int)msgid data:(NSData *)data [windowController setTitle:string]; [string release]; + } else if (SetDocumentFilenameMsgID == msgid) { + const void *bytes = [data bytes]; + int len = *((int*)bytes); bytes += sizeof(int); + + if (len > 0) { + NSString *filename = [[NSString alloc] initWithBytes:(void*)bytes + length:len encoding:NSUTF8StringEncoding]; + + [windowController setDocumentFilename:filename]; + + [filename release]; + } else { + [windowController setDocumentFilename:@""]; + } } else if (AddMenuMsgID == msgid) { NSDictionary *attrs = [NSDictionary dictionaryWithData:data]; [self addMenuWithDescriptor:[attrs objectForKey:@"descriptor"] diff --git a/src/MacVim/MMWindowController.h b/src/MacVim/MMWindowController.h index 24b7e7a3d7..31fa81dcc4 100644 --- a/src/MacVim/MMWindowController.h +++ b/src/MacVim/MMWindowController.h @@ -40,6 +40,7 @@ - (void)selectTabWithIndex:(int)idx; - (void)setTextDimensionsWithRows:(int)rows columns:(int)cols live:(BOOL)live; - (void)setTitle:(NSString *)title; +- (void)setDocumentFilename:(NSString *)filename; - (void)setToolbar:(NSToolbar *)toolbar; - (void)createScrollbarWithIdentifier:(long)ident type:(int)type; - (BOOL)destroyScrollbarWithIdentifier:(long)ident; diff --git a/src/MacVim/MMWindowController.m b/src/MacVim/MMWindowController.m index 4aab9aa004..dbc1aa8b24 100644 --- a/src/MacVim/MMWindowController.m +++ b/src/MacVim/MMWindowController.m @@ -314,6 +314,12 @@ - (void)setTitle:(NSString *)title } } +- (void)setDocumentFilename:(NSString *)filename +{ + if (filename) + [decoratedWindow setRepresentedFilename:filename]; +} + - (void)setToolbar:(NSToolbar *)toolbar { // The full-screen window has no toolbar. diff --git a/src/MacVim/MacVim.h b/src/MacVim/MacVim.h index 09f3970673..1d39868970 100644 --- a/src/MacVim/MacVim.h +++ b/src/MacVim/MacVim.h @@ -168,6 +168,7 @@ enum { EnableAntialiasMsgID, DisableAntialiasMsgID, SetVimStateMsgID, + SetDocumentFilenameMsgID, }; diff --git a/src/MacVim/MacVim.m b/src/MacVim/MacVim.m index d8b1c47013..c82d1ac7ea 100644 --- a/src/MacVim/MacVim.m +++ b/src/MacVim/MacVim.m @@ -76,6 +76,7 @@ "EnableAntialiasMsgID", "DisableAntialiasMsgID", "SetVimStateMsgID", + "SetDocumentFilenameMsgID", }; diff --git a/src/MacVim/gui_macvim.m b/src/MacVim/gui_macvim.m index e18268f28b..849f4d4e57 100644 --- a/src/MacVim/gui_macvim.m +++ b/src/MacVim/gui_macvim.m @@ -1532,7 +1532,12 @@ + (id)stringWithVimString:(char_u *)s; title = CONVERT_TO_UTF8(title); #endif - [[MMBackend sharedInstance] setWindowTitle:(char*)title]; + MMBackend *backend = [MMBackend sharedInstance]; + [backend setWindowTitle:(char*)title]; + + // TODO: Convert filename to UTF-8? + if (curbuf) + [backend setDocumentFilename:(char*)curbuf->b_ffname]; #ifdef FEAT_MBYTE CONVERT_TO_UTF8_FREE(title); @@ -1825,6 +1830,7 @@ + (id)stringWithVimString:(char_u *)s; bytes:&buf->b_odb_server_id length:sizeof(OSType)]; + // TODO: Convert b_ffname to UTF-8? NSString *path = [NSString stringWithUTF8String:(char*)buf->b_ffname]; NSData *pathData = [[[NSURL fileURLWithPath:path] absoluteString] dataUsingEncoding:NSUTF8StringEncoding]; From 57247ff88228fac26d936c024b776a791761d18d Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Tue, 24 Jun 2008 20:52:01 +0200 Subject: [PATCH 0539/1156] Don't respond to SetWindowTitleMsgID message in live resize Responding to these messages would clobber the text dimension title that is set during live resize. --- src/MacVim/MMVimController.m | 6 +++++- src/MacVim/MMWindowController.m | 4 +--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/MacVim/MMVimController.m b/src/MacVim/MMVimController.m index b053a567bd..130a5104d4 100644 --- a/src/MacVim/MMVimController.m +++ b/src/MacVim/MMVimController.m @@ -682,7 +682,11 @@ - (void)handleMessage:(int)msgid data:(NSData *)data NSString *string = [[NSString alloc] initWithBytes:(void*)bytes length:len encoding:NSUTF8StringEncoding]; - [windowController setTitle:string]; + // While in live resize the window title displays the dimensions of the + // window so don't clobber this with a spurious "set title" message + // from Vim. + if (![[windowController vimView] inLiveResize]) + [windowController setTitle:string]; [string release]; } else if (SetDocumentFilenameMsgID == msgid) { diff --git a/src/MacVim/MMWindowController.m b/src/MacVim/MMWindowController.m index dbc1aa8b24..169fb284d0 100644 --- a/src/MacVim/MMWindowController.m +++ b/src/MacVim/MMWindowController.m @@ -308,10 +308,8 @@ - (void)setTextDimensionsWithRows:(int)rows columns:(int)cols live:(BOOL)live - (void)setTitle:(NSString *)title { - if (title) { + if (title) [decoratedWindow setTitle:title]; - [fullscreenWindow setTitle:title]; - } } - (void)setDocumentFilename:(NSString *)filename From da4c936c721c1e8cfbdeade3ed0e4a25d24ca9ab Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Tue, 24 Jun 2008 20:53:57 +0200 Subject: [PATCH 0540/1156] Tell Git to ignore files --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 1d53735bb8..bae0c7dedd 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ .*.swp .DS_Store src/MacVim/MacVim.xcodeproj/*.mode1 +src/MacVim/MacVim.xcodeproj/*.mode1v3 src/MacVim/MacVim.xcodeproj/*.pbxuser src/MacVim/PSMTabBarControl/PSMTabBarControl.xcodeproj/*.mode1 src/MacVim/PSMTabBarControl/PSMTabBarControl.xcodeproj/*.pbxuser @@ -21,3 +22,4 @@ src/objects src/po/*.mo src/tags src/xxd/xxd +src/xxd/xxd.dSYM From 79ec8a039d94a2b80052f74b06cf9f4add5c1415 Mon Sep 17 00:00:00 2001 From: Bjorn Winckler Date: Wed, 25 Jun 2008 00:01:12 +0200 Subject: [PATCH 0541/1156] Fix typo in Appcast for snapshot 32 --- src/MacVim/macvim_latest.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/MacVim/macvim_latest.xml b/src/MacVim/macvim_latest.xml index aef54bc674..b0d400d525 100644 --- a/src/MacVim/macvim_latest.xml +++ b/src/MacVim/macvim_latest.xml @@ -52,7 +52,7 @@ that you update now!