From 39bf43e4653adad59f540e02fcab6b42a95593d9 Mon Sep 17 00:00:00 2001 From: Ryohei Morita Date: Mon, 2 Feb 2015 01:02:55 +0800 Subject: [PATCH 1/7] Fix calculation of display mode index in 'list' table. --- main.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/main.c b/main.c index 339dd42..2615463 100644 --- a/main.c +++ b/main.c @@ -164,11 +164,13 @@ unsigned int listAvailableModes(CGDirectDisplayID display, int displayNum) { CGDisplayModeRef mode; - int modesPerColumn = numModes / MODES_PER_LINE; + int lastRowNum = (numModes - 1) / MODES_PER_LINE; + int lastRowColumnSize = numModes % MODES_PER_LINE; for (i = 0; (i < numModes) && returncode; i++) { - int rowNumber = (i / MODES_PER_LINE); - int idxDisplayMode = (i % MODES_PER_LINE) * modesPerColumn + rowNumber; + int rowNumber = i / MODES_PER_LINE; + int columnNumber = i % MODES_PER_LINE; + int idxDisplayMode = columnNumber * lastRowNum + MIN(lastRowColumnSize, columnNumber) + rowNumber; // if there are an even number of display modes to display, // the last mode must have it's index decremented by 1 From 03685c68108555321389377d3bb36340c1996d46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Avi=20=D7=90=D7=91=D7=99=20Alkalay=20=D7=90=D7=9C=D7=A7?= =?UTF-8?q?=D7=9C=D7=A2=D7=99?= Date: Sun, 5 Apr 2015 21:51:31 -0300 Subject: [PATCH 2/7] Added changeres UI and Makefile changes to support and install it --- Makefile | 17 ++++++++++++----- changeres.applescript | 17 +++++++++++++++++ 2 files changed, 29 insertions(+), 5 deletions(-) create mode 100644 changeres.applescript diff --git a/Makefile b/Makefile index e9fc71f..b30cfb9 100644 --- a/Makefile +++ b/Makefile @@ -8,23 +8,27 @@ # -convert test target to a shell script # -figure out of lipo is the best way to make a universal binary on cmdline -PREFIX=/usr/local +PREFIX=/usr +IDENTIFIER=net.alkalay.screenresolution ORIG_RES=1920x1200x32 TEST_RES=800x600x32 -VERSION=1.7dev +VERSION=2.0 CC=clang PACKAGE_BUILD=/usr/bin/pkgbuild ARCH_FLAGS=-arch i386 -arch x86_64 .PHONY: build -build: screenresolution +build: screenresolution changeres.app screenresolution: main.o cg_utils.o $(CC) $(CPPFLAGS) $(CFLAGS) $(ARCH_FLAGS) -framework Foundation -framework ApplicationServices $^ -o $@ +changeres.app: changeres.applescript + osacompile -o $@ $< + %.o: %.c version.h $(CC) $(CPPFLAGS) $(CFLAGS) $(ARCH_FLAGS) $< -c -o $@ @@ -35,6 +39,7 @@ clean: rm -f screenresolution *.o \ screenresolution-$(VERSION).pkg screenresolution-$(VERSION).dmg \ version.h + rm -rf changeres.app rm -rf pkgroot dmgroot reallyclean: clean @@ -73,11 +78,13 @@ install: screenresolution install -s -m 0755 screenresolution \ $(DESTDIR)/$(PREFIX)/bin/ -pkg: screenresolution +pkg: screenresolution changeres.app mkdir -p pkgroot/$(PREFIX)/bin + mkdir -p pkgroot/Applications install -s -m 0755 screenresolution \ pkgroot/$(PREFIX)/bin - $(PACKAGE_BUILD) --root pkgroot/ --identifier com.johnhford.screenresolution \ + mv changeres.app pkgroot/Applications/ + $(PACKAGE_BUILD) --root pkgroot/ --identifier $(IDENTIFIER) \ --version $(VERSION) "screenresolution-$(VERSION).pkg" rm -f screenresolution.pkg ln -s screenresolution-$(VERSION).pkg screenresolution.pkg diff --git a/changeres.applescript b/changeres.applescript new file mode 100644 index 0000000..571a103 --- /dev/null +++ b/changeres.applescript @@ -0,0 +1,17 @@ +-- Simple dialog that asks for some MacBook Pro Retina 13" resolutions and sets the display size + +-- Avi Alkalay +-- Mar 2015 +-- São Paulo, Brazil + +display dialog "Chose Resolution" buttons {"2560×1600", "2048×1280 (big but confortable)", "1650×1050 (highest supported by Apple)"} default button 2 + +set the button_pressed to the button returned of the result + +if the button_pressed is "2048×1280 (big but confortable)" then + do shell script "/usr/local/bin/screenresolution set 2048x1280x32@0" +else if the button_pressed is "2560×1600" then + do shell script "/usr/local/bin/screenresolution set 2560x1600x32@0" +else + do shell script "/usr/local/bin/screenresolution set 1650x1050x32@0" +end if From c12505de03fef59d3e473ed34f0806bc15c57747 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Avi=20=D7=90=D7=91=D7=99=20Alkalay=20=D7=90=D7=9C=D7=A7?= =?UTF-8?q?=D7=9C=D7=A2=D7=99?= Date: Mon, 6 Apr 2015 20:19:37 -0300 Subject: [PATCH 3/7] GUI is ready asking for 3 highest resolutions available, perfect to keep in dock. --- Makefile | 20 ++++++++++++------- SwitchResolution.applescript | 37 +++++++++++++++++++++++++++++++++++ changeres.applescript | 17 ---------------- resolution.png | Bin 0 -> 45581 bytes 4 files changed, 50 insertions(+), 24 deletions(-) create mode 100644 SwitchResolution.applescript delete mode 100644 changeres.applescript create mode 100644 resolution.png diff --git a/Makefile b/Makefile index b30cfb9..81417a0 100644 --- a/Makefile +++ b/Makefile @@ -14,20 +14,25 @@ IDENTIFIER=net.alkalay.screenresolution ORIG_RES=1920x1200x32 TEST_RES=800x600x32 -VERSION=2.0 +VERSION=2.2 CC=clang PACKAGE_BUILD=/usr/bin/pkgbuild ARCH_FLAGS=-arch i386 -arch x86_64 .PHONY: build -build: screenresolution changeres.app +build: screenresolution SwitchResolution.app screenresolution: main.o cg_utils.o $(CC) $(CPPFLAGS) $(CFLAGS) $(ARCH_FLAGS) -framework Foundation -framework ApplicationServices $^ -o $@ -changeres.app: changeres.applescript +%.icns: %.png + sips -s format icns $< --out $@ + +SwitchResolution.app: SwitchResolution.applescript resolution.icns osacompile -o $@ $< + mv resolution.icns $@/Contents/Resources/applet.icns + %.o: %.c version.h $(CC) $(CPPFLAGS) $(CFLAGS) $(ARCH_FLAGS) $< -c -o $@ @@ -38,8 +43,9 @@ version.h: clean: rm -f screenresolution *.o \ screenresolution-$(VERSION).pkg screenresolution-$(VERSION).dmg \ - version.h - rm -rf changeres.app + version.h \ + resolution.icns + rm -rf SwitchResolution.app rm -rf pkgroot dmgroot reallyclean: clean @@ -78,12 +84,12 @@ install: screenresolution install -s -m 0755 screenresolution \ $(DESTDIR)/$(PREFIX)/bin/ -pkg: screenresolution changeres.app +pkg: screenresolution SwitchResolution.app mkdir -p pkgroot/$(PREFIX)/bin mkdir -p pkgroot/Applications install -s -m 0755 screenresolution \ pkgroot/$(PREFIX)/bin - mv changeres.app pkgroot/Applications/ + mv SwitchResolution.app pkgroot/Applications/ $(PACKAGE_BUILD) --root pkgroot/ --identifier $(IDENTIFIER) \ --version $(VERSION) "screenresolution-$(VERSION).pkg" rm -f screenresolution.pkg diff --git a/SwitchResolution.applescript b/SwitchResolution.applescript new file mode 100644 index 0000000..5cb2362 --- /dev/null +++ b/SwitchResolution.applescript @@ -0,0 +1,37 @@ +-- Simple dialog that asks for some MacBook Pro Retina 13" resolutions and sets the display size + +-- Avi Alkalay +-- Mar 2015 +-- São Paulo, Brazil + +set ScreenResolutionCommand to "/usr/bin/screenresolution" + +set AppleScript's text item delimiters to "|" +set res to text items of (do shell script ScreenResolutionCommand & " list 2>/dev/null | grep x | sed -e 's/x /x/g' | xargs echo | tr ' ' '\n' | sort -rn | head -3 | perl -e '$i=0; while (<>) {$i++; chop; m^(.*)x(.*)x(.*)^; print \"|\" if ($i>1); print \"$1×$2^$_\"};'") + +set AppleScript's text item delimiters to "^" +set resolutions to {} +repeat with i in res + set r to text items of i + set end of resolutions to r +end repeat + +set names to {} +repeat with i in resolutions + set thename to item 1 of i + set end of names to thename +end repeat + +-- choose from list names with prompt "Choose from the list." + +display dialog "Chose Resolution" buttons names + +set the button_pressed to the button returned of the result + +repeat with i in resolutions + set thename to item 1 of i + set theresolution to item 2 of i + if the button_pressed is thename then + do shell script ScreenResolutionCommand & " set " & theresolution + end if +end repeat \ No newline at end of file diff --git a/changeres.applescript b/changeres.applescript deleted file mode 100644 index 571a103..0000000 --- a/changeres.applescript +++ /dev/null @@ -1,17 +0,0 @@ --- Simple dialog that asks for some MacBook Pro Retina 13" resolutions and sets the display size - --- Avi Alkalay --- Mar 2015 --- São Paulo, Brazil - -display dialog "Chose Resolution" buttons {"2560×1600", "2048×1280 (big but confortable)", "1650×1050 (highest supported by Apple)"} default button 2 - -set the button_pressed to the button returned of the result - -if the button_pressed is "2048×1280 (big but confortable)" then - do shell script "/usr/local/bin/screenresolution set 2048x1280x32@0" -else if the button_pressed is "2560×1600" then - do shell script "/usr/local/bin/screenresolution set 2560x1600x32@0" -else - do shell script "/usr/local/bin/screenresolution set 1650x1050x32@0" -end if diff --git a/resolution.png b/resolution.png new file mode 100644 index 0000000000000000000000000000000000000000..da1bc0fe3e2ad6a2cd00f7c039da252401106d20 GIT binary patch literal 45581 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 JI3OoL-sd3H)~VU}BKu;E*il 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 aZ~d-p@JfD6?@a^XPf1QqwoKY2;C}#?g(SrQ literal 0 HcmV?d00001 From 36b83676f5bc87ae5d7daa1553b614f1841c893e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Avi=20=D7=90=D7=91=D7=99=20Alkalay=20=D7=90=D7=9C=D7=A7?= =?UTF-8?q?=D7=9C=D7=A2=D7=99?= Date: Tue, 7 Apr 2015 10:13:26 -0300 Subject: [PATCH 4/7] Better README including the new GUI. --- README => README.md | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) rename README => README.md (77%) diff --git a/README b/README.md similarity index 77% rename from README rename to README.md index f4735e8..9f9282b 100644 --- a/README +++ b/README.md @@ -1,19 +1,26 @@ -This is a tool that can be used to determine current resolution, -list available resolutions and set resolutions for active displays -on Mac OS 10.6, and possibly above. I have only tested 10.6. +This is a set of tools (GUI and command line) that can exploit Retina's highest and +unsupported resolutions. As an example, a Retina MacBook Pro 13" can be set to +2560x1600 maximum resolution, as opposed to Apple's max supported 1650x1050. -I used clang for development, but the code seems to compile -just fine with gcc. The code might not be as well layed out -as it could be, feel free to send a pull request. +The SwitchResolution GUI app will show you the 3 highest resolutions to chose. While +the screenresolution command lets you list available resolutions get current and set a +new one. They were all tested on Yosemite. + +The screenresolution command was developed in C, while the SwitchResolution app is a +very simple AppleScript compiled into an app. Build+Install ==================== -Running the following commands in Terminal.app will result in +Running the following commands will result in dmg with a pkg file being created if the system has Xcode 4. git clone github.com:jhford/screenresolution cd screenresolution make dmg + +or, change the last command to a more economical + + make pkg At this point, I'd recommend testing that things work! I have written a 'test' makefile target. Because this script expects two @@ -36,12 +43,12 @@ you can run open screenresolution.pkg -If you want to put this program on another system, you can choose -between the pkg file, the dmg file, the binaries or use the -install make target with DESTDIR to specify an alternate root. +Or simply double click on the PKG file to install it on your system. -Running -==================== + + +Running the command line tool +============================= There are three commands that this program supports: get, list and set. All three modes operate on active displays [1]. From c115fc3b6a492a4e79f55683a50f9df6ab8057d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Avi=20=D7=90=D7=91=D7=99=20Alkalay=20=D7=90=D7=9C=D7=A7?= =?UTF-8?q?=D7=9C=D7=A2=D7=99?= Date: Wed, 8 Apr 2015 08:50:24 -0300 Subject: [PATCH 5/7] Correct highest resolutions on GUI and better README. --- README.md | 98 +++++++++++++++++++----------------- SwitchResolution.applescript | 2 +- 2 files changed, 54 insertions(+), 46 deletions(-) diff --git a/README.md b/README.md index 9f9282b..b4cd4c0 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,8 @@ -This is a set of tools (GUI and command line) that can exploit Retina's highest and -unsupported resolutions. As an example, a Retina MacBook Pro 13" can be set to -2560x1600 maximum resolution, as opposed to Apple's max supported 1650x1050. +This is a set of tools (GUI and command line) that let you use MacBook Pro Retina's +highest and unsupported resolutions. As an example, a Retina MacBook Pro 13" can be set +to 2560×1600 maximum resolution, as opposed to Apple's max supported 1650×1050. + +![chose resolution](https://cloud.githubusercontent.com/assets/3484242/7044411/8c3d8532-ddc9-11e4-85fc-5301aee68b40.png) The SwitchResolution GUI app will show you the 3 highest resolutions to chose. While the screenresolution command lets you list available resolutions get current and set a @@ -9,43 +11,17 @@ new one. They were all tested on Yosemite. The screenresolution command was developed in C, while the SwitchResolution app is a very simple AppleScript compiled into an app. -Build+Install -==================== -Running the following commands will result in -dmg with a pkg file being created if the system has Xcode 4. - - git clone github.com:jhford/screenresolution - cd screenresolution - make dmg - -or, change the last command to a more economical - - make pkg - -At this point, I'd recommend testing that things work! I have -written a 'test' makefile target. Because this script expects two -monitors that both use the same resolution, it mightn't work -properly for you if you only have one - - make test ORIG_RES=1920x1200x32 - -This will cause your screen to flicker as it changes the mode a -couple times on each monitor. - -The makefiles support the DESTDIR (alternate root) and PREFIX -variables. If you don't know what those are, you probably don't -want them. - -This will create a DMG file and a PKG file. If you know or care -about the differences, you probably know what to do at this point. -If you want to install this program on the system you built it on, -you can run - - open screenresolution.pkg - -Or simply double click on the PKG file to install it on your system. +MacBook Pro Retina machines always use the maximum hardware resolution. The screen +resolution manipulated by this tools is what is actually presented to apps. This way text, +widgets, menus and screen real estate are increased an decreased for optimal use. +Fast change resolution with SwitchResolution +============================================ +The SwitchResolution app purpose is to give fast one-click access to highest resolutions. +Best way to use it is to fix it on your dock because you will find that different +resolutions fit better for different kinds of work. You will prefer highest resolutions +when working with many windows and lower resolutions when simply reading text. Running the command line tool ============================= @@ -77,26 +53,58 @@ This keyword will cause the first display to be skipped. If you specify more resolutions than you have active screens, the extra resolutions will be ignored. -Example 1: - This example works with one or more screens +This example works with one or more screens $ screenresolution set 800x600x32 Result 1: The main display will change to 800x600x32, second screen will not be changed -Example 2: - This example assumes two screens +This example assumes two screens $ screenresolution set 800x600x32 800x600x32 Result 2: The first and second monitor on the system will be set to 800x600x32 -Example 3: - This example assumes two screens +This example assumes two screens $ screen resolution set skip 800x600x32 - This will not touch the first screen but will set the second +This will not touch the first screen but will set the second screen to 800x600x32 +Build+Install +==================== +Running the following commands will result in +dmg with a pkg file being created if the system has Xcode 4. + + git clone github.com:avibrazil/screenresolution + cd screenresolution + make dmg + +or, change the last command to a more economical + + make pkg + +At this point, I'd recommend testing that things work! I have +written a 'test' makefile target. Because this script expects two +monitors that both use the same resolution, it mightn't work +properly for you if you only have one + + make test ORIG_RES=1920x1200x32 + +This will cause your screen to flicker as it changes the mode a +couple times on each monitor. + +The makefiles support the DESTDIR (alternate root) and PREFIX +variables. If you don't know what those are, you probably don't +want them. + +This will create a DMG file and a PKG file. If you know or care +about the differences, you probably know what to do at this point. +If you want to install this program on the system you built it on, +you can run + + open screenresolution.pkg + +Or simply double click on the PKG file to install it on your system. [1]See discussion point for explanation of what active display means. http://developer.apple.com/library/mac/documentation/GraphicsImaging/Reference/Quartz_Services_Ref/Reference/reference.html#//apple_ref/c/func/CGGetActiveDisplayList diff --git a/SwitchResolution.applescript b/SwitchResolution.applescript index 5cb2362..1582ecc 100644 --- a/SwitchResolution.applescript +++ b/SwitchResolution.applescript @@ -7,7 +7,7 @@ set ScreenResolutionCommand to "/usr/bin/screenresolution" set AppleScript's text item delimiters to "|" -set res to text items of (do shell script ScreenResolutionCommand & " list 2>/dev/null | grep x | sed -e 's/x /x/g' | xargs echo | tr ' ' '\n' | sort -rn | head -3 | perl -e '$i=0; while (<>) {$i++; chop; m^(.*)x(.*)x(.*)^; print \"|\" if ($i>1); print \"$1×$2^$_\"};'") +set res to text items of (do shell script ScreenResolutionCommand & " list 2>/dev/null | grep x | sed -e 's/x /x/g' | xargs echo | tr ' ' '\n' | sort -run | head -3 | perl -e '$i=0; while (<>) {$i++; chop; m^(.*)x(.*)x(.*)^; print \"|\" if ($i>1); print \"$1×$2^$_\"};'") set AppleScript's text item delimiters to "^" set resolutions to {} From bcac37476f453230bac10cf32ca29f9eb58a5122 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Avi=20=D7=90=D7=91=D7=99=20Alkalay=20=D7=90=D7=9C=D7=A7?= =?UTF-8?q?=D7=9C=D7=A2=D7=99?= Date: Wed, 8 Apr 2015 08:55:15 -0300 Subject: [PATCH 6/7] better README --- README.md | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index b4cd4c0..e7eed5c 100644 --- a/README.md +++ b/README.md @@ -54,21 +54,22 @@ specify more resolutions than you have active screens, the extra resolutions will be ignored. This example works with one or more screens + $ screenresolution set 800x600x32 -Result 1: - The main display will change to 800x600x32, second screen - will not be changed + +Result: the main display will change to 800x600x32, second screen will not be changed This example assumes two screens + $ screenresolution set 800x600x32 800x600x32 -Result 2: - The first and second monitor on the system will be set to - 800x600x32 + +Result: The first and second monitor on the system will be set to 800x600x32 This example assumes two screens + $ screen resolution set skip 800x600x32 -This will not touch the first screen but will set the second - screen to 800x600x32 + +This will not touch the first screen but will set the second screen to 800x600x32 Build+Install ==================== From 68a90857de2d2fb9f4428158a6902d854f2ff22c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Avi=20=D7=90=D7=91=D7=99=20Alkalay=20=D7=90=D7=9C=D7=A7?= =?UTF-8?q?=D7=9C=D7=A2=D7=99?= Date: Sat, 11 Apr 2015 02:33:25 -0300 Subject: [PATCH 7/7] disclaimer about new RDM software that makes this one obsolete --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index e7eed5c..98a9017 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,8 @@ +# This software is now obsolete + +It doesn't know how to handle HiDPI resolutions and the GUI is limited. +[RDM](https://github.com/avibrazil/RDM) is a better and more advanced solutions. + This is a set of tools (GUI and command line) that let you use MacBook Pro Retina's highest and unsupported resolutions. As an example, a Retina MacBook Pro 13" can be set to 2560×1600 maximum resolution, as opposed to Apple's max supported 1650×1050.