— Created 2016-03-11 by Takaaki Naganoya — 2018 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation"
–fb-rotate –http://modbookish.lefora.com/topic/3513246/A-Unix-Utility-to-Change-the-Primary-Display-on-OSX/#.VuIe82OFlro
–ディスプレイの情報を取得(基本情報) getDisplayList() of me –> {{dispID:"0x4248387", dispWidth:1920, dispHeight:1200, mainD:true}, {dispID:"0x424b104", dispWidth:1920, dispHeight:1200, mainD:false}, {dispID:"0x1b557a25", dispWidth:1920, dispHeight:1080, mainD:false}}
–メインディスプレイを回転させる rotateMainDisplayToDegree(0) of me –いったんこれを実行すると、構成によってはメインディスプレイが他のIDのものに変わる可能性がある
–ディスプレイの詳細情報を取得 getDisplayInformation() of me –> {{dispID:"0x4248387", dispWidth:1920, dispHeight:1200, dispX1:0, dispY1:0, dispX2:1920, dispY2:1200, mainD:true, rotationDegree:0, cousorExists:false}, {dispID:"0x424b104", dispWidth:1920, dispHeight:1200, dispX1:-1920, dispY1:0, dispX2:0, dispY2:1200, mainD:false, rotationDegree:0, cousorExists:true}, {dispID:"0x1b557a25", dispWidth:1080, dispHeight:1920, dispX1:1920, dispY1:-362, dispX2:3000, dispY2:1558, mainD:false, rotationDegree:270, cousorExists:false}}
on getDisplayInformation() set aPath to POSIX path of (path to me) & "Contents/Resources/fb-rotate" try set aRes to (do shell script (quoted form of aPath) & " -i") on error return false end try set aList to paragraphs of aRes set aaList to contents of (items 2 thru -2 of aList) set a to contents of last item of aList set {b, c} to separateStrByAChar(a, ":") of me set {b1, c1} to separateStrByAChar(c, ",") of me set mouseX to returnNumberCharsOnly(b1) as number set mouseY to returnNumberCharsOnly(c1) as number set recList to {} repeat with i in aaList set j to contents of i –Parse Result by space character set aStr to (current application’s NSString’s stringWithString:j) set aLine to (aStr’s componentsSeparatedByString:" ") (aLine’s removeObject:"") set bList to aLine as list –> {"3", "0x4248387", "1920×1200", "0", "0", "-1920", "-1200", "0", "[main]"} –Display ID set anID to contents of item 2 of bList –Resolution set aResol to contents of item 3 of bList set dParseRes to separateStrByACharAndReturnNumList(aResol, "x") of me if dParseRes = "" then exit repeat –Error copy dParseRes to {aWidth, aHeight} –Display_Bounds set dX1 to (contents of item 4 of bList) as number set dY1 to (contents of item 5 of bList) as number set dX2 to (contents of item 6 of bList) as number set dY2 to (contents of item 7 of bList) as number –Rotation set aDeg to (contents of item 8 of bList) as number –Mouse Cursor Detection set mouseF to (dX1 ≤ mouseX) and (mouseX ≤ dX2) and (dY1 ≤ mouseY) and (mouseY ≤ dY2) –Main Display (Menu) set aMain to contents of last item of bList if (contents of last item of bList) contains "main" then set aMainF to true else set aMainF to false end if set the end of recList to {dispID:anID, dispWidth:aWidth, dispHeight:aHeight, dispX1:dX1, dispY1:dY1, dispX2:dX2, dispY2:dY2, mainD:aMainF, rotationDegree:aDeg, cousorExists:mouseF} end repeat return recList end getDisplayInformation
–指定IDのディスプレイを指定角度(0, 90, 180, 270のいずれか)に回転させる on rotateADisplayToDegree(aDispID as string, aDegree as integer) if aDegree is not in {0, 90, 180, 270} then return false set aPath to POSIX path of (path to me) & "Contents/Resources/fb-rotate" try set aRes to (do shell script (quoted form of aPath) & " -d " & aDispID & " -r " & (aDegree as string)) on error return false end try end rotateADisplayToDegree
–メインディスプレイを指定角度(0, 90, 180, 270のいずれか)に回転させる on rotateMainDisplayToDegree(aDegree as integer) if aDegree is not in {0, 90, 180, 270} then return false set mainID to getMainDispID() of me set aPath to POSIX path of (path to me) & "Contents/Resources/fb-rotate" try set aRes to (do shell script (quoted form of aPath) & " -d " & mainID & " -r " & (aDegree as string)) on error return false end try end rotateMainDisplayToDegree
–メインディスプレイのIDを取得する on getMainDispID() set dList to getDisplayList() of me set dDict to current application’s NSArray’s arrayWithArray:dList set aRes to filterRecListByLabel1(dDict, "mainD == true") of me set aMainD to contents of first item of aRes set mainID to dispID of aMainD return mainID end getMainDispID
–実行中のMacに接続されているディスプレイの一覧を取得する on getDisplayList() set aPath to POSIX path of (path to me) & "Contents/Resources/fb-rotate" try set aRes to (do shell script (quoted form of aPath) & " -l") on error return false end try set aList to paragraphs of aRes set aaList to contents of (items 2 thru -1 of aList) set recList to {} repeat with i in aaList set j to contents of i set bList to words of j set anID to contents of item 1 of bList set aResol to contents of item 2 of bList set dParseRes to separateStrByACharAndReturnNumList(aResol, "x") of me if dParseRes = "" then exit repeat –Error copy dParseRes to {aWidth, aHeight} set aMain to contents of last item of bList if j ends with "]" then set aMainF to true else set aMainF to false end if set the end of recList to {dispID:anID, dispWidth:aWidth, dispHeight:aHeight, mainD:aMainF} end repeat recList end getDisplayList
–"1920×1200" といった文字列を"x"でparseしてパラメータを分ける。結果は文字列のリストで返す on separateStrByAChar(aStr as string, aChar as string) if aStr does not contain aChar then return "" if length of aChar is not equal to 1 then return "" if aStr = "" or (length of aStr < 3) then return "" set aPos to offset of aChar in aStr set partA to text 1 thru (aPos – 1) of aStr set partB to text (aPos + 1) thru -1 of aStr return {partA, partB} end separateStrByAChar
–"1920×1200" といった文字列を"x"でparseしてパラメータを分ける。結果は整数のリストで返す on separateStrByACharAndReturnNumList(aStr as string, aChar as string) if aStr does not contain aChar then return "" if length of aChar is not equal to 1 then return "" if aStr = "" or (length of aStr < 3) then return "" set aPos to offset of aChar in aStr set partA to (text 1 thru (aPos – 1) of aStr) as number set partB to (text (aPos + 1) thru -1 of aStr) as number return {partA, partB} end separateStrByACharAndReturnNumList
–リストに入れたレコードを、指定の属性ラベルの値で抽出 on filterRecListByLabel1(aRecList as list, aPredicate as string) set aArray to current application’s NSArray’s arrayWithArray:aRecList set aPredicate to current application’s NSPredicate’s predicateWithFormat:aPredicate set filteredArray to aArray’s filteredArrayUsingPredicate:aPredicate set bList to filteredArray as list return bList end filterRecListByLabel1
–数字とプラスマイナスの符号のみ返す on returnNumberCharsOnly(aStr) set anNSString to current application’s NSString’s stringWithString:aStr set anNSString to anNSString’s stringByReplacingOccurrencesOfString:"[^0-9-+]" withString:"" options:(current application’s NSRegularExpressionSearch) range:{0, anNSString’s |length|()} return anNSString as text end returnNumberCharsOnly
|