https://iphonedev.wiki/api.php?action=feedcontributions&user=Dustin+Howett&feedformat=atom
iPhone Development Wiki - User contributions [en]
2024-03-29T14:08:09Z
User contributions
MediaWiki 1.39.6
https://iphonedev.wiki/index.php?title=User:Cynder&diff=5414
User:Cynder
2020-04-04T05:13:47Z
<p>Dustin Howett: comment about MSHake</p>
<hr />
<div>iOS Developer. <br />
<br />
''"Causing more bugs than an iOS beta"''<br />
<br />
[https://twitter.com/_kritanta/ @_kritanta]<br />
<br />
<hr><br />
<br />
MSHake isn't actually a typo, it's part of the substrate API for generating a pair of function names to pass as two arguments to MSHookFunction :) [[User:Dustin Howett|Dustin Howett]] ([[User talk:Dustin Howett|talk]]) 05:13, 4 April 2020 (UTC)</div>
Dustin Howett
https://iphonedev.wiki/index.php?title=Cydia_Substrate&diff=5413
Cydia Substrate
2020-04-04T05:12:52Z
<p>Dustin Howett: Reverted edits by Kritanta (talk) to last revision by Kirb</p>
<hr />
<div>{{Infobox Package<br />
|developer=saurik<br />
|version=0.9.5001<br />
|package=mobilesubstrate<br />
}}<br />
<small>'''Languages: English &bull; [[MobileSubstrate/fr|français]] &bull; [[MobileSubstrate/th|ไทย]]'''</small><br />
<br />
'''Cydia Substrate''' (formerly called '''MobileSubstrate''') is the ''de facto'' framework that allows 3rd-party developers to provide run-time patches (“Cydia Substrate extensions”) to system functions, similar to [http://web.archive.org/web/20021207193945/http://www.unsanity.com/haxies/ape/ Application Enhancer] on the OS X. <br />
<br />
saurik has written a [http://www.cydiasubstrate.com/id/264d6581-a762-4343-9605-729ef12ff0af/ whole website of documentation for Substrate].<br />
<br />
Cydia Substrate consists of 3 major components: MobileHooker, MobileLoader and safe mode. <br />
<br />
== MobileHooker ==<br />
<br />
MobileHooker is used to replace system functions. This process is known as hooking. There are 2 APIs that one would use:<br />
<br />
<source lang="c"><br />
IMP MSHookMessage(Class class, SEL selector, IMP replacement, const char* prefix); // prefix should be NULL.<br />
void MSHookMessageEx(Class class, SEL selector, IMP replacement, IMP *result);<br />
void MSHookFunction(void* function, void* replacement, void** p_original);<br />
</source><br />
<br />
MSHookMessage() will replace the implementation of the Objective-C message <tt>-[</tt>''class'' ''selector''<tt>]</tt> by ''replacement'', and return the original implementation. To hook a class method, provide the meta class retrieved from objc_getMetaClass in the MSHookeMessage(Ex) call and see example note below. This dynamic replacement is in fact a feature of Objective-C, and can be done using [http://developer.apple.com/mac/library/documentation/Cocoa/Reference/ObjCRuntimeRef/Reference/reference.html#//apple_ref/c/func/method_setImplementation method_setImplementation].<br />
MSHookMessage() is not thread-safe and has been deprecated in favor of MSHookMessageEx()<br />
<br />
MSHookFunction() is like MSHookMessage() but is for C/C++ functions. The replacement is done at assembly level. Conceptually, MSHookFunction() will write instructions that jumps to the replacement function, and allocate some bytes on a custom memory location, which has the original cut-out instructions and a jump to the rest of the hooked function. Since on iOS by default a memory page cannot be simultaneously writable and executable, a kernel patch must be applied for MSHookFunction() to work. (Any public jailbreak should have one.)<br />
<br />
As of the latest version of MobileSubstrate, MSHookMessage() also requires a kernel patch for supercall closures to hook all methods properly. <br />
<br />
It is also possible to get references to classes' ivars via [[Hooking Instance Variables | MSHookIvar]] when not possible via instance methods.<br />
<br />
=== Example code ===<br />
<br />
Using MSHookFunction:<br />
<br />
<source lang="c"><br />
MSHook(void, CFShow, CFTypeRef obj) { // our replacement of CFShow().<br />
printf("Calling original CFShow(%p)...", obj);<br />
_CFShow(obj); // calls the original CFShow.<br />
printf(" done.\n");<br />
}<br />
...<br />
// hook CFShow to our own implementation.<br />
MSHookFunction(CFShow, MSHake(CFShow));<br />
// From now on any call to CFShow will pass through our CFShow replacement first.<br />
...<br />
CFShow(CFSTR("test"));<br />
</source><br />
<br />
Using MSHookMessageEx:<br />
<br />
<source lang="objc"><br />
static IMP original_UIView_setFrame_;<br />
void replaced_UIView_setFrame_(UIView* self, SEL _cmd, CGRect frame) { // Note the implicit self and _cmd parameters are needed explicitly here.<br />
CGRect originalFrame = self.frame;<br />
NSLog("Changing frame of %p from %@ to %@", self, NSStringFromCGRect(originalFrame), NSStringFromCGRect(frame));<br />
original_UIView_setFrame_(self, _cmd, frame); // Remember to pass self and _cmd.<br />
}<br />
...<br />
MSHookMessageEx([UIView class], @selector(setFrame:), (IMP)replaced_UIView_setFrame_, (IMP *)&original_UIView_setFrame_);<br />
...<br />
myView.frame = CGRectMake(0, 0, 100, 100);<br />
</source><br />
<br />
Note that if you are hooking a class method, you have to put a meta-class in the ''class'' argument, e.g.<br />
<br />
<source lang="objc"><br />
MSHookMessageEx(objc_getMetaClass("UIView"), @selector(commitAnimations), replaced_UIView_commitAnimations, (IMP *)&original_UIView_commitAnimations);<br />
</source><br />
<br />
Using MSHookFunction to hook private functions (in this case a C++ Method):<br />
<br />
<source lang="c"><br />
#define PRIVATE_FRAMEWORKS "/System/Library/PrivateFrameworks"<br />
#define WEBKIT PRIVATE_FRAMEWORKS"/WebKit.framework/WebKit"<br />
#define WEBKIT_FUNC_NAME "__ZN20WebFrameLoaderClient23dispatchWillSendRequestEPN7WebCore14DocumentLoaderEmRNS0_15ResourceRequestERKNS0_16ResourceResponseE"<br />
#define WEBCORE PRIVATE_FRAMEWORKS"/WebCore.framework/WebCore"<br />
#define WEBCORE_FUNC_NAME "__ZNK7WebCore15ResourceRequest12nsURLRequestEv"<br />
<br />
NSURLRequest* (*webcore_func)(void* something);<br />
<br />
void (*webkit_func)(void* something, void* loader, unsigned long identifier, void* request, const void** response);<br />
<br />
<br />
MSHook(void, webkit_func, void* something, void* loader, unsigned long identifier, void* request, const void** response) {<br />
<br />
NSURLRequest *nsRequest = webcore_func(request);<br />
//do something<br />
_webkit_func(something, loader, identifier, request, response);<br />
}<br />
<br />
template <typename Type_><br />
static void nlset(Type_ &function, struct nlist *nl, size_t index) {<br />
struct nlist &name(nl[index]);<br />
uintptr_t value(name.n_value);<br />
if ((name.n_desc & N_ARM_THUMB_DEF) != 0)<br />
value |= 0x00000001;<br />
function = reinterpret_cast<Type_>(value);<br />
}<br />
<br />
//later, in your %ctor<br />
<br />
dlopen(WEBKIT, RTLD_LAZY | RTLD_NOLOAD);<br />
struct nlist nl[2];<br />
bzero(&nl, sizeof(struct nlist) * 2);<br />
nl[0].n_un.n_name = (char*)WEBKIT_FUNC_NAME; <br />
<br />
dlopen(WEBCORE, RTLD_LAZY | RTLD_NOLOAD);<br />
struct nlist nl2[2];<br />
bzero(&nl2, sizeof(struct nlist) * 2);<br />
nl2[0].n_un.n_name = (char*)WEBCORE_FUNC_NAME;<br />
if(nlist(WEBKIT, nl) < 0 || nl[0].n_type == N_UNDF)<br />
{<br />
fprintf(stderr, "\n nlist(%s, %s) failed\n", "WebKit", nl[0].n_un.n_name);<br />
}<br />
else if (nlist(WEBCORE, nl2) < 0 || nl2[0].n_type == N_UNDF)<br />
{<br />
fprintf(stderr, "\n nlist(%s, %s) failed\n", "WebCore", nl2[0].n_un.n_name);<br />
}<br />
else<br />
{<br />
nlset(webcore_func, nl2, 0);<br />
nlset(webkit_func, nl, 0);<br />
MSHookFunction(webkit_func, MSHake(webkit_func));<br />
}<br />
</source><br />
<br />
Because we want the pointer to a private symbol we have to use nlist. However you should not be doing it this way, as it is not portable to other platforms and later versions of iOS. [http://www.cydiasubstrate.com/api/c/MSGetImageByName MSGetImageByName] and [http://www.cydiasubstrate.com/api/c/MSFindSymbol/ MSFindSymbol] provide the same functionality and are portable.<br />
<br />
== MobileLoader ==<br />
<br />
MobileLoader loads 3rd-party patching code into the running application. <br />
<br />
MobileLoader will first load itself into the run application using [http://koichitamura.blogspot.com/2008/11/hooking-library-calls-on-mac.html <tt>DYLD_INSERT_LIBRARIES</tt>] environment variable. Then it looks for all dynamic libraries in the directory <tt>/Library/MobileSubstrate/DynamicLibraries/</tt>, and dlopen them. An extension should use constructor code to perform any works, e.g.<br />
<source lang="objc"><br />
...<br />
// The attribute forces this function to be called on load.<br />
__attribute__((constructor))<br />
static void initialize() {<br />
NSLog(@"MyExt: Loaded");<br />
MSHookFunction(CFShow, replaced_CFShow, &original_CFShow);<br />
}<br />
</source><br />
<br />
=== Filters ===<br />
<br />
Developers may add filters to restrict whether the extension should be loaded or not. Filters are implemented as plist that lives beside the dylib. If the dylib is named <tt>foo.dylib</tt>, then the filter should be named <tt>foo.plist</tt>. The filter should be a dictionary with key '''Filter''', which is another dictionaries that can contain these keys:<br />
* '''CoreFoundationVersion''' (array): The extension is loaded only if the version of [[CoreFoundation.framework]] is above the specified values. Currently, only the first 2 values are checked.<br />
{{CoreFoundation Version Table|center=1}}<br />
* '''Bundles''' (array): The extension is loaded only if the bundle-ID of the running application matches the list.<br />
* '''Classes''' (array): The extension is loaded only if the one of the specified objective-C classes is implemented in the application.<br />
* '''Executables''' (array): The extension is loaded only if one of the executable names matches the running application. This is required to hook things that have no other identifiable characteristics.<br />
<br />
For example, to restrict the extension only load in {{applink|SpringBoard}}, the plist would look like<br />
Filter = {<br />
Bundles = (com.apple.springboard);<br />
};<br />
<br />
You can also use this method to restrict the extension to only load into applications that link to a specific bundle, such as UIKit. For example:<br />
Filter = {<br />
Bundles = (com.apple.UIKit);<br />
};<br />
<br />
<br />
You can use CoreFoundationVersion key and specify lower- and upper-bounds. When two values are in the array, the first is treated as greater-than-or-equal-to rule, while the second is a less-than rule. The following example shows loading restricted to firmwares from 4.0 to 4.3 only:<br />
<br />
CoreFoundationVersion = (550.32, 675.00);<br />
<br />
<br />
You can also include both Executables and Bundle filters to match both executables and applications that link to specific bundles you want.<br />
<br />
Filter = {<br />
Executables = ("mediaserverd");<br />
Bundles = ( "com.apple.MobileSMS", "net.whatsapp.WhatsApp" );<br />
};<br />
<br />
As of iOS 9.0, the filter plist ''must'' exist. Dylibs without a corresponding plist will not be loaded. To replicate the previous effect of no filter plist causing the dylib to be loaded into all processes, set your filter to the bundle <code>com.apple.Security</code>.<br />
<br />
For setuid apps, since almost all environment variables are discarded, the developer of the app must explicitly perform <code>dlopen("/Library/MobileSubstrate/MobileSubstrate.dylib", RTLD_LAZY)</code> within <code>main()</code> to let MobileLoader run. This is not recommended, since most extensions do not expect to be running within a root process, and can have unexpected behavior (such as writing a file with permissions that would disallow it from being read by non-root processes). It would be a better choice to design the app to run as mobile, with a helper process performing root operations.<br />
<br />
In addition, MobileLoader also hooks <tt>nlist()</tt> to improve its performance, and defines several signal handlers for safe mode.<br />
<br />
== Safe mode ==<br />
<br />
When a extension crashed the SpringBoard, MobileLoader will catch that and put the device into safe mode. In safe mode all 3rd-party extensions will be disabled.<br />
<br />
The following signals will invoke safe mode:<br />
* SIGABRT<br />
* SIGILL<br />
* SIGBUS<br />
* SIGSEGV<br />
* SIGSYS<br />
<br />
== External links ==<br />
<br />
* Safemode source: http://gitweb.saurik.com/safemode-ios.git (git://git.saurik.com/safemode-ios.git)<br />
<br />
{{Navbox HookingLibs}}<br />
{{Navbox Library}}<br />
[[Category:Directories in /Library]]</div>
Dustin Howett
https://iphonedev.wiki/index.php?title=Open_Source_Projects&diff=5340
Open Source Projects
2019-10-23T16:49:04Z
<p>Dustin Howett: Roxanne is no longer an open-source project, by a fairly strict definition. If you cannot use code from the project unencumbered, it cannot serve as a resource for new developers to learn from. Better to not list it.</p>
<hr />
<div>Please add more projects, especially your own projects!<br />
* [http://theiphonewiki.com/wiki/Open_Source_Jailbreaking_Tools Open Source Jailbreaking Tools]<br />
* Example code can be found using [https://github.com/search?q=tweak+extension%3A+.xm+&ref=searchresults&type=Code&utf8=%E2%9C%93 Github Search]. To read about flexible searching, please see [[Getting Started#Finding example projects]] for advice<br />
* [[Advice for new developers#Choosing open vs. closed source|Advantages, Disadvantages of Open Sourcing]]<br />
<br />
'''A note on licenses:''' If a project does not explicitly have a license that gives you the right to use its code, that means it is copyrighted by the developer and you can't use its code in your own projects - in other words, you can read it and learn from it, but don't copy and paste it. If you've published a project that does not have a free license, and you'd like people to be able to use your code if they want to, [http://www.gnu.org/licenses/license-recommendations.html How to choose a license for your own work] and [http://choosealicense.com/ Choose A License] may be helpful. GitHub has advice on [https://help.github.com/articles/open-source-licensing adding a license to your repository].<br />
<br />
'''A note on contributing:''' If you'd like to contribute improvements to one of these projects (or even just file a bug report), a great first step is to get in contact with the developer and talk to them about it - you can email them, tweet them, find them on IRC, open an issue on the project page, or whatever method of communication you can find. People are usually pretty happy to hear that another developer is interested enough in their project to want to add something to it. If you'd like to contribute code to a project that is on GitHub (like most of these), GitHub's [https://guides.github.com/activities/contributing-to-open-source/ guide to contributing to open source] has helpful advice for how to make a pull request (a formal way to propose your changes so they can be easily integrated). And yes, [http://openhatch.org/blog/2013/what-contributing-to-open-source-can-give-back-to-you/ contributing is worth your time].<br />
<br />
= Tweaks =<br />
<br />
Also check out [http://tweakweek.com/ TweakWeek] for a long list of relatively simple open source tweaks, organized by rpetrich. [[Tweak Battles]] is also a great resource.<br />
== iOS 12 compatible ==<br />
<br />
{| class="wikitable sortable"<br />
! Project !! Author !! Compatibility !! Updated !! License !! Short description<br />
|-<br />
| [https://github.com/iKilledAppl3/Malipo Malipo] || J.K. Hayslip (iKilledAppl3) || iOS 10 - iOS 12.1.2 || 2018-08-23 || MIT || Change your charge sounds.<br />
|-<br />
|}<br />
<br />
== iOS 11 compatible ==<br />
<br />
{| class="wikitable sortable"<br />
! Project !! Author !! Compatibility !! Updated !! License !! Short description<br />
|-<br />
| [https://github.com/zaneh/cctimercountdown CCTimerCountdown] || Zane Helton || iOS 11 || 2018-03-25 || MIT || Display remaining time on timer in the control center.<br />
|-<br />
| [https://github.com/iKilledAppl3/ColorMyCCModules-CCWallCustomizer-2 ColorMyCCModules + CCWallCustomizer 2] || J.K. Hayslip (iKilledAppl3) || iOS 10 - 11 || 2018-06-13 || MIT || Colorize your CC Modules and Customize your CC Background.<br />
|-<br />
| [https://github.com/ruler225/jailbreaktweaks/ Multiple Small Tweaks] || Youssef Mikhail || iOS 11 || 2018-07-01 || N/A || A collective repo of ruler225's tweaks.<br />
|-<br />
| [https://github.com/Auxilium-Development Multiple Tweaks] || Auxilium Development || iOS 11 || 2018-04-16 || MIT || A collective repo of many tweaks, basic and advanced.<br />
|-<br />
| [https://github.com/jakeajames/RealCC RealCC] || Jake James || iOS 11 || 2018-07-12 || N/A || Actually disable Wi-Fi and Bluetooth from Control Center. <br />
|-<br />
| [https://github.com/iKilledAppl3/Swipe2Rec Swipe2Rec] || J.K. Hayslip (iKilledAppl3) || iOS 11 - 11.4 beta 3 || 2018-07-26 || MIT || Record your screen with just a swipe on the StatusBar. <br />
|-<br />
| [https://github.com/jakeajames/TimeToUnlock TimeToUnlock] || Jake James || iOS 11 || 2018-07-12 || N/A || Set the current time as your passcode.<br />
|-<br />
| [https://github.com/jakeajames/CatchaThief CatchaThief] || Jake James || iOS 11 || 2018-07-12 || N/A || Take a picture of whoever inputs an incorrect passcode.<br />
|-<br />
| [https://github.com/johnnyjwaity/UnlockTimeXI TimeUnlockXI] || Johnny Waity || iOS 11 || 2018-07-08 || N/A || Have a Dynamic Passcode by having it set as the time.<br />
|-<br />
| [https://github.com/patrickk17/noslowanimationsxi NoSlowAnimationsXI] || Patrick Knauf || iOS 11 || 2018-07-30 || MIT || Don't get slowed down by animations on iOS 11!<br />
|}<br />
<br />
== iOS 10 compatible ==<br />
<br />
{| class="wikitable sortable"<br />
! Project !! Author !! Compatibility !! Updated !! License !! Short description<br />
|-<br />
| [https://github.com/iKilledAppl3/9Clock 9Clock] || J.K. Hayslip (iKilledAppl3) || iOS 10 || 2018 - 06- 02 || Apache 2.0 || Bring back the iOS 9 clock to iOS 10<br />
|-<br />
| [https://github.com/SatbirTanda/ArtworkAnimations ArtworkAnimations] || sst1337 || iOS 8 - 10 || 04-17-2017 || MIT || Animate Your Lockscreen Album Art<br />
|-<br />
| [https://github.com/PoomSmart/BlurryBadges BlurryBadges] || PoomSmart || iOS 7 - 10 || 2017-01-05 || MIT || Blurry icon badges<br />
|-<br />
| [https://github.com/PoomSmart/CameraModes CameraModes] || PoomSmart || iOS 7 - 10 || 2017-06-06 || MIT || Specific available camera modes<br />
|-<br />
| [https://github.com/Skittyblock/CCPage CCPage] || Skitty || iOS 10 || 2017-07-16 || MIT || Example of adding a page to the CC<br />
|-<br />
| [https://github.com/iKilledAppl3/CCWallCustomizer CCWallCustomizer] || iKilledAppl3 & J.K. Hayslip || iOS 10 || 2017-06-06 || Apache || Customize the CC background.<br />
|-<br />
| [https://github.com/wolfposd/ClearOnOpen ClearOnOpen] || wolfposd || iOS 6 - 10 || 2017-02-07 || WTFPL || Clears Spotlight search on opening.<br />
|-<br />
| [https://github.com/Sticktron/DarkMessages DarkMessages] || Sticktron || iOS 10 || 2017-04-04 || &copy; || Dark Mode for the Messages App.<br />
|-<br />
| [https://github.com/SatbirTanda/DebuggingInformationOverlay DebuggingInformationOverlay] || sst1337 || iOS 10 || 05-30-2017 || MIT || Show Apple's UIDebuggingInformationOverlay on any app<br />
|-<br />
| [https://github.com/iKilledAppl3/enableccmute EnableCCMute] || iKilledAppl3 || iOS 10 || 2017-02-22 || Apache || Enables the hidden mute toggle for all iOS 10 devices.<br />
|-<br />
| [https://github.com/iKilledAppl3/Envoy Envoy] || iKilledAppl3 || iOS 7- 10 || 2017-03-22 || GPLv3 || Enhance your FB Messenger.<br />
|-<br />
| [https://github.com/PoomSmart/Flashorama Flashorama] || PoomSmart || iOS 6 - 10 || 2017-06-06 || MIT || Toggle torch in Panorama mode<br />
|-<br />
| [https://github.com/Sticktron/FrontCamUnMirror FrontCamUnMirror] || Sticktron || iOS 7 - 10 || 2017-02-15 || &copy; || Un-Mirror the Front Camera's Live Preview.<br />
|-<br />
| [https://github.com/iKilledAppl3/IGProfileNavTextColorer IGProfileNavTextColorer] || iKilledAppl3 || iOS 10 || 2017-08-04 || Apache 2.0 || A tweak that demos how to color the IGInsetLabel that Instagram Uses for the profile view.<br />
|-<br />
| [https://github.com/evilgoldfish/LockGlyphX LockGlyph X] || evilgoldfish, Sticktron, AppleBetasDev || iOS 10 || 2017-03-05 || MIT || The evolution of LockGlyph. For iOS 10.<br />
|-<br />
| [https://github.com/iKilledAppl3/Meteora Meteora] || J.K Hayslip (iKilledAppl3), SkittyBlock, Sticktron, D_Gh0st, Fr0mDerik || iOS 10 || 2017-08-09 || MIT || iOS 7 - iOS 9 Lockcreen for iOS 10!<br />
|-<br />
| [https://github.com/PoomSmart/MoreTimer MoreTimer] || PoomSmart || iOS 8 - 10 || 2017-06-06 || MIT || Configurations for camera timer mode<br />
|-<br />
| [https://github.com/iKilledAppl3/NCWallCustomizer NCWallCustomizer] || iKilledAppl3 || iOS 10 || 2017-06-06 || Apache || Custom NC backgrounds.<br />
|-<br />
| [https://github.com/PoomSmart/NoGrayContrast NoGrayContrast] || PoomSmart || iOS 7.1 - 10 || 2016-06-06 || MIT || Remove gray patterns from folders and dock background<br />
|-<br />
| [https://github.com/iKilledAppl3/noinstastories NoInstaStories] || iKilledAppl3 || iOS 10+ || 2018-04-07 || Apache 2.0 || Remove the Instagram Stories from your Instagram feed.<br />
|-<br />
| [https://github.com/PoomSmart/NoUpperCaseTable NoUpperCaseTable] || PoomSmart || iOS 7 - 10 || 2017-01-05 || MIT || Disable UITableView titles uppercase<br />
|-<br />
| [https://github.com/SatbirTanda/PanoramaPapers PanoramaPapers] || sst1337 || iOS 9 - 10 || 04-30-2017 || MIT || Add a different image to each SpringBoard Screen!<br />
|-<br />
| [https://github.com/PoomSmart/Record--n--Torch Record 'n' Torch] || PoomSmart || iOS 5 - 10 || 2017-06-06 || MIT || Toggle torch while recording video<br />
|-<br />
| [https://github.com/megacookie/SwipyFolders SwipyFolders] || MegaCookie || iOS 8 - 10 || 2017-08-02 || MIT || Gestures for your folders<br />
|-<br />
| [https://github.com/PoomSmart/TransparentCameraBar TransparentCameraBar] || PoomSmart || iOS 4 - 10 || 2017-06-06 || MIT || Set camera bar opacity or shrink it<br />
|-<br />
| [https://github.com/iKilledAppl3/WaterCharge WaterCharge] || iKilledAppl3 & J.K. Hayslip || iOS 10 || 2017-06-04 || Apache || Cool Water effects in the charge view.<br />
|-<br />
| [https://github.com/ianb821/WhoAreYou WhoAreYou] || Ian Burns || iOS 10 || 2017-01-4 || MIT || Put the name of the sender in the Messages QR banner<br />
|-<br />
| [https://github.com/nathanaccidentally/LongerMessage10 LongerMessage10] || nathanaccidentally || iOS 10 || 2017-5-22 || MIT || Change notification line ammount from settings.<br />
|}<br />
<br />
== iOS 9 compatible ==<br />
<br />
{| class="wikitable sortable"<br />
|-<br />
! Project !! Author !! Compatibility !! Updated !! License !! Short description<br />
|-<br />
| [https://github.com/Sticktron/AhAhAh Ah!Ah!Ah!] || Sticktron || iOS 7 - 9 || 2016-10-04 || &copy; || A themeable unlock error alarm inspired by Jurassic Park.<br />
|-<br />
| [https://github.com/PoomSmart/AppColorClose AppColorClose] || PoomSmart || iOS 7 - 9 || 2016-06-11 || MIT || Close box color based on app icon<br />
|-<br />
| [https://github.com/Bruno-Furtado/bitprice-ios BitPrice] || Bruno Tortato Furtado || iOS 9 - 11 || 2018-02-06 || MIT || iOS app for display and monitor the current Bitcoint rate.<br />
|-<br />
| [https://github.com/PoomSmart/BlurryBar BlurryBar] || PoomSmart || iOS 7 - 9 || 2016-06-11 || MIT || Fast blurry SB status bar<br />
|-<br />
| [https://github.com/PoomSmart/BlurryContrast BlurryContrast] || PoomSmart || iOS 7 - 9 || 2016-06-11 || MIT || No SpringBoard blurry effects as increase contrast option enabled<br />
|-<br />
| [https://github.com/PoomSmart/Burst-Mode Burst mode] || PoomSmart || iOS 5 - 9 || 2016-06-11 || MIT || Extend or enable the Burst Mode feature<br />
|-<br />
| [https://github.com/PoomSmart/CamBlur7 CamBlur7] || PoomSmart || iOS 7 - 9 || 2016-06-11 || MIT || Live blur effect for camera top/bottom bar<br />
|-<br />
| [https://github.com/PoomSmart/CamElapsedPlus CamElapsed+] || PoomSmart || iOS 7 - 9 || 2016-06-11 || MIT || More video recording elapsed time resolution<br />
|-<br />
| [https://github.com/PoomSmart/CamRotate CamRotate] || PoomSmart || iOS 5 - 9 || 2016-06-11 || MIT || Design camera rotation<br />
|-<br />
| [https://github.com/zaneh/cctimercountdown CCTimerCountdown] || Zane Helton || iOS 9 || 2015-11-25 || MIT || Display remaining time on timer in the control center.<br />
|-<br />
| [https://github.com/ruslan120101/CleanCydia CleanCydia] || Ruslan Ardashev || iOS 8 - 9 || 2016-01-24 || MIT || Remove most ads from Cydia.<br />
|-<br />
| [https://github.com/SatbirTanda/DockArt DockArt] || sst1337 || iOS 7 - 9 || 2016-01-01 || MIT || Add an image to your dock<br />
|-<br />
| [https://github.com/PoomSmart/FaceDetectionDuringVideo FaceDetectionDuringVideo] || PoomSmart || iOS 6 - 9 || 2016-06-11 || MIT || Enable Face Detection when start video recording<br />
|-<br />
| [https://github.com/DavidGoldman/flash Flash] || David Goldman || iOS 8 - 9 || 2015-12-23 || - || Flashlight access on lock screen while in darkness<br />
|-<br />
| [https://github.com/PoomSmart/FrontFlash FrontFlash] || PoomSmart || iOS 4 - 9 || 2016-06-11 || MIT || Simulate flash in Front-Facing camera by flashing the screen<br />
|-<br />
| [https://github.com/PoomSmart/Front-HDR Front HDR] || PoomSmart || iOS 6 - 9 || 2016-06-11 || MIT || Enable HDR in Front-Facing camera<br />
|-<br />
| [https://github.com/i0sa/GrabberApp9 GrabberApp8] || i0sa || iOS 8 - 9 || 2015-11-11 || MIT || Change lockscreen camera grabber app and add another left one.<br />
|-<br />
| [https://github.com/eswick/harbor Harbor] || Evan Swick || iOS 7 - 9 || 2015-11-1 || GPLv3 || OS X-style dock redesigned for touch screens<br />
|-<br />
| [https://github.com/ayushgoel/LinkKeyboard LinkKeyboard] || Ayush Goel || iOS 8 - 10 || 2016-10-28 || MIT || Put all your links in one place and make them accessible via a keyboard.<br />
|-<br />
| [https://github.com/iKilledAppl3/NanoChargingView NanoChargingView] || Billy Ellis & iKilledAppl3 || iOS 8 - 9 || 2016-08-3 || © || Apple Watch style charging on the lockscreen<br />
|-<br />
| [https://github.com/PoomSmart/NoPhotoGestures NoPhotoGestures] || PoomSmart || iOS 7 - 9 || 2016-06-11 || MIT || No more photo gestures in album<br />
|-<br />
| [https://github.com/wolfposd/NoLiveClock NoLiveClock] || wolfposd || iOS 7 - 9 || 2015-10-16 || MIT || Disables Clock animation on Springboard.<br />
|-<br />
| [https://github.com/PoomSmart/NoWallpaperZoomAnimation NoWallpaperZoomAnimation] || PoomSmart || iOS 7 - 9 || 2016-06-11 || MIT || No more wallpaper zooming animation<br />
|-<br />
| [https://github.com/SatbirTanda/Nemerov Nemerov] || sst1337 || iOS 7 - 9 || 2016-01-01 || MIT || Customize your screenshot animation<br />
|-<br />
| [https://github.com/SatbirTanda/NemerovPlus NemerovPlus] || sst1337 || iOS 7 - 9 || 2016-01-01 || MIT || Customize your screenshot animation<br />
|-<br />
| [https://github.com/ravecode/OneTapClear OneTapClear] || Rave || iOS 8 - 9 || 2015-10-30 || MIT || One tap to clear NC notifications.<br />
|-<br />
| [https://github.com/PoomSmart/PanoEnabler PanoMod] || PoomSmart || iOS 6 - 9 || 2016-06-11 || MIT || Enable Panorama and customize it<br />
|-<br />
| [https://github.com/PoomSmart/PhotoTorch PhotoTorch] || PoomSmart || iOS 6 - 9 || 2016-06-11 || MIT || Adjustable torch in camera app<br />
|-<br />
| [https://github.com/iKilledAppl3/roundedswitchr RoundedSwitchr] || iKilledAppl3 || iOS 9+ || 2016-11-11 || Apache || shape your multitasking cards <br />
|-<br />
| [https://github.com/SatbirTanda/SwipeToDeleteContact SwipeToDeleteContact] || sst1337 || iOS 7 - 9 || 2016-01-01 || MIT || Swipe to delete a contact<br />
|-<br />
| [https://github.com/karimhm/RotaryLock RotaryLock] || Karim Hamm || iOS 7 - 9 || 2015-22-09 || © || Add a combination lock to your lock screen replacing the stock number pad<br />
|-<br />
| [https://github.com/PoomSmart/Slo-mo-Mod Slo-mo Mod] || PoomSmart || iOS 7 - 9 || 2016-06-11 || MIT || Enable Slo-mo capture in unsupported devices<br />
|-<br />
| [https://github.com/ludvigeriksson/snoozehelper SnoozeHelper] || Ludvig Eriksson || iOS 8 - 9 || 2015-10-23 || MIT || Make the whole screen act like a snooze button.<br />
|-<br />
| [https://github.com/ludvigeriksson/statusbartimer StatusBarTimer] || Ludvig Eriksson || iOS 7 - 9 || 2015-10-23 || MIT || Show the timer or stopwatch in the status bar.<br />
|-<br />
| [https://github.com/PoomSmart/Still-Capture-Enabler-2 Still Capture Enabler 2] || PoomSmart || iOS 4 - 9 || 2016-06-11 || MIT || Take still during video recording<br />
|-<br />
| [https://github.com/PoomSmart/SwitchAutofocus SwitchAutofocus] || PoomSmart || iOS 7 - 9 || 2016-06-11 || MIT || Improvement for camera autofocus<br />
|-<br />
| [https://github.com/freerunnering/SwipeSelection SwipeSelection] || freerunnering || iOS 4 - 9 || 2015-07-08 || © || Move cursor and selection text with keyboard gestures<br />
|-<br />
| [https://github.com/ludvigeriksson/timeuntilalarm TimeUntilAlarm] || Ludvig Eriksson || iOS 7 - 9 || 2015-12-02 || MIT || Show the time remaining until alarms go off.<br />
|-<br />
| [https://github.com/bolencki13/traverse Traverse] || Brian Olencki || iOS 9 || 2016-01-14 || MIT || Create custom 3D touch actions for Apps on your device.<br />
|-<br />
| [https://github.com/PoomSmart/RenameFolderWithoutName Unrestricted Folders Naming] || PoomSmart || iOS 5 - 9 || 2016-06-11 || © || Folder name spacing will remain, can rename folder<br />
|-<br />
| [https://github.com/zaneh/unsplashwallpaper UnsplashWallpaper] || Zane Helton || iOS 8 - 9 || 2015-11-25 || MIT || Save and change wallpaper images to images from Unsplash.<br />
|-<br />
| [https://github.com/PoomSmart/Video-Zoom-Mod Video Zoom Mod] || PoomSmart || iOS 7 - 9 || 2016-06-11 || MIT || Enable Video Zoom & set the maximum zoom factor<br />
|-<br />
|[https://github.com/isammour/WACallConfirm WACallConfirm] || Ibrahim Sammour || iOS 7-9 || 2016-07-28 || MIT || Confirm before calling on WhatsApp<br />
|-<br />
|[https://github.com/Sticktron/Wu-Lock Wu-Lock] || Sticktron || iOS 8-9 || 2015-04-15 || &copy; || Unlock in Wu-Tang style!<br />
|}<br />
<br />
== iOS 8 compatible ==<br />
<br />
{| class="wikitable sortable"<br />
|-<br />
! Project !! Author !! Compatibility !! Updated !! License !! Short description<br />
|-<br />
| [https://github.com/brycepauken/Aeuria-LS Aeuria LS] || Bryce Pauken || iOS 8 || 2015-26-07 || MIT || A clock-centered lockscreen replacement<br />
|-<br />
| [https://github.com/wvabrinskas/allarm Allarm] || William_vab || iOS 8 || 2015-20-06 || ? || Toggle all alarms at once on your iOS Device directly in the Clocks app. <br />
|-<br />
| [https://github.com/MohammadAG/iOS-AutoAirPlay AutoAirPlay] || MohammadAG || iOS 8 || 2015-01-05 || GPLv3 || Activator plugin to connect to first AirPlay device.<br />
|-<br />
| [https://github.com/GN-OS/Bloard Bloard] || GN-OS || iOS 7 - 8 || 2014-02-14 || ? || Make keyboards black<br />
|-<br />
| [https://github.com/xTheMaster3x/BlueBoard BlueBoard] || xTM3x || iOS 7 - 8 || 2015-02-14 || Apache 2.0 || Make keyboard keys blue<br />
|-<br />
| [https://github.com/PoomSmart/CamToggleBlur CamToggleBlur] || PoomSmart || iOS 7 - 8 || 2015-01-10 || MIT || Toggle for blur transition effect in camera app<br />
|-<br />
| [https://github.com/PoomSmart/CamVolZoom CamVolZoom] || PoomSmart || iOS 5 - 8 || 2015-01-10 || MIT || Use volume buttons for camera zooming<br />
|-<br />
| [https://github.com/PoomSmart/CCFlashLightLevel CCFlashLightLevel] || PoomSmart || iOS 7 - 8 || 2015-03-12 || MIT || Adjustable torch level in Control Center<br />
|-<br />
| [https://github.com/DavidGoldman/ColorBanners ColorBanners] || DavidGoldman || iOS 8 || 2015-05-28 || - || Color banners and notifications<br />
|-<br />
| [https://github.com/Cr4zyS1m0n/curtainChecker curtainChecker] || Simon Selg || iOS 8 - 8.1.2 || 2015-01-06 || - || VoiceOver enhancements for blind people<br />
|-<br />
| [https://github.com/robottom/CustomFlash CustomFlash] || Aaron Thomas || iOS 8 - 8.4 || 2015-07-12 || - || Remove flash when screenshotting and replace with a notification<br />
|-<br />
| [https://github.com/ryanb93/CyDelete CyDelete] || Ryan Burke || iOS 7 - 8.1 || 2014-11-10 || GPLv3 || Uninstall Cydia applications via SpringBoard<br />
|-<br />
| [https://github.com/robottom/DeleteAllMessages8 DeleteAllMessages8] || Aaron Thomas || iOS 8 - 8.4 || 2015-07-07 || - || Adds button to delete all messages at once<br />
|-<br />
| [https://github.com/iNasser0/DockColor DockColor] || iNasser || iOS 7 - 8 || 2015-01-03 || - || Simple tweak to change the home screen dock color<br />
|-<br />
| [https://github.com/MohammadAG/iOS-DoubleTapToSleep DoubleTapToSleep] || MohammadAG || iOS 8 || 2014-12-22 || GPLv3 || Double tap lock or home screen to lock the screen<br />
|-<br />
| [https://github.com/jjxtra/DRColorPicker DRColorPicker] || jjxtra || iOS 6 - 8 || 2014-09-01 || MIT || Color picker for iOS - favorites, recents, hue, wheel, import images<br />
|-<br />
| [https://github.com/PoomSmart/IB-Graphics-Selector IB Graphics Selector] || PoomSmart || iOS 5 - 8 || 2015-01-10 || MIT || Select Infinity Blade app graphics quality<br />
|-<br />
| [https://github.com/Razzile/EasyRespring EasyRespring] || Satori/Razzile || iOS 8 || 2015-01-08 || - || Small tweak that enables you to respring your device by swiping springboard from the app switcher<br />
|-<br />
| [https://github.com/PoomSmart/EffectsPlus Effects+] || PoomSmart || iOS 7 - 8 || 2017-06-06 || Apache 2.0 || More filters for Camera & Photos app<br />
|-<br />
| [https://github.com/PoomSmart/ForceReach ForceReach] || PoomSmart || iOS 8 || 2015-01-10 || MIT || Unrestriced reachability feature<br />
|-<br />
| [https://github.com/angelXwind/IneffectivePower IneffectivePower] || angelXwind || iOS 8 - 8.1.2 || 2015-05-30 || BSD || Stop the infamous "Effective Power" text string from crashing CoreText!<br />
|-<br />
| [https://github.com/xTheMaster3x/Integrate Integrate] || xTM3x || iOS 8 || 2015-08-03 || ? || Remove table view separators<br />
|-<br />
| [https://github.com/PoomSmart/InternalPhotos InternalPhotos] || PoomSmart || iOS 7 - 8 || 2015-01-10 || MIT || Enable hidden photos settings<br />
|-<br />
| [https://github.com/switchpwn/KeyShortcut-Pro KeyShortcut Pro] || switchpwn (Mustafa Gezen) || iOS 6 - 8 || 2014-05-13 || MIT || Use keys as shortcut<br />
|-<br />
| [https://github.com/Razzile/KillSwitcher KillSwitcher] || Satori/Razzile || iOS 8 || 2015-01-27 || - || Adds a button to the app switcher to kill all running apps at once<br />
|-<br />
| [https://github.com/PoomSmart/Live-Effects-Enabler Live Effects Enabler] || PoomSmart || iOS 7 - 8 || 2015-01-10 || MIT || Camera live filters for unsupported iOS 7 devices<br />
|-<br />
| [https://github.com/PoomSmart/LLBPano LLBPano] || PoomSmart || iOS 6 - 8 || 2015-01-10 || MIT || Enable Low-light mode in Panorama<br />
|-<br />
| [https://github.com/matibot/MBCircularProgressBar MBCircularProgressBar] || Mati Bot || iOS 7 - 8 || 2015-08-18 || MIT || A circular, animatable & highly customizable progress bar from the Interface Builder<br />
|-<br />
| [https://github.com/PoomSmart/MyBias MyBias] || PoomSmart || iOS 8 || 2015-01-10 || MIT || Take advantages of camera focus feature<br />
|-<br />
| [https://github.com/iMokhles/MyOwnTweaks MyOwnTweaks] || iMokhles || iOS 7 - 8 || 2014-12-19 || GNU v3 || OpenIN - CopyTXT features for Social Apps<br />
|-<br />
| [https://github.com/fewjative/nonearme NoNearMe] || fewjative || iOS 7 || 2014-05-17 || MIT || Removes the 'Near Me' tab from the AppStore Application<br />
|-<br />
| [https://github.com/ruslan120101/nupsidedown nupsidedown] || Ruslan Ardashev || iOS 8 - 8.1.2 || 2014-12-23 || - || Disable upside-down orientation <br />
|-<br />
| [https://github.com/xTheMaster3x/Pag Pag] || xTM3x || iOS 8 || 2015-01-11 || Apache 2.0 || Paste and Go button in MobileSafari<br />
|-<br />
| [https://github.com/ruslan120101/panicLockiOS8 panicLockiOS8] || Ruslan Ardashev || iOS 8 - 8.1.2 || 2014-12-30 || - || Discretely lock your iDevice with a compromised passcode<br />
|-<br />
| [https://github.com/angelXwind/PreferenceOrganizer2 PreferenceOrganizer 2] || angelXwind, hirakujira, gary19930520, eliz || iOS 6 - 8.1.2 || 2015-05-30 || BSD || Organises the Settings application's sections into 4 configurable categories: Apple Apps, Social Apps, Tweaks, and App Store Apps<br />
|-<br />
| [https://github.com/xTheMaster3x/Presentation Presentation] || xTM3x || iOS 8 || 2015-08-03 || Apache 2.0 || Class-0 like SMS notifications on the Lock Screen<br />
|-<br />
| [https://github.com/ruslan120101/reachabilityToggles reachabilityToggles] || Ruslan Ardashev || iOS 8 - 8.1.2 || 2015-01-04 || - || Customize Reachability Duration, Animation, & more<br />
|-<br />
| [https://github.com/wvabrinskas/ReSwitch ReSwitch] || William_vab || iOS 8 || 2015-19-08 || ? || Switches the recent contacts with the app cards in the app switcher. <br />
|-<br />
| [https://github.com/Razzile/RippleBoard RippleBoard] || Satori/Razzile || iOS 8 || 2015-05-23 || MIT || Creates a flat ripple effect on app launch and other times<br />
|-<br />
| [https://github.com/kyewei/ShowSongMetadata ShowSongMetadata] || kyewei || iOS 8 - 8.4 || 2015-08-19 || - || View song metadata in Music app<br />
|-<br />
| [https://github.com/xTheMaster3x/SleekKey SleekKey] || xTM3x || iOS 7 - 8 || 2015-02-24 || Apache 2.0 || Remove keyboard key backgrounds<br />
|-<br />
| [https://github.com/milodarling/SnooScreens SnooScreens] || Milo Darling || iOS 8 || 2014-11-30 || MIT || Set the wallpaper based on image posts from subreddits<br />
|-<br />
| [https://github.com/MohammadAG/iOS-SpotlightSiri SpotlightSiri] || MohammadAG || iOS 8 || 2015-01-09 || GPLv3 || Use Siri by prefixing Spotlight searches with "Siri"<br />
|-<br />
| [https://github.com/f41c0r/TinderStats-iOS TinderStats] || f41c0r || iOS 8 || 2016-06-25 || GPLv3 || Track statistics about your Tinder usage.<br />
|-<br />
| [https://github.com/iMokhles/WAEnhancer WAEnhancer] || iMokhles || iOS 7 - 8 || 2014-12-18 || GNU v3 || Suite of features for WhatsApp<br />
|-<br />
|-<br />
|}<br />
<br />
== iOS 7 compatible ==<br />
<br />
{| class="wikitable sortable"<br />
|-<br />
! Project !! Author !! Compatibility !! Updated (as of Nov 2013) !! License !! Short description<br />
|-<br />
| [https://github.com/fewjative/alarmnotifier AlarmNotifier] || fewjative || iOS 7 || 2014-05-17 || MIT || Displays a notification that displays the amount of time before the alarm will go off<br />
|-<br />
| [https://github.com/GN-OS/BadgeClearer BadgeClearer] || GN-OS || iOS 4 - 7.1 || 2014-01-31 || zlib || Remove app badges<br />
|-<br />
| [https://github.com/Sticktron/BigBubbles BigBubbles] || Sticktron || iOS 6 - 7 || 2015-03-26 || &copy; || Bigger image bubbles for the Messages App.<br />
|-<br />
| [https://github.com/insanj/Bluepicker Bluepicker] || insanj || iOS 6 - 7 || 2014-05-16 || CC BY-NC || Control Bluetooth devices via Activator<br />
|-<br />
| [https://github.com/jontelang/Boover Boover] || jontelang || iOS 5 - 7 || 2014-01-14 || ? || Move icon badges<br />
|-<br />
| [https://github.com/hbang/BrightVol BrightVol] || hbang || iOS 4 - 11 || 2014-02-07 || GPL || Control brightness with volume buttons (using Activator)<br />
|-<br />
| [https://github.com/rpetrich/BrowserChooser BrowserChooser] || rpetrich || iOS 5 - 7 || 2014-01-19 || ? || Switch default browsers<br />
|-<br />
| [https://github.com/VAlexander/Chameleon Chameleon] || VAlexander || iOS 7 || 2014-07-29 || MIT || Lightweight x powerful flat color framework for iOS<br />
|-<br />
| [https://bitbucket.org/coolstar/classicbadges ClassicBadges] || coolstar || iOS 7 || 2014-04-12 || GPLv3 || iOS 6 Badges for iOS 7<br />
|-<br />
| [https://bitbucket.org/coolstar/classicdock ClassicDock] || coolstar || iOS 7 || 2014-05-12 || GPLv3 || iOS 6 Dock for iOS 7<br />
|-<br />
| [https://github.com/insanj/Cleary Cleary] || insanj || iOS 6 - 7 || 2014-04-27 || BSD || Create Clear tasks using Activator<br />
|-<br />
| [https://github.com/PoomSmart/Contrast70 Contrast70] || PoomSmart || iOS 7.0 || 2014-09-19 || MIT || Add gray patterns for increase contrast handling.<br />
|-<br />
| [https://github.com/Qusic/Couria Couria] || Qusic || iOS 6 - 7 || 2014-02-08 || GPLv3 || Quick reply and quick compose system<br />
|-<br />
| [https://github.com/fewjative/customspotlighttext CustomSpotlightText] || fewjative || iOS 7 || 2014-05-17 || MIT || Customize the placeholder text found when doing a spotlight search<br />
|-<br />
| [http://gitweb.saurik.com/cydget.git Cydget] ([[Cydget]]) || saurik || iOS 2.2 - 9 || 2014-02-18 || BSD || Manage lockscreen plugins<br />
|-<br />
| [https://github.com/rweichler/cylinder Cylinder] || rweichler || iOS 4 - 7 || 2014-03-27 || GPLv3 || Animated page swipes<br />
|-<br />
| [https://github.com/thomasfinch/Dim Dim] || tomf64 || iOS 7 || 2014-05-07 || GPL || Dim device screen below minimum brightness<br />
|-<br />
| [https://github.com/MiloSovoy/Dropped Dropped] || James-Isaac-Neutron || iOS 7 || 2014-10-20 || MIT || Activator events for dropping your phone<br />
|-<br />
| [https://github.com/NSPwn/Fake-Operator FakeOperator] || GreySyntax || iOS 4.1 - 7.1 || 2014-01-06 || GPL || Allows the carrier label to be changed<br />
|-<br />
| [https://github.com/BenAndCarl/Faces Faces] || Ben Rosen & CPDigitalDarkroom || iOS 7 || 2014-09-08 || GPLv3 || Set images for passcode buttons.<br />
|-<br />
| [https://github.com/thomasfinch/Favebot FaveBot] || tomf64 || iOS 7 || 2014-05-23 || GPL || View favorites natively in Tweetbot 3<br />
|-<br />
| [https://github.com/rpetrich/FullForce FullForce] || rpetrich || iOS 3.2 - 7 || 2014-01-10 || GPL || Force applications to show in iPad mode<br />
|-<br />
| [https://github.com/bushe/GoodByeSlideTo GoodByeSlideTo] || Bushe || iOS 7 || 2014-02-16 || ? || Removes "Slide To" text under notifications<br />
|-<br />
| [https://github.com/PoomSmart/HDRBadge70 HDRBadge70] || PoomSmart || iOS 7.0 || 2014-09-19 || MIT || Fulfill incompleted HDR badge system<br />
|-<br />
| [https://github.com/codyd51/Hermes Hermes] || Codyd51 || iOS 7 || 2014-07-15 || CC || Simplistic quick reply<br />
|-<br />
| [https://github.com/sharedRoutine/Hold2Speak Hold2Speak] || isklikas - sharedRoutine || iOS 7 || 2014-05-03 || ? || Reply and start calls with the speaker enabled<br />
|-<br />
| [https://github.com/cc941201/iMessageSpamReporter iMessageSpamReporter] || CC-Dog || iOS 7 || 2014-02-21 || BSD || Report iMessage spam to Apple directly in MobileSMS.app<br />
|-<br />
| [https://github.com/ashikase/LastApp LastApp] || ashikase || iOS 3 - 7 || 2014-01-02 || BSD || Quickly switch to previous application<br />
|-<br />
| [https://github.com/PoomSmart/LocationRemindersEnabler7 LocationRemindersEnabler7] || PoomSmart || iOS 7 || 2014-02-21 || MIT || Enable location-reminders for unsupported iOS 7 devices<br />
|-<br />
| [https://github.com/fewjative/LowPowerBanner LowPowerBanner] || fewjative || iOS 5 - 7 || 2014-05-17 || MIT || Changes power alerts into banners and can customize the text, icon, sound and when to receive the alert<br />
|-<br />
| [https://github.com/hbang/MapsOpener MapsOpener] || hbang || iOS 5 - 11 || 2014-04-03 || GPL || Open Google Maps links in the Google Maps app<br />
|-<br />
| [https://github.com/b3ll/MessageBox MessageBox] || b3ll || iOS 7 || 2014-04-02 || BSD || Use Chat Heads outside Facebook app<br />
|-<br />
| [https://github.com/PoomSmart/MoreDictation MoreDictation] || PoomSmart || iOS 5 - 7 || 2015-01-10 || MIT || More languages support for dictation<br />
|-<br />
| [https://github.com/PoomSmart/MyAssistive MyAssistive] || PoomSmart || iOS 5 - 7.1 || 2014-01-05 || MIT || Repurpose the Assistive Touch<br />
|-<br />
| [https://github.com/hbang/NCPad NCPad] || hbang || iOS 5 - 7 || 2014-01-30 || MIT || Resize notification banners to iPad screen width<br />
|-<br />
| [https://github.com/r-plus/NoDictation NoDictation] || r-plus || iOS 5.1 - 7 || 2013-12-30 || ? || Disable dictation key without disabling Siri<br />
|-<br />
| [https://github.com/fewjative/nonearme NoNearMe] || fewjative || iOS 7 || 2014-05-17 || MIT || Removes the 'Near Me' tab from the AppStore Application<br />
|-<br />
| [https://github.com/nickfrey/NowNow NowNow] || nickfrey || iOS 7 || 2014-05-14 || ? || Invoke Google Voice Search using Activator<br />
|-<br />
| [https://github.com/jzplusplus/OkSiri OkSiri] || jzplusplus || iOS 7 || 2014-07-25 || GPLv2 || Always-on keyword recognition<br />
|-<br />
| [https://github.com/eswick/osexperience OS Experience] || eswick || iOS 6 - 7 || 2015-06-19 || MIT || Window manager and switcher<br />
|-<br />
| [https://github.com/ruslan120101/panicLock panicLock] || panicLock || iOS 7 || 2014-08-10 || ? || Discrete locking of iDevice even with a compromised passcode<br />
|-<br />
| [https://github.com/protosphere/pinnacle Pinnacle] || ProtoSphere || iOS 7 || 2014-04-11 || MIT || Hold back button to go to top-level page<br />
|-<br />
| [https://github.com/b3ll/PostOffice PostOffice] || b3ll || iOS 6 - 7 || 2014-03-18 || BSD || Forward iOS notifications to Google Glass<br />
|-<br />
| [https://github.com/cc941201/PreferredLanguageOrder PreferredLanguageOrder] || CC-Dog || iOS 7 || 2014-03-07 || BSD || Adjust preferred language order in Preferences.app<br />
|-<br />
| [https://github.com/thomasfinch/Priority-Hub Priority Hub] || tomf64 || iOS 7 || 2014-05-28 || || Sort lock screen notifications by app<br />
|-<br />
| [https://github.com/a1anyip/ProWidgets ProWidgets] || a1anyip || iOS 7 || 2015-07-01 || ? || Widget suite and framework for iOS<br />
|-<br />
| [https://github.com/PoomSmart/ProximityCam ProximityCam] || PoomSmart || iOS 7 || 2014-02-21 || MIT || Proximity camera snap for iOS<br />
|-<br />
| [https://github.com/ashikase/ShowCase ShowCase] || ashikase || iOS 7 || 2014-01-02 || BSD || Make keyboard show current case<br />
|-<br />
| [https://github.com/insanj/SleepyAlarm SleepyAlarm] || insanj || iOS 7 || 2014-03-13 || CC BY-NC || Suggests better wake up times<br />
|-<br />
| [https://github.com/c-ryan747/SMSStats2 SMSStats2] || Callum Ryan || iOS 7 || 2014-03-31 || MIT || Statistics in MobileSMS.app<br />
|-<br />
| [https://github.com/BGerard/SnapSelect SnapSelect] || BGerard || iOS 7 || 2014-07-04 || GPL 2 || Send photos from your photo library via SnapChat<br />
|-<br />
| [https://github.com/insanj/Snooze Snooze] || insanj || iOS 7 || 2014-05-29 || CC BY-NC || Configure snooze times other than nine minutes<br />
|-<br />
| [https://github.com/Firemoon777/StatusModifier StatusModifier] || Firemoon777 || iOS 7.0 - 7.1 || 2014-07-17 || GPL v3 || Customize your statusbar<br />
|-<br />
| [https://github.com/switchpwn/SwitchData SwitchData] || switchpwn || iOS 7 || 2014-05-13 || MIT || Switch between wifi and cellular data depending on the service signal<br />
|-<br />
| [https://github.com/r-plus/SwipeShiftCaret SwipeShiftCaret] || r-plus || iOS 4 - 7 || 2014-02-20 || ISC || Edit text with keyboard gestures<br />
|-<br />
| [https://github.com/rpetrich/SwitchIcons SwitchIcons] || rpetrich || iOS 5 - 7 || 2014-01-10 || ? || Example tweak for Flipswitch<br />
|-<br />
| [https://github.com/hbang/TypeStatus TypeStatus] || hbang || iOS 5 - 11 || 2014-05-18 || Apache 2.0 || iMessage typing indicators for the status bar<br />
|-<br />
| [https://github.com/conradev/UserAgentFaker UserAgentFaker] || conradev || iOS 7 || 2014-03-31 || MIT || User agent faker for browsers<br />
|-<br />
| [https://github.com/iMokhles/VBEnahncerLite VBEnhancerLite] || iMokhles || iOS 6 - 7 || 2014-08-12 || Apache || Suite of features for Viber app<br />
|-<br />
| [http://gitweb.saurik.com/veency.git Veency] || saurik || iOS 6 - 7 || 2014-01-28 || AGPL 3.0 || VNC server<br />
|-<br />
| [https://github.com/fewjative/verticalvideosyndrome VerticalVideoSyndrome] || fewjative || iOS 7 || 2014-05-17 || MIT || Displays a warning image when in recording mode and device is vertically oriented<br />
|-<br />
| [https://github.com/imokhles/WAEHideCamera WAEHideCamera] || iMokhles || iOS 6 - 7 || 2014-09-23 || Apache || Hide camera button in new version WhatsApp<br />
|-<br />
| [https://github.com/imokhles/wareadmark WAReadMark] || iMokhles || iOS 5 - 7 || 2014-04-15 || ? || Disable Read Mark in WhatsApp<br />
|-<br />
| [https://github.com/iMokhles/WhatsAtor WhatsAtor] || iMokhles || iOS 6 - 7 || 2013-12-25 || GPL || Send WhatsApp messages from anywhere<br />
|-<br />
| [https://github.com/iMokhles/whatsapplstimest WhatsApp LSeen TimeStamp] || iMokhles || iOS 5 - 7 || 2013-09-03 || GPL || Toggle WhatsApp timestamp without waiting 24 hours<br />
|-<br />
| [http://gitweb.saurik.com/winterboard.git WinterBoard] ([[WinterBoard]]) || saurik || iOS 2 - 9 || 2014-01-29 || BSD? || Advanced theming system<br />
|-<br />
| [https://github.com/PoomSmart/Yellow-Flash-7.0 Yellow Flash 7.0] || PoomSmart || iOS 7.0 || 2014-09-19 || MIT || Yellowish flash button highlight<br />
|}<br />
<br />
== iOS 6 compatible ==<br />
<br />
{| class="wikitable sortable"<br />
|-<br />
! Project !! Author !! Compatibility !! Updated (as of Nov 2013) !! License !! Short description<br />
|-<br />
| [https://github.com/trenskow/AirFloat AirFloat] || trenskow || iOS 6 || 2013-07-13 || BSD? || AirPlay audio (AirTunes) for iOS<br />
|-<br />
| [https://github.com/EthanArbuckle/AlienBlueTags AlienBlueTags] || EthanArbuckle || iOS 6 || 2013-11-06 || ? || Adds Reddit user tagging to AlienBlue<br />
|-<br />
| [https://github.com/nickfrey/AnyLockApp AnyLockApp] || nickfrey || iOS 5 - 6 || 2012-02-04 || ? || Change lockscreen camera shortcut<br />
|-<br />
| [https://github.com/PoomSmart/PLReorientingButtonMod Camera Button UI Mod] || PoomSmart || iOS 6 || 2013-12-20 || MIT || Change opacity & position of (gray) camera buttons<br />
|-<br />
| [https://github.com/rpetrich/DietBar DietBar] || rpetrich || iOS 3 - 6 || 2012-06-23 || ? || Shrink navigation bars<br />
|-<br />
| [https://github.com/rpetrich/DietBulletins DietBulletins] || rpetrich || iOS 4 - 6 || 2013-09-10 || ? || Shrink notification bulletins<br />
|-<br />
| [https://github.com/uroboro/FlipNC FlipNC] || uroboro || iOS 5 - 6 || 2014-03-18 || GPL || Adds flipswitches to the notification center<br />
|-<br />
| [https://github.com/insanj/GoogleSearchforVelox GoogleSearchforVelox] || insanj || iOS 6 || 2013-08-24 || BSD || Quick search from the Google app<br />
|-<br />
| [https://github.com/FilippoBiga/Harlem-Shake Harlem Shake] || FilippoBiga || iOS 6 || 2013-03-11 || ? || Make SpringBoard icons dance<br />
|-<br />
| [https://github.com/Xuzz/tweaks/tree/master/hookslaw %hook's law] || Xuzz || iOS 6 || 2013-02-16 || BSD || Makes animations springier<br />
|-<br />
| [https://github.com/rpetrich/IconRotator IconRotator] || rpetrich || iOS 5 - 6 || 2013-02-16 || GPL || Rotates icons<br />
|-<br />
| [https://github.com/patelhiren/iannounce iAnnounce] || patelhiren || iOS 4 - 6 || 2013-03-01 || ? || Announce incoming caller's name<br />
|-<br />
| [https://github.com/zephster/InAMinute InAMinute] || zephster || iOS 6 || 2013-08-24 || ? || Fine-grained time selection system-wide<br />
|-<br />
| [https://github.com/rpetrich/LiveClock LiveClock] || rpetrich || iOS 3 - 6 || 2013-02-04 || ? || Animated clock icon on SpringBoard<br />
|-<br />
| [https://github.com/H6nry/ncforward NCForward] || h6nry || iOS 5 - 6 || 2015-12-09 || Credit pls. || Forward iOS notifications to (theoretically) every internet connected device<br />
|-<br />
| [https://github.com/rpetrich/NoNewsIsGoodNews NoNewsIsGoodNews] || rpetrich || iOS 5 - 6 || 2011-12-28 || ? || Hide Newsstand icon<br />
|-<br />
| [https://github.com/conradev/Tweaks/tree/master/nopasscodeblock NoPasscodeBlock] || conradev || iOS 6 || 2013-02-05 || ? || Prevent permanent passcode locking<br />
|-<br />
| [https://github.com/k3a/OctopusKeyboard OctopusKeyboard] || k3a || iOS 6 || 2014-03-19 || GPL || Predictive keyboard, showing word suggestions<br />
|-<br />
| [https://github.com/rpetrich/RotationInhibitor RotationInhibitor] || rpetrich || iOS 3 - 6.1 || 2013-02-04 || ? || Disable device rotation<br />
|-<br />
| [https://github.com/rpetrich/RunningIndicator RunningIndicator] || rpetrich || iOS 4 - 6 || 2013-05-29 || ? || Running app icons glow<br />
|-<br />
| [https://github.com/DHowett/safaridownloader Safari Download Manager] || DHowett / francis || iOS 3.1 - 6.1 || 2013-02-04 || BSD || A download manager, for Safari!<br />
|-<br />
| [https://github.com/insanj/SliderKiller SliderKiller] || insanj || iOS 6 || 2013-08-24 || BSD || Always "slide to unlock" instead of "slide to reply"<br />
|-<br />
| [https://github.com/bd452/TapTapPass TapTapPass] || bd452 || iOS 6 || 2013-10-10 || ? || Gesture-based passcode toggle<br />
|-<br />
| [https://github.com/bushe/Unlock7 Unlock7] || bushe || iOS 6 || 2013-11-01 || ? || Adds some iOS 7 lockscreen features to iOS 6<br />
|-<br />
| [https://github.com/Cykey/Uninstall-Application-Size Uninstall Application Size] || Cykey || iOS 6 || 2013-09-26 || Public Domain || Shows application size when prompting to uninstall<br />
|-<br />
| [https://github.com/rpetrich/VideoPace VideoPace] || rpetrich || iOS 4.3 - 6 || 2013-08-04 || ? || Increase speed of video playback<br />
|-<br />
| [https://github.com/rpetrich/WiCarrier WiCarrier] || rpetrich || iOS 3 - 6 || 2012-04-07 || GPL || Show WiFi network name/IP in place of carrier view<br />
|}<br />
<br />
== iOS 5 compatible ==<br />
<br />
{| class="wikitable sortable"<br />
|-<br />
! Project !! Author !! Compatibility !! Updated (as of Nov 2013) !! License !! Short description<br />
|-<br />
| [https://github.com/rpetrich/AutocorrectionBar AutocorrectionBar] || rpetrich || iOS 4.3 - 5 || 2011-11-09 || ? || Enable hidden keyboard feature<br />
|-<br />
| [https://github.com/rpetrich/ClearNotifications ClearNotifications] || rpetrich || iOS 5 || 2012-02-03 || ? || Clear lock screen notifications with a swipe<br />
|-<br />
| [https://github.com/eni9889/Color-Mail-Labels Color Mail Labels] || eni9889|| iOS 5 || 2012-02-13 || GPLv3 || Give each mail account its own color<br />
|-<br />
| [https://github.com/DHowett/cydelete Cydelete] || DHowett || iOS 2 - 5 || 2011-10-09 || GPLv3 || Delete Cydia apps from Springboard<br />
|-<br />
| [https://github.com/rpetrich/FastBlurredNotificationCenter FastBlurredNotificationCenter] || rpetrich || iOS 5 || 2012-03-03 || GPL || Blurs notification center background<br />
|-<br />
| [https://github.com/aricha/Merge Merge] || Andrew Richardson & Joshua Tucker || iOS 5 || 2012-10-13 || Apache || Combines messages by contact in Messages<br />
|-<br />
| [https://github.com/rpetrich/MoreLinesNotificationCenter MoreLinesNotificationCenter] || rpetrich || iOS 5 || 2011-10-16 || ? || More lines in notification center<br />
|-<br />
| [https://github.com/rpetrich/MusicBanners MusicBanners] || rpetrich || iOS 5 || 2012-04-08 || GPL || Track change bulletins with album art in SpringBoard<br />
|-<br />
| [https://github.com/rpetrich/TopographyForGoogleMaps TopographyForGoogleMaps] || rpetrich || iOS 5.1 || 2012-12-25 || ? || Enable hidden topography view<br />
|-<br />
| [https://github.com/coolstar/vassistant VAssistant] || coolstar || iOS 5 - 5.1.1 || 2012-12-08 || GPL 3 || Siri clone for iOS 5<br />
|-<br />
| [https://github.com/jlippold/WifiSMS WifiSMS] || jlippold || iOS 4 - 5 || 2012-04-08 || ? || iPhone webserver gateway for SMS<br />
|}<br />
<br />
== iOS 4 compatible ==<br />
<br />
{| class="wikitable sortable"<br />
|-<br />
! Project !! Author !! Compatibility !! Updated (as of Nov 2013) !! License !! Short description<br />
|-<br />
| [https://github.com/Chronic-Dev/animate animate] || Chronic-Dev Team et al. || iOS 4.2.1 || 2011-07-10 || © || Customize boot logo animations<br />
|-<br />
| [https://github.com/Xuzz/tweaks/tree/master/appslide Appslide] || Xuzz || iOS 4.2 || 2013-02-16 || BSD || Use home button to go back<br />
|-<br />
| [https://github.com/rpetrich/DeepEnd DeepEnd] || rpetrich || iOS 4 || 2011-01-31 || ? || 3D effect for Springboard<br />
|-<br />
| [https://github.com/Xuzz/tweaks/tree/master/five-icon-switcher Five Icon Switcher] || Xuzz || iOS 4 || 2011-09-24 || BSD || Five icons in app switcher<br />
|-<br />
| [https://github.com/rpetrich/IconRenamer IconRenamer] || rpetrich || iOS 4 || 2011-10-16 || ? || Rename icons from your SpringBoard<br />
|-<br />
| [https://github.com/rpetrich/ListLauncher ListLauncher] || rpetrich || iOS 4 || 2011-02-05 || ? || Launch apps from Spotlight<br />
|-<br />
| [https://github.com/rpetrich/LivePaper LivePaper] || rpetrich et al. || iOS 4 || 2011-07-20 || ? || Live wallpaper with plugins<br />
|-<br />
| [https://github.com/rpetrich/MathAlarm MathAlarm] || rpetrich || iOS 4.2 || 2012-01-10 || ? || Solve arithmetic problems to turn off alarm<br />
|-<br />
| [https://github.com/rpetrich/QuickReply QuickReply] || rpetrich || iOS 2 - 4 || 2011-04-24 || whatever || Quick reply for SMS<br />
|-<br />
| [https://github.com/rpetrich/PagePusher PagePusher] || rpetrich || iOS 4 || 2011-06-02 || ? || Page-styled app animations<br />
|-<br />
| [https://github.com/rpetrich/SwitcherMod SwitcherMod] || rpetrich and Optimo || iOS 4 || 2011-12-31 || ? || Customized app switcher<br />
|-<br />
| [https://github.com/rpetrich/VoiceKeys VoiceKeys] || rpetrich || iOS 4 || 2011-11-27 || ? || Voice recognition using Google's service<br />
|-<br />
| [https://github.com/rpetrich/WebGLEnabler WebGLEnabler] || rpetrich || iOS 4.2 || 2011-07-24 || ? || Enable WebGL support in apps that use UIWebView<br />
|}<br />
<br />
== iOS 3 compatible ==<br />
<br />
{| class="wikitable sortable"<br />
|-<br />
! Project !! Author !! Compatibility !! Updated (as of Nov 2013) !! License !! Short description<br />
|-<br />
| [https://github.com/rpetrich/DisplayEffects DisplayEffects] || rpetrich || iOS 3 || 2011-01-18 || ? || Experimental effects for iOS<br />
|-<br />
| [https://github.com/rpetrich/NoClearHistory NoClearHistory] || rpetrich || iOS 3 || 2010-09-29 || ? || Don't allow clearing history<br />
|-<br />
| [https://github.com/n00neimp0rtant/OpenNotifier OpenNotifier] || n00neimp0rtant and Lunat1k || iOS 3.2 || 2013-04-18 || ? || Notification icons for your status bar<br />
|-<br />
| [https://github.com/rpetrich/ProSwitcher ProSwitcher] || rpetrich and chpwn || iOS 3 || 2010-09-18 || ? || Palm Pre-style application switcher<br />
|-<br />
| [https://github.com/rpetrich/PullToDismiss PullToDismiss] || rpetrich || iOS 3.2 || 2011-12-30 || ? || Pull down to dismiss keyboard<br />
|-<br />
| [https://github.com/rpetrich/SliderBar SliderBar] || rpetrich || iOS 3 || 2011-06-06 || ? || Quick scrolling in all table views<br />
|-<br />
| [https://github.com/rpetrich/SplitMail SplitMail] || rpetrich || iOS 3.2 || 2012-02-02 || ? || Split-style iPad mail app in portrait<br />
|-<br />
| [https://svn.bingner.com/SAM Subscriber Artificial Module (SAM)] || sbingner || iOS 3 || 2013-06-07 || LGPL || <small>(Login: username "anonymous", no password. [https://repo.bingner.com/websvn/ Web view].)</small><br />
|-<br />
| [https://github.com/rpetrich/WebPreview WebPreview] || rpetrich || iOS 3 || 2011-02-17 || ? || Preview web links in a popup<br />
|}<br />
<br />
== Unknown compatibility ==<br />
<br />
{| class="wikitable sortable"<br />
|-<br />
! Project !! Author !! Compatibility !! Updated (as of Nov 2013) !! License !! Short description<br />
|-<br />
| [https://github.com/rpetrich/AllowRotate AllowRotate] || rpetrich || iOS ? || 2010-10-03 || ? || <br />
|-<br />
| [https://github.com/Xuzz/tweaks/tree/master/fullwebclips FullWebClips] || Xuzz || iOS ? || 2011-07-21 || BSD || Make Web Clips fullscreen<br />
|-<br />
| [https://github.com/DarkMalloc/Glue Glue] || DarkMalloc || iOS ? || 2011-06-29 || ? || Share a note with Pastie from the Notes app<br />
|-<br />
| [https://github.com/Xuzz/tweaks/tree/master/internalizer Internalizer] || Xuzz || iOS ? || 2011-07-22 || BSD || Add text to your lockscreen<br />
|-<br />
| [https://github.com/BGerard/IPSlider IPSlider] || BGerard || iOS ? || 2013-11-15 || GPL 2 || Set "slide to unlock" message to IP address<br />
|-<br />
| [https://github.com/conradev/Tweaks/tree/master/lockseconds LockSeconds] || conradev || iOS ? || 2012-06-02 || ? || Add seconds to lockscreen clock<br />
|-<br />
| [https://github.com/FreeManRepo/MediaSpeak MediaSpeak] || freemanrepo || iOS ? || 2012-04-15 || ? || Speak currently playing song<br />
|-<br />
| [https://github.com/rpetrich/Multi-Slide Multi-Slide] || rpetrich and InfectionFX || iOS ? || 2011-06-19 || WTFPL || Multiple unlock sliders<br />
|-<br />
| [https://github.com/Xuzz/tweaks/tree/master/no-dots No Dots] || Xuzz || iOS ? || 2010-11-27 || BSD || No page dots<br />
|-<br />
| [https://github.com/rpetrich/SBCustomIcon SBCustomIcon] || rpetrich || iOS ? || 2009-02-09 || ? || <br />
|-<br />
| [https://github.com/conradev/Tweaks/tree/master/searchclear SearchClear] || conradev || iOS ? || 2012-06-24 || ? || Clears the search field after a search<br />
|-<br />
| [https://github.com/Xuzz/tweaks/tree/master/switcherscape SwitcherScape] || Xuzz || iOS ? || 2011-07-22 || BSD || App switcher in landscape mode<br />
|-<br />
| [https://github.com/Xuzz/tweaks/tree/master/webscrollian Webscrollian] || Xuzz || iOS ? || 2011-07-28 || BSD || Faster scrolling for web content<br />
|}<br />
<br />
= Applications =<br />
<br />
{| class="wikitable sortable"<br />
|-<br />
! Project !! Author !! Compatibility !! Updated (as of Nov 2013) !! License !! Short description<br />
|-<br />
| [https://github.com/ashikase/CrashReporter CrashReporter] || ashikase || iOS 6 - 11 || 2016-06-26 || ? || App for processing and sending crash logs<br />
|-<br />
| [http://gitweb.saurik.com/cydia.git Cydia] || saurik || iOS 2 - 11 || 2016-06-26 || Modified BSD || Graphical APT frontend<br />
|-<br />
| [https://code.google.com/p/mobileterminal/ MobileTerminal] || (multiple) || iOS 3.2 - 6 || 2011-10-26 || GPL 2 || Terminal emulator<br />
|-<br />
| [https://github.com/hbang/NewTerm NewTerm] || (multiple) || iOS 7 - 11 || 2018-07-09 || GPL 2 || Terminal emulator (successor to MobileTerminal)<br />
|-<br />
| [https://github.com/coolstar/RecordMyScreen/ RecordMyScreen] || coolstar || iOS 5 - 6 || 2013-07-22 || MIT || Screen Recorder<br />
|-<br />
| [https://github.com/hrydgard/ppsspp PPSSPP] || (multiple) || iOS 5 - 8.1 || 2014-11-22 || GPL || Sony PlayStation Portable emulator<br />
|-<br />
| [https://github.com/lufinkey/miniCode miniCode] || lufinkey || iOS 4.3.3 - 7 || 2014-07-19 || ?|| On device IDE<br />
|}<br />
<br />
= Tools =<br />
<br />
{| class="wikitable sortable"<br />
|-<br />
! Project !! Source !! Author !! Compatibility !! Updated (As of Nov 2013) !! License !! Short description<br />
|-<br />
| [[Airscan]] || [https://github.com/Cykey/airscan] || Cykey || iOS 6 || 2013-08-12 || ? || iOS command-line WiFi scanner<br />
|-<br />
| [[CaptainHammer]] || [https://github.com/rpetrich/CaptainHammer] || rpetrich || iOS 3 - 6 || 2013-05-10 || GPL 3 || Simple debugging tools for iOS<br />
|-<br />
| [[Open]] || [https://github.com/conradev/Open] || conradev || iOS 6 || 2013-07-24 || ? || Open apps from shell on iOS<br />
|-<br />
| [[sbutils]] || [https://github.com/innoying/iOS-sbutils] || innoying || iOS 6 || 2012-25-01 || ? || A collection of utilities to access iOS functions via the command line<br />
|-<br />
| [[symbolicate]] || [https://github.com/ashikase/symbolicate] || ashikase, KennyTM || iOS ? || 2013-12-28 || ? || Command-line tool for symbolicating crash logs<br />
|-<br />
| [[Theos]] || [https://github.com/theos/theos] || (multiple) || - || 2013-11-06 || GPL 3 || Unified cross-platform iPhone Makefile system<br />
|-<br />
|}<br />
<br />
= Developer libraries =<br />
<br />
{| class="wikitable sortable"<br />
|-<br />
! Project !! Source !! Author !! Compatibility !! Updated (As of Nov 2013) !! License !! Short description<br />
|-<br />
| [[AppList]] || [https://github.com/rpetrich/AppList] || rpetrich || iOS 3 - 11 || 2014-04-30 || ? || Allow extensions to read the list of installed apps<br />
|-<br />
| [[BTstack]] || [http://btstack.org] || mringwal || iOS 3 - 7 || 2014-05-22 || dual license || Bluetooth stack with SDP, RFCOMM, and, L2CAP APIs<br />
|-<br />
| [[Cephei]] || [https://github.com/hbang/libcephei] || hbang || iOS 5 - 11 || 2014-05-05 || Apache 2.0 || Useful functions for tweak developers<br />
|-<br />
| [[Flipswitch]] || [https://github.com/a3tweaks/Flipswitch] || rpetrich and Jack Willis || iOS ? - 7 || 2014-04-09 || LGPL || Centralized toggle system for iOS<br />
|-<br />
| [[HidSupport]] || [https://code.google.com/p/hid-support] || mringwal || iOS 3 - 7 || 2014-04-22 || BSD New || Key and touch injection library<br />
|-<br />
| [[IconSupport]] || [https://github.com/Xuzz/IconSupport] || Sakurina, chpwn, ashikase || iOS 3 - 7 || 2014-01-23 || ? || Safe icon support library<br />
|-<br />
| [[Libcolorpicker]] || [https://bitbucket.org/pixelfiredev/libcolorpicker libcolorpicker] || pixelfiredev || iOS 7 || 2014-09-13 || MIT || A color picker<br />
|-<br />
| [[LibDisplay]] || [https://github.com/freerunnering/LibDisplay] || freerunnering || iOS 4 - 6 || 2013-02-07 || ? || Manage display stacks (pre-iOS 6) and manage running applications<br />
|-<br />
| [[Libdisplaystack]] || [https://github.com/Zimm/libdisplaystack] || Zimm || iOS ? || 2010-12-30 || non-commercial || Library for launching and exiting apps<br />
|-<br />
| [[Libhide]] || [https://github.com/bushe/Libhide] || BigBoss, theiostream, Bushe || iOS 2 - 7 || 2014-02-21 || ? || A library for hiding icons from Springboard<br />
|-<br />
| [[Libobjcipc]] || [https://github.com/a1anyip/libobjcipc] || a1anyip || iOS 7 || 2014-03-19 || ? || An inter-process communication (between app and SpringBoard) solution<br />
|-<br />
| [[Libopener]] || [https://github.com/hbang/libopener] || hbang || iOS 5 - 11 || 2014-05-05 || Apache 2.0 || Developer library for overriding link destinations<br />
|-<br />
| [[Libstatusbar]] || [https://github.com/phoenix3200/libstatusbar] || phoenix3200 || iOS 3 - 9 || 2014-02-07 || ? || Custom statusbar icon library<br />
|-<br />
| [[PreferenceLoader]] || [https://github.com/rpetrich/preferenceloader] || (various) || iOS 3 - 11 || 2013-11-22 || LGPLv3 || Allows developers to add entries to Settings.app<br />
|-<br />
| [[SearchLoader]] || [https://github.com/theiostream/SearchLoader] || theiostream || iOS 6 || 2013-07-22 || ? || Loads search bundles<br />
|}</div>
Dustin Howett
https://iphonedev.wiki/index.php?title=MediaWiki:Common.js&diff=5159
MediaWiki:Common.js
2018-02-26T08:58:57Z
<p>Dustin Howett: Update from Wikipedia@20180226</p>
<hr />
<div>/**<br />
* Keep code in MediaWiki:Common.js to a minimum as it is unconditionally<br />
* loaded for all users on every wiki page. If possible create a gadget that is<br />
* enabled by default instead of adding it here (since gadgets are fully<br />
* optimized ResourceLoader modules with possibility to add dependencies etc.)<br />
*<br />
* Since Common.js isn't a gadget, there is no place to declare its<br />
* dependencies, so we have to lazy load them with mw.loader.using on demand and<br />
* then execute the rest in the callback. In most cases these dependencies will<br />
* be loaded (or loading) already and the callback will not be delayed. In case a<br />
* dependency hasn't arrived yet it'll make sure those are loaded before this.<br />
*/<br />
<br />
/* global mw, $ */<br />
/* jshint strict:false, browser:true */<br />
<br />
mw.loader.using( ['mediawiki.user', 'mediawiki.util', 'mediawiki.notify'] ).done( function () {<br />
/* Begin of mw.loader.using callback */<br />
<br />
/**<br />
* Main Page layout fixes<br />
*<br />
* Description: Adds an additional link to the complete list of languages available.<br />
* Maintainers: [[User:AzaToth]], [[User:R. Koot]], [[User:Alex Smotrov]]<br />
*/<br />
if ( mw.config.get( 'wgPageName' ) === 'Main_Page' || mw.config.get( 'wgPageName' ) === 'Talk:Main_Page' ) {<br />
$( function () {<br />
mw.util.addPortletLink( 'p-lang', '//meta.wikimedia.org/wiki/List_of_Wikipedias',<br />
'Complete list', 'interwiki-completelist', 'Complete list of Wikipedias' );<br />
} );<br />
}<br />
<br />
/**<br />
* Redirect User:Name/skin.js and skin.css to the current skin's pages<br />
* (unless the 'skin' page really exists)<br />
* @source: http://www.mediawiki.org/wiki/Snippets/Redirect_skin.js<br />
* @rev: 2<br />
*/<br />
if ( mw.config.get( 'wgArticleId' ) === 0 && mw.config.get( 'wgNamespaceNumber' ) === 2 ) {<br />
var titleParts = mw.config.get( 'wgPageName' ).split( '/' );<br />
/* Make sure there was a part before and after the slash<br />
and that the latter is 'skin.js' or 'skin.css' */<br />
if ( titleParts.length == 2 ) {<br />
var userSkinPage = titleParts.shift() + '/' + mw.config.get( 'skin' );<br />
if ( titleParts.slice( -1 ) == 'skin.js' ) {<br />
window.location.href = mw.util.getUrl( userSkinPage + '.js' );<br />
} else if ( titleParts.slice( -1 ) == 'skin.css' ) {<br />
window.location.href = mw.util.getUrl( userSkinPage + '.css' );<br />
}<br />
}<br />
}<br />
<br />
/**<br />
* Map addPortletLink to mw.util<br />
* @deprecated: Use mw.util.addPortletLink instead.<br />
*/<br />
mw.log.deprecate( window, 'addPortletLink', mw.util.addPortletLink, 'Use mw.util.addPortletLink instead' );<br />
<br />
/**<br />
* Extract a URL parameter from the current URL<br />
* @deprecated: Use mw.util.getParamValue with proper escaping<br />
*/<br />
mw.log.deprecate( window, 'getURLParamValue', mw.util.getParamValue, 'Use mw.util.getParamValue instead' );<br />
<br />
/**<br />
* Test if an element has a certain class<br />
* @deprecated: Use $(element).hasClass() instead.<br />
*/<br />
mw.log.deprecate( window, 'hasClass', function ( element, className ) {<br />
return $( element ).hasClass( className );<br />
}, 'Use jQuery.hasClass() instead' );<br />
<br />
/**<br />
* @source www.mediawiki.org/wiki/Snippets/Load_JS_and_CSS_by_URL<br />
* @rev 6<br />
*/<br />
var extraCSS = mw.util.getParamValue( 'withCSS' ),<br />
extraJS = mw.util.getParamValue( 'withJS' );<br />
<br />
if ( extraCSS ) {<br />
if ( extraCSS.match( /^MediaWiki:[^&<>=%#]*\.css$/ ) ) {<br />
mw.loader.load( '/w/index.php?title=' + extraCSS + '&action=raw&ctype=text/css', 'text/css' );<br />
} else {<br />
mw.notify( 'Only pages from the MediaWiki namespace are allowed.', { title: 'Invalid withCSS value' } );<br />
}<br />
}<br />
<br />
if ( extraJS ) {<br />
if ( extraJS.match( /^MediaWiki:[^&<>=%#]*\.js$/ ) ) {<br />
mw.loader.load( '/w/index.php?title=' + extraJS + '&action=raw&ctype=text/javascript' );<br />
} else {<br />
mw.notify( 'Only pages from the MediaWiki namespace are allowed.', { title: 'Invalid withJS value' } );<br />
}<br />
}<br />
<br />
/**<br />
* WikiMiniAtlas<br />
*<br />
* Description: WikiMiniAtlas is a popup click and drag world map.<br />
* This script causes all of our coordinate links to display the WikiMiniAtlas popup button.<br />
* The script itself is located on meta because it is used by many projects.<br />
* See [[Meta:WikiMiniAtlas]] for more information.<br />
* Note - use of this service is recommended to be repalced with mw:Help:Extension:Kartographer<br />
*/<br />
( function () {<br />
var require_wikiminiatlas = false;<br />
var coord_filter = /geohack/;<br />
$( function () {<br />
$( 'a.external.text' ).each( function( key, link ) {<br />
if ( link.href && coord_filter.exec( link.href ) ) {<br />
require_wikiminiatlas = true;<br />
// break from loop<br />
return false;<br />
}<br />
} );<br />
if ( $( 'div.kmldata' ).length ) {<br />
require_wikiminiatlas = true;<br />
}<br />
if ( require_wikiminiatlas ) {<br />
mw.loader.load( '//meta.wikimedia.org/w/index.php?title=MediaWiki:Wikiminiatlas.js&action=raw&ctype=text/javascript' );<br />
}<br />
} );<br />
} )();<br />
<br />
/**<br />
* Collapsible tables<br />
*<br />
* Allows tables to be collapsed, showing only the header. See [[Help:Collapsing]].<br />
*<br />
* @version 2.0.3 (2014-03-14)<br />
* @source https://www.mediawiki.org/wiki/MediaWiki:Gadget-collapsibleTables.js<br />
* @author [[User:R. Koot]]<br />
* @author [[User:Krinkle]]<br />
* @deprecated Since MediaWiki 1.20: Use class="mw-collapsible" instead which<br />
* is supported in MediaWiki core.<br />
*/<br />
<br />
var autoCollapse = 2;<br />
var collapseCaption = 'hide';<br />
var expandCaption = 'show';<br />
var tableIndex = 0;<br />
<br />
function collapseTable( tableIndex ) {<br />
var Button = document.getElementById( 'collapseButton' + tableIndex );<br />
var Table = document.getElementById( 'collapsibleTable' + tableIndex );<br />
<br />
if ( !Table || !Button ) {<br />
return false;<br />
}<br />
<br />
var Rows = Table.rows;<br />
var i;<br />
var $row0 = $(Rows[0]);<br />
<br />
if ( Button.firstChild.data === collapseCaption ) {<br />
for ( i = 1; i < Rows.length; i++ ) {<br />
Rows[i].style.display = 'none';<br />
}<br />
Button.firstChild.data = expandCaption;<br />
} else {<br />
for ( i = 1; i < Rows.length; i++ ) {<br />
Rows[i].style.display = $row0.css( 'display' );<br />
}<br />
Button.firstChild.data = collapseCaption;<br />
}<br />
}<br />
<br />
function createClickHandler( tableIndex ) {<br />
return function ( e ) {<br />
e.preventDefault();<br />
collapseTable( tableIndex );<br />
};<br />
}<br />
<br />
function createCollapseButtons( $content ) {<br />
var NavigationBoxes = {};<br />
var $Tables = $content.find( 'table' );<br />
var i;<br />
<br />
$Tables.each( function( i, table ) {<br />
if ( $(table).hasClass( 'collapsible' ) ) {<br />
<br />
/* only add button and increment count if there is a header row to work with */<br />
var HeaderRow = table.getElementsByTagName( 'tr' )[0];<br />
if ( !HeaderRow ) {<br />
return;<br />
}<br />
var Header = table.getElementsByTagName( 'th' )[0];<br />
if ( !Header ) {<br />
return;<br />
}<br />
<br />
NavigationBoxes[ tableIndex ] = table;<br />
table.setAttribute( 'id', 'collapsibleTable' + tableIndex );<br />
<br />
var Button = document.createElement( 'span' );<br />
var ButtonLink = document.createElement( 'a' );<br />
var ButtonText = document.createTextNode( collapseCaption );<br />
// Styles are declared in [[MediaWiki:Common.css]]<br />
Button.className = 'collapseButton';<br />
<br />
ButtonLink.style.color = Header.style.color;<br />
ButtonLink.setAttribute( 'id', 'collapseButton' + tableIndex );<br />
ButtonLink.setAttribute( 'href', '#' );<br />
$( ButtonLink ).on( 'click', createClickHandler( tableIndex ) );<br />
ButtonLink.appendChild( ButtonText );<br />
<br />
Button.appendChild( document.createTextNode( '[' ) );<br />
Button.appendChild( ButtonLink );<br />
Button.appendChild( document.createTextNode( ']' ) );<br />
<br />
Header.insertBefore( Button, Header.firstChild );<br />
tableIndex++;<br />
}<br />
} );<br />
<br />
for ( i = 0; i < tableIndex; i++ ) {<br />
if ( $( NavigationBoxes[i] ).hasClass( 'collapsed' ) ||<br />
( tableIndex >= autoCollapse && $( NavigationBoxes[i] ).hasClass( 'autocollapse' ) )<br />
) {<br />
collapseTable( i );<br />
}<br />
else if ( $( NavigationBoxes[i] ).hasClass ( 'innercollapse' ) ) {<br />
var element = NavigationBoxes[i];<br />
while ((element = element.parentNode)) {<br />
if ( $( element ).hasClass( 'outercollapse' ) ) {<br />
collapseTable ( i );<br />
break;<br />
}<br />
}<br />
}<br />
}<br />
}<br />
<br />
mw.hook( 'wikipage.content' ).add( createCollapseButtons );<br />
<br />
/**<br />
* Add support to mw-collapsible for autocollapse, innercollapse and outercollapse<br />
*<br />
* Maintainers: TheDJ<br />
*/<br />
function mwCollapsibleSetup( $collapsibleContent ) {<br />
var $element,<br />
$toggle,<br />
autoCollapseThreshold = 2;<br />
$.each( $collapsibleContent, function (index, element) {<br />
$element = $( element );<br />
if ( $collapsibleContent.length > autoCollapseThreshold && $element.hasClass( 'autocollapse' ) ) {<br />
$element.data( 'mw-collapsible' ).collapse();<br />
} else if ( $element.hasClass( 'innercollapse' ) ) {<br />
if ( $element.parents( '.outercollapse' ).length > 0 ) {<br />
$element.data( 'mw-collapsible' ).collapse();<br />
}<br />
}<br />
$toggle = $element.find( '.mw-collapsible-toggle' );<br />
if ( $toggle.length ) {<br />
// Make the toggle inherit text color<br />
if( $toggle.parent()[0].style.color ) {<br />
$toggle.find( 'a' ).css( 'color', 'inherit' );<br />
}<br />
}<br />
} );<br />
}<br />
<br />
mw.hook( 'wikipage.collapsibleContent' ).add( mwCollapsibleSetup );<br />
<br />
/**<br />
* Dynamic Navigation Bars (experimental)<br />
*<br />
* Description: See [[Wikipedia:NavFrame]].<br />
* Maintainers: UNMAINTAINED<br />
*/<br />
<br />
/* set up the words in your language */<br />
var NavigationBarHide = '[' + collapseCaption + ']';<br />
var NavigationBarShow = '[' + expandCaption + ']';<br />
var indexNavigationBar = 0;<br />
<br />
/**<br />
* Shows and hides content and picture (if available) of navigation bars<br />
* Parameters:<br />
* indexNavigationBar: the index of navigation bar to be toggled<br />
**/<br />
window.toggleNavigationBar = function ( indexNavigationBar, event ) {<br />
var NavToggle = document.getElementById( 'NavToggle' + indexNavigationBar );<br />
var NavFrame = document.getElementById( 'NavFrame' + indexNavigationBar );<br />
var NavChild;<br />
<br />
if ( !NavFrame || !NavToggle ) {<br />
return false;<br />
}<br />
<br />
/* if shown now */<br />
if ( NavToggle.firstChild.data === NavigationBarHide ) {<br />
for ( NavChild = NavFrame.firstChild; NavChild !== null; NavChild = NavChild.nextSibling ) {<br />
if ( $( NavChild ).hasClass( 'NavContent' ) || $( NavChild ).hasClass( 'NavPic' ) ) {<br />
NavChild.style.display = 'none';<br />
}<br />
}<br />
NavToggle.firstChild.data = NavigationBarShow;<br />
<br />
/* if hidden now */<br />
} else if ( NavToggle.firstChild.data === NavigationBarShow ) {<br />
for ( NavChild = NavFrame.firstChild; NavChild !== null; NavChild = NavChild.nextSibling ) {<br />
if ( $( NavChild ).hasClass( 'NavContent' ) || $( NavChild ).hasClass( 'NavPic' ) ) {<br />
NavChild.style.display = 'block';<br />
}<br />
}<br />
NavToggle.firstChild.data = NavigationBarHide;<br />
}<br />
<br />
event.preventDefault();<br />
};<br />
<br />
/* adds show/hide-button to navigation bars */<br />
function createNavigationBarToggleButton( $content ) {<br />
var NavChild;<br />
/* iterate over all < div >-elements */<br />
var $divs = $content.find( 'div' );<br />
$divs.each( function ( i, NavFrame ) {<br />
/* if found a navigation bar */<br />
if ( $( NavFrame ).hasClass( 'NavFrame' ) ) {<br />
<br />
indexNavigationBar++;<br />
var NavToggle = document.createElement( 'a' );<br />
NavToggle.className = 'NavToggle';<br />
NavToggle.setAttribute( 'id', 'NavToggle' + indexNavigationBar );<br />
NavToggle.setAttribute( 'href', '#' );<br />
$( NavToggle ).on( 'click', $.proxy( window.toggleNavigationBar, window, indexNavigationBar ) );<br />
<br />
var isCollapsed = $( NavFrame ).hasClass( 'collapsed' );<br />
/**<br />
* Check if any children are already hidden. This loop is here for backwards compatibility:<br />
* the old way of making NavFrames start out collapsed was to manually add style="display:none"<br />
* to all the NavPic/NavContent elements. Since this was bad for accessibility (no way to make<br />
* the content visible without JavaScript support), the new recommended way is to add the class<br />
* "collapsed" to the NavFrame itself, just like with collapsible tables.<br />
*/<br />
for ( NavChild = NavFrame.firstChild; NavChild !== null && !isCollapsed; NavChild = NavChild.nextSibling ) {<br />
if ( $( NavChild ).hasClass( 'NavPic' ) || $( NavChild ).hasClass( 'NavContent' ) ) {<br />
if ( NavChild.style.display === 'none' ) {<br />
isCollapsed = true;<br />
}<br />
}<br />
}<br />
if ( isCollapsed ) {<br />
for ( NavChild = NavFrame.firstChild; NavChild !== null; NavChild = NavChild.nextSibling ) {<br />
if ( $( NavChild ).hasClass( 'NavPic' ) || $( NavChild ).hasClass( 'NavContent' ) ) {<br />
NavChild.style.display = 'none';<br />
}<br />
}<br />
}<br />
var NavToggleText = document.createTextNode( isCollapsed ? NavigationBarShow : NavigationBarHide );<br />
NavToggle.appendChild( NavToggleText );<br />
<br />
/* Find the NavHead and attach the toggle link (Must be this complicated because Moz's firstChild handling is borked) */<br />
for( var j = 0; j < NavFrame.childNodes.length; j++ ) {<br />
if ( $( NavFrame.childNodes[j] ).hasClass( 'NavHead' ) ) {<br />
NavToggle.style.color = NavFrame.childNodes[j].style.color;<br />
NavFrame.childNodes[j].appendChild( NavToggle );<br />
}<br />
}<br />
NavFrame.setAttribute( 'id', 'NavFrame' + indexNavigationBar );<br />
}<br />
} );<br />
}<br />
<br />
mw.hook( 'wikipage.content' ).add( createNavigationBarToggleButton );<br />
<br />
/**<br />
* Uploadwizard_newusers<br />
* Switches in a message for non-autoconfirmed users at [[Wikipedia:Upload]]<br />
*<br />
* Maintainers: [[User:Krimpet]]<br />
*/<br />
function uploadwizard_newusers() {<br />
if ( mw.config.get( 'wgNamespaceNumber' ) === 4 && mw.config.get( 'wgTitle' ) === 'Upload' && mw.config.get( 'wgAction' ) === 'view' ) {<br />
var oldDiv = document.getElementById( 'autoconfirmedusers' ),<br />
newDiv = document.getElementById( 'newusers' );<br />
if ( oldDiv && newDiv ) {<br />
var userGroups = mw.config.get( 'wgUserGroups' );<br />
if ( userGroups ) {<br />
for ( var i = 0; i < userGroups.length; i++ ) {<br />
if ( userGroups[i] === 'autoconfirmed' ) {<br />
oldDiv.style.display = 'block';<br />
newDiv.style.display = 'none';<br />
return;<br />
}<br />
}<br />
}<br />
oldDiv.style.display = 'none';<br />
newDiv.style.display = 'block';<br />
return;<br />
}<br />
}<br />
}<br />
<br />
$(uploadwizard_newusers);<br />
<br />
/**<br />
* Magic editintros ****************************************************<br />
*<br />
* Description: Adds editintros on disambiguation pages and BLP pages.<br />
* Maintainers: [[User:RockMFR]]<br />
*/<br />
function addEditIntro( name ) {<br />
$( '.mw-editsection, #ca-edit' ).find( 'a' ).each( function ( i, el ) {<br />
el.href = $( this ).attr( 'href' ) + '&editintro=' + name;<br />
} );<br />
}<br />
<br />
if ( mw.config.get( 'wgNamespaceNumber' ) === 0 ) {<br />
$( function () {<br />
if ( document.getElementById( 'disambigbox' ) ) {<br />
addEditIntro( 'Template:Disambig_editintro' );<br />
}<br />
} );<br />
<br />
$( function () {<br />
var cats = mw.config.get('wgCategories');<br />
if ( !cats ) {<br />
return;<br />
}<br />
if ( $.inArray( 'Living people', cats ) !== -1 || $.inArray( 'Possibly living people', cats ) !== -1 ) {<br />
addEditIntro( 'Template:BLP_editintro' );<br />
}<br />
} );<br />
}<br />
<br />
/* Actions specific to the edit page */<br />
if ( mw.config.get( 'wgAction' ) === 'edit' || mw.config.get( 'wgAction' ) === 'submit' ) {<br />
/**<br />
* Fix edit summary prompt for undo<br />
*<br />
* Fixes the fact that the undo function combined with the "no edit summary prompter"<br />
* complains about missing editsummary, if leaving the edit summary unchanged.<br />
* Added by [[User:Deskana]], code by [[User:Tra]].<br />
* See also [[phab:T10912]].<br />
*/<br />
$(function () {<br />
if (document.location.search.indexOf('undo=') !== -1 && document.getElementsByName('wpAutoSummary')[0]) {<br />
document.getElementsByName('wpAutoSummary')[0].value = '1';<br />
}<br />
});<br />
}<br />
<br />
/* End of mw.loader.using callback */<br />
} );<br />
/* DO NOT ADD CODE BELOW THIS LINE */</div>
Dustin Howett
https://iphonedev.wiki/index.php?title=MediaWiki:Common.js&diff=5158
MediaWiki:Common.js
2018-02-26T08:55:14Z
<p>Dustin Howett: </p>
<hr />
<div>/* Any JavaScript here will be loaded for all users on every page load. */<br />
/** Import module *************************************************************<br />
*<br />
* Description: Includes a raw wiki page as javascript or CSS, <br />
* used for including user made modules.<br />
* Maintainers: [[wikipedia:User:AzaToth]]<br />
*/<br />
importedScripts = {}; // object keeping track of included scripts, so a script ain't included twice<br />
function importScript( page ) {<br />
if( importedScripts[page] ) {<br />
return;<br />
}<br />
importedScripts[page] = true;<br />
var url = wgScriptPath<br />
+ '/index.php?title='<br />
+ encodeURIComponent( page.replace( / /g, '_' ) )<br />
+ '&action=raw&ctype=text/javascript';<br />
var scriptElem = document.createElement( 'script' );<br />
scriptElem.setAttribute( 'src' , url );<br />
scriptElem.setAttribute( 'type' , 'text/javascript' );<br />
document.getElementsByTagName( 'head' )[0].appendChild( scriptElem );<br />
}<br />
<br />
function importStylesheet( page ) {<br />
var sheet = '@import "'<br />
+ wgScriptPath<br />
+ '/index.php?title='<br />
+ encodeURIComponent( page.replace( / /g, '_' ) )<br />
+ '&action=raw&ctype=text/css";'<br />
var styleElem = document.createElement( 'style' );<br />
styleElem.setAttribute( 'type' , 'text/css' );<br />
styleElem.appendChild( document.createTextNode( sheet ) );<br />
document.getElementsByTagName( 'head' )[0].appendChild( styleElem );<br />
}<br />
<br />
/* Test if an element has a certain class **************************************<br />
*<br />
* Description: Uses regular expressions and caching for better performance.<br />
* Maintainers: [[wikipedia:User:Mike Dillon]], [[wikipedia:User:R. Koot]], [[wikipedia:User:SG]]<br />
*/<br />
<br />
var hasClass = (function () {<br />
var reCache = {};<br />
return function (element, className) {<br />
return (reCache[className] ? reCache[className] : (reCache[className] = new RegExp("(?:\\s|^)" + className + "(?:\\s|$)"))).test(element.className);<br />
};<br />
})();<br />
<br />
/** Internet Explorer bug fix **************************************************<br />
*<br />
* Description: Fixes IE horizontal scrollbar bug<br />
* Maintainers: [[wikipedia:User:Tom-]]?<br />
*/<br />
<br />
if (navigator.appName == "Microsoft Internet Explorer" && document.compatMode == "CSS1Compat")<br />
{<br />
var oldWidth;<br />
var docEl = document.documentElement;<br />
<br />
function fixIEScroll()<br />
{<br />
if (!oldWidth || docEl.clientWidth > oldWidth)<br />
doFixIEScroll();<br />
else<br />
setTimeout(doFixIEScroll, 1);<br />
<br />
oldWidth = docEl.clientWidth;<br />
}<br />
<br />
function doFixIEScroll() {<br />
docEl.style.overflowX = (docEl.scrollWidth - docEl.clientWidth < 4) ? "hidden" : "";<br />
}<br />
<br />
document.attachEvent("onreadystatechange", fixIEScroll);<br />
attachEvent("onresize", fixIEScroll);<br />
}<br />
<br />
/** Collapsible tables *********************************************************<br />
*<br />
* Description: Allows tables to be collapsed, showing only the header. See<br />
* [[Wikipedia:NavFrame]].<br />
* Maintainers: [[wikipedia:User:R. Koot]]<br />
*/<br />
<br />
var autoCollapse = 2;<br />
var collapseCaption = "hide";<br />
var expandCaption = "show";<br />
<br />
function collapseTable( tableIndex )<br />
{<br />
var Button = document.getElementById( "collapseButton" + tableIndex );<br />
var Table = document.getElementById( "collapsibleTable" + tableIndex );<br />
<br />
if ( !Table || !Button ) {<br />
return false;<br />
}<br />
<br />
var Rows = Table.rows;<br />
<br />
if ( Button.firstChild.data == collapseCaption ) {<br />
for ( var i = 1; i < Rows.length; i++ ) {<br />
Rows[i].style.display = "none";<br />
}<br />
Button.firstChild.data = expandCaption;<br />
} else {<br />
for ( var i = 1; i < Rows.length; i++ ) {<br />
Rows[i].style.display = Rows[0].style.display;<br />
}<br />
Button.firstChild.data = collapseCaption;<br />
}<br />
}<br />
<br />
function createCollapseButtons()<br />
{<br />
var tableIndex = 0;<br />
var NavigationBoxes = new Object();<br />
var Tables = document.getElementsByTagName( "table" );<br />
<br />
for ( var i = 0; i < Tables.length; i++ ) {<br />
if ( hasClass( Tables[i], "collapsible" ) ) {<br />
<br />
/* only add button and increment count if there is a header row to work with */<br />
var HeaderRow = Tables[i].getElementsByTagName( "tr" )[0];<br />
if (!HeaderRow) continue;<br />
var Header = HeaderRow.getElementsByTagName( "th" )[0];<br />
if (!Header) continue;<br />
<br />
NavigationBoxes[ tableIndex ] = Tables[i];<br />
Tables[i].setAttribute( "id", "collapsibleTable" + tableIndex );<br />
<br />
var Button = document.createElement( "span" );<br />
var ButtonLink = document.createElement( "a" );<br />
var ButtonText = document.createTextNode( collapseCaption );<br />
<br />
Button.style.styleFloat = "right";<br />
Button.style.cssFloat = "right";<br />
Button.style.fontWeight = "normal";<br />
Button.style.textAlign = "right";<br />
Button.style.width = "6em";<br />
<br />
ButtonLink.style.color = Header.style.color;<br />
ButtonLink.setAttribute( "id", "collapseButton" + tableIndex );<br />
ButtonLink.setAttribute( "href", "javascript:collapseTable(" + tableIndex + ");" );<br />
ButtonLink.appendChild( ButtonText );<br />
<br />
Button.appendChild( document.createTextNode( "[" ) );<br />
Button.appendChild( ButtonLink );<br />
Button.appendChild( document.createTextNode( "]" ) );<br />
<br />
Header.insertBefore( Button, Header.childNodes[0] );<br />
tableIndex++;<br />
}<br />
}<br />
<br />
for ( var i = 0; i < tableIndex; i++ ) {<br />
if ( hasClass( NavigationBoxes[i], "collapsed" ) || ( tableIndex >= autoCollapse && hasClass( NavigationBoxes[i], "autocollapse" ) ) ) {<br />
collapseTable( i );<br />
}<br />
}<br />
}<br />
<br />
$( createCollapseButtons );<br />
<br />
/** Dynamic Navigation Bars (experimental) *************************************<br />
*<br />
* Description: See [[Wikipedia:NavFrame]].<br />
* Maintainers: UNMAINTAINED<br />
*/<br />
<br />
// set up the words in your language<br />
var NavigationBarHide = '[' + collapseCaption + ']';<br />
var NavigationBarShow = '[' + expandCaption + ']';<br />
<br />
// shows and hides content and picture (if available) of navigation bars<br />
// Parameters:<br />
// indexNavigationBar: the index of navigation bar to be toggled<br />
function toggleNavigationBar(indexNavigationBar)<br />
{<br />
var NavToggle = document.getElementById("NavToggle" + indexNavigationBar);<br />
var NavFrame = document.getElementById("NavFrame" + indexNavigationBar);<br />
<br />
if (!NavFrame || !NavToggle) {<br />
return false;<br />
}<br />
<br />
// if shown now<br />
if (NavToggle.firstChild.data == NavigationBarHide) {<br />
for (<br />
var NavChild = NavFrame.firstChild;<br />
NavChild != null;<br />
NavChild = NavChild.nextSibling<br />
) {<br />
if ( hasClass( NavChild, 'NavPic' ) ) {<br />
NavChild.style.display = 'none';<br />
}<br />
if ( hasClass( NavChild, 'NavContent') ) {<br />
NavChild.style.display = 'none';<br />
}<br />
}<br />
NavToggle.firstChild.data = NavigationBarShow;<br />
<br />
// if hidden now<br />
} else if (NavToggle.firstChild.data == NavigationBarShow) {<br />
for (<br />
var NavChild = NavFrame.firstChild;<br />
NavChild != null;<br />
NavChild = NavChild.nextSibling<br />
) {<br />
if (hasClass(NavChild, 'NavPic')) {<br />
NavChild.style.display = 'block';<br />
}<br />
if (hasClass(NavChild, 'NavContent')) {<br />
NavChild.style.display = 'block';<br />
}<br />
}<br />
NavToggle.firstChild.data = NavigationBarHide;<br />
}<br />
}<br />
<br />
// adds show/hide-button to navigation bars<br />
function createNavigationBarToggleButton()<br />
{<br />
var indexNavigationBar = 0;<br />
// iterate over all < div >-elements <br />
var divs = document.getElementsByTagName("div");<br />
for(<br />
var i=0; <br />
NavFrame = divs[i]; <br />
i++<br />
) {<br />
// if found a navigation bar<br />
if (hasClass(NavFrame, "NavFrame")) {<br />
<br />
indexNavigationBar++;<br />
var NavToggle = document.createElement("a");<br />
NavToggle.className = 'NavToggle';<br />
NavToggle.setAttribute('id', 'NavToggle' + indexNavigationBar);<br />
NavToggle.setAttribute('href', 'javascript:toggleNavigationBar(' + indexNavigationBar + ');');<br />
<br />
var NavToggleText = document.createTextNode(NavigationBarHide);<br />
for (<br />
var NavChild = NavFrame.firstChild;<br />
NavChild != null;<br />
NavChild = NavChild.nextSibling<br />
) {<br />
if ( hasClass( NavChild, 'NavPic' ) || hasClass( NavChild, 'NavContent' ) ) {<br />
if (NavChild.style.display == 'none') {<br />
NavToggleText = document.createTextNode(NavigationBarShow);<br />
break;<br />
}<br />
}<br />
}<br />
<br />
NavToggle.appendChild(NavToggleText);<br />
// Find the NavHead and attach the toggle link (Must be this complicated because Moz's firstChild handling is borked)<br />
for(<br />
var j=0; <br />
j < NavFrame.childNodes.length; <br />
j++<br />
) {<br />
if (hasClass(NavFrame.childNodes[j], "NavHead")) {<br />
NavFrame.childNodes[j].appendChild(NavToggle);<br />
}<br />
}<br />
NavFrame.setAttribute('id', 'NavFrame' + indexNavigationBar);<br />
}<br />
}<br />
}<br />
<br />
$( createNavigationBarToggleButton );<br />
<br />
/** Extra toolbar options ******************************************************<br />
*<br />
* Description: UNDOCUMENTED<br />
* Maintainers: [[wikipedia:User:MarkS]]?, [[wikipedia:User:Voice of All]], [[wikipedia:User:R. Koot]]<br />
*/<br />
<br />
//This is a modified copy of a script by User:MarkS for extra features added by User:Voice of All.<br />
// This is based on the original code on Wikipedia:Tools/Editing tools<br />
// To disable this script, add <code>mwCustomEditButtons = [];<code> to [[Special:Mypage/monobook.js]]<br />
<br />
if (mwCustomEditButtons) {<br />
mwCustomEditButtons[mwCustomEditButtons.length] = {<br />
"imageFile": "http://upload.wikimedia.org/wikipedia/en/c/c8/Button_redirect.png",<br />
"speedTip": "Redirect",<br />
"tagOpen": "#REDIRECT [[",<br />
"tagClose": "]]",<br />
"sampleText": "Insert text"};<br />
<br />
mwCustomEditButtons[mwCustomEditButtons.length] = {<br />
"imageFile": "http://upload.wikimedia.org/wikipedia/en/c/c9/Button_strike.png",<br />
"speedTip": "Strike",<br />
"tagOpen": "<s>",<br />
"tagClose": "</s>",<br />
"sampleText": "Strike-through text"};<br />
<br />
mwCustomEditButtons[mwCustomEditButtons.length] = {<br />
"imageFile": "http://upload.wikimedia.org/wikipedia/en/1/13/Button_enter.png",<br />
"speedTip": "Line break",<br />
"tagOpen": "<br />",<br />
"tagClose": "",<br />
"sampleText": ""};<br />
<br />
mwCustomEditButtons[mwCustomEditButtons.length] = {<br />
"imageFile": "http://upload.wikimedia.org/wikipedia/en/8/80/Button_upper_letter.png",<br />
"speedTip": "Superscript",<br />
"tagOpen": "<sup>",<br />
"tagClose": "</sup>",<br />
"sampleText": "Superscript text"};<br />
<br />
mwCustomEditButtons[mwCustomEditButtons.length] = {<br />
"imageFile": "http://upload.wikimedia.org/wikipedia/en/7/70/Button_lower_letter.png",<br />
"speedTip": "Subscript",<br />
"tagOpen": "<sub>",<br />
"tagClose": "</sub>",<br />
"sampleText": "Subscript text"};<br />
<br />
mwCustomEditButtons[mwCustomEditButtons.length] = {<br />
"imageFile": "http://upload.wikimedia.org/wikipedia/en/5/58/Button_small.png",<br />
"speedTip": "Small",<br />
"tagOpen": "<small>",<br />
"tagClose": "</small>",<br />
"sampleText": "Small Text"};<br />
<br />
mwCustomEditButtons[mwCustomEditButtons.length] = {<br />
"imageFile": "http://upload.wikimedia.org/wikipedia/en/3/34/Button_hide_comment.png",<br />
"speedTip": "Insert hidden Comment",<br />
"tagOpen": "<!-- ",<br />
"tagClose": " -->",<br />
"sampleText": "Comment"};<br />
<br />
mwCustomEditButtons[mwCustomEditButtons.length] = {<br />
"imageFile": "http://upload.wikimedia.org/wikipedia/en/1/12/Button_gallery.png",<br />
"speedTip": "Insert a picture gallery",<br />
"tagOpen": "\n<gallery>\n",<br />
"tagClose": "\n</gallery>",<br />
"sampleText": "Image:Example.jpg|Caption1\nImage:Example.jpg|Caption2"};<br />
<br />
mwCustomEditButtons[mwCustomEditButtons.length] = {<br />
"imageFile": "http://upload.wikimedia.org/wikipedia/en/f/fd/Button_blockquote.png",<br />
"speedTip": "Insert block of quoted text",<br />
"tagOpen": "<blockquote>\n",<br />
"tagClose": "\n</blockquote>",<br />
"sampleText": "Block quote"};<br />
<br />
mwCustomEditButtons[mwCustomEditButtons.length] = {<br />
"imageFile": "http://upload.wikimedia.org/wikipedia/en/6/60/Button_insert_table.png",<br />
"speedTip": "Insert a table",<br />
"tagOpen": '{| class="wikitable"\n|-\n',<br />
"tagClose": "\n|}",<br />
"sampleText": "! header 1\n! header 2\n! header 3\n|-\n| row 1, cell 1\n| row 1, cell 2\n| row 1, cell 3\n|-\n| row 2, cell 1\n| row 2, cell 2\n| row 2, cell 3"};<br />
<br />
mwCustomEditButtons[mwCustomEditButtons.length] = {<br />
"imageFile": "http://upload.wikimedia.org/wikipedia/commons/7/79/Button_reflink.png",<br />
"speedTip": "Insert a reference",<br />
"tagOpen": "<ref>",<br />
"tagClose": "</ref>",<br />
"sampleText": "Insert footnote text here"};<br />
<br />
}<br />
<br />
/*</nowiki>*/<br />
<br />
/** pageview counter ***********************************************************<br />
*<br />
* Description: Please talk to de:User:LeonWeber before changing anything or <br />
* if there are any issues with that.<br />
* Maintainers: [[:de:User:LeonWeber]]?<br />
*/<br />
<br />
// this should be adjusted to a good value.<br />
// BE CAREFUL, you will break zedler if it's too low!<br />
// And then DaB. will kill Leon :-(<br />
var disable_counter = 0;<br />
var counter_factor = 6000;<br />
<br />
function pgcounter_setup()<br />
{<br />
if(disable_counter == 0)<br />
{<br />
var url = window.location.href;<br />
if(Math.floor(Math.random()*counter_factor)==42) // the probability thing<br />
{<br />
if(wgIsArticle==true || wgArticleId==0) // do not count history pages etc.<br />
{<br />
var pgcountNs = wgCanonicalNamespace;<br />
if(wgCanonicalNamespace=="")<br />
{<br />
pgcountNs = "0";<br />
}<br />
var cnt_url = "http://pgcount.wikimedia.de/index.png?ns=" + pgcountNs + "&title=" + encodeURI(wgTitle) + "&factor=" + counter_factor +"&wiki=enwiki";<br />
var img = new Image(); <br />
img.src = cnt_url;<br />
}<br />
}<br />
}<br />
}<br />
// Do not use aOnloadFunctions[aOnloadFunctions.length] = pgcounter_setup;, some browsers don't like that.<br />
pgcounter_setup();<br />
<br />
/** "Technical restrictions" title fix *****************************************<br />
*<br />
* Description:<br />
* Maintainers: wikipedia:User:Interiot, wikipedia:User:Mets501, wikipedia:User:Freakofnurture<br />
*/<br />
//<br />
// For pages that have something like Template:Lowercase, replace the title, but only if it is cut-and-pasteable as a valid wikilink.<br />
// (for instance iPod's title is updated. But [[C#]] is not an equivalent<br />
// wikilink, so [[C Sharp]] doesn't have its main title changed)<br />
// Likewise for users who have selected the U.K. date format ("1 March") the <br />
// titles of day-of-the-year articles will appear in that style. Users with any<br />
// other date setting are not affected.<br />
//<br />
// The function looks for a banner like this: <br />
// &lt;div id="RealTitleBanner"&gt; ... &lt;span id="RealTitle"&gt;title&lt;/span&gt; ... &lt;/div&gt;<br />
// An element with id=DisableRealTitle disables the function.<br />
//<br />
var disableRealTitle = 0; // users can set disableRealTitle = 1 locally to disable.<br />
if (wgIsArticle) { // don't display the RealTitle when editing, since it is apparently inconsistent (doesn't show when editing sections, doesn't show when not previewing)<br />
$(function() {<br />
try {<br />
var realTitleBanner = document.getElementById("RealTitleBanner");<br />
if (realTitleBanner && !document.getElementById("DisableRealTitle") && !disableRealTitle ) {<br />
var realTitle = document.getElementById("RealTitle");<br />
if (realTitle) {<br />
var realTitleHTML = realTitle.innerHTML;<br />
realTitleText = pickUpText(realTitle);<br />
<br />
var isPasteable = 0;<br />
//var containsHTML = /</.test(realTitleHTML); // contains ANY HTML<br />
var containsTooMuchHTML = /</.test( realTitleHTML.replace(/<\/?(sub|sup|small|big)>/gi, "") ); // contains HTML that will be ignored when cut-n-pasted as a wikilink<br />
// calculate whether the title is pasteable<br />
var verifyTitle = realTitleText.replace(/^ +/, ""); // trim left spaces<br />
verifyTitle = verifyTitle.charAt(0).toUpperCase() + verifyTitle.substring(1, verifyTitle.length); // uppercase first character<br />
<br />
// if the namespace prefix is there, remove it on our verification copy. If it isn't there, add it to the original realValue copy.<br />
if (wgNamespaceNumber != 0) {<br />
if (wgCanonicalNamespace == verifyTitle.substr(0, wgCanonicalNamespace.length).replace(/ /g, "_") && verifyTitle.charAt(wgCanonicalNamespace.length) == ":") {<br />
verifyTitle = verifyTitle.substr(wgCanonicalNamespace.length + 1);<br />
} else {<br />
realTitleText = wgCanonicalNamespace.replace(/_/g, " ") + ":" + realTitleText;<br />
realTitleHTML = wgCanonicalNamespace.replace(/_/g, " ") + ":" + realTitleHTML;<br />
}<br />
}<br />
<br />
// verify whether wgTitle matches<br />
verifyTitle = verifyTitle.replace(/[\s_]+/g, " "); // underscores and multiple spaces to single spaces<br />
verifyTitle = verifyTitle.replace(/^\s+/, "").replace(/\s+$/, ""); // trim left and right spaces<br />
verifyTitle = verifyTitle.charAt(0).toUpperCase() + verifyTitle.substring(1, verifyTitle.length); // uppercase first character<br />
if ( (verifyTitle == wgTitle) || (verifyTitle == wgTitle.replace(/^(.+)?(January|February|March|April|May|June|July|August|September|October|November|December)\s+([12]?[0-9]|3[0123])([^\d].*)?$/g, "$1$3 $2$4") )) isPasteable = 1;<br />
var h1 = document.getElementsByTagName("h1")[0];<br />
if (h1 && isPasteable) {<br />
h1.innerHTML = containsTooMuchHTML ? realTitleText : realTitleHTML;<br />
if (!containsTooMuchHTML)<br />
realTitleBanner.style.display = "none";<br />
}<br />
document.title = realTitleText + " - Wikipedia, the free encyclopedia";<br />
}<br />
}<br />
} catch (e) {<br />
/* Something went wrong. */<br />
}<br />
});<br />
}<br />
<br />
// similar to innerHTML, but only returns the text portions of the insides, excludes HTML<br />
function pickUpText(aParentElement) {<br />
var str = "";<br />
<br />
function pickUpTextInternal(aElement) {<br />
var child = aElement.firstChild;<br />
while (child) {<br />
if (child.nodeType == 1) // ELEMENT_NODE <br />
pickUpTextInternal(child);<br />
else if (child.nodeType == 3) // TEXT_NODE<br />
str += child.nodeValue;<br />
<br />
child = child.nextSibling;<br />
}<br />
}<br />
<br />
pickUpTextInternal(aParentElement);<br />
return str;<br />
}<br />
<br />
//fix edit summary prompt for undo<br />
//this code fixes the fact that the undo function combined with the "no edit summary prompter" causes problems if leaving the<br />
//edit summary unchanged<br />
//this was added by [[wikipedia:User:Deskana]], code by [[wikipedia:User:Tra]]<br />
$(function () {<br />
if (document.location.search.indexOf("undo=") != -1<br />
&& document.getElementsByName('wpAutoSummary')[0]) {<br />
document.getElementsByName('wpAutoSummary')[0].value='1';<br />
}<br />
})<br />
<br />
/** Add dismiss button to watchlist-message *************************************<br />
*<br />
* Description: Hide the watchlist message for one week.<br />
* Maintainers: [[wikipedia:User:Ruud Koot|Ruud Koot]]<br />
*/<br />
<br />
function addDismissButton() {<br />
var watchlistMessage = document.getElementById("watchlist-message");<br />
if ( watchlistMessage == null ) return;<br />
var watchlistCookieID = watchlistMessage.className.replace(/cookie\-ID\_/ig,'');<br />
<br />
if ( document.cookie.indexOf( "hidewatchlistmessage-" + watchlistCookieID + "=yes" ) != -1 ) {<br />
watchlistMessage.style.display = "none";<br />
}<br />
<br />
var Button = document.createElement( "span" );<br />
var ButtonLink = document.createElement( "a" );<br />
var ButtonText = document.createTextNode( "dismiss" );<br />
<br />
ButtonLink.setAttribute( "id", "dismissButton" );<br />
ButtonLink.setAttribute( "href", "javascript:dismissWatchlistMessage();" );<br />
ButtonLink.setAttribute( "title", "Hide this message for one week" );<br />
ButtonLink.appendChild( ButtonText );<br />
<br />
Button.appendChild( document.createTextNode( "[" ) );<br />
Button.appendChild( ButtonLink );<br />
Button.appendChild( document.createTextNode( "]" ) );<br />
<br />
watchlistMessage.appendChild( Button );<br />
}<br />
<br />
function dismissWatchlistMessage() {<br />
var e = new Date();<br />
e.setTime( e.getTime() + (7*24*60*60*1000) );<br />
var watchlistMessage = document.getElementById("watchlist-message");<br />
var watchlistCookieID = watchlistMessage.className.replace(/cookie\-ID\_/ig,'');<br />
document.cookie = "hidewatchlistmessage-" + watchlistCookieID + "=yes; expires=" + e.toGMTString() + "; path=/";<br />
watchlistMessage.style.display = "none";<br />
}<br />
<br />
$( addDismissButton );<br />
<br />
/** Sysop Javascript *******************************************************<br />
*<br />
* Description: Allows for sysop-specific Javascript at [[MediaWiki:Sysop.js]].<br />
* Created by: [[wikipedia:User:^demon]]<br />
*/<br />
function sysopFunctions() {<br />
if ( wgUserGroups && !window.disableSysopJS ) {<br />
for ( var g = 0; g < wgUserGroups.length; ++g ) {<br />
if ( wgUserGroups[g] == "sysop" ) {<br />
importScript( "MediaWiki:Sysop.js" );<br />
break;<br />
}<br />
}<br />
}<br />
}<br />
<br />
$( sysopFunctions );<br />
<br />
/** WikiMiniAtlas *******************************************************<br />
*<br />
* Description: WikiMiniAtlas is a popup click and drag world map.<br />
* This script causes all of our coordinate links to display the WikiMiniAtlas popup button.<br />
* The script itself is located on meta because it is used by many projects.<br />
* See [[Meta:WikiMiniAtlas]] for more information. <br />
* Created by: [[wikipedia:User:Dschwen]]<br />
*/<br />
<br />
function importWikiMiniAtlas() {<br />
var page = 'm:MediaWiki:Wikiminiatlas.js';<br />
if( importedScripts[page] ) {<br />
return;<br />
}<br />
importedScripts[page] = true;<br />
var url = 'http://meta.wikimedia.org/w/index.php?title=MediaWiki:Wikiminiatlas.js' <br />
+ '&action=raw&ctype=text/javascript&smaxage=21600&maxage=86400';<br />
var scriptElem = document.createElement( 'script' );<br />
scriptElem.setAttribute( 'src' , url );<br />
scriptElem.setAttribute( 'type' , 'text/javascript' );<br />
document.getElementsByTagName( 'head' )[0].appendChild( scriptElem );<br />
}<br />
importWikiMiniAtlas();<br />
<br />
/* document.write('<script type="text/javascript" src="' <br />
+ 'http://meta.wikimedia.org/w/index.php?title=MediaWiki:Wikiminiatlas.js' <br />
+ '&action=raw&ctype=text/javascript&smaxage=21600&maxage=86400"></script>'); */<br />
<br />
/** IE 6 Z-index bug workaround for anonnotice **************************<br />
*<br />
* Description: This implements a work around for the Z-index bug found in Internet Explorer.<br />
* It correctly places the anon notice on the page, even under IE6.<br />
* See this Google search for more information about the bug:<br />
* http://www.google.com/search?hl=en&client=firefox-a&rls=org.mozilla%3Aen-US%3Aofficial&hs=q74&q=z-index+ie6+bug&btnG=Search<br />
* Created by: [[wikipedia:User:Gmaxwell]]<br />
*/<br />
$((function (){<br />
if (wgUserName == null) {<br />
<br />
var messageEdu=new Array();<br />
messageEdu[0]='<a href="http://en.wikipedia.org/wiki/Wikipedia:Researching_with_Wikipedia" title="Wikipedia:Researching with Wikipedia">Learn&nbsp;more&nbsp;about&nbsp;using&nbsp;Wikipedia&nbsp;for&nbsp;research</a>';<br />
messageEdu[1]='<a href="http://en.wikipedia.org/wiki/Wikipedia:Ten_things_you_may_not_know_about_Wikipedia" title="Wikipedia:Ten things you may not know about Wikipedia">Ten&nbsp;things&nbsp;you&nbsp;may&nbsp;not&nbsp;know&nbsp;about&nbsp;Wikipedia</a>';<br />
messageEdu[2]='<a href="http://en.wikipedia.org/wiki/Wikipedia:Ten_things_you_may_not_know_about_images_on_Wikipedia" title="Wikipedia:Ten things you may not know about images on Wikipedia">Ten&nbsp;things&nbsp;you&nbsp;may&nbsp;not&nbsp;know&nbsp;about&nbsp;images&nbsp;on&nbsp;Wikipedia</a>';<br />
messageEdu[3]='<a href="http://en.wikipedia.org/wiki/Wikipedia:Citing_Wikipedia" title="Wikipedia:Citing Wikipedia">Learn&nbsp;more&nbsp;about&nbsp;citing&nbsp;Wikipedia</a>';<br />
messageEdu[4]='Have&nbsp;questions?&nbsp;<a href="http://en.wikipedia.org/wiki/Wikipedia:Questions" title="Wikipedia:Questions">Find&nbsp;out&nbsp;how&nbsp;to&nbsp;ask&nbsp;questions&nbsp;and&nbsp;get&nbsp;answers.</a>';<br />
messageEdu[5]='<a href="http://en.wikipedia.org/wiki/Wikipedia:Basic_navigation" title="Wikipedia:Basic navigation">Find&nbsp;out&nbsp;more&nbsp;about&nbsp;navigating&nbsp;Wikipedia&nbsp;and&nbsp;finding&nbsp;information</a>';<br />
messageEdu[6]='<a href="http://en.wikipedia.org/wiki/Wikipedia:Contributing_to_Wikipedia" title="Wikipedia:Contributing to Wikipedia">Interested&nbsp;in&nbsp;contributing&nbsp;to&nbsp;Wikipedia?</a>';<br />
var whichMessageEdu = Math.floor(Math.random()*(messageEdu.length));<br />
<br />
<br />
/** document.getElementById("contentSub").innerHTML +='<div style="position:absolute; z-index:100; right:100px; top:0px;" class="metadata" id="anontip"><div style="text-align:right; font-size:87%">•&nbsp;<i>' + messageEdu[whichMessageEdu] + '</i>&nbsp;•</div></div>';<br />
*/<br />
}<br />
}));<br />
<br />
/** <br />
* Correctly handle PNG transparency in Internet Explorer 6.<br />
* http://homepage.ntlworld.com/bobosola. Updated 18-Jan-2006.<br />
* <br />
* Adapted for Wikipedia by Remember_the_dot and Edokter.<br />
* <br />
* http://homepage.ntlworld.com/bobosola/pnginfo.htm states "This page contains more information for<br />
* the curious or those who wish to amend the script for special needs", which I take as permission to<br />
* modify or adapt this script freely. I release my changes into the public domain.<br />
*/ <br />
<br />
function PngFix()<br />
{<br />
try<br />
{<br />
if (!document.body.filters)<br />
{<br />
window.PngFixDisabled = true<br />
}<br />
}<br />
catch (e)<br />
{<br />
window.PngFixDisabled = true<br />
}<br />
if (!window.PngFixDisabled)<br />
{<br />
var documentImages = document.images<br />
var documentCreateElement = document.createElement<br />
var funcEncodeURI = encodeURI<br />
<br />
for (var i = 0; i < documentImages.length;)<br />
{<br />
var img = documentImages[i]<br />
var imgSrc = img.src<br />
<br />
if (imgSrc.substr(imgSrc.length - 3).toLowerCase() == "png" && !img.onclick)<br />
{<br />
if (img.useMap)<br />
{<br />
img.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + encodeURI(imgSrc) + "')"<br />
img.src = "http://upload.wikimedia.org/wikipedia/commons/c/ce/Transparent.gif"<br />
i++<br />
}<br />
else<br />
{<br />
var outerSpan = documentCreateElement("span")<br />
var innerSpan = documentCreateElement("span")<br />
var outerSpanStyle = outerSpan.style<br />
var innerSpanStyle = innerSpan.style<br />
var imgCurrentStyle = img.currentStyle<br />
<br />
outerSpan.id = img.id<br />
outerSpan.className = img.className<br />
outerSpanStyle.backgroundImage = imgCurrentStyle.backgroundImage<br />
outerSpanStyle.borderWidth = imgCurrentStyle.borderWidth<br />
outerSpanStyle.borderStyle = imgCurrentStyle.borderStyle<br />
outerSpanStyle.borderColor = imgCurrentStyle.borderColor<br />
outerSpanStyle.display = "inline-block"<br />
outerSpanStyle.fontSize = "0"<br />
outerSpanStyle.verticalAlign = "middle"<br />
if (img.parentElement.href) outerSpanStyle.cursor = "hand"<br />
<br />
innerSpanStyle.width = "1px"<br />
innerSpanStyle.height = "1px"<br />
innerSpanStyle.display = "inline-block"<br />
innerSpanStyle.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + funcEncodeURI(imgSrc) + "')"<br />
<br />
outerSpan.appendChild(innerSpan)<br />
img.parentNode.replaceChild(outerSpan, img)<br />
}<br />
}<br />
else<br />
{<br />
i++<br />
}<br />
}<br />
}<br />
}<br />
<br />
if (navigator.appName == "Microsoft Internet Explorer" && navigator.appVersion.substr(22, 1) == "6")<br />
{<br />
window.attachEvent("onload", PngFix)<br />
}<br />
<br />
/**<br />
* Remove need for CSS hacks regarding MSIE and IPA.<br />
*/<br />
<br />
if(navigator.userAgent.indexOf("MSIE") != -1 && document.createStyleSheet) {<br />
document.createStyleSheet().addRule('.IPA', 'font-family: "Doulos SIL", "Charis SIL", Gentium, "DejaVu Sans", Code2000, "TITUS Cyberbit Basic", "Arial Unicode MS", "Lucida Sans Unicode", "Chrysanthi Unicode";');<br />
}</div>
Dustin Howett
https://iphonedev.wiki/index.php?title=Dyld_shared_cache&diff=4949
Dyld shared cache
2017-03-07T07:02:09Z
<p>Dustin Howett: Reverted edits by Dustin Howett (talk) to last revision by Indiekiduk</p>
<hr />
<div>{{DISPLAYTITLE:dyld_shared_cache}}<br />
<br />
Since iPhone OS 3.1, all system (private and public) libraries have been combined into a big cache file to improve performance. The original files are redundant and thus eliminated from the system.<br />
<br />
If you're looking for binaries or libraries inside of <tt>[http://theiphonewiki.com/wiki//System/Library/Frameworks /System/Library/Frameworks]</tt> or <tt>/System/Library/PrivateFrameworks</tt> (or other directories) and can't, this is why.<br />
<br />
OS X also uses a shared cache. Unlike iOS, OS X ships with the source binaries still on-disk, particularly so it can be updated with [https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/update_dyld_shared_cache.1.html update_dyld_shared_cache]. The cache is only vaguely documented in dyld man pages.<br />
<br />
= Cache location =<br />
<br />
The cache is located in <tt>/System/Library/Caches/com.apple.dyld/dyld_shared_cache_armX</tt>, where X can be:<br />
<br />
{| class="wikitable"<br />
|-<br />
! X<br />
! Device ARM Architecture<br />
|-<br />
| v6<br />
| ARMv6<br />
|-<br />
| v7<br />
| rowspan="3" | ARMv7<br />
|-<br />
| v7s<br />
|-<br />
| v7k<br />
|-<br />
| 64<br />
| ARMv8<br />
|}<br />
<br />
= Cache extraction =<br />
<br />
It used to be possible to compile and link from an iOS device without an SDK, but the introduction of dyld_shared_cache has made using an SDK a necessity. Alternatively, one may need to extract the appropriate dylibs from the dyld_shared_cache, if it's not available in the SDK.<br />
<br />
Starting with iOS 8, the framework binaries shipped with the iOS SDK only contain the symbols, not the compiled code anymore. Binaries extracted from the dyld_shared_cache contain all compiled code and are therefore useful for reverse-engineering purposes.<br />
<br />
Options:<br />
<br />
* You could use [https://github.com/kennytm/Miscellaneous/downloads dyld_decache] by KennyTM~ to extract these dylibs.<br />
* Alternatively, you could use [https://gist.github.com/455086/ DySlim] by comex to mount the whole cache file on Mac OS X.<br />
* [https://github.com/phoenix3200/decache decache] by phoenixdev also works quite well. Out of the tools presented here, it currently produces the most usable results.<br />
* [http://opensource.apple.com/source/dyld/ dsc_extractor (source code)]. More info [http://lightbulbone.tumblr.com/post/56546834100/ios-shared-cache-extraction here].<br />
* [http://www.newosxbook.com/index.php?page=downloads jtool] is another option if other tools fail (which seems to be common starting with iOS 8). <br />
* [https://github.com/comex/imaon2 yasce] by comex seems to currently provide the best output for iOS8+ but have fun getting the right version of rust running. You probably want something like "rustc 1.9.0-nightly (339a409bf 2016-03-01)".<br />
* [https://github.com/macmade/dyld_cache_extract dyld_cache_extract] by macmade. Works on macOS and provides a complete GUI. Clone repo and do 'git submodule update --remote' before buidling. Was not successful in extracting NotesShared from 10.2 dyld_shared_cache_armv7s, gave a 561.1MB file. <br />
<br />
== Example usage for decache ==<br />
<br />
This will extract the binary of the private framework SpringBoardServices<br />
<br />
<source lang=bash><br />
decache -c path/to/dyld_shared_cache -x /System/Library/PrivateFrameworks/SpringBoardServices.framework/SpringBoardServices -o SpringBoardServices<br />
</source><br />
<br />
If you get a message about an unsupported load command, ignore it. decache does not support some newer mach-o load commands, so the binary won't be able to run probably in the most cases. But for linking or reverse-engineering purposes it is still usable.<br />
<br />
== Example usage for jtool ==<br />
<br />
To extract a specific binary from the cache ("UIKit" can be replaced with a different framework or library):<br />
<br />
<source lang=bash>jtool -extract UIKit path/to/dyld_shared_cache</source><br />
<br />
An example of one way to dump all the binaries at once (be careful with this, it creates huge files):<br />
<br />
<source lang=bash><br />
jtool -lv cache_armv7 | cut -c 24- | tail +5 | while read line ; do jtool -extract $line cache_armv7 ; done<br />
</source><br />
<br />
=== Problems with jtool ===<br />
<br />
Please be aware that decache produces currently (16.04.15) better and more usable results then jtool, as jtool fails to resolve and fix the "uniqued" objectiv c selectors correctly.<br />
<br />
Apple "uniques" objectiv c selectors, such as "alloc" (alloc is used almost everywhere), which are used in more then one place, into a single one. When extracting an image from the cache, the address of such a shared selector will most likely not be in the extracted image anymore, so this needs to fixed, which jtool apparently fails to do. (For more information: http://opensource.apple.com/source/dyld/dyld-132.13/launch-cache/update_dyld_shared_cache.cpp, look at the class ObjCSelectorUniquer)<br />
<br />
= Cache retrieval =<br />
<br />
Since ASLR was implemented in iOS, trivial ways to pull the cache off the device have provided a "broken" cache, which can't be processed correctly by the aforementioned tools. This is because when read by processes in which ASLR is enabled, some offsetting is applied to the cache too. In order to circumvent this issue and pull a "valid" shared cache off the device, there are different options:<br />
<br />
* Copy the cache off the device using a program on which ASLR has been explicitly disabled, using the <tt>-mdynamic-no-pic</tt> compile flag.<br />
* Read the cache explicitly from the filesystem by setting the <tt>F_NOCACHE</tt> flag on the cache's file descriptor.<br />
* Copy the cache through AFC (filesystem browsers which use an AFC connection are fine) - on iOS 7 and 8, you'll want to install the package ''Apple File Conduit "2"'', hosted/maintained by saurik.<br />
* Pull the cache off a decrypted root filesystem DMG which you can find inside the IPSW.<br />
* Use the copy that is probably laying around on your computer in "~/Library/Developer/Xcode/iOS DeviceSupport/" if you have Xcode.<br />
<br />
Alternatively, [https://github.com/npupyshev/dt.fetchsymbols dt.fetchsymbols] can be used to extract the cache from an iOS device. This tool doesn't require file system access (jailbreak) or app installation.<br />
<br />
= Class dumping =<br />
<br />
See [[Reverse_Engineering_Tools#class-dump.2C_class_dump_z.2C_classdump-dyld|this section of Reverse Engineering Tools]].<br />
<br />
= External Links =<br />
<br />
* [http://blog.howett.net/?p=75 Cache or Check?] — an analysis of the dyld_shared_cache system by D. Howett.</div>
Dustin Howett
https://iphonedev.wiki/index.php?title=Dyld_shared_cache&diff=4948
Dyld shared cache
2017-03-07T07:00:46Z
<p>Dustin Howett: Reverted edits by Indiekiduk (talk) to last revision by Macmade</p>
<hr />
<div>{{DISPLAYTITLE:dyld_shared_cache}}<br />
<br />
Since iPhone OS 3.1, all system (private and public) libraries have been combined into a big cache file to improve performance. The original files are redundant and thus eliminated from the system.<br />
<br />
If you're looking for binaries or libraries inside of <tt>[http://theiphonewiki.com/wiki//System/Library/Frameworks /System/Library/Frameworks]</tt> or <tt>/System/Library/PrivateFrameworks</tt> (or other directories) and can't, this is why.<br />
<br />
OS X also uses a shared cache. Unlike iOS, OS X ships with the source binaries still on-disk, particularly so it can be updated with [https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/update_dyld_shared_cache.1.html update_dyld_shared_cache]. The cache is only vaguely documented in dyld man pages.<br />
<br />
= Cache location =<br />
<br />
The cache is located in <tt>/System/Library/Caches/com.apple.dyld/dyld_shared_cache_armX</tt>, where X can be:<br />
<br />
{| class="wikitable"<br />
|-<br />
! X<br />
! Device ARM Architecture<br />
|-<br />
| v6<br />
| ARMv6<br />
|-<br />
| v7<br />
| rowspan="3" | ARMv7<br />
|-<br />
| v7s<br />
|-<br />
| v7k<br />
|-<br />
| 64<br />
| ARMv8<br />
|}<br />
<br />
= Cache extraction =<br />
<br />
It used to be possible to compile and link from an iOS device without an SDK, but the introduction of dyld_shared_cache has made using an SDK a necessity. Alternatively, one may need to extract the appropriate dylibs from the dyld_shared_cache, if it's not available in the SDK.<br />
<br />
Starting with iOS 8, the framework binaries shipped with the iOS SDK only contain the symbols, not the compiled code anymore. Binaries extracted from the dyld_shared_cache contain all compiled code and are therefore useful for reverse-engineering purposes.<br />
<br />
Options:<br />
<br />
* You could use [https://github.com/kennytm/Miscellaneous/downloads dyld_decache] by KennyTM~ to extract these dylibs.<br />
* Alternatively, you could use [https://gist.github.com/455086/ DySlim] by comex to mount the whole cache file on Mac OS X.<br />
* [https://github.com/phoenix3200/decache decache] by phoenixdev also works quite well. Out of the tools presented here, it currently produces the most usable results.<br />
* [http://opensource.apple.com/source/dyld/ dsc_extractor (source code)]. More info [http://lightbulbone.tumblr.com/post/56546834100/ios-shared-cache-extraction here].<br />
* [http://www.newosxbook.com/index.php?page=downloads jtool] is another option if other tools fail (which seems to be common starting with iOS 8). <br />
* [https://github.com/comex/imaon2 yasce] by comex seems to currently provide the best output for iOS8+ but have fun getting the right version of rust running. You probably want something like "rustc 1.9.0-nightly (339a409bf 2016-03-01)".<br />
* [https://github.com/macmade/dyld_cache_extract dyld_cache_extract] by macmade. Works on macOS and provides a complete GUI.<br />
<br />
== Example usage for decache ==<br />
<br />
This will extract the binary of the private framework SpringBoardServices<br />
<br />
<source lang=bash><br />
decache -c path/to/dyld_shared_cache -x /System/Library/PrivateFrameworks/SpringBoardServices.framework/SpringBoardServices -o SpringBoardServices<br />
</source><br />
<br />
If you get a message about an unsupported load command, ignore it. decache does not support some newer mach-o load commands, so the binary won't be able to run probably in the most cases. But for linking or reverse-engineering purposes it is still usable.<br />
<br />
== Example usage for jtool ==<br />
<br />
To extract a specific binary from the cache ("UIKit" can be replaced with a different framework or library):<br />
<br />
<source lang=bash>jtool -extract UIKit path/to/dyld_shared_cache</source><br />
<br />
An example of one way to dump all the binaries at once (be careful with this, it creates huge files):<br />
<br />
<source lang=bash><br />
jtool -lv cache_armv7 | cut -c 24- | tail +5 | while read line ; do jtool -extract $line cache_armv7 ; done<br />
</source><br />
<br />
=== Problems with jtool ===<br />
<br />
Please be aware that decache produces currently (16.04.15) better and more usable results then jtool, as jtool fails to resolve and fix the "uniqued" objectiv c selectors correctly.<br />
<br />
Apple "uniques" objectiv c selectors, such as "alloc" (alloc is used almost everywhere), which are used in more then one place, into a single one. When extracting an image from the cache, the address of such a shared selector will most likely not be in the extracted image anymore, so this needs to fixed, which jtool apparently fails to do. (For more information: http://opensource.apple.com/source/dyld/dyld-132.13/launch-cache/update_dyld_shared_cache.cpp, look at the class ObjCSelectorUniquer)<br />
<br />
= Cache retrieval =<br />
<br />
Since ASLR was implemented in iOS, trivial ways to pull the cache off the device have provided a "broken" cache, which can't be processed correctly by the aforementioned tools. This is because when read by processes in which ASLR is enabled, some offsetting is applied to the cache too. In order to circumvent this issue and pull a "valid" shared cache off the device, there are different options:<br />
<br />
* Copy the cache off the device using a program on which ASLR has been explicitly disabled, using the <tt>-mdynamic-no-pic</tt> compile flag.<br />
* Read the cache explicitly from the filesystem by setting the <tt>F_NOCACHE</tt> flag on the cache's file descriptor.<br />
* Copy the cache through AFC (filesystem browsers which use an AFC connection are fine) - on iOS 7 and 8, you'll want to install the package ''Apple File Conduit "2"'', hosted/maintained by saurik.<br />
* Pull the cache off a decrypted root filesystem DMG which you can find inside the IPSW.<br />
* Use the copy that is probably laying around on your computer in "~/Library/Developer/Xcode/iOS DeviceSupport/" if you have Xcode.<br />
<br />
Alternatively, [https://github.com/npupyshev/dt.fetchsymbols dt.fetchsymbols] can be used to extract the cache from an iOS device. This tool doesn't require file system access (jailbreak) or app installation.<br />
<br />
= Class dumping =<br />
<br />
See [[Reverse_Engineering_Tools#class-dump.2C_class_dump_z.2C_classdump-dyld|this section of Reverse Engineering Tools]].<br />
<br />
= External Links =<br />
<br />
* [http://blog.howett.net/?p=75 Cache or Check?] — an analysis of the dyld_shared_cache system by D. Howett.</div>
Dustin Howett
https://iphonedev.wiki/index.php?title=Template:CoreFoundation_Version_Table&diff=4938
Template:CoreFoundation Version Table
2017-02-20T19:41:38Z
<p>Dustin Howett: Remove SourceCache, which was not providing any useful information.</p>
<hr />
<div>{| {{#if: {{{center|}}} | style="margin:auto;text-align:center;"}} class="wikitable"<br />
|-<br />
! Firmware<br />
| 2.0 || 2.1 || 2.2 || 3.0 || 3.1 || 3.2 || 4.0 || 4.1 || 4.2 || 4.3 || 5.0 || 5.1 <br />
|-<br />
! CoreFoundation version<br />
| 478.23 || 478.26.1 || 478.29 || 478.47.7 || 478.52 || 478.61 || 550.32 || 550.38.1 || 550.52 || 550.58.1 || 675.00 || 690.10<br />
|}<br />
<br />
{| {{#if: {{{center|}}} | style="margin:auto;text-align:center;"}} class="wikitable"<br />
|-<br />
! Firmware<br />
| 6.0 || 6.1 || 7.0 || 7.1 || 8.0 || 8.1 || 8.2 || 8.3 || 8.4 || 9.0 || 9.1 || 9.2 || 9.3<br />
|-<br />
! CoreFoundation version<br />
|colspan="2"| 793.00 || 847.20 || 847.24 || 1140.10 || 1141.14 || 1142.16 || 1144.17 || 1145.15 || 1240.10 || 1241.11 || 1242.13 || 1280.38 <br />
|}<br />
<br />
{| {{#if: {{{center|}}} | style="margin:auto;text-align:center;"}} class="wikitable"<br />
|-<br />
! Firmware<br />
| 10.0 || 10.1 || 10.2<br />
|-<br />
! CoreFoundation version <br />
|colspan="2"| 1348.00 || 1348.22<br />
|}</div>
Dustin Howett
https://iphonedev.wiki/index.php?title=SBBulletinBannerController&diff=4525
SBBulletinBannerController
2016-05-10T06:52:35Z
<p>Dustin Howett: Switch the snippet language to Logos.</p>
<hr />
<div>SBBulletinBannerController can be used to post notifications to the user from a substrate tweak running inside Springboard.<br />
<br />
<source lang="logos"><br />
BBBulletinRequest *bulletin = [[BBBulletinRequest alloc] init]; <br />
bulletin.sectionID = @"com.application.identifier"; <br />
bulletin.title = @"Title"; <br />
bulletin.message = @"Message"; <br />
bulletin.date = [NSDate date]; <br />
SBBulletinBannerController *controller = [%c(SBBulletinBannerController) sharedInstance];<br />
if ([controller respondsToSelector:@selector(observer:addBulletin:forFeed:playLightsAndSirens:withReply:)])<br />
[controller observer:nil addBulletin:bulletin forFeed:2 playLightsAndSirens:YES withReply:nil]; <br />
else if ([controller respondsToSelector:@selector(observer:addBulletin:forFeed:)])<br />
[controller observer:nil addBulletin:bulletin forFeed:2];<br />
[bulletin release];<br />
</source><br />
<br />
== References ==<br />
<br />
<references/><br />
<br />
{{occlass|library=SpringBoard.app|navbox=1}}</div>
Dustin Howett
https://iphonedev.wiki/index.php?title=Open_Source_Projects&diff=4227
Open Source Projects
2015-11-03T18:11:37Z
<p>Dustin Howett: /* iOS 6 compatible */ Add SDM</p>
<hr />
<div>Here is a list of some '''open source software available for jailbroken devices'''. See TheiPhoneWiki for [http://theiphonewiki.com/wiki/Open_Source_Jailbreaking_Tools a list of open source jailbreaking tools]. Please add more projects, especially your own projects!<br />
<br />
If you're looking for example code for something and you can't find anything relevant in this list, try searching GitHub - see [[Getting Started#Finding example projects]] for advice.<br />
<br />
If you'd like advice on the advantages and disadvantages of making a project open source, [[Advice for new developers#Choosing open vs. closed source|here are some factors to consider]].<br />
<br />
'''A note on licenses:''' If a project does not explicitly have a license that gives you the right to use its code, that means it is copyrighted by the developer and you can't use its code in your own projects - in other words, you can read it and learn from it, but don't copy and paste it. If you've published a project that does not have a free license, and you'd like people to be able to use your code if they want to, [http://www.gnu.org/licenses/license-recommendations.html How to choose a license for your own work] and [http://choosealicense.com/ Choose A License] may be helpful. GitHub has advice on [https://help.github.com/articles/open-source-licensing adding a license to your repository].<br />
<br />
'''A note on contributing:''' If you'd like to contribute improvements to one of these projects (or even just file a bug report), a great first step is to get in contact with the developer and talk to them about it - you can email them, tweet them, find them on IRC, open an issue on the project page, or whatever method of communication you can find. People are usually pretty happy to hear that another developer is interested enough in their project to want to add something to it. If you'd like to contribute code to a project that is on GitHub (like most of these), GitHub's [https://guides.github.com/activities/contributing-to-open-source/ guide to contributing to open source] has helpful advice for how to make a pull request (a formal way to propose your changes so they can be easily integrated). And yes, [http://openhatch.org/blog/2013/what-contributing-to-open-source-can-give-back-to-you/ contributing is worth your time].<br />
<br />
== Tweaks ==<br />
<br />
Also check out [http://tweakweek.com/ TweakWeek] for a long list of relatively simple open source tweaks, organized by rpetrich.<br />
<br />
=== iOS 8 compatible ===<br />
<br />
{| class="wikitable sortable"<br />
|-<br />
! Project !! Author !! Compatibility !! Updated !! License !! Short description<br />
|-<br />
| [https://github.com/brycepauken/Aeuria-LS Aeuria LS] || Bryce Pauken || iOS 8 || 2015-26-07 || MIT || A clock-centered lockscreen replacement<br />
|-<br />
| [https://github.com/wvabrinskas/allarm Allarm] || William_vab || iOS 8 || 2015-20-06 || ? || Toggle all alarms at once on your iOS Device directly in the Clocks app. <br />
|-<br />
| [https://github.com/MohammadAG/iOS-AutoAirPlay AutoAirPlay] || MohammadAG || iOS 8 || 2015-01-05 || GPLv3 || Activator plugin to connect to first AirPlay device.<br />
|-<br />
| [https://github.com/PoomSmart/AppColorClose AppColorClose] || PoomSmart || iOS 7 - 8 || 2015-01-10 || MIT || Close box color based on app icon<br />
|-<br />
| [https://github.com/PoomSmart/Auto-HDR-Enabler Auto HDR Enabler] || PoomSmart || iOS 8 || 2015-01-10 || MIT || Enable iPhone 5s' Auto HDR mode in unsupported devices<br />
|-<br />
| [https://github.com/GN-OS/Bloard Bloard] || GN-OS || iOS 7 - 8 || 2014-02-14 || ? || Make keyboards black<br />
|-<br />
| [https://github.com/xTheMaster3x/BlueBoard BlueBoard] || xTM3x || iOS 7 - 8 || 2015-02-14 || Apache 2.0 || Make keyboard keys blue<br />
|-<br />
| [https://github.com/PoomSmart/BlurryBadges BlurryBadges] || PoomSmart || iOS 7 - 8 || 2015-01-10 || MIT || Blurry icon badges<br />
|-<br />
| [https://github.com/PoomSmart/BlurryBar BlurryBar] || PoomSmart || iOS 7 - 8 || 2015-01-10 || MIT || Fast blurry SB status bar<br />
|-<br />
| [https://github.com/PoomSmart/BlurryContrast BlurryContrast] || PoomSmart || iOS 7 - 8 || 2015-01-10 || MIT || No SpringBoard blurry effects as increase contrast option enabled<br />
|-<br />
| [https://github.com/PoomSmart/Burst-Mode Burst mode] || PoomSmart || iOS 5 - 8 || 2015-01-10 || MIT || Extend or enable the Burst Mode feature<br />
|-<br />
| [https://github.com/PoomSmart/CamBlur7 CamBlur7] || PoomSmart || iOS 7 - 8 || 2015-01-10 || MIT || Live blur effect for camera top/bottom bar<br />
|-<br />
| [https://github.com/PoomSmart/CamElapsedPlus CamElapsed+] || PoomSmart || iOS 7 - 8 || 2015-01-10 || MIT || More video recording elapsed time resolution<br />
|-<br />
| [https://github.com/PoomSmart/CameraModes CameraModes] || PoomSmart || iOS 7 - 8 || 2015-01-10 || MIT || Specific available camera modes<br />
|-<br />
| [https://github.com/PoomSmart/CamRotate CamRotate] || PoomSmart || iOS 5 - 8 || 2015-01-10 || MIT || Design camera rotation<br />
|-<br />
| [https://github.com/PoomSmart/CamToggleBlur CamToggleBlur] || PoomSmart || iOS 7 - 8 || 2015-01-10 || MIT || Toggle for blur transition effect in camera app<br />
|-<br />
| [https://github.com/PoomSmart/CamVolZoom CamVolZoom] || PoomSmart || iOS 5 - 8 || 2015-01-10 || MIT || Use volume buttons for camera zooming<br />
|-<br />
| [https://github.com/PoomSmart/CCFlashLightLevel CCFlashLightLevel] || PoomSmart || iOS 7 - 8 || 2015-03-12 || MIT || Adjustable torch level in Control Center<br />
|-<br />
| [https://github.com/DavidGoldman/ColorBanners ColorBanners] || DavidGoldman || iOS 8 || 2015-05-28 || - || Color banners and notifications<br />
|-<br />
| [https://github.com/Cr4zyS1m0n/curtainChecker curtainChecker] || Simon Selg || iOS 8 - 8.1.2 || 2015-01-06 || - || VoiceOver enhancements for blind people<br />
|-<br />
| [https://github.com/robottom/CustomFlash CustomFlash] || Aaron Thomas || iOS 8 - 8.4 || 2015-07-12 || - || Remove flash when screenshotting and replace with a notification<br />
|-<br />
| [https://github.com/ryanb93/CyDelete CyDelete] || Ryan Burke || iOS 7 - 8.1 || 2014-11-10 || GPLv3 || Uninstall Cydia applications via SpringBoard<br />
|-<br />
| [https://github.com/robottom/DeleteAllMessages8 DeleteAllMessages8] || Aaron Thomas || iOS 8 - 8.4 || 2015-07-07 || - || Adds button to delete all messages at once<br />
|-<br />
| [https://github.com/iNasser0/DockColor DockColor] || iNasser || iOS 7 - 8 || 2015-01-03 || - || Simple tweak to change the home screen dock color<br />
|-<br />
| [https://github.com/MohammadAG/iOS-DoubleTapToSleep DoubleTapToSleep] || MohammadAG || iOS 8 || 2014-12-22 || GPLv3 || Double tap lock or home screen to lock the screen<br />
|-<br />
| [https://github.com/jjxtra/DRColorPicker DRColorPicker] || jjxtra || iOS 6 - 8 || 2014-09-01 || MIT || Color picker for iOS - favorites, recents, hue, wheel, import images<br />
|-<br />
| [https://github.com/PoomSmart/IB-Graphics-Selector IB Graphics Selector] || PoomSmart || iOS 5 - 8 || 2015-01-10 || MIT || Select Infinity Blade app graphics quality<br />
|-<br />
| [https://github.com/Razzile/EasyRespring EasyRespring] || Satori/Razzile || iOS 8 || 2015-01-08 || - || Small tweak that enables you to respring your device by swiping springboard from the app switcher<br />
|-<br />
| [https://github.com/PoomSmart/Flashorama Flashorama] || PoomSmart || iOS 6 - 8 || 2015-01-10 || MIT || Toggle torch in Panorama mode<br />
|-<br />
| [https://github.com/PoomSmart/ForceReach ForceReach] || PoomSmart || iOS 8 || 2015-01-10 || MIT || Unrestriced reachability feature<br />
|-<br />
| [https://github.com/PoomSmart/FrontFlash FrontFlash] || PoomSmart || iOS 4 - 8 || 2014-01-10 || MIT || Simulate flash in Front-Facing camera by flashing the screen<br />
|-<br />
| [https://github.com/PoomSmart/Front-HDR Front HDR] || PoomSmart || iOS 6 - 8 || 2014-01-10 || MIT || Enable HDR in Front-Facing camera<br />
|-<br />
| [https://github.com/PoomSmart/EffectsPlus Effects+] || PoomSmart || iOS 7 - 8 || 2015-01-10 || Apache 2.0 || More filters for Camera & Photos app<br />
|-<br />
| [https://github.com/PoomSmart/HiddenSettings7 HiddenSettings7] || PoomSmart || iOS 7 - 8 || 2014-10-24 || MIT || Show hidden SpringBoard settings<br />
|-<br />
| [https://github.com/angelXwind/IneffectivePower IneffectivePower] || angelXwind || iOS 8 - 8.1.2 || 2015-05-30 || BSD || Stop the infamous "Effective Power" text string from crashing CoreText!<br />
|-<br />
| [https://github.com/xTheMaster3x/Integrate Integrate] || xTM3x || iOS 8 || 2015-08-03 || ? || Remove table view separators<br />
|-<br />
| [https://github.com/PoomSmart/InternalPhotos InternalPhotos] || PoomSmart || iOS 7 - 8 || 2015-01-10 || MIT || Enable hidden photos settings<br />
|-<br />
| [https://github.com/switchpwn/KeyShortcut-Pro KeyShortcut Pro] || switchpwn (Mustafa Gezen) || iOS 6 - 8 || 2014-05-13 || MIT || Use keys as shortcut<br />
|-<br />
| [https://github.com/Razzile/KillSwitcher KillSwitcher] || Satori/Razzile || iOS 8 || 2015-01-27 || - || Adds a button to the app switcher to kill all running apps at once<br />
|-<br />
| [https://github.com/PoomSmart/Live-Effects-Enabler Live Effects Enabler] || PoomSmart || iOS 7 - 8 || 2015-01-10 || MIT || Camera live filters for unsupported iOS 7 devices<br />
|-<br />
| [https://github.com/PoomSmart/LLBPano LLBPano] || PoomSmart || iOS 6 - 8 || 2015-01-10 || MIT || Enable Low-light mode in Panorama<br />
|-<br />
| [https://github.com/matibot/MBCircularProgressBar MBCircularProgressBar] || Mati Bot || iOS 7 - 8 || 2015-08-18 || MIT || A circular, animatable & highly customizable progress bar from the Interface Builder<br />
|-<br />
| [https://github.com/PoomSmart/MoreTimer MoreTimer] || PoomSmart || iOS 8 || 2015-01-10 || MIT || Configurations for camera "timer" mode<br />
|-<br />
| [https://github.com/PoomSmart/MyBias MyBias] || PoomSmart || iOS 8 || 2015-01-10 || MIT || Take advantages of camera focus feature<br />
|-<br />
| [https://github.com/iMokhles/MyOwnTweaks MyOwnTweaks] || iMokhles || iOS 7 - 8 || 2014-12-19 || GNU v3 || OpenIN - CopyTXT features for Social Apps<br />
|-<br />
| [https://github.com/PoomSmart/NoGrayContrast NoGrayContrast] || PoomSmart || iOS 7.1 - 8 || 2015-01-10 || MIT || Remove gray patterns from folders and dock background<br />
|-<br />
| [https://github.com/PoomSmart/NoPhotoGestures NoPhotoGestures] || PoomSmart || iOS 7 - 8 || 2015-01-10 || MIT || No more photo gestures in album<br />
|-<br />
| [https://github.com/fewjative/nonearme NoNearMe] || fewjative || iOS 7 || 2014-05-17 || MIT || Removes the 'Near Me' tab from the AppStore Application<br />
|-<br />
| [https://github.com/PoomSmart/NoSquare NoSquare] || PoomSmart || iOS 7 - 8 || 2015-01-10 || MIT || Disable camera "square" mode<br />
|-<br />
| [https://github.com/PoomSmart/NoUpperCaseTable NoUpperCaseTable] || PoomSmart || iOS 7 - 8 || 2015-01-10 || MIT || Disable UITableView titles uppercase<br />
|-<br />
| [https://github.com/PoomSmart/NoWallpaperZoomAnimation NoWallpaperZoomAnimation] || PoomSmart || iOS 7 - 8 || 2015-01-10 || MIT || No more wallpaper zooming animation<br />
|-<br />
| [https://github.com/ruslan120101/nupsidedown nupsidedown] || Ruslan Ardashev || iOS 8 - 8.1.2 || 2014-12-23 || - || Disable upside-down orientation <br />
|-<br />
| [https://github.com/xTheMaster3x/Pag Pag] || xTM3x || iOS 8 || 2015-01-11 || Apache 2.0 || Paste and Go button in MobileSafari<br />
|-<br />
| [https://github.com/ruslan120101/panicLockiOS8 panicLockiOS8] || Ruslan Ardashev || iOS 8 - 8.1.2 || 2014-12-30 || - || Discretely lock your iDevice with a compromised passcode<br />
|-<br />
| [https://github.com/PoomSmart/PhotoTorch PhotoTorch] || PoomSmart || iOS 6 - 8 || 2015-03-12 || MIT || Adjustable torch in camera app<br />
|-<br />
| [https://github.com/angelXwind/PreferenceOrganizer2 PreferenceOrganizer 2] || angelXwind, hirakujira, gary19930520, eliz || iOS 6 - 8.1.2 || 2015-05-30 || BSD || Organises the Settings application's sections into 4 configurable categories: Apple Apps, Social Apps, Tweaks, and App Store Apps<br />
|-<br />
| [https://github.com/xTheMaster3x/Presentation Presentation] || xTM3x || iOS 8 || 2015-08-03 || Apache 2.0 || Class-0 like SMS notifications on the Lock Screen<br />
|-<br />
| [https://github.com/ruslan120101/reachabilityToggles reachabilityToggles] || Ruslan Ardashev || iOS 8 - 8.1.2 || 2015-01-04 || - || Customize Reachability Duration, Animation, & more<br />
|-<br />
| [https://github.com/PoomSmart/Record--n--Torch Record 'n' Torch] || PoomSmart || iOS 5 - 8 || 2015-01-10 || MIT || Toggle Torch while recording video<br />
|-<br />
| [https://github.com/wvabrinskas/ReSwitch ReSwitch] || William_vab || iOS 8 || 2015-19-08 || ? || Switches the recent contacts with the app cards in the app switcher. <br />
|-<br />
| [https://github.com/Razzile/RippleBoard RippleBoard] || Satori/Razzile || iOS 8 || 2015-05-23 || MIT || Creates a flat ripple effect on app launch and other times<br />
|-<br />
| [https://github.com/PoomSmart/SiriNoConfirm SiriNoConfirm] || PoomSmart || iOS 5 - 8 || 2015-01-10 || MIT || Remove Siri confirmation view when you enable/disable it<br />
|-<br />
| [https://github.com/xTheMaster3x/SleekKey SleekKey] || xTM3x || iOS 7 - 8 || 2015-02-24 || Apache 2.0 || Remove keyboard key backgrounds<br />
|-<br />
| [https://github.com/PoomSmart/Slo-mo-Mod Slo-mo Mod] || PoomSmart || iOS 7 - 8 || 2015-01-10 || MIT || Enable Slo-mo capture in unsupported devices and mod it<br />
|-<br />
| [https://github.com/milodarling/SnooScreens SnooScreens] || Milo Darling || iOS 8 || 2014-11-30 || MIT || Set the wallpaper based on image posts from subreddits<br />
|-<br />
| [https://github.com/PoomSmart/Still-Capture-Enabler-2 Still Capture Enabler 2] || PoomSmart || iOS 4 - 8 || 2015-01-10 || MIT || Take still during video recording<br />
|-<br />
| [https://github.com/freerunnering/SwipeSelection SwipeSelection] || freerunnering || iOS 4 - 8 || 2015-07-08 || ? || Move cursor and selection text with keyboard gestures<br />
|-<br />
| [https://github.com/PoomSmart/SwitchAutofocus SwitchAutofocus] || PoomSmart || iOS 7 - 8 || 2015-01-10 || MIT || Improvement for camera autofocus<br />
|-<br />
| [https://github.com/MohammadAG/iOS-SpotlightSiri SpotlightSiri] || MohammadAG || iOS 8 || 2015-01-09 || GPLv3 || Use Siri by prefixing Spotlight searches with "Siri"<br />
|-<br />
| [https://github.com/PoomSmart/TransparentCameraBar TransparentCameraBar] || PoomSmart || iOS 4 - 8 || 2015-01-10 || MIT || Set camera bar opacity or shrink it<br />
|-<br />
| [https://github.com/PoomSmart/RenameFolderWithoutName Unrestricted Folders Naming] || PoomSmart || iOS 5 - 8 || 2015-01-10 || © || Folder name spacing will remain, can rename folder<br />
|-<br />
| [https://github.com/PoomSmart/Video-Zoom-Mod Video Zoom Mod] || PoomSmart || iOS 7 - 8 || 2015-01-10 || MIT || Enable Video Zoom & set the maximum zoom factor<br />
|-<br />
| [https://github.com/iMokhles/WAEnhancer WAEnhancer] || iMokhles || iOS 7 - 8 || 2014-12-18 || GNU v3 || Suite of features for WhatsApp<br />
|-<br />
| [https://github.com/caetan0/colorpass ColorPass] || Caetano Melone || iOS 7 - 8 || 2015-30-09 || MIT || change the color of your passcode keys<br />
|-<br />
|}<br />
<br />
=== iOS 7 compatible ===<br />
<br />
{| class="wikitable sortable"<br />
|-<br />
! Project !! Author !! Compatibility !! Updated (as of Nov 2013) !! License !! Short description<br />
|-<br />
| [https://github.com/fewjative/alarmnotifier AlarmNotifier] || fewjative || iOS 7 || 2014-05-17 || MIT || Displays a notification that displays the amount of time before the alarm will go off<br />
|-<br />
| [https://github.com/PoomSmart/AnimatedWeatherEnabler AnimatedWeatherEnabler] || PoomSmart || iOS 7 || 2014-02-21 || MIT || Enable iOS 7 weather app animation in iPhone 4<br />
|-<br />
| [https://github.com/PoomSmart/BackdropBar BackdropBar] || PoomSmart || iOS 7 || 2014-08-23 || MIT || Blurry backdrop SB status bar<br />
|-<br />
| [https://github.com/GN-OS/BadgeClearer BadgeClearer] || GN-OS || iOS 4 - 7.1 || 2014-01-31 || zlib || Remove app badges<br />
|-<br />
| [https://github.com/insanj/Bluepicker Bluepicker] || insanj || iOS 6 - 7 || 2014-05-16 || CC BY-NC || Control Bluetooth devices via Activator<br />
|-<br />
| [https://github.com/jontelang/Boover Boover] || jontelang || iOS 5 - 7 || 2014-01-14 || ? || Move icon badges<br />
|-<br />
| [https://github.com/hbang/BrightVol BrightVol] || hbang || iOS 4 - 7 || 2014-02-07 || GPL || Control brightness with volume buttons (using Activator)<br />
|-<br />
| [https://github.com/rpetrich/BrowserChooser BrowserChooser] || rpetrich || iOS 5 - 7 || 2014-01-19 || ? || Switch default browsers<br />
|-<br />
| [https://github.com/VAlexander/Chameleon Chameleon] || VAlexander || iOS 7 || 2014-07-29 || MIT || Lightweight x powerful flat color framework for iOS<br />
|-<br />
| [https://bitbucket.org/coolstar/classicbadges ClassicBadges] || coolstar || iOS 7 || 2014-04-12 || GPLv3 || iOS 6 Badges for iOS 7<br />
|-<br />
| [https://bitbucket.org/coolstar/classicdock ClassicDock] || coolstar || iOS 7 || 2014-05-12 || GPLv3 || iOS 6 Dock for iOS 7<br />
|-<br />
| [https://github.com/insanj/Cleary Cleary] || insanj || iOS 6 - 7 || 2014-04-27 || BSD || Create Clear tasks using Activator<br />
|-<br />
| [https://github.com/PoomSmart/Contrast70 Contrast70] || PoomSmart || iOS 7.0 || 2014-09-19 || MIT || Add gray patterns for increase contrast handling.<br />
|-<br />
| [https://github.com/Qusic/Couria Couria] || Qusic || iOS 6 - 7 || 2014-02-08 || GPLv3 || Quick reply and quick compose system<br />
|-<br />
| [https://github.com/fewjative/customspotlighttext CustomSpotlightText] || fewjative || iOS 7 || 2014-05-17 || MIT || Customize the placeholder text found when doing a spotlight search<br />
|-<br />
| [http://gitweb.saurik.com/cydget.git Cydget] ([[Cydget]]) || saurik || iOS 2.2 - 7 || 2014-02-18 || BSD || Manage lockscreen plugins<br />
|-<br />
| [https://github.com/rweichler/cylinder Cylinder] || rweichler || iOS 4 - 7 || 2014-03-27 || GPLv3 || Animated page swipes<br />
|-<br />
| [https://github.com/thomasfinch/Dim Dim] || tomf64 || iOS 7 || 2014-05-07 || GPL || Dim device screen below minimum brightness<br />
|-<br />
| [https://github.com/MiloSovoy/Dropped Dropped] || James-Isaac-Neutron || iOS 7 || 2014-10-20 || MIT || Activator events for dropping your phone<br />
|-<br />
| [https://github.com/PoomSmart/FaceDetectionDuringVideo FaceDetectionDuringVideo] || PoomSmart || iOS 6 - 7.1 || 2013-12-25 || MIT || Enable Face Detection when start video recording<br />
|-<br />
| [https://github.com/NSPwn/Fake-Operator FakeOperator] || GreySyntax || iOS 4.1 - 7.1 || 2014-01-06 || GPL || Allows the carrier label to be changed<br />
|-<br />
| [https://github.com/BenAndCarl/Faces Faces] || Ben Rosen & CPDigitalDarkroom || iOS 7 || 2014-09-08 || GPLv3 || Set images for passcode buttons.<br />
|-<br />
| [https://github.com/thomasfinch/Favebot FaveBot] || tomf64 || iOS 7 || 2014-05-23 || GPL || View favorites natively in Tweetbot 3<br />
|-<br />
| [https://github.com/rpetrich/FullForce FullForce] || rpetrich || iOS 3.2 - 7 || 2014-01-10 || GPL || Force applications to show in iPad mode<br />
|-<br />
| [https://github.com/bushe/GoodByeSlideTo GoodByeSlideTo] || Bushe || iOS 7 || 2014-02-16 || ? || Removes "Slide To" text under notifications<br />
|-<br />
| [https://github.com/PoomSmart/HDRBadge70 HDRBadge70] || PoomSmart || iOS 7.0 || 2014-09-19 || MIT || Fulfill incompleted HDR badge system<br />
|-<br />
| [https://github.com/codyd51/Hermes Hermes] || Codyd51 || iOS 7 || 2014-07-15 || CC || Simplistic quick reply<br />
|-<br />
| [https://github.com/sharedRoutine/Hold2Speak Hold2Speak] || isklikas - sharedRoutine || iOS 7 || 2014-05-03 || ? || Reply and start calls with the speaker enabled<br />
|-<br />
| [https://github.com/cc941201/iMessageSpamReporter iMessageSpamReporter] || CC-Dog || iOS 7 || 2014-02-21 || BSD || Report iMessage spam to Apple directly in MobileSMS.app<br />
|-<br />
| [https://github.com/ashikase/LastApp LastApp] || ashikase || iOS 3 - 7 || 2014-01-02 || BSD || Quickly switch to previous application<br />
|-<br />
| [https://github.com/PoomSmart/LocationRemindersEnabler7 LocationRemindersEnabler7] || PoomSmart || iOS 7 || 2014-02-21 || MIT || Enable location-reminders for unsupported iOS 7 devices<br />
|-<br />
| [https://github.com/fewjative/LowPowerBanner LowPowerBanner] || fewjative || iOS 5 - 7 || 2014-05-17 || MIT || Changes power alerts into banners and can customize the text, icon, sound and when to receive the alert<br />
|-<br />
| [https://github.com/hbang/MapsOpener MapsOpener] || hbang || iOS 5 - 7 || 2014-04-03 || GPL || Open Google Maps links in the Google Maps app<br />
|-<br />
| [https://github.com/b3ll/MessageBox MessageBox] || b3ll || iOS 7 || 2014-04-02 || BSD || Use Chat Heads outside Facebook app<br />
|-<br />
| [https://github.com/PoomSmart/MoreDictation MoreDictation] || PoomSmart || iOS 5 - 7 || 2015-01-10 || MIT || More languages support for dictation<br />
|-<br />
| [https://github.com/PoomSmart/MyAssistive MyAssistive] || PoomSmart || iOS 5 - 7.1 || 2014-01-05 || MIT || Repurpose the Assistive Touch<br />
|-<br />
| [https://github.com/hbang/NCPad NCPad] || hbang || iOS 5 - 7 || 2014-01-30 || MIT || Resize notification banners to iPad screen width<br />
|-<br />
| [https://github.com/r-plus/NoDictation NoDictation] || r-plus || iOS 5.1 - 7 || 2013-12-30 || ? || Disable dictation key without disabling Siri<br />
|-<br />
| [https://github.com/fewjative/nonearme NoNearMe] || fewjative || iOS 7 || 2014-05-17 || MIT || Removes the 'Near Me' tab from the AppStore Application<br />
|-<br />
| [https://github.com/nickfrey/NowNow NowNow] || nickfrey || iOS 7 || 2014-05-14 || ? || Invoke Google Voice Search using Activator<br />
|-<br />
| [https://github.com/jzplusplus/OkSiri OkSiri] || jzplusplus || iOS 7 || 2014-07-25 || GPLv2 || Always-on keyword recognition<br />
|-<br />
| [https://github.com/eswick/osexperience OS Experience] || eswick || iOS 6 - 7 || 2015-06-19 || MIT || Window manager and switcher<br />
|-<br />
| [https://github.com/ruslan120101/panicLock panicLock] || panicLock || iOS 7 || 2014-08-10 || ? || Discrete locking of iDevice even with a compromised passcode<br />
|-<br />
| [https://github.com/PoomSmart/PanoEnabler PanoMod] || PoomSmart || iOS 6 - 7.1 || 2014-09-19 || MIT || Enable Panorama and customize it<br />
|-<br />
| [https://github.com/protosphere/pinnacle Pinnacle] || ProtoSphere || iOS 7 || 2014-04-11 || MIT || Hold back button to go to top-level page<br />
|-<br />
| [https://github.com/b3ll/PostOffice PostOffice] || b3ll || iOS 6 - 7 || 2014-03-18 || BSD || Forward iOS notifications to Google Glass<br />
|-<br />
| [https://github.com/cc941201/PreferredLanguageOrder PreferredLanguageOrder] || CC-Dog || iOS 7 || 2014-03-07 || BSD || Adjust preferred language order in Preferences.app<br />
|-<br />
| [https://github.com/thomasfinch/Priority-Hub Priority Hub] || tomf64 || iOS 7 || 2014-05-28 || MIT || Sort lock screen notifications by app<br />
|-<br />
| [https://github.com/a1anyip/ProWidgets ProWidgets] || a1anyip || iOS 7 || 2015-07-01 || ? || Widget suite and framework for iOS<br />
|-<br />
| [https://github.com/PoomSmart/ProximityCam ProximityCam] || PoomSmart || iOS 7 || 2014-02-21 || MIT || Proximity camera snap for iOS<br />
|-<br />
| [https://github.com/ashikase/ShowCase ShowCase] || ashikase || iOS 7 || 2014-01-02 || BSD || Make keyboard show current case<br />
|-<br />
| [https://github.com/insanj/SleepyAlarm SleepyAlarm] || insanj || iOS 7 || 2014-03-13 || CC BY-NC || Suggests better wake up times<br />
|-<br />
| [https://github.com/c-ryan747/SMSStats2 SMSStats2] || Callum Ryan || iOS 7 || 2014-03-31 || MIT || Statistics in MobileSMS.app<br />
|-<br />
| [https://github.com/BGerard/SnapSelect SnapSelect] || BGerard || iOS 7 || 2014-07-04 || GPL 2 || Send photos from your photo library via SnapChat<br />
|-<br />
| [https://github.com/insanj/Snooze Snooze] || insanj || iOS 7 || 2014-05-29 || CC BY-NC || Configure snooze times other than nine minutes<br />
|-<br />
| [https://github.com/Firemoon777/StatusModifier StatusModifier] || Firemoon777 || iOS 7.0 - 7.1 || 2014-07-17 || GPL v3 || Customize your statusbar<br />
|-<br />
| [https://github.com/switchpwn/SwitchData SwitchData] || switchpwn || iOS 7 || 2014-05-13 || MIT || Switch between wifi and cellular data depending on the service signal<br />
|-<br />
| [https://github.com/r-plus/SwipeShiftCaret SwipeShiftCaret] || r-plus || iOS 4 - 7 || 2014-02-20 || ISC || Edit text with keyboard gestures<br />
|-<br />
| [https://github.com/rpetrich/SwitchIcons SwitchIcons] || rpetrich || iOS 5 - 7 || 2014-01-10 || ? || Example tweak for Flipswitch<br />
|-<br />
| [https://github.com/hbang/TypeStatus TypeStatus] || hbang || iOS 5 - 7 || 2014-05-18 || Apache 2.0 || iMessage typing indicators for the status bar<br />
|-<br />
| [https://github.com/conradev/UserAgentFaker UserAgentFaker] || conradev || iOS 7 || 2014-03-31 || MIT || User agent faker for browsers<br />
|-<br />
| [https://github.com/iMokhles/VBEnahncerLite VBEnhancerLite] || iMokhles || iOS 6 - 7 || 2014-08-12 || Apache || Suite of features for Viber app<br />
|-<br />
| [http://gitweb.saurik.com/veency.git Veency] || saurik || iOS 6 - 7 || 2014-01-28 || AGPL 3.0 || VNC server<br />
|-<br />
| [https://github.com/fewjative/verticalvideosyndrome VerticalVideoSyndrome] || fewjative || iOS 7 || 2014-05-17 || MIT || Displays a warning image when in recording mode and device is vertically oriented<br />
|-<br />
| [https://github.com/imokhles/WAEHideCamera WAEHideCamera] || iMokhles || iOS 6 - 7 || 2014-09-23 || Apache || Hide camera button in new version WhatsApp<br />
|-<br />
| [https://github.com/imokhles/wareadmark WAReadMark] || iMokhles || iOS 5 - 7 || 2014-04-15 || ? || Disable Read Mark in WhatsApp<br />
|-<br />
| [https://github.com/iMokhles/WhatsAtor WhatsAtor] || iMokhles || iOS 6 - 7 || 2013-12-25 || GPL || Send WhatsApp messages from anywhere<br />
|-<br />
| [https://github.com/iMokhles/whatsapplstimest WhatsApp LSeen TimeStamp] || iMokhles || iOS 5 - 7 || 2013-09-03 || GPL || Toggle WhatsApp timestamp without waiting 24 hours<br />
|-<br />
| [http://gitweb.saurik.com/winterboard.git WinterBoard] ([[WinterBoard]]) || saurik || iOS 2 - 7 || 2014-01-29 || BSD? || Advanced theming system<br />
|-<br />
| [https://github.com/PoomSmart/Yellow-Flash-7.0 Yellow Flash 7.0] || PoomSmart || iOS 7.0 || 2014-09-19 || MIT || Yellowish flash button highlight<br />
|}<br />
<br />
=== iOS 6 compatible ===<br />
<br />
{| class="wikitable sortable"<br />
|-<br />
! Project !! Author !! Compatibility !! Updated (as of Nov 2013) !! License !! Short description<br />
|-<br />
| [https://github.com/trenskow/AirFloat AirFloat] || trenskow || iOS 6 || 2013-07-13 || BSD? || AirPlay audio (AirTunes) for iOS<br />
|-<br />
| [https://github.com/EthanArbuckle/AlienBlueTags AlienBlueTags] || EthanArbuckle || iOS 6 || 2013-11-06 || ? || Adds Reddit user tagging to AlienBlue<br />
|-<br />
| [https://github.com/nickfrey/AnyLockApp AnyLockApp] || nickfrey || iOS 5 - 6 || 2012-02-04 || ? || Change lockscreen camera shortcut<br />
|-<br />
| [https://github.com/PoomSmart/PLReorientingButtonMod Camera Button UI Mod] || PoomSmart || iOS 6 || 2013-12-20 || MIT || Change opacity & position of (gray) camera buttons<br />
|-<br />
| [https://github.com/rpetrich/DietBar DietBar] || rpetrich || iOS 3 - 6 || 2012-06-23 || ? || Shrink navigation bars<br />
|-<br />
| [https://github.com/rpetrich/DietBulletins DietBulletins] || rpetrich || iOS 4 - 6 || 2013-09-10 || ? || Shrink notification bulletins<br />
|-<br />
| [https://github.com/uroboro/FlipNC FlipNC] || uroboro || iOS 5 - 6 || 2014-03-18 || GPL || Adds flipswitches to the notification center<br />
|-<br />
| [https://github.com/insanj/GoogleSearchforVelox GoogleSearchforVelox] || insanj || iOS 6 || 2013-08-24 || BSD || Quick search from the Google app<br />
|-<br />
| [https://github.com/FilippoBiga/Harlem-Shake Harlem Shake] || FilippoBiga || iOS 6 || 2013-03-11 || ? || Make SpringBoard icons dance<br />
|-<br />
| [https://github.com/Xuzz/tweaks/tree/master/hookslaw %hook's law] || Xuzz || iOS 6 || 2013-02-16 || BSD || Makes animations springier<br />
|-<br />
| [https://github.com/rpetrich/IconRotator IconRotator] || rpetrich || iOS 5 - 6 || 2013-02-16 || GPL || Rotates icons<br />
|-<br />
| [https://github.com/patelhiren/iannounce iAnnounce] || patelhiren || iOS 4 - 6 || 2013-03-01 || ? || Announce incoming caller's name<br />
|-<br />
| [https://github.com/zephster/InAMinute InAMinute] || zephster || iOS 6 || 2013-08-24 || ? || Fine-grained time selection system-wide<br />
|-<br />
| [https://github.com/rpetrich/LiveClock LiveClock] || rpetrich || iOS 3 - 6 || 2013-02-04 || ? || Animated clock icon on SpringBoard<br />
|-<br />
| [https://github.com/rpetrich/NoNewsIsGoodNews NoNewsIsGoodNews] || rpetrich || iOS 5 - 6 || 2011-12-28 || ? || Hide Newsstand icon<br />
|-<br />
| [https://github.com/conradev/Tweaks/tree/master/nopasscodeblock NoPasscodeBlock] || conradev || iOS 6 || 2013-02-05 || ? || Prevent permanent passcode locking<br />
|-<br />
| [https://github.com/k3a/OctopusKeyboard OctopusKeyboard] || k3a || iOS 6 || 2014-03-19 || GPL || Predictive keyboard, showing word suggestions<br />
|-<br />
| [https://github.com/rpetrich/RotationInhibitor RotationInhibitor] || rpetrich || iOS 3 - 6.1 || 2013-02-04 || ? || Disable device rotation<br />
|-<br />
| [https://github.com/rpetrich/RunningIndicator RunningIndicator] || rpetrich || iOS 4 - 6 || 2013-05-29 || ? || Running app icons glow<br />
|-<br />
| [https://github.com/DHowett/safaridownloader Safari Download Manager] || DHowett / francis || iOS 3.1 - 6.1 || 2013-02-04 || BSD || A download manager, for Safari!<br />
|-<br />
| [https://github.com/insanj/SliderKiller SliderKiller] || insanj || iOS 6 || 2013-08-24 || BSD || Always "slide to unlock" instead of "slide to reply"<br />
|-<br />
| [https://github.com/bd452/TapTapPass TapTapPass] || bd452 || iOS 6 || 2013-10-10 || ? || Gesture-based passcode toggle<br />
|-<br />
| [https://github.com/bushe/Unlock7 Unlock7] || bushe || iOS 6 || 2013-11-01 || ? || Adds some iOS 7 lockscreen features to iOS 6<br />
|-<br />
| [https://github.com/Cykey/Uninstall-Application-Size Uninstall Application Size] || Cykey || iOS 6 || 2013-09-26 || Public Domain || Shows application size when prompting to uninstall<br />
|-<br />
| [https://github.com/rpetrich/VideoPace VideoPace] || rpetrich || iOS 4.3 - 6 || 2013-08-04 || ? || Increase speed of video playback<br />
|-<br />
| [https://github.com/rpetrich/WiCarrier WiCarrier] || rpetrich || iOS 3 - 6 || 2012-04-07 || GPL || Show WiFi network name/IP in place of carrier view<br />
|}<br />
<br />
=== iOS 5 compatible ===<br />
<br />
{| class="wikitable sortable"<br />
|-<br />
! Project !! Author !! Compatibility !! Updated (as of Nov 2013) !! License !! Short description<br />
|-<br />
| [https://github.com/rpetrich/AutocorrectionBar AutocorrectionBar] || rpetrich || iOS 4.3 - 5 || 2011-11-09 || ? || Enable hidden keyboard feature<br />
|-<br />
| [https://github.com/rpetrich/ClearNotifications ClearNotifications] || rpetrich || iOS 5 || 2012-02-03 || ? || Clear lock screen notifications with a swipe<br />
|-<br />
| [https://github.com/eni9889/Color-Mail-Labels Color Mail Labels] || eni9889|| iOS 5 || 2012-02-13 || GPLv3 || Give each mail account its own color<br />
|-<br />
| [https://github.com/DHowett/cydelete Cydelete] || DHowett || iOS 2 - 5 || 2011-10-09 || GPLv3 || Delete Cydia apps from Springboard<br />
|-<br />
| [https://github.com/rpetrich/FastBlurredNotificationCenter FastBlurredNotificationCenter] || rpetrich || iOS 5 || 2012-03-03 || GPL || Blurs notification center background<br />
|-<br />
| [https://github.com/aricha/Merge Merge] || Andrew Richardson & Joshua Tucker || iOS 5 || 2012-10-13 || Apache || Combines messages by contact in Messages<br />
|-<br />
| [https://github.com/rpetrich/MoreLinesNotificationCenter MoreLinesNotificationCenter] || rpetrich || iOS 5 || 2011-10-16 || ? || More lines in notification center<br />
|-<br />
| [https://github.com/rpetrich/MusicBanners MusicBanners] || rpetrich || iOS 5 || 2012-04-08 || GPL || Track change bulletins with album art in SpringBoard<br />
|-<br />
| [https://github.com/rpetrich/TopographyForGoogleMaps TopographyForGoogleMaps] || rpetrich || iOS 5.1 || 2012-12-25 || ? || Enable hidden topography view<br />
|-<br />
| [https://github.com/coolstar/vassistant VAssistant] || coolstar || iOS 5 - 5.1.1 || 2012-12-08 || GPL 3 || Siri clone for iOS 5<br />
|-<br />
| [https://github.com/jlippold/WifiSMS WifiSMS] || jlippold || iOS 4 - 5 || 2012-04-08 || ? || iPhone webserver gateway for SMS<br />
|}<br />
<br />
=== iOS 4 compatible ===<br />
<br />
{| class="wikitable sortable"<br />
|-<br />
! Project !! Author !! Compatibility !! Updated (as of Nov 2013) !! License !! Short description<br />
|-<br />
| [https://github.com/Chronic-Dev/animate animate] || Chronic-Dev Team et al. || iOS 4.2.1 || 2011-07-10 || © || Customize boot logo animations<br />
|-<br />
| [https://github.com/Xuzz/tweaks/tree/master/appslide Appslide] || Xuzz || iOS 4.2 || 2013-02-16 || BSD || Use home button to go back<br />
|-<br />
| [https://github.com/rpetrich/DeepEnd DeepEnd] || rpetrich || iOS 4 || 2011-01-31 || ? || 3D effect for Springboard<br />
|-<br />
| [https://github.com/Xuzz/tweaks/tree/master/five-icon-switcher Five Icon Switcher] || Xuzz || iOS 4 || 2011-09-24 || BSD || Five icons in app switcher<br />
|-<br />
| [https://github.com/rpetrich/IconRenamer IconRenamer] || rpetrich || iOS 4 || 2011-10-16 || ? || Rename icons from your SpringBoard<br />
|-<br />
| [https://github.com/rpetrich/ListLauncher ListLauncher] || rpetrich || iOS 4 || 2011-02-05 || ? || Launch apps from Spotlight<br />
|-<br />
| [https://github.com/rpetrich/LivePaper LivePaper] || rpetrich et al. || iOS 4 || 2011-07-20 || ? || Live wallpaper with plugins<br />
|-<br />
| [https://github.com/rpetrich/MathAlarm MathAlarm] || rpetrich || iOS 4.2 || 2012-01-10 || ? || Solve arithmetic problems to turn off alarm<br />
|-<br />
| [https://github.com/rpetrich/QuickReply QuickReply] || rpetrich || iOS 2 - 4 || 2011-04-24 || whatever || Quick reply for SMS<br />
|-<br />
| [https://github.com/rpetrich/PagePusher PagePusher] || rpetrich || iOS 4 || 2011-06-02 || ? || Page-styled app animations<br />
|-<br />
| [https://github.com/rpetrich/SwitcherMod SwitcherMod] || rpetrich and Optimo || iOS 4 || 2011-12-31 || ? || Customized app switcher<br />
|-<br />
| [https://github.com/rpetrich/VoiceKeys VoiceKeys] || rpetrich || iOS 4 || 2011-11-27 || ? || Voice recognition using Google's service<br />
|-<br />
| [https://github.com/rpetrich/WebGLEnabler WebGLEnabler] || rpetrich || iOS 4.2 || 2011-07-24 || ? || Enable WebGL support in apps that use UIWebView<br />
|}<br />
<br />
=== iOS 3 compatible ===<br />
<br />
{| class="wikitable sortable"<br />
|-<br />
! Project !! Author !! Compatibility !! Updated (as of Nov 2013) !! License !! Short description<br />
|-<br />
| [https://github.com/rpetrich/DisplayEffects DisplayEffects] || rpetrich || iOS 3 || 2011-01-18 || ? || Experimental effects for iOS<br />
|-<br />
| [https://github.com/rpetrich/NoClearHistory NoClearHistory] || rpetrich || iOS 3 || 2010-09-29 || ? || Don't allow clearing history<br />
|-<br />
| [https://github.com/n00neimp0rtant/OpenNotifier OpenNotifier] || n00neimp0rtant and Lunat1k || iOS 3.2 || 2013-04-18 || ? || Notification icons for your status bar<br />
|-<br />
| [https://github.com/rpetrich/ProSwitcher ProSwitcher] || rpetrich and chpwn || iOS 3 || 2010-09-18 || ? || Palm Pre-style application switcher<br />
|-<br />
| [https://github.com/rpetrich/PullToDismiss PullToDismiss] || rpetrich || iOS 3.2 || 2011-12-30 || ? || Pull down to dismiss keyboard<br />
|-<br />
| [https://github.com/rpetrich/SliderBar SliderBar] || rpetrich || iOS 3 || 2011-06-06 || ? || Quick scrolling in all table views<br />
|-<br />
| [https://github.com/rpetrich/SplitMail SplitMail] || rpetrich || iOS 3.2 || 2012-02-02 || ? || Split-style iPad mail app in portrait<br />
|-<br />
| [https://svn.bingner.com/SAM Subscriber Artificial Module (SAM)] || sbingner || iOS 3 || 2013-06-07 || LGPL || <small>(Login: username "anonymous", no password. [https://repo.bingner.com/websvn/ Web view].)</small><br />
|-<br />
| [https://github.com/rpetrich/WebPreview WebPreview] || rpetrich || iOS 3 || 2011-02-17 || ? || Preview web links in a popup<br />
|}<br />
<br />
=== Unknown compatibility ===<br />
<br />
{| class="wikitable sortable"<br />
|-<br />
! Project !! Author !! Compatibility !! Updated (as of Nov 2013) !! License !! Short description<br />
|-<br />
| [https://github.com/rpetrich/AllowRotate AllowRotate] || rpetrich || iOS ? || 2010-10-03 || ? || <br />
|-<br />
| [https://github.com/Xuzz/tweaks/tree/master/fullwebclips FullWebClips] || Xuzz || iOS ? || 2011-07-21 || BSD || Make Web Clips fullscreen<br />
|-<br />
| [https://github.com/DarkMalloc/Glue Glue] || DarkMalloc || iOS ? || 2011-06-29 || ? || Share a note with Pastie from the Notes app<br />
|-<br />
| [https://github.com/Xuzz/tweaks/tree/master/internalizer Internalizer] || Xuzz || iOS ? || 2011-07-22 || BSD || Add text to your lockscreen<br />
|-<br />
| [https://github.com/BGerard/IPSlider IPSlider] || BGerard || iOS ? || 2013-11-15 || GPL 2 || Set "slide to unlock" message to IP address<br />
|-<br />
| [https://github.com/conradev/Tweaks/tree/master/lockseconds LockSeconds] || conradev || iOS ? || 2012-06-02 || ? || Add seconds to lockscreen clock<br />
|-<br />
| [https://github.com/FreeManRepo/MediaSpeak MediaSpeak] || freemanrepo || iOS ? || 2012-04-15 || ? || Speak currently playing song<br />
|-<br />
| [https://github.com/rpetrich/Multi-Slide Multi-Slide] || rpetrich and InfectionFX || iOS ? || 2011-06-19 || WTFPL || Multiple unlock sliders<br />
|-<br />
| [https://github.com/Xuzz/tweaks/tree/master/no-dots No Dots] || Xuzz || iOS ? || 2010-11-27 || BSD || No page dots<br />
|-<br />
| [https://github.com/rpetrich/SBCustomIcon SBCustomIcon] || rpetrich || iOS ? || 2009-02-09 || ? || <br />
|-<br />
| [https://github.com/conradev/Tweaks/tree/master/searchclear SearchClear] || conradev || iOS ? || 2012-06-24 || ? || Clears the search field after a search<br />
|-<br />
| [https://github.com/Xuzz/tweaks/tree/master/switcherscape SwitcherScape] || Xuzz || iOS ? || 2011-07-22 || BSD || App switcher in landscape mode<br />
|-<br />
| [https://github.com/Xuzz/tweaks/tree/master/webscrollian Webscrollian] || Xuzz || iOS ? || 2011-07-28 || BSD || Faster scrolling for web content<br />
|}<br />
<br />
== Applications ==<br />
<br />
{| class="wikitable sortable"<br />
|-<br />
! Project !! Author !! Compatibility !! Updated (as of Nov 2013) !! License !! Short description<br />
|-<br />
| [https://github.com/ashikase/CrashReporter CrashReporter] || ashikase || iOS 6 - 8 || 2013-02-19 || ? || App for processing and sending crash logs<br />
|-<br />
| [http://gitweb.saurik.com/cydia.git Cydia] || saurik || iOS 2 - 6 || 2012-09-21 || Modified BSD || Graphical APT frontend<br />
|-<br />
| [https://code.google.com/p/mobileterminal/ MobileTerminal] || (multiple) || iOS 3.2 - 6 || 2011-10-26 || GPL 2 || Terminal emulator<br />
|-<br />
| [https://github.com/coolstar/RecordMyScreen/ RecordMyScreen] || coolstar || iOS 5 - 6 || 2013-07-22 || MIT || Screen Recorder<br />
|-<br />
| [https://github.com/hrydgard/ppsspp PPSSPP] || (multiple) || iOS 5 - 8.1 || 2014-11-22 || GPL || Sony PlayStation Portable emulator<br />
|-<br />
| [https://github.com/lufinkey/miniCode miniCode] || lufinkey || iOS 4.3.3 - 7 || 2014-07-19 || ?|| On device IDE<br />
|}<br />
<br />
== Tools ==<br />
<br />
{| class="wikitable sortable"<br />
|-<br />
! Project !! Source !! Author !! Compatibility !! Updated (As of Nov 2013) !! License !! Short description<br />
|-<br />
| [[Airscan]] || [https://github.com/Cykey/airscan] || Cykey || iOS 6 || 2013-08-12 || ? || iOS command-line WiFi scanner<br />
|-<br />
| [[CaptainHammer]] || [https://github.com/rpetrich/CaptainHammer] || rpetrich || iOS 3 - 6 || 2013-05-10 || GPL 3 || Simple debugging tools for iOS<br />
|-<br />
| [[Open]] || [https://github.com/conradev/Open] || conradev || iOS 6 || 2013-07-24 || ? || Open apps from shell on iOS<br />
|-<br />
| [[sbutils]] || [https://github.com/innoying/iOS-sbutils] || innoying || iOS 6 || 2012-25-01 || ? || A collection of utilities to access iOS functions via the command line<br />
|-<br />
| [[symbolicate]] || [https://github.com/ashikase/symbolicate] || ashikase, KennyTM || iOS ? || 2013-12-28 || ? || Command-line tool for symbolicating crash logs<br />
|-<br />
| [[Theos]] || [https://github.com/DHowett/theos] || DHowett || - || 2013-11-06 || GPL 3 || Unified cross-platform iPhone Makefile system<br />
|-<br />
|}<br />
<br />
== Developer libraries ==<br />
<br />
{| class="wikitable sortable"<br />
|-<br />
! Project !! Source !! Author !! Compatibility !! Updated (As of Nov 2013) !! License !! Short description<br />
|-<br />
| [[AppList]] || [https://github.com/rpetrich/AppList] || rpetrich || iOS 3 - 6 || 2014-04-30 || ? || Allow extensions to read the list of installed apps<br />
|-<br />
| [[BTstack]] || [http://btstack.org] || mringwal || iOS 3 - 7 || 2014-05-22 || dual license || Bluetooth stack with SDP, RFCOMM, and, L2CAP APIs<br />
|-<br />
| [[Flipswitch]] || [https://github.com/a3tweaks/Flipswitch] || rpetrich and Jack Willis || iOS ? - 7 || 2014-04-09 || LGPL || Centralized toggle system for iOS<br />
|-<br />
| [[HidSupport]] || [https://code.google.com/p/hid-support] || mringwal || iOS 3 - 7 || 2014-04-22 || BSD New || Key and touch injection library<br />
|-<br />
| [[IconSupport]] || [https://github.com/Xuzz/IconSupport] || Sakurina, chpwn, ashikase || iOS 3 - 7 || 2014-01-23 || ? || Safe icon support library<br />
|-<br />
| [[Libcolorpicker]] || [https://bitbucket.org/pixelfiredev/libcolorpicker libcolorpicker] || pixelfiredev || iOS 7 || 2014-09-13 || MIT || A color picker<br />
|-<br />
| [[LibDisplay]] || [https://github.com/freerunnering/LibDisplay] || freerunnering || iOS 4 - 6 || 2013-02-07 || ? || Manage display stacks (pre-iOS 6) and manage running applications<br />
|-<br />
| [[Libdisplaystack]] || [https://github.com/Zimm/libdisplaystack] || Zimm || iOS ? || 2010-12-30 || non-commercial || Library for launching and exiting apps<br />
|-<br />
| [[Libhide]] || [https://github.com/bushe/Libhide] || BigBoss, theiostream, Bushe || iOS 2 - 7 || 2014-02-21 || ? || A library for hiding icons from Springboard<br />
|-<br />
| [[Libobjcipc]] || [https://github.com/a1anyip/libobjcipc] || a1anyip || iOS 7 || 2014-03-19 || ? || An inter-process communication (between app and SpringBoard) solution<br />
|-<br />
| [[Libopener]] || [https://github.com/hbang/libopener] || hbang || iOS ? || 2014-05-05 || GPLv3 || Developer library for overriding link destinations<br />
|-<br />
| [[Libstatusbar]] || [https://github.com/phoenix3200/libstatusbar] || phoenix3200 || iOS 3 - 7 || 2014-02-07 || ? || Custom statusbar icon library<br />
|-<br />
| [[PreferenceLoader]] || [https://github.com/DHowett/preferenceloader] || DHowett || iOS 3 - 7 || 2013-11-22 || LGPLv3 || Allows developers to add entries to Settings.app<br />
|-<br />
| [[SearchLoader]] || [https://github.com/theiostream/SearchLoader] || theiostream || iOS 6 || 2013-07-22 || ? || Loads search bundles<br />
|}</div>
Dustin Howett
https://iphonedev.wiki/index.php?title=Updating_extensions_for_iOS_8&diff=3048
Updating extensions for iOS 8
2014-10-26T02:50:16Z
<p>Dustin Howett: /* What has changed in iOS 8? (Classes, frameworks, etc.) */ "NO PLS RECOVERY" doesn't have much to do with updating extensions for iOS 8</p>
<hr />
<div>Let's collect knowledge like we did with [[Updating extensions for iOS 7]] - paste in your notes and share what you've learned, and somebody else will organize it later. :) If you want to ask questions and share tips over chat with other developers, see [[IRC]] for how to connect to #theos and #iphonedev.<br />
<br />
'''Hey developer, you can add your knowledge here! Yes, you! [http://iphonedevwiki.net/index.php?title=Special:UserLogin&returnto=Updating+extensions+for+iOS+8&type=signup Make an account and edit this page!]'''<br />
<br />
== What has changed in iOS 8? (Classes, frameworks, etc.) ==<br />
<br />
* The term 'Display Identifier' has been removed from SpringBoard. Methods that used the term usually have a 'Bundle Identifier' equivalent; e.g. -[SBApplicationController applicationWithDisplayIdentifier:] and -[SBApplication displayIdentifier] are now -[SBApplicationController applicationWithBundleIdentifier] and -[SBApplication bundleIdentifier]<br />
<br />
* "Has anyone looked into granting entitlements in iOS 8? It would appear the popular method of hooking "_XPCConnectionHasEntitlement" no longer works." "I haven't had a whole lot of time to do testing or look for better methods but I found "_BSAuditTokenTaskHasEntitlement" which appears to have a similar function to "_XPCConnectionHasEntitlement", its part of the "assertiond" process which must be hooked in order to access it, so far it's worked. More specifically, part of the "BaseBoard" private framework within "assertiond"."<br />
<br />
* PLBatteryPropertiesEntry no longer seems to exist for getting current battery info such as: <code>[PLBatteryPropertiesEntry batteryPropertiesEntry].currentCapacity</code>. You can still use:<br />
<source lang="objc"><br />
io_service_t powerSource = IOServiceGetMatchingService(kIOMasterPortDefault, IOServiceMatching("IOPMPowerSource"));<br />
CFNumberRef currentCapacityNum = (CFNumberRef)IORegistryEntryCreateCFProperty(powerSource, CFSTR(kIOPMPSCurrentCapacityKey), kCFAllocatorDefault, 0);<br />
</source><br />
<br />
* launchctl appears to be slightly broken. launchctl start and stop work perfectly, but launchctl load and unload break with the cryptic error message <code>/System/Library/LaunchDaemons/com.apple.mobile.installd.plist: The specified service path was not in the service cache</code><br />
<br />
* MISValidateSignatureAndCopyInfo appears to perform additional code-signing checks during app installation.<br />
<br />
* installd cannot be reloaded via launchctl.<br />
<br />
* Mobile application containers are at /var/mobile/Containers/Application<br />
<br />
* Looks like certain apps dont have privileges for IORegistryEntryCreateCFProperty anymore (Safari, Mail)<br />
<br />
* xTM3x has been doing some research into preference saving ([https://ghostbin.com/paste/mcgu3 log], file atomicity takes long enough to see the auxiliary files). It seems that the PostNotification from the [[Preferences specifier plist]] is now posted '''before''' the plist is updated on disk — as opposed to '''after''' the plist was updated on disk which was the case on iOS < 8 (unless I'm doing something terribly wrong!). These facts could mean that writing to file with <code>atomicity:YES</code> (as is custom) is slower than on previous iOS versions. This could be a bug on Apple's code and not an issue with developer's code. Either a patch should be made or wait for Apple to notice and fix it.<br />
<br />
* PrivateFrameworks (and possibly others) in the iOS 8 SDK are missing the __TEXT section. Frameworks must be extracted from a device's dyld_shared_cache using a tool like [http://www.newosxbook.com/index.php?page=downloads JTool] or IDA before they can be (statically) reverse engineered.<br />
<br />
* Many functions from SBMediaController have been removed, and it is now useless for accessing now playing information. The best alternative seems to be the MediaRemote framework.<br />
<br />
* You can no longer mount FAT-formatted storage devices via the CCK, only HFS.<br />
<br />
* "Has anyone figured out how to add subviews to UIAlertView in iOS 8 yet?" "I found a workaround so I can at least add to the content view (which is not the size of the full alert view though). Within a subclass of UIAlertView do <code>[[[[self _alertController] contentViewController] view] addSubview:theSubview];</code>. When not subclassing, <code>[[[[alertView _alertController] contentViewController] view] addSubview:theSubview];</code> should work, although one has to figure out the right time to do that."<br />
<br />
== What is new in iOS 8, and how does it work? ==<br />
<br />
* The view Reachability invokes is in the new framework FrontBoard - you can hook it. It is a FBWindowContextHostView.<br />
<br />
* FrontBoard is a new thing<br />
<br />
* Apple seems to call the iOS side Octavia and the OS X side Nero<br />
<br />
== Which tools and other preexisting things are still working on iOS 8? Which ones don't work? ==<br />
<br />
* The package <code>syslogd to /var/log/syslog</code> seems to not be working. [http://www.reddit.com/r/jailbreakdevelopers/comments/2k3b29/syslog_on_ios_8/ An alternative] - also as listed [http://theiphonewiki.com/wiki/System_Log on TheiPhoneWiki]. In other words: while the syslogd package doesn't work, installing socat and running <code>socat - UNIX-CONNECT:/var/run/lockdown/syslog.sock</code> still works on iOS 8. You can pipe it to a file if you want.<br />
<br />
* "Does Theos work on iOS 8?" [http://www.reddit.com/r/jailbreakdevelopers/comments/2k2eat/question_theos_and_ios_8/ uroboro responds here]<br />
<br />
* [http://www.reddit.com/r/jailbreakdevelopers/comments/2k6gft/list_installed_apps_on_ios_8/ AppList seems to not be compatible yet] - an official fix will be available soon.<br />
<br />
* libstatusbar seems to not be compatible yet, UIImage kitImageNamed returns null - while waiting for an official fix, if you need a version for testing, you could compile from [http://github.com/tateu/libstatusbar/tree/iOS8_Temp_Hack my patched source], it's a horrible hack, but it works as a temporary solution.<br />
<br />
* libsymbolicate doesn't work on 8... (VMUHeader is gone from Symbolication.framework)<br />
<br />
* RocketBootstrap seems to work<br />
<br />
* "What works for dumping classes on iOS 8? I've tried using classdumpdyld and classdumpz but none of them seem to work. I'm trying to dump them directly on an iPhone 6." "You could use class-dump for i386 and the iOS 8 simulator" "[http://stevenygard.com/projects/class-dump/ This class-dump works for me.]" "If you want to dump on your iPhone then just compile its source to ARM; IIRC its distributed binary is x86/64 only."<br />
<br />
== Random assorted other notes ==<br />
<br />
* [http://developer.limneos.net/index.php?ios=8.0 iOS 8.0 Headers] and [https://github.com/coolstar/iOS-8.1-SpringBoard-Headers another set of SpringBoard headers] (made with two different [[Reverse_Engineering_Tools#class-dump.2C_class_dump_z.2C_classdump-dyld|class dumping tools]]).<br />
<br />
* In things like SBStarkBanner* classes, Stark is the codename for the blur-heavy UI since iOS 7</div>
Dustin Howett
https://iphonedev.wiki/index.php?title=Updating_extensions_for_iOS_8&diff=3047
Updating extensions for iOS 8
2014-10-26T02:49:52Z
<p>Dustin Howett: /* What has changed in iOS 8? (Classes, frameworks, etc.) */ Removed some mentions of piracy tools.</p>
<hr />
<div>Let's collect knowledge like we did with [[Updating extensions for iOS 7]] - paste in your notes and share what you've learned, and somebody else will organize it later. :) If you want to ask questions and share tips over chat with other developers, see [[IRC]] for how to connect to #theos and #iphonedev.<br />
<br />
'''Hey developer, you can add your knowledge here! Yes, you! [http://iphonedevwiki.net/index.php?title=Special:UserLogin&returnto=Updating+extensions+for+iOS+8&type=signup Make an account and edit this page!]'''<br />
<br />
== What has changed in iOS 8? (Classes, frameworks, etc.) ==<br />
<br />
* The term 'Display Identifier' has been removed from SpringBoard. Methods that used the term usually have a 'Bundle Identifier' equivalent; e.g. -[SBApplicationController applicationWithDisplayIdentifier:] and -[SBApplication displayIdentifier] are now -[SBApplicationController applicationWithBundleIdentifier] and -[SBApplication bundleIdentifier]<br />
<br />
* "Has anyone looked into granting entitlements in iOS 8? It would appear the popular method of hooking "_XPCConnectionHasEntitlement" no longer works." "I haven't had a whole lot of time to do testing or look for better methods but I found "_BSAuditTokenTaskHasEntitlement" which appears to have a similar function to "_XPCConnectionHasEntitlement", its part of the "assertiond" process which must be hooked in order to access it, so far it's worked. More specifically, part of the "BaseBoard" private framework within "assertiond"."<br />
<br />
* PLBatteryPropertiesEntry no longer seems to exist for getting current battery info such as: <code>[PLBatteryPropertiesEntry batteryPropertiesEntry].currentCapacity</code>. You can still use:<br />
<source lang="objc"><br />
io_service_t powerSource = IOServiceGetMatchingService(kIOMasterPortDefault, IOServiceMatching("IOPMPowerSource"));<br />
CFNumberRef currentCapacityNum = (CFNumberRef)IORegistryEntryCreateCFProperty(powerSource, CFSTR(kIOPMPSCurrentCapacityKey), kCFAllocatorDefault, 0);<br />
</source><br />
<br />
* launchctl appears to be slightly broken. launchctl start and stop work perfectly, but launchctl load and unload break with the cryptic error message <code>/System/Library/LaunchDaemons/com.apple.mobile.installd.plist: The specified service path was not in the service cache</code><br />
<br />
* MISValidateSignatureAndCopyInfo appears to perform additional code-signing checks during app installation.<br />
<br />
* installd cannot be reloaded via launchctl.<br />
<br />
* NO PLS RECOVERY (which basically hot-patches <code>EnterRecovery</code> out of lockdownd using Substrate) still works in iOS 8.<br />
<br />
* Mobile application containers are at /var/mobile/Containers/Application<br />
<br />
* Looks like certain apps dont have privileges for IORegistryEntryCreateCFProperty anymore (Safari, Mail)<br />
<br />
* xTM3x has been doing some research into preference saving ([https://ghostbin.com/paste/mcgu3 log], file atomicity takes long enough to see the auxiliary files). It seems that the PostNotification from the [[Preferences specifier plist]] is now posted '''before''' the plist is updated on disk — as opposed to '''after''' the plist was updated on disk which was the case on iOS < 8 (unless I'm doing something terribly wrong!). These facts could mean that writing to file with <code>atomicity:YES</code> (as is custom) is slower than on previous iOS versions. This could be a bug on Apple's code and not an issue with developer's code. Either a patch should be made or wait for Apple to notice and fix it.<br />
<br />
* PrivateFrameworks (and possibly others) in the iOS 8 SDK are missing the __TEXT section. Frameworks must be extracted from a device's dyld_shared_cache using a tool like [http://www.newosxbook.com/index.php?page=downloads JTool] or IDA before they can be (statically) reverse engineered.<br />
<br />
* Many functions from SBMediaController have been removed, and it is now useless for accessing now playing information. The best alternative seems to be the MediaRemote framework.<br />
<br />
* You can no longer mount FAT-formatted storage devices via the CCK, only HFS.<br />
<br />
* "Has anyone figured out how to add subviews to UIAlertView in iOS 8 yet?" "I found a workaround so I can at least add to the content view (which is not the size of the full alert view though). Within a subclass of UIAlertView do <code>[[[[self _alertController] contentViewController] view] addSubview:theSubview];</code>. When not subclassing, <code>[[[[alertView _alertController] contentViewController] view] addSubview:theSubview];</code> should work, although one has to figure out the right time to do that."<br />
<br />
== What is new in iOS 8, and how does it work? ==<br />
<br />
* The view Reachability invokes is in the new framework FrontBoard - you can hook it. It is a FBWindowContextHostView.<br />
<br />
* FrontBoard is a new thing<br />
<br />
* Apple seems to call the iOS side Octavia and the OS X side Nero<br />
<br />
== Which tools and other preexisting things are still working on iOS 8? Which ones don't work? ==<br />
<br />
* The package <code>syslogd to /var/log/syslog</code> seems to not be working. [http://www.reddit.com/r/jailbreakdevelopers/comments/2k3b29/syslog_on_ios_8/ An alternative] - also as listed [http://theiphonewiki.com/wiki/System_Log on TheiPhoneWiki]. In other words: while the syslogd package doesn't work, installing socat and running <code>socat - UNIX-CONNECT:/var/run/lockdown/syslog.sock</code> still works on iOS 8. You can pipe it to a file if you want.<br />
<br />
* "Does Theos work on iOS 8?" [http://www.reddit.com/r/jailbreakdevelopers/comments/2k2eat/question_theos_and_ios_8/ uroboro responds here]<br />
<br />
* [http://www.reddit.com/r/jailbreakdevelopers/comments/2k6gft/list_installed_apps_on_ios_8/ AppList seems to not be compatible yet] - an official fix will be available soon.<br />
<br />
* libstatusbar seems to not be compatible yet, UIImage kitImageNamed returns null - while waiting for an official fix, if you need a version for testing, you could compile from [http://github.com/tateu/libstatusbar/tree/iOS8_Temp_Hack my patched source], it's a horrible hack, but it works as a temporary solution.<br />
<br />
* libsymbolicate doesn't work on 8... (VMUHeader is gone from Symbolication.framework)<br />
<br />
* RocketBootstrap seems to work<br />
<br />
* "What works for dumping classes on iOS 8? I've tried using classdumpdyld and classdumpz but none of them seem to work. I'm trying to dump them directly on an iPhone 6." "You could use class-dump for i386 and the iOS 8 simulator" "[http://stevenygard.com/projects/class-dump/ This class-dump works for me.]" "If you want to dump on your iPhone then just compile its source to ARM; IIRC its distributed binary is x86/64 only."<br />
<br />
== Random assorted other notes ==<br />
<br />
* [http://developer.limneos.net/index.php?ios=8.0 iOS 8.0 Headers] and [https://github.com/coolstar/iOS-8.1-SpringBoard-Headers another set of SpringBoard headers] (made with two different [[Reverse_Engineering_Tools#class-dump.2C_class_dump_z.2C_classdump-dyld|class dumping tools]]).<br />
<br />
* In things like SBStarkBanner* classes, Stark is the codename for the blur-heavy UI since iOS 7</div>
Dustin Howett
https://iphonedev.wiki/index.php?title=Theos/Setup&diff=2060
Theos/Setup
2014-02-04T22:01:50Z
<p>Dustin Howett: Reverted edits by JonasGessner (talk) to last revision by Britta</p>
<hr />
<div>== Purpose ==<br />
<br />
This page contains instructions for installing [[Theos]] and preparing a new project.<br />
<br />
== Requirements ==<br />
<br />
* A UNIX-based operating system (Mac OS X, iOS (jailbroken), and most variants of Linux should do)<br />
** subversion or git<br />
** curl<br />
** perl<br />
* Some form of a toolchain or official SDK<br />
* Access to a terminal emulator and some knowledge of how to use it<br />
* '''Objective-C knowledge'''<br />
<br />
More detailed explanations of these requirements are given in the next section, and are dependent on the environment you use.<br />
<br />
== Setting Up Dependencies ==<br />
<br />
=== For Mac OS X ===<br />
<br />
Mac OS X comes with most of the necessary tools (subversion, curl, and perl) by default.<br />
You will still need compilation tools and the iOS SDK, and the easiest way to obtain both of these is by installing the official [http://developer.apple.com/iphone/ iOS SDK] from Apple's web site. (You will have to register for a free developer account in order to download it.)<br />
<br />
=== For iOS ===<br />
<br />
* Install the SDK.<br />
<!-- What does this mean? --><br />
<br />
=== For Linux ===<br />
<br />
To be written.<br />
<br />
== Installing Theos ==<br />
<br />
=== On Mac OS X or Linux ===<br />
<br />
# Open a terminal window.<br />
# Choose a location for Theos to be installed. If you are unsure, a good choice is <tt>/opt/theos</tt>.<pre>export THEOS=/opt/theos</pre><br />
#* If you chose a location outside of your user's home directory, you will probably need to run some or all of the following commands with root permissions.<br />
# Download the latest version of Theos:<br />
#* Using git: <pre>git clone git://github.com/DHowett/theos.git $THEOS</pre><br />
#* Alternatively, you can use svn, if you prefer: <pre>svn co http://svn.howett.net/svn/theos/trunk $THEOS</pre><br />
# Download <tt>[[ldid]]</tt> to <tt>$THEOS/bin</tt>: <pre>git clone git://git.saurik.com/ldid.git&#10;cd ldid&#10;git submodule update --init&#10;./make.sh&#10;cp -f ./ldid $THEOS/bin/ldid</pre><br />
<br />
=== On iOS ===<br />
<br />
(On your iOS device:)<br />
<br />
# Create a file at <tt>/etc/apt/sources.list.d/coredev.nl.list</tt> containing the following line: <pre>deb http://coredev.nl/cydia iphone main</pre><br />
# Create a file at <tt>/etc/apt/sources.list.d/howett.net.list</tt> containing the following line: <pre>deb http://nix.howett.net/theos ./</pre><br />
# Make sure APT 0.6 Transitional Package is installed before doing this step.As root, issue these commands (using either SSH or MobileTerminal): <pre>apt-get update</pre><pre>apt-get install perl net.howett.theos</pre><br />
<br />
'''Note:''' Theos will be installed to <tt>/var/theos/</tt> on your device, hereafter referred to as <tt>$THEOS</tt> in this guide.<br />
<br />
== Creating a Project ==<br />
<br />
Theos lets you create new projects based on templates using the New Instance Creator (NIC). You do not need to be root to do this step, nor should you be. Start the NIC wizard using the following command:<br />
<br />
$THEOS/bin/nic.pl<br />
<br />
NIC will prompt you for all the necessary information before creating a project.<br />
<br />
=== NIC Example ===<br />
<br />
Here is an example of what you will see when using the NIC to create a project (with user input shown in bold):<br />
<br />
$ '''$THEOS/bin/nic.pl'''<br />
NIC 1.0 - New Instance Creator<br />
------------------------------<br />
[1.] iphone/application<br />
[2.] iphone/library<br />
[3.] iphone/preference_bundle<br />
[4.] iphone/tool<br />
[5.] iphone/tweak<br />
Choose a Template (required): '''1'''<br />
Project Name (required): '''iPhoneDevWiki'''<br />
Package Name [com.yourcompany.iphonedevwiki]: '''net.howett.iphonedevwiki'''<br />
Authour/Maintainer Name [Dustin L. Howett]: <br />
Instantiating iphone/application in iphonedevwiki/...<br />
Done.<br />
$<br />
<br />
The above will create a folder <tt>./iphonedevwiki</tt> in the current working directory - make sure you have permissions to create a folder.<br />
<br />
==Getting Started==<br />
You can learn how to do Makefiles with theos on http://uv.howett.net/ipf.html. Start over there.<br><br />
You can learn how to do nic templates on http://theos.howett.net/nic/.<br />
<br />
== Getting Help ==<br />
<br />
If you need further assistance, or if you have other questions about Theos itself, feel free to connect to #theos on irc.saurik.com using your preferred IRC client.</div>
Dustin Howett
https://iphonedev.wiki/index.php?title=Updating_extensions_for_iOS_7&diff=2049
Updating extensions for iOS 7
2014-01-29T01:39:08Z
<p>Dustin Howett: /* How to compile for ARMv6 and ARM64 */ Throw in a strict warning.</p>
<hr />
<div>This is an informal collection of advice; feel free to add to it and rearrange. A lot of this is from #theos on irc.saurik.com - if you're working on updating your tweaks and you use Theos, join in and share what you've learned (see [[IRC]]).<br />
<br />
== How to compile for ARM64 ==<br />
Tweak binaries must contain an ARM64 slice in order for it to be loaded into 64-bit processes. If you don't need to support iOS 4.2.1 or older, ensure Xcode 5 is installed and set <code>ARCHS</code> in your Makefile:<br />
<br />
<source lang="bash"><br />
ARCHS = armv7 arm64<br />
</source><br />
<br />
You will also need updated versions of any libraries that you link against which contain an arm64 slice. To get the updated Substrate dylib, see saurik's instructions below, starting from the <code>wget</code> of the Substrate deb.<br />
<br />
Apple hasn't yet released the source code of the Xcode 5 toolchain, so it is not yet possible to support ARM64 if you don't use OS X and Xcode's toolchain.<br />
<br />
== How to compile for ARMv6 and ARM64 ==<br />
{{Warning|Compiling for ARMv6 and ARM64 is useful in only a subset of normal situations. If you've made it this far and you do not have a particular reason to retain ARMv6 support, please see the above section.}}<br />
<br />
These instructions only use first-party components from Apple, DHowett, and saurik (and were written by saurik).<br />
<br />
The idea is that we are going to use parts of Xcode 4 (which you don't have to install: you might just have it sitting in /Volumes) to "fix" parts of Xcode 5 so that it can target armv6 (need Xcode 4.4.1).<br />
<br />
<source lang="bash"><br />
cd $Xcode5/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/5.0/lib/darwin/<br />
mv libclang_rt.ios.a libclang_rt.ios-7.0.a<br />
lipo -thin armv6 -output libclang_rt.ios-5.1.a $Xcode4/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/4.0/lib/darwin/libclang_rt.ios.a<br />
lipo -create -output libclang_rt.ios.a libclang_rt.ios-5.1.a libclang_rt.ios-7.0.a<br />
cd $Xcode5/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk/usr/lib/<br />
mv dylib1.o dylib1-7.0.o<br />
lipo -thin armv6 -output dylib1-5.1.o $Xcode4/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/usr/lib/dylib1.o<br />
lipo -create -output dylib1.o dylib1-5.1.o dylib1-7.0.o<br />
</source><br />
<br />
Then, we download Theos directly from DHowett's code repository, and add in the parts it needs from the various packages provided by saurik.<br />
<br />
<source lang="bash"><br />
sudo mkdir -p /opt/theos<br />
sudo chown "$(id -u):$(id -g)" /opt/theos<br />
cd /opt/theos<br />
git clone https://github.com/DHowett/theos.git .<br />
wget http://apt.saurik.com/debs/ldid_1:1.1.2_iphoneos-arm.deb<br />
ar p ldid_1:1.1.2_iphoneos-arm.deb data.tar.gz | tar -zxvf- --strip-components 2 ./usr/bin/ldid<br />
wget http://apt.saurik.com/debs/mobilesubstrate_0.9.5000_iphoneos-arm.deb<br />
ar p mobilesubstrate_0.9.5000_iphoneos-arm.deb data.tar.lzma >substrate.tar.lzma<br />
# ... extract the lama file; OS X doesn't come with an lzma utility :( ...<br />
tar -xvf substrate.tar --strip-components 3 ./Library/Frameworks/CydiaSubstrate.framework/<br />
ln -s ../CydiaSubstrate.framework/Headers/CydiaSubstrate.h include/substrate.h<br />
ln -s ../CydiaSubstrate.framework/CydiaSubstrate lib/libsubstrate.dylib<br />
</source><br />
<br />
Finally, in our Theos Makefile, we specify that we want to target iOS 2.0 using the 7.0 SDK, and that we want both ARMv6 and ARM64 slices.<br />
<br />
<source lang="bash"><br />
TARGET := iphone:7.0:2.0<br />
ARCHS := armv6 arm64<br />
</source><br />
<br />
=== Alternative method ===<br />
This is slightly more complicated. You need to compile an armv6 slice using the 5.1 SDK and another arm64 slice using the 7.0 SDK. You then stitch both together with lipo. [http://sharedinstance.net/2013/12/how-to-support-arm64/ This blog post] describes how to do that manually, but rpetrich has created a theos fork, which does that automatically for you.<br />
<br />
Setup rpetrich’s theos:<br />
<br />
<source lang="bash"><br />
export THEOS=/opt/theos-rpetrich<br />
sudo mkdir -p $THEOS<br />
sudo chown "$(id -u):$(id -g)" $THEOS<br />
cd $THEOS<br />
git clone https://github.com/rpetrich/theos .<br />
wget http://joedj.net/ldid<br />
mv ldid bin/ldid<br />
chmod +x bin/ldid<br />
wget http://cdn.hbang.ws/dl/libsubstrate_arm64.dylib<br />
mv libsubstrate_arm64.dylib lib/libsubstrate.dylib<br />
</source><br />
<br />
(note from rpetrich: theos should be as a submodule for my fork, not installed in a system path. system paths are dangerous)<br />
<br />
Install headers:<br />
<br />
<source lang="bash"><br />
cd $THEOS<br />
./git-submodule-recur.sh init<br />
git submodule update --recursive<br />
</source><br />
<br />
Setup the Makefile<br />
<br />
<source lang="bash"><br />
TARGET := iphone:clang<br />
THEOS_PLATFORM_SDK_ROOT_armv6 = /Applications/Xcode_4.4.1.app/Contents/Developer<br />
SDKVERSION_armv6 = 5.1<br />
TARGET_IPHONEOS_DEPLOYMENT_VERSION = 3.0<br />
TARGET_IPHONEOS_DEPLOYMENT_VERSION_arm64 = 7.0<br />
ARCHS = armv6 arm64<br />
<br />
TWEAK_NAME = iLogIt<br />
iLogIt_FILES = Tweak.xm<br />
<br />
include theos/makefiles/common.mk<br />
include $(THEOS_MAKE_PATH)/tweak.mk<br />
</source><br />
<br />
rpetrich's theos is using objc's hooking method instead of MobileSubstrate therefore it doesn't link with MS by default. This is OK if you are only hooking objc messages, but if you need to use MSHookFunction, you have to tell theos to link to lib substrate:<br />
<br />
<source lang="bash"><br />
iLogIt_LIBRARIES = substrate<br />
</source><br />
<br />
(note from saurik: I highly disrecommend not using Substrate's MSHookMessage implementation; I never understood why rpetrich doesn't use it, but on multiple occasions the way we hook messages has had to change, and centralizing it in Substrate means that I can fix it once for everyone's compiled extensions... this happened last as recently as iOS 5, and all of rpetrich's extensions had to be recompiled and redeployed, which is reasonably fine for him as he's insanely productive and around constantly, but for most people you should please just use the centralized implementation.)<br />
<br />
To use Substrate for hooking, add this add the top of your Logos source file (e.g., Tweak.xm)<br />
<source lang="c"><br />
%config(generator=MobileSubstrate);<br />
</source><br />
<br />
Example Projects:<br />
Take a look at the Makefiles of these projects:<br />
<br />
* https://dl.dropboxusercontent.com/u/15373/Other/iPhone/ilogit-tweak-ios7-example.tar<br />
* https://github.com/joedj/ExchangePolicyCleaner/blob/master/Makefile#L3<br />
* https://github.com/a3tweaks/Flipswitch<br />
<br />
== Updating code for ARM64 ==<br />
Read Apple's documentation on ARM64: [https://developer.apple.com/library/ios/documentation/General/Conceptual/CocoaTouch64BitGuide/ConvertingYourAppto64-Bit/ConvertingYourAppto64-Bit.html "Converting Your App to a 64-Bit Binary"]<br />
<br />
If you need to specifically test for 64-bit:<br />
<br />
<source lang="objc"><br />
#ifdef __LP64__<br />
NSLog(@"64-bit");<br />
#else<br />
NSLog(@"32-bit");<br />
#endif<br />
</source><br />
<br />
== Detecting iOS 7 ==<br />
<br />
Detecting whether code is being compiled for iOS 7.0 or higher:<br />
<br />
<source lang="objc"><br />
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_7_0<br />
[[UIApplication sharedApplication] setStatusBarStyle: UIStatusBarStyleLightContent animated: YES];<br />
#endif<br />
</source><br />
<br />
Note that this is a compile time check. To check for iOS 7 at runtime, compare against the CoreFoundation version:<br />
<br />
<source lang="objc"><br />
if (kCFCoreFoundationVersionNumber >= kCFCoreFoundationVersionNumber_iOS_7_0) {<br />
// do >= iOS 7 stuff<br />
} else {<br />
// do <= iOS 6 stuff<br />
}<br />
</source><br />
<br />
Apple often forgets to add new version number constants to their headers, so you may need to define the version numbers yourself:<br />
<br />
<source lang="objc"><br />
#ifndef kCFCoreFoundationVersionNumber_iOS_7_0<br />
#define kCFCoreFoundationVersionNumber_iOS_7_0 847.20<br />
#endif<br />
</source><br />
<br />
See [[CoreFoundation.framework]] for a full list.<br />
<br />
== Updating Cydia Depictions ==<br />
<br />
It's best to make the background transparent to make it match Cydia's background. Just add the following to your depiction's header:<br />
<br />
<source lang="html4strict"><br />
<script><br />
if (navigator.userAgent.search(/Cydia/) != -1) {<br />
document.body.classList.add("cydia");<br />
}<br />
</script><br />
</source><br />
<br />
And in your CSS:<br />
<br />
<source lang="css"><br />
body.cydia {<br />
background: none !important;<br />
}<br />
</source><br />
<br />
Cydia's table cell styling hasn't currently been changed to reflect the iOS 7 UI, so no other CSS needs updating.<br />
<br />
== Theos bootstrap.sh patch for ARM64 ==<br />
<br />
01:03:36 < therpgitbot> [theos] rpetrich pushed 1 new commit to master: http://git.io/ankV8g<br />
01:03:36 < therpgitbot> theos/master f6ebd79 Ryan Petrich: Workaround bootstrap problems on Xcode 5.x (temporary fix for now)<br />
<br />
== Dealing with 32-bit and 64-bit ==<br />
<br />
12:38:15 <%joedj> sbingner: i did find this question (and the response 2 posts down) interesting, i'm not sure what they're talking about: https://www.mikeash.com/pyblog/friday-qa-2013-09-27-arm64-and-you.html#comment-7436311d02c5a55738d1baefa03b0d34<br />
09:55:43 <@rpetrich> joedj: it's a bug with the components that communicate with the App Store<br />
<br />
== Theos and ldid errors ==<br />
<br />
19:02:14 < yoshbu> I've been off the jailbreak train for awhile now. Trying to reinstall theos, getting some build failures when trying to install ldid, anybody know if there's a quick fix?<br />
19:02:52 < yoshbu> like, error: unknown type name '__darwin_intptr_t'<br />
19:02:59 < yoshbu> and, error: unknown type name '__uint32_t'; did you mean 'uint32_t'?<br />
19:05:27 < Alcatraz> are you trying to compile ldid on mac?<br />
19:05:55 < yoshbu> following step 4 of http://iphonedevwiki.net/index.php/Theos/Getting_Started<br />
19:06:10 < Alcatraz> yeah compiling it has been broken for some time<br />
19:06:27 < Alcatraz> has to do with xcode 5<br />
19:06:32 < Alcatraz> pretty sure anyway<br />
19:06:50 < yoshbu> ldid is a dependency of theos though right?<br />
19:07:01 < Alcatraz> yeah. you can ask someone on here for a copy<br />
19:08:05 < ac3xx> yoshbu, wget http://ac3xx.com/ldid -O $THEOS/bin/ldid && chmod +x $THEOS/bin/ldid<br />
<br />
== Accessing the device's UDID ==<br />
UDID access is blocked by default on iOS7 and iOS will substitute a generated ID in UIDevice's uniqueIdentifier property. Use <code>MGCopyAnswer(CFSTR("UniqueDeviceID"))</code> and link against libMobileGestalt.dylib (<code>ProjectName_LIBRARIES = MobileGestalt</code>) to get access to the device ID from system processes or apps installed to /Applications. Device ID is completely inaccessible from app store processes and some daemons.<br />
<br />
For App Store apps, it appears you can still retrieve the UDID from MobileGestalt with a private entitlement:<br />
<br />
<source lang="xml"><br />
<key>com.apple.private.MobileGestalt.AllowedProtectedKeys</key><br />
<array><br />
<string>UniqueDeviceID</string><br />
</array><br />
</source><br />
<br />
== Ongoing issues ==<br />
* Apps installed to \Applications stop launching after a while with this error:<br />
Jan 22 11:40:44 iPhone-5s backboardd[12261] <Warning>: Launch Services: Registering unknown app identifier libactivator failed<br />
Jan 22 11:40:44 iPhone-5s backboardd[12261] <Warning>: Launch Services: Unable to find app identifier libactivator<br />
Jan 22 11:40:44 iPhone-5s backboardd[12261] <Warning>: Can't create application "libactivator" without a bundle path<br />
<br />
Or their icons disappear after this happens:<br />
Jan 22 23:49:42 iPhone-5s lsd[11724] <Warning>: LaunchServices: Updating identifier store<br />
Jan 22 23:49:43 iPhone-5s /usr/libexec/lsd[11724] <Error>: Need to synchronize with MobileInstallation<br />
Jan 22 23:49:44 iPhone-5s /usr/libexec/lsd[11724] <Notice>: LaunchServices: Adding com.malcolmhall.PhoneNumberTest to unregister list<br />
Jan 22 23:49:44 iPhone-5s /usr/libexec/lsd[11724] <Notice>: LaunchServices: Adding com.malcolmhall.AppWhere to unregister list<br />
Jan 22 23:49:44 iPhone-5s /usr/libexec/lsd[11724] <Notice>: LaunchServices: Adding libactivator to unregister list<br />
Jan 22 23:49:44 iPhone-5s lsd[11724] <Warning>: LaunchServies: No placeholder bundle to remove for com.malcolmhall.AppWhere.<br />
<br />
* CPDistributedMessagingCenter, XPC and other IPC methods built on top of bootstrap registered mach services don't work, you get deny lookup in the Xcode console.<br />
===Workaround===<br />
rpetrich has built a workaround called RocketBootstrap: ''"One common way processes communicate with each other on iOS and OS X is through a messaging system called mach ports. Each port is a channel that can either receive or send messages. There is a central registration system for these ports called bootstrap, where ports can be registered and accessed by a service name assigned to them. Recent versions of iOS restrict which names a process can access—MobileMail, MobileSafari and App Store apps are only allowed to access a very specific set of services that come with iOS. RocketBootstrap adds a secondary lookup service that doesn't restrict which processes can access which services."''<br />
<br />
Install this from Cydia or add a depends to your deb of com.rpetrich.rocketbootstrap.<br />
Download bootstrap.h and rocketbootstrap.h from https://github.com/rpetrich/RocketBootstrap/tree/master<br />
You will also need to copy `librocketbootstrap.dylib` from `/usr/lib` on your iDevice to `$THEOS/lib` and link against it in your Makefile:<br />
<source lang="bash"><br />
myTweak_LIBRARIES = rocketbootstrap<br />
</source><br />
<br />
Example Usage (server inside a SpringBoard tweak):<br />
<br />
<source lang="objc"><br />
#import "rocketbootstrap.h"<br />
<br />
CPDistributedMessagingCenter *c = [CPDistributedMessagingCenter centerNamed:@"com.mycompany.myCenter"];<br />
// apply rocketbootstrap regardless of iOS version (via rpetrich)<br />
rocketbootstrap_distributedmessagingcenter_apply(c);<br />
[c runServerOnCurrentThread];<br />
[c registerForMessageName:@"myMessageName" target:myTarget selector:@selector(handleMessageNamed:withUserInfo:)];<br />
</source><br />
<br />
Example Usage (client from sandboxed app):<br />
<source lang="objc"><br />
#import "rocketbootstrap.h"<br />
<br />
CPDistributedMessagingCenter *c = [%c(CPDistributedMessagingCenter) centerNamed:@"com.mycompany.myCenter"];<br />
rocketbootstrap_distributedmessagingcenter_apply(c);<br />
[c sendMessageName:@"myMessageName" userInfo:nil]; //send an NSDictionary here to pass data<br />
</source><br />
<br />
If you want to run a server inside a daemon, then you still need a simple SpringBoard tweak, that just has to call bootstrap_unlock with the service name (take the code from the rocket bootstrap header and include bootstrap.h). Then you can run a server with the same name inside your daemon. rocketbootstrap_distributedmessagingcenter_apply must still be called on both the server and on the clients. It even works for sendMessageAndReceiveReplyName.<br />
<br />
<br />
* Printing a stack trace doesn't show symbols.<br />
* Wee apps' (Notification Center widgets) principal class must now be a view controller subclass instead of implementing a protocol.<br />
* Hooking a method that uses a struct gives wrong layout of fields on arm64. You may need to #pragma pack(push,4) before and then #pragma pack(pop) after the struct however you really need to use the debugger and view the memory to understand for sure what's happening.<br />
* Using MSHookMessage arm64 requires the original function pointer to declare the parameters or it seg faults at runtime.<br />
* After copying an app to /Applications and respringing, sometimes the icon doesn't appear. Also if it was there before sometimes it can disappear.</div>
Dustin Howett
https://iphonedev.wiki/index.php?title=Open_Source_Projects&diff=1687
Open Source Projects
2013-11-23T04:30:00Z
<p>Dustin Howett: /* Developer libraries */ PreferenceLoader is now LGPL</p>
<hr />
<div>This page is an attempt to catalogue most of the open source jailbreak projects available online.<br />
<br />
A bit of background information: If a project does not explicitly have a license that gives you the right to use its code, that means it is copyrighted by the developer and you can't use its code in your own projects - in other words, you can read it and learn from it, but don't copy and paste it. If you've published a project that does not have a free license, and you'd like people to be able to use your code if they want to, [http://www.gnu.org/licenses/license-recommendations.html How to choose a license for your own work] and [http://choosealicense.com/ Choose A License] may be helpful.<br />
<br />
== Tweaks ==<br />
<br />
Also check out [http://tweakweek.com/ TweakWeek] for a long list of relatively simple open source tweaks, organized by rpetrich.<br />
<br />
{| class="wikitable sortable"<br />
|-<br />
! Project !! Author !! Compatibility !! Updated (as of Nov 2013) !! License !! Short description<br />
|-<br />
| [https://github.com/trenskow/AirFloat AirFloat] || trenskow || iOS ? - 6 || 2013-07-13 || BSD? || AirPlay audio (AirTunes) for iOS<br />
|-<br />
| [https://github.com/EthanArbuckle/AlienBlueTags AlienBlueTags] || EthanArbuckle || iOS 6 || 2013-11-06 || ? || adds Reddit user tagging to AlienBlue<br />
|-<br />
| [https://github.com/rpetrich/AllowRotate AllowRotate] || rpetrich || iOS ? || 2010-10-03 || ? || <br />
|-<br />
| [https://github.com/Chronic-Dev/animate animate] || Chronic-Dev Team et al. || iOS 4.2.1 || 2011-07-10 || © || customize boot logo animations<br />
|-<br />
| [https://github.com/nickfrey/AnyLockApp AnyLockApp] || nickfrey || iOS 5 - 6 || 2012-02-04 || ? || change lockscreen camera shortcut<br />
|-<br />
| [https://github.com/Xuzz/tweaks/tree/master/appslide Appslide] || Xuzz || iOS 4.2 - ? || 2013-02-16 || BSD || use home button to go back<br />
|-<br />
| [https://github.com/rpetrich/AutocorrectionBar AutocorrectionBar] || rpetrich || iOS 4.3 - 5 || 2011-11-09 || ? || enable hidden keyboard feature<br />
|-<br />
| [https://github.com/jontelang/Boover Boover] || jontelang || iOS 5 - 6.1 || 2013-03-24 || ? || move icon badges<br />
|-<br />
| [https://github.com/hbang/BrightVol BrightVol] || hbang || iOS ? || 2013-05-22 || GPL || Control brightness with volume buttons (using Activator)<br />
|-<br />
| [https://github.com/rpetrich/BrowserChooser BrowserChooser] || rpetrich || iOS 5 - 6 || 2013-03-22 || ? || switch default browsers<br />
|-<br />
| [https://github.com/PoomSmart/Burst-Mode Burst mode] || PoomSmart || iOS 5 - 6 || 2013-11-17 || MIT || iOS 7 Burst mode-like for iOS 5&6<br />
|-<br />
| [https://github.com/PoomSmart/CamRotate CamRotate] || PoomSmart || iOS 5 - 6 || 2013-11-17 || MIT || design camera rotation<br />
|-<br />
| [https://github.com/PoomSmart/CamVolZoom CamVolZoom] || PoomSmart || iOS 5 - 6 || 2013-11-17 || MIT || use volume buttons for camera zooming<br />
|-<br />
| [https://github.com/rpetrich/ClearNotifications ClearNotifications] || rpetrich || iOS 5 - ? || 2012-02-03 || ? || clear lock screen notifications with a swipe<br />
|-<br />
| [https://github.com/insanj/Cleary Cleary] || insanj || iOS 6 || 2013-08-24 || BSD || create Clear tasks using Activator<br />
|-<br />
| [https://github.com/DHowett/cydelete Cydelete] || DHowett || iOS 2 - 5 || 2011-10-09 || GPLv3 || delete Cydia apps from Springboard<br />
|-<br />
| [http://gitweb.saurik.com/cydget.git Cydget] ([[Cydget]]) || saurik || iOS 2.2 - 6.1 || 2013-03-22 || BSD || manage lockscreen plugins<br />
|-<br />
| [https://github.com/rpetrich/DeepEnd DeepEnd] || rpetrich || iOS 4 - ? || 2011-01-31 || ? || 3D effect for Springboard<br />
|-<br />
| [https://github.com/rpetrich/DietBar DietBar] || rpetrich || iOS 3 - 6 || 2012-06-23 || ? || shrink navigation bars<br />
|-<br />
| [https://github.com/rpetrich/DietBulletins DietBulletins] || rpetrich || iOS 4 - 6 || 2013-09-10 || ? || shrink notification bulletins<br />
|-<br />
| [https://github.com/rpetrich/DisplayEffects DisplayEffects] || rpetrich || iOS 3 - ? || 2011-01-18 || ? || experimental effects for iOS<br />
|-<br />
| [https://github.com/PoomSmart/FaceDetectionDuringVideo FaceDetectionDuringVideo] || PoomSmart || iOS 6 || 2013-11-17 || MIT || enable Face Detection when start video recording<br />
|-<br />
| [https://github.com/rpetrich/FastBlurredNotificationCenter FastBlurredNotificationCenter] || rpetrich || iOS 5 - ? || 2012-03-03 || GPL || blurs notification center background<br />
|-<br />
| [https://github.com/Xuzz/tweaks/tree/master/five-icon-switcher Five Icon Switcher] || Xuzz || iOS 4 - ? || 2011-09-24 || BSD || five icons in app switcher<br />
|-<br />
| [https://github.com/PoomSmart/Flashorama Flashorama] || PoomSmart || iOS 6 || 2013-11-17 || MIT || toggle torch in Panorama mode<br />
|-<br />
| [https://github.com/PoomSmart/FrontFlash FrontFlash] || PoomSmart || iOS 4 - 6 || 2013-11-17 || MIT || simulate flash in Front-Facing camera by flashing the screen<br />
|-<br />
| [https://github.com/PoomSmart/Front-HDR Front HDR] || PoomSmart || iOS 6 - 7 || 2013-11-17 || MIT || enable HDR in Front-Facing camera<br />
|-<br />
| [https://github.com/rpetrich/FullForce FullForce] || rpetrich || iOS 3.2 - ? || 2011-11-08 || GPL || force applications to show in iPad mode<br />
|-<br />
| [https://github.com/Xuzz/tweaks/tree/master/fullwebclips FullWebClips] || Xuzz || iOS ? || 2011-07-21 || BSD || make Web Clips fullscreen<br />
|-<br />
| [https://github.com/DarkMalloc/Glue Glue] || DarkMalloc || iOS ? || 2011-06-29 || ? || share a note with Pastie from the Notes app<br />
|-<br />
| [https://github.com/insanj/GoogleSearchforVelox GoogleSearchforVelox] || insanj || iOS 6 || 2013-08-24 || BSD || quick search from the Google app<br />
|-<br />
| [https://github.com/FilippoBiga/Harlem-Shake Harlem Shake] || FilippoBiga || iOS 6 || 2013-03-11 || ? || make SpringBoard icons dance<br />
|-<br />
| [https://github.com/Xuzz/tweaks/tree/master/hookslaw %hook's law] || Xuzz || iOS 6 || 2013-02-16 || BSD || makes animations springier<br />
|-<br />
| [https://github.com/rpetrich/IconRenamer IconRenamer] || rpetrich || iOS 4 - ? || 2011-10-16 || ? || rename icons from your SpringBoard<br />
|-<br />
| [https://github.com/rpetrich/IconRotator IconRotator] || rpetrich || iOS 5 - 6 || 2013-02-16 || GPL || rotates icons<br />
|-<br />
| [https://github.com/patelhiren/iannounce iAnnounce] || patelhiren || iOS 4 - 6 || 2013-03-01 || ? || announce incoming caller's name<br />
|-<br />
| [https://github.com/zephster/InAMinute InAMinute] || zephster || iOS 6 || 2013-08-24 || ? || fine-grained time selection system-wide<br />
|-<br />
| [https://github.com/Xuzz/tweaks/tree/master/internalizer Internalizer] || Xuzz || iOS ? || 2011-07-22 || BSD || Add text to your lockscreen<br />
|-<br />
| [https://github.com/BGerard/IPSlider IPSlider] || BGerard || iOS ? || 2013-11-15 || GPL 2 || set "slide to unlock" message to IP address<br />
|-<br />
| [https://github.com/rpetrich/ListLauncher ListLauncher] || rpetrich || iOS 4 - ? || 2011-02-05 || ? || launch apps from Spotlight<br />
|-<br />
| [https://github.com/rpetrich/LiveClock LiveClock] || rpetrich || iOS 3 - 6 || 2013-02-04 || ? || animated clock icon on SpringBoard<br />
|-<br />
| [https://github.com/rpetrich/LivePaper LivePaper] || rpetrich et al. || iOS 4 - ? || 2011-07-20 || ? || live wallpaper with plugins<br />
|-<br />
| [https://github.com/PoomSmart/LLBPano LLBPano] || PoomSmart || iOS 6 || 2013-11-17 || MIT || Enable Low-light mode in Panorama<br />
|-<br />
| [https://github.com/conradev/Tweaks/tree/master/lockseconds LockSeconds] || conradev || iOS ? || 2012-06-02 || ? || add seconds to lockscreen clock<br />
|-<br />
| [https://github.com/hbang/MapsOpener MapsOpener] || hbang || iOS ? - 6 || 2013-05-22 || GPL || open Google Maps links in the Google Maps app<br />
|-<br />
| [https://github.com/rpetrich/MathAlarm MathAlarm] || rpetrich || iOS 4.2 - ? || 2012-01-10 || ? || solve arithmetic problems to turn off alarm<br />
|-<br />
| [https://github.com/FreeManRepo/MediaSpeak MediaSpeak] || freemanrepo || iOS ? || 2012-04-15 || ? || speak currently playing song<br />
|-<br />
| [https://github.com/b3ll/MessageBox MessageBox] || b3ll || iOS 6 || 2013-05-02 || BSD || use Chat Heads outside Facebook app<br />
|-<br />
| [https://github.com/rpetrich/MoreLinesNotificationCenter MoreLinesNotificationCenter] || rpetrich || iOS 5 - ? || 2011-10-16 || ? || more lines in notification center<br />
|-<br />
| [https://github.com/rpetrich/Multi-Slide Multi-Slide] || rpetrich and InfectionFX || iOS ? || 2011-06-19 || WTFPL || multiple unlock sliders<br />
|-<br />
| [https://github.com/rpetrich/MusicBanners MusicBanners] || rpetrich || iOS 5 - ? || 2012-04-08 || GPL || track change bulletins with album art in SpringBoard<br />
|-<br />
| [https://github.com/hbang/NCPad NCPad] || hbang || iOS ? - 6 || 2013-05-22 || MIT || resize notification banners to iPad screen width<br />
|-<br />
| [https://github.com/rpetrich/NoClearHistory NoClearHistory] || rpetrich || iOS 3 - ? || 2010-09-29 || ? || don't allow clearing history<br />
|-<br />
| [https://github.com/Xuzz/tweaks/tree/master/no-dots No Dots] || Xuzz || iOS ? || 2010-11-27 || BSD || no page dots<br />
|-<br />
| [https://github.com/rpetrich/NoNewsIsGoodNews NoNewsIsGoodNews] || rpetrich || iOS 5 - 6 || 2011-12-28 || ? || hide Newsstand icon<br />
|-<br />
| [https://github.com/conradev/Tweaks/tree/master/nopasscodeblock NoPasscodeBlock] || conradev || iOS ? - 6 || 2013-02-05 || ? || prevent permanent passcode locking<br />
|-<br />
| [https://github.com/nickfrey/NowNow NowNow] || nickfrey || iOS ? - 6 || 2013-11-10 || ? || invoke Google Voice Search using Activator<br />
|-<br />
| [https://github.com/n00neimp0rtant/OpenNotifier OpenNotifier] || n00neimp0rtant and Lunat1k || iOS 3.2 - ? || 2013-04-18 || ? || notification icons for your status bar<br />
|-<br />
| [https://github.com/PoomSmart/PanoEnabler PanoMod] || PoomSmart || iOS 6 || 2013-11-17 || MIT || enable Panorama and customize it<br />
|-<br />
| [https://github.com/rpetrich/PagePusher PagePusher] || rpetrich || iOS 4 - ? || 2011-06-02 || ? || page-styled app animations<br />
|-<br />
| [https://github.com/PoomSmart/PhotoTorch PhotoTorch] || PoomSmart || iOS 6 || 2013-11-17 || MIT || Adjustable Torch in Photo Camera mode<br />
|-<br />
| [https://github.com/protosphere/pinnacle Pinnacle] || ProtoSphere || iOS ? || 2013-04-02 || ? || hold back button to go to top-level page<br />
|-<br />
| [https://github.com/b3ll/PostOffice PostOffice] || b3ll || iOS 6 || 2013-06-19 || BSD || forward iOS notifications to Google Glass<br />
|-<br />
| [https://github.com/rpetrich/ProSwitcher ProSwitcher] || rpetrich and chpwn || iOS 3 - ? || 2010-09-18 || ? || Palm Pre-style application switcher<br />
|-<br />
| [https://github.com/rpetrich/PullToDismiss PullToDismiss] || rpetrich || iOS 3.2 - ? || 2011-12-30 || ? || pull down to dismiss keyboard<br />
|-<br />
| [https://github.com/rpetrich/QuickReply QuickReply] || rpetrich || iOS 2 - 4 || 2011-04-24 || whatever || quick reply for SMS<br />
|-<br />
| [https://github.com/PoomSmart/Record--n--Torch Record 'n' Torch] || PoomSmart || iOS 5 - 6 || 2013-11-17 || MIT || toggle Torch while recording video<br />
|-<br />
| [https://github.com/rpetrich/RotationInhibitor RotationInhibitor] || rpetrich || iOS 3 - 6.1 || 2013-02-04 || ? || disable device rotation<br />
|-<br />
| [https://github.com/rpetrich/RunningIndicator RunningIndicator] || rpetrich || iOS 4 - 6 || 2013-05-29 || ? || running app icons glow<br />
|-<br />
| [https://github.com/rpetrich/SBCustomIcon SBCustomIcon] || rpetrich || iOS ? || 2009-02-09 || ? || <br />
|-<br />
| [https://github.com/conradev/Tweaks/tree/master/searchclear SearchClear] || conradev || iOS ? || 2012-06-24 || ? || clears the search field after a search<br />
|-<br />
| [https://github.com/rpetrich/SliderBar SliderBar] || rpetrich || iOS 3 - ? || 2011-06-06 || ? || quick scrolling in all table views<br />
|-<br />
| [https://github.com/insanj/SliderKiller SliderKiller] || insanj || iOS 6 || 2013-08-24 || BSD || always "slide to unlock" instead of "slide to reply"<br />
|-<br />
| [https://github.com/rpetrich/SplitMail SplitMail] || rpetrich || iOS 3.2 - ? || 2012-02-02 || ? || split-style iPad mail app in portrait<br />
|-<br />
| [https://github.com/PoomSmart/Still-Capture-Enabler-2 Still Capture Enabler 2] || PoomSmart || iOS 4 - 7 || 2013-11-17 || MIT || Take still during video recording<br />
|-<br />
| [https://svn.bingner.com/SAM Subscriber Artificial Module (SAM)] || sbingner || iOS 3 - ? || 2013-06-07 || LGPL || <small>(Login: username "anonymous", no password. [https://repo.bingner.com/websvn/ Web view].)</small><br />
|-<br />
| [https://github.com/freerunnering/SwipeSelection SwipeSelection] || freerunnering || iOS 4 - 6 || 2013-04-20 || ? || edit text with keyboard gestures<br />
|-<br />
| [https://github.com/r-plus/SwipeShiftCaret SwipeShiftCaret] || r-plus || iOS 4 - 6 || 2013-11-09 || ISC || edit text with keyboard gestures<br />
|-<br />
| [https://github.com/Xuzz/tweaks/tree/master/switcherscape SwitcherScape] || Xuzz || iOS ? || 2011-07-22 || BSD || app switcher in landscape mode<br />
|-<br />
| [https://github.com/rpetrich/SwitcherMod SwitcherMod] || rpetrich and Optimo || iOS 4 - ? || 2011-12-31 || ? || customized app switcher<br />
|-<br />
| [https://github.com/rpetrich/SwitchIcons SwitchIcons] || rpetrich || iOS 5 - 6 || 2013-09-20 || ? || example tweak for Flipswitch<br />
|-<br />
| [https://github.com/bd452/TapTapPass TapTapPass] || bd452 || iOS 6 || 2013-10-10 || ? || gesture-based passcode toggle<br />
|-<br />
| [https://github.com/rpetrich/TopographyForGoogleMaps TopographyForGoogleMaps] || rpetrich || iOS 5.1 - ? || 2012-12-25 || ? || enable hidden topography view<br />
|-<br />
| [https://github.com/PoomSmart/TransparentCameraBar TransparentCameraBar] || PoomSmart || iOS 4 - 6 || 2013-11-17 || MIT || set camera bar opacity or shrink it<br />
|-<br />
| [https://github.com/hbang/TypeStatus TypeStatus] || hbang || iOS ? - 6 || 2013-09-25 || Apache 2.0 || iMessage typing indicators for the status bar<br />
|-<br />
| [https://github.com/bushe/Unlock7 Unlock7] || bushe || iOS 6 || 2013-11-01 || ? || adds some iOS 7 lockscreen features to iOS 6<br />
|-<br />
| [https://github.com/PoomSmart/RenameFolderWithoutName Unrestricted Folders Naming] || PoomSmart || iOS 5 - 6 || 2013-11-17 || © || folder name spacing will remain, can rename folder to whatever<br />
|-<br />
| [https://github.com/Cykey/Uninstall-Application-Size Uninstall Application Size] || Cykey || iOS 6 || 2013-09-26 || ? || shows application size when prompting to uninstall<br />
|-<br />
| [https://github.com/conradev/UserAgentFaker UserAgentFaker] || conradev || iOS ? || 2012-04-12 || ? || user agent faker for browsers<br />
|-<br />
| [https://github.com/coolstar/vassistant VAssistant] || coolstar || iOS 5 - 5.1.1 || 2012-12-08 || GPL 3 || <br />
|-<br />
| [http://gitweb.saurik.com/veency.git Veency] || saurik || iOS ? - 6.1 || 2013-02-03 || AGPL 3.0 || VNC server<br />
|-<br />
| [https://github.com/rpetrich/VideoPace VideoPace] || rpetrich || iOS 4.3 - 6 || 2013-08-04 || ? || increase speed of video playback<br />
|-<br />
| [https://github.com/rpetrich/VoiceKeys VoiceKeys] || rpetrich || iOS 4 - ? || 2011-11-27 || ? || voice recognition using Google's service<br />
|-<br />
| [https://github.com/rpetrich/WebGLEnabler WebGLEnabler] || rpetrich || iOS 4.2 - ? || 2011-07-24 || ? || Enable WebGL support in apps that use UIWebView<br />
|-<br />
| [https://github.com/rpetrich/WebPreview WebPreview] || rpetrich || iOS 3 - ? || 2011-02-17 || ? || preview web links in a popup<br />
|-<br />
| [https://github.com/Xuzz/tweaks/tree/master/webscrollian Webscrollian] || Xuzz || iOS ? || 2011-07-28 || BSD || faster scrolling for web content<br />
|-<br />
| [https://github.com/iMokhles/whatsapplstimest WhatsApp LSeen TimeStamp] || iMokhles || iOS 5 - 6 || 2013-09-03 || ? || toggle WhatsApp timestamp without waiting 24 hours<br />
|-<br />
| [https://github.com/rpetrich/WiCarrier WiCarrier] || rpetrich || iOS 3 - ? || 2012-04-07 || GPL || show WiFi network name/IP in place of carrier view<br />
|-<br />
| [https://github.com/jlippold/WifiSMS WifiSMS] || jlippold || iOS 4 - 5 || 2012-04-08 || ? || iPhone webserver gateway for SMS<br />
|-<br />
| [http://gitweb.saurik.com/winterboard.git Winterboard] || saurik || iOS 2 - 6.1 || 2013-09-07 || BSD? || advanced theming system<br />
|}<br />
<br />
== Applications ==<br />
<br />
{| class="wikitable sortable"<br />
|-<br />
! Project !! Author !! Compatibility !! Updated (as of Nov 2013) !! License !! Short description<br />
|-<br />
| [http://gitweb.saurik.com/cydia.git Cydia] || saurik || iOS 2 - 6 || 2012-09-21 || Modified BSD || Graphical APT frontend<br />
|-<br />
| [https://code.google.com/p/mobileterminal/ MobileTerminal] || (multiple) || iOS 3.2 - 6 || 2011-10-26 || GPL 2 || Terminal emulator<br />
|-<br />
| [https://github.com/coolstar/RecordMyScreen/ RecordMyScreen] || coolstar || iOS 5 - 6 || 2013-07-22 || MIT || Screen Recorder<br />
|-<br />
| [https://github.com/InfiniDev/nds4ios nds4ios] || (multiple) || iOS 5 - 7 || 2013-11-11 || ? || Nintendo DS emulator<br />
|-<br />
| [https://github.com/hrydgard/ppsspp PPSSPP] || (multiple) || iOS 5 - 7 || 2013-11-17 || GPL || Sony PlayStation Portable emulator<br />
|}<br />
<br />
== Tools ==<br />
<br />
{| class="wikitable sortable"<br />
|-<br />
! Project !! Source !! Author !! Compatibility !! Updated (As of Nov 2013) !! License !! Short description<br />
|-<br />
| [[Airscan]] || [https://github.com/Cykey/airscan] || Cykey || iOS ? - 6 || 2013-08-12 || ? || iOS command-line WiFi scanner<br />
|-<br />
| [[CaptainHammer]] || [https://github.com/rpetrich/CaptainHammer] || rpetrich || iOS 3 - 6 || 2013-05-10 || GPL 3 || Simple debugging tools for iOS<br />
|-<br />
| [[Open]] || [https://github.com/conradev/Open] || conradev || iOS ? - 6 || 2013-07-24 || ? || Open apps from shell on iOS<br />
|-<br />
| [[sbutils]] || [https://github.com/innoying/iOS-sbutils] || innoying || iOS ? - 6 || 2012-25-01 || ? || A collection of utilities to access iOS functions via the command line<br />
|-<br />
| [[Theos]] || [https://github.com/DHowett/theos] || DHowett || - || 2013-11-06 || GPL 3 || Unified cross-platform iPhone Makefile system<br />
|-<br />
|}<br />
<br />
== Developer libraries ==<br />
<br />
{| class="wikitable sortable"<br />
|-<br />
! Project !! Source !! Author !! Compatibility !! Updated (As of Nov 2013) !! License !! Short description<br />
|-<br />
| [[AppList]] || [https://github.com/rpetrich/AppList] || rpetrich || iOS 3 - 6 || 2013-08-17 || ? || Allow extensions to read the list of installed apps<br />
|-<br />
| [[BTstack]] || [http://btstack.org] || mringwal || iOS 3 - 6 || 2013-04-09 || dual license || Bluetooth stack with SDP, RFCOMM, and, L2CAP APIs<br />
|-<br />
| [[Flipswitch]] || [https://github.com/a3tweaks/Flipswitch] || rpetrich and Jack Willis || iOS ? - 6 || 2013-11-08 || LGPL || Centralized toggle system for iOS<br />
|-<br />
| [[HidSupport]] || [https://code.google.com/p/hid-support] || mringwal || iOS 3 - 6 || 2013-05-07 || BSD New || Key and touch injection library<br />
|-<br />
| [[IconSupport]] || [https://github.com/Xuzz/IconSupport] || Sakurina, chpwn, ashikase || iOS 3 - 6 || 2013-09-14 || ? || Safe icon support library<br />
|-<br />
| [[Libactivator]] || [https://github.com/rpetrich/libactivator] || rpetrich || iOS 3 - 6 || 2012-06-05 || LGPL || Centralized gestures and button management<br />
|-<br />
| [[LibDisplay]] || [https://github.com/freerunnering/LibDisplay] || freerunnering || iOS ? - 6 || 2013-02-07 || ? || Manage display stacks (pre-iOS 6) and manage running applications<br />
|-<br />
| [[Libdisplaystack]] || [https://github.com/Zimm/libdisplaystack] || Zimm || iOS ? || 2010-12-30 || non-commercial || Library for launching and exiting apps<br />
|-<br />
| [[Libhide]] || [https://github.com/big-boss/Libhide] || BigBoss || iOS ? || 2011-10-13 || ? || A library for hiding icons from Springboard<br />
|-<br />
| [[Libstatusbar]] || [https://github.com/phoenix3200/libstatusbar] || phoenix3200 || iOS 3 - 6 || 2013-02-07 || ? || Custom statusbar icon library<br />
|-<br />
| [[PreferenceLoader]] || [https://github.com/DHowett/preferenceloader] || DHowett || iOS ? - 6 || 2013-05-10 || LGPLv3 || Allows developers to add entries to Settings.app<br />
|-<br />
| [[SearchLoader]] || [https://github.com/theiostream/SearchLoader] || theiostream || iOS ? - 6 || 2013-07-22 || ? || Loads search bundles<br />
|}</div>
Dustin Howett
https://iphonedev.wiki/index.php?title=Open_Source_Projects&diff=1686
Open Source Projects
2013-11-22T22:37:08Z
<p>Dustin Howett: </p>
<hr />
<div>This page is an attempt to catalogue most of the open source jailbreak projects available online.<br />
<br />
A bit of background information: If a project does not explicitly have a license that gives you the right to use its code, that means it is copyrighted by the developer and you can't use its code in your own projects - in other words, you can read it and learn from it, but don't copy and paste it. If you've published a project that does not have a free license, and you'd like people to be able to use your code if they want to, [http://www.gnu.org/licenses/license-recommendations.html How to choose a license for your own work] and [http://choosealicense.com/ Choose A License] may be helpful.<br />
<br />
== Tweaks ==<br />
<br />
Also check out [http://tweakweek.com/ TweakWeek] for a long list of relatively simple open source tweaks, organized by rpetrich.<br />
<br />
{| class="wikitable sortable"<br />
|-<br />
! Project !! Author !! Compatibility !! Updated (as of Nov 2013) !! License !! Short description<br />
|-<br />
| [https://github.com/trenskow/AirFloat AirFloat] || trenskow || iOS ? - 6 || 2013-07-13 || BSD? || AirPlay audio (AirTunes) for iOS<br />
|-<br />
| [https://github.com/EthanArbuckle/AlienBlueTags AlienBlueTags] || EthanArbuckle || iOS 6 || 2013-11-06 || ? || adds Reddit user tagging to AlienBlue<br />
|-<br />
| [https://github.com/rpetrich/AllowRotate AllowRotate] || rpetrich || iOS ? || 2010-10-03 || ? || <br />
|-<br />
| [https://github.com/Chronic-Dev/animate animate] || Chronic-Dev Team et al. || iOS 4.2.1 || 2011-07-10 || © || customize boot logo animations<br />
|-<br />
| [https://github.com/nickfrey/AnyLockApp AnyLockApp] || nickfrey || iOS 5 - 6 || 2012-02-04 || ? || change lockscreen camera shortcut<br />
|-<br />
| [https://github.com/Xuzz/tweaks/tree/master/appslide Appslide] || Xuzz || iOS 4.2 - ? || 2013-02-16 || BSD || use home button to go back<br />
|-<br />
| [https://github.com/rpetrich/AutocorrectionBar AutocorrectionBar] || rpetrich || iOS 4.3 - 5 || 2011-11-09 || ? || enable hidden keyboard feature<br />
|-<br />
| [https://github.com/jontelang/Boover Boover] || jontelang || iOS 5 - 6.1 || 2013-03-24 || ? || move icon badges<br />
|-<br />
| [https://github.com/hbang/BrightVol BrightVol] || hbang || iOS ? || 2013-05-22 || GPL || Control brightness with volume buttons (using Activator)<br />
|-<br />
| [https://github.com/rpetrich/BrowserChooser BrowserChooser] || rpetrich || iOS 5 - 6 || 2013-03-22 || ? || switch default browsers<br />
|-<br />
| [https://github.com/PoomSmart/Burst-Mode Burst mode] || PoomSmart || iOS 5 - 6 || 2013-11-17 || MIT || iOS 7 Burst mode-like for iOS 5&6<br />
|-<br />
| [https://github.com/PoomSmart/CamRotate CamRotate] || PoomSmart || iOS 5 - 6 || 2013-11-17 || MIT || design camera rotation<br />
|-<br />
| [https://github.com/PoomSmart/CamVolZoom CamVolZoom] || PoomSmart || iOS 5 - 6 || 2013-11-17 || MIT || use volume buttons for camera zooming<br />
|-<br />
| [https://github.com/rpetrich/ClearNotifications ClearNotifications] || rpetrich || iOS 5 - ? || 2012-02-03 || ? || clear lock screen notifications with a swipe<br />
|-<br />
| [https://github.com/insanj/Cleary Cleary] || insanj || iOS 6 || 2013-08-24 || BSD || create Clear tasks using Activator<br />
|-<br />
| [https://github.com/DHowett/cydelete Cydelete] || DHowett || iOS 2 - 5 || 2011-10-09 || GPLv3 || delete Cydia apps from Springboard<br />
|-<br />
| [http://gitweb.saurik.com/cydget.git Cydget] ([[Cydget]]) || saurik || iOS 2.2 - 6.1 || 2013-03-22 || BSD || manage lockscreen plugins<br />
|-<br />
| [https://github.com/rpetrich/DeepEnd DeepEnd] || rpetrich || iOS 4 - ? || 2011-01-31 || ? || 3D effect for Springboard<br />
|-<br />
| [https://github.com/rpetrich/DietBar DietBar] || rpetrich || iOS 3 - 6 || 2012-06-23 || ? || shrink navigation bars<br />
|-<br />
| [https://github.com/rpetrich/DietBulletins DietBulletins] || rpetrich || iOS 4 - 6 || 2013-09-10 || ? || shrink notification bulletins<br />
|-<br />
| [https://github.com/rpetrich/DisplayEffects DisplayEffects] || rpetrich || iOS 3 - ? || 2011-01-18 || ? || experimental effects for iOS<br />
|-<br />
| [https://github.com/PoomSmart/FaceDetectionDuringVideo FaceDetectionDuringVideo] || PoomSmart || iOS 6 || 2013-11-17 || MIT || enable Face Detection when start video recording<br />
|-<br />
| [https://github.com/rpetrich/FastBlurredNotificationCenter FastBlurredNotificationCenter] || rpetrich || iOS 5 - ? || 2012-03-03 || GPL || blurs notification center background<br />
|-<br />
| [https://github.com/Xuzz/tweaks/tree/master/five-icon-switcher Five Icon Switcher] || Xuzz || iOS 4 - ? || 2011-09-24 || BSD || five icons in app switcher<br />
|-<br />
| [https://github.com/PoomSmart/Flashorama Flashorama] || PoomSmart || iOS 6 || 2013-11-17 || MIT || toggle torch in Panorama mode<br />
|-<br />
| [https://github.com/PoomSmart/FrontFlash FrontFlash] || PoomSmart || iOS 4 - 6 || 2013-11-17 || MIT || simulate flash in Front-Facing camera by flashing the screen<br />
|-<br />
| [https://github.com/PoomSmart/Front-HDR Front HDR] || PoomSmart || iOS 6 - 7 || 2013-11-17 || MIT || enable HDR in Front-Facing camera<br />
|-<br />
| [https://github.com/rpetrich/FullForce FullForce] || rpetrich || iOS 3.2 - ? || 2011-11-08 || GPL || force applications to show in iPad mode<br />
|-<br />
| [https://github.com/Xuzz/tweaks/tree/master/fullwebclips FullWebClips] || Xuzz || iOS ? || 2011-07-21 || BSD || make Web Clips fullscreen<br />
|-<br />
| [https://github.com/DarkMalloc/Glue Glue] || DarkMalloc || iOS ? || 2011-06-29 || ? || share a note with Pastie from the Notes app<br />
|-<br />
| [https://github.com/insanj/GoogleSearchforVelox GoogleSearchforVelox] || insanj || iOS 6 || 2013-08-24 || BSD || quick search from the Google app<br />
|-<br />
| [https://github.com/FilippoBiga/Harlem-Shake Harlem Shake] || FilippoBiga || iOS 6 || 2013-03-11 || ? || make SpringBoard icons dance<br />
|-<br />
| [https://github.com/Xuzz/tweaks/tree/master/hookslaw %hook's law] || Xuzz || iOS 6 || 2013-02-16 || BSD || makes animations springier<br />
|-<br />
| [https://github.com/rpetrich/IconRenamer IconRenamer] || rpetrich || iOS 4 - ? || 2011-10-16 || ? || rename icons from your SpringBoard<br />
|-<br />
| [https://github.com/rpetrich/IconRotator IconRotator] || rpetrich || iOS 5 - 6 || 2013-02-16 || GPL || rotates icons<br />
|-<br />
| [https://github.com/patelhiren/iannounce iAnnounce] || patelhiren || iOS 4 - 6 || 2013-03-01 || ? || announce incoming caller's name<br />
|-<br />
| [https://github.com/zephster/InAMinute InAMinute] || zephster || iOS 6 || 2013-08-24 || ? || fine-grained time selection system-wide<br />
|-<br />
| [https://github.com/Xuzz/tweaks/tree/master/internalizer Internalizer] || Xuzz || iOS ? || 2011-07-22 || BSD || Add text to your lockscreen<br />
|-<br />
| [https://github.com/BGerard/IPSlider IPSlider] || BGerard || iOS ? || 2013-11-15 || GPL 2 || set "slide to unlock" message to IP address<br />
|-<br />
| [https://github.com/rpetrich/ListLauncher ListLauncher] || rpetrich || iOS 4 - ? || 2011-02-05 || ? || launch apps from Spotlight<br />
|-<br />
| [https://github.com/rpetrich/LiveClock LiveClock] || rpetrich || iOS 3 - 6 || 2013-02-04 || ? || animated clock icon on SpringBoard<br />
|-<br />
| [https://github.com/rpetrich/LivePaper LivePaper] || rpetrich et al. || iOS 4 - ? || 2011-07-20 || ? || live wallpaper with plugins<br />
|-<br />
| [https://github.com/PoomSmart/LLBPano LLBPano] || PoomSmart || iOS 6 || 2013-11-17 || MIT || Enable Low-light mode in Panorama<br />
|-<br />
| [https://github.com/conradev/Tweaks/tree/master/lockseconds LockSeconds] || conradev || iOS ? || 2012-06-02 || ? || add seconds to lockscreen clock<br />
|-<br />
| [https://github.com/hbang/MapsOpener MapsOpener] || hbang || iOS ? - 6 || 2013-05-22 || GPL || open Google Maps links in the Google Maps app<br />
|-<br />
| [https://github.com/rpetrich/MathAlarm MathAlarm] || rpetrich || iOS 4.2 - ? || 2012-01-10 || ? || solve arithmetic problems to turn off alarm<br />
|-<br />
| [https://github.com/FreeManRepo/MediaSpeak MediaSpeak] || freemanrepo || iOS ? || 2012-04-15 || ? || speak currently playing song<br />
|-<br />
| [https://github.com/b3ll/MessageBox MessageBox] || b3ll || iOS 6 || 2013-05-02 || BSD || use Chat Heads outside Facebook app<br />
|-<br />
| [https://github.com/rpetrich/MoreLinesNotificationCenter MoreLinesNotificationCenter] || rpetrich || iOS 5 - ? || 2011-10-16 || ? || more lines in notification center<br />
|-<br />
| [https://github.com/rpetrich/Multi-Slide Multi-Slide] || rpetrich and InfectionFX || iOS ? || 2011-06-19 || WTFPL || multiple unlock sliders<br />
|-<br />
| [https://github.com/rpetrich/MusicBanners MusicBanners] || rpetrich || iOS 5 - ? || 2012-04-08 || GPL || track change bulletins with album art in SpringBoard<br />
|-<br />
| [https://github.com/hbang/NCPad NCPad] || hbang || iOS ? - 6 || 2013-05-22 || MIT || resize notification banners to iPad screen width<br />
|-<br />
| [https://github.com/rpetrich/NoClearHistory NoClearHistory] || rpetrich || iOS 3 - ? || 2010-09-29 || ? || don't allow clearing history<br />
|-<br />
| [https://github.com/Xuzz/tweaks/tree/master/no-dots No Dots] || Xuzz || iOS ? || 2010-11-27 || BSD || no page dots<br />
|-<br />
| [https://github.com/rpetrich/NoNewsIsGoodNews NoNewsIsGoodNews] || rpetrich || iOS 5 - 6 || 2011-12-28 || ? || hide Newsstand icon<br />
|-<br />
| [https://github.com/conradev/Tweaks/tree/master/nopasscodeblock NoPasscodeBlock] || conradev || iOS ? - 6 || 2013-02-05 || ? || prevent permanent passcode locking<br />
|-<br />
| [https://github.com/nickfrey/NowNow NowNow] || nickfrey || iOS ? - 6 || 2013-11-10 || ? || invoke Google Voice Search using Activator<br />
|-<br />
| [https://github.com/n00neimp0rtant/OpenNotifier OpenNotifier] || n00neimp0rtant and Lunat1k || iOS 3.2 - ? || 2013-04-18 || ? || notification icons for your status bar<br />
|-<br />
| [https://github.com/PoomSmart/PanoEnabler PanoMod] || PoomSmart || iOS 6 || 2013-11-17 || MIT || enable Panorama and customize it<br />
|-<br />
| [https://github.com/rpetrich/PagePusher PagePusher] || rpetrich || iOS 4 - ? || 2011-06-02 || ? || page-styled app animations<br />
|-<br />
| [https://github.com/PoomSmart/PhotoTorch PhotoTorch] || PoomSmart || iOS 6 || 2013-11-17 || MIT || Adjustable Torch in Photo Camera mode<br />
|-<br />
| [https://github.com/protosphere/pinnacle Pinnacle] || ProtoSphere || iOS ? || 2013-04-02 || ? || hold back button to go to top-level page<br />
|-<br />
| [https://github.com/b3ll/PostOffice PostOffice] || b3ll || iOS 6 || 2013-06-19 || BSD || forward iOS notifications to Google Glass<br />
|-<br />
| [https://github.com/rpetrich/ProSwitcher ProSwitcher] || rpetrich and chpwn || iOS 3 - ? || 2010-09-18 || ? || Palm Pre-style application switcher<br />
|-<br />
| [https://github.com/rpetrich/PullToDismiss PullToDismiss] || rpetrich || iOS 3.2 - ? || 2011-12-30 || ? || pull down to dismiss keyboard<br />
|-<br />
| [https://github.com/rpetrich/QuickReply QuickReply] || rpetrich || iOS 2 - 4 || 2011-04-24 || whatever || quick reply for SMS<br />
|-<br />
| [https://github.com/PoomSmart/Record--n--Torch Record 'n' Torch] || PoomSmart || iOS 5 - 6 || 2013-11-17 || MIT || toggle Torch while recording video<br />
|-<br />
| [https://github.com/rpetrich/RotationInhibitor RotationInhibitor] || rpetrich || iOS 3 - 6.1 || 2013-02-04 || ? || disable device rotation<br />
|-<br />
| [https://github.com/rpetrich/RunningIndicator RunningIndicator] || rpetrich || iOS 4 - 6 || 2013-05-29 || ? || running app icons glow<br />
|-<br />
| [https://github.com/rpetrich/SBCustomIcon SBCustomIcon] || rpetrich || iOS ? || 2009-02-09 || ? || <br />
|-<br />
| [https://github.com/conradev/Tweaks/tree/master/searchclear SearchClear] || conradev || iOS ? || 2012-06-24 || ? || clears the search field after a search<br />
|-<br />
| [https://github.com/rpetrich/SliderBar SliderBar] || rpetrich || iOS 3 - ? || 2011-06-06 || ? || quick scrolling in all table views<br />
|-<br />
| [https://github.com/insanj/SliderKiller SliderKiller] || insanj || iOS 6 || 2013-08-24 || BSD || always "slide to unlock" instead of "slide to reply"<br />
|-<br />
| [https://github.com/rpetrich/SplitMail SplitMail] || rpetrich || iOS 3.2 - ? || 2012-02-02 || ? || split-style iPad mail app in portrait<br />
|-<br />
| [https://github.com/PoomSmart/Still-Capture-Enabler-2 Still Capture Enabler 2] || PoomSmart || iOS 4 - 7 || 2013-11-17 || MIT || Take still during video recording<br />
|-<br />
| [https://svn.bingner.com/SAM Subscriber Artificial Module (SAM)] || sbingner || iOS 3 - ? || 2013-06-07 || LGPL || <small>(Login: username "anonymous", no password. [https://repo.bingner.com/websvn/ Web view].)</small><br />
|-<br />
| [https://github.com/freerunnering/SwipeSelection SwipeSelection] || freerunnering || iOS 4 - 6 || 2013-04-20 || ? || edit text with keyboard gestures<br />
|-<br />
| [https://github.com/r-plus/SwipeShiftCaret SwipeShiftCaret] || r-plus || iOS 4 - 6 || 2013-11-09 || ISC || edit text with keyboard gestures<br />
|-<br />
| [https://github.com/Xuzz/tweaks/tree/master/switcherscape SwitcherScape] || Xuzz || iOS ? || 2011-07-22 || BSD || app switcher in landscape mode<br />
|-<br />
| [https://github.com/rpetrich/SwitcherMod SwitcherMod] || rpetrich and Optimo || iOS 4 - ? || 2011-12-31 || ? || customized app switcher<br />
|-<br />
| [https://github.com/rpetrich/SwitchIcons SwitchIcons] || rpetrich || iOS 5 - 6 || 2013-09-20 || ? || example tweak for Flipswitch<br />
|-<br />
| [https://github.com/bd452/TapTapPass TapTapPass] || bd452 || iOS 6 || 2013-10-10 || ? || gesture-based passcode toggle<br />
|-<br />
| [https://github.com/rpetrich/TopographyForGoogleMaps TopographyForGoogleMaps] || rpetrich || iOS 5.1 - ? || 2012-12-25 || ? || enable hidden topography view<br />
|-<br />
| [https://github.com/PoomSmart/TransparentCameraBar TransparentCameraBar] || PoomSmart || iOS 4 - 6 || 2013-11-17 || MIT || set camera bar opacity or shrink it<br />
|-<br />
| [https://github.com/hbang/TypeStatus TypeStatus] || hbang || iOS ? - 6 || 2013-09-25 || Apache 2.0 || iMessage typing indicators for the status bar<br />
|-<br />
| [https://github.com/bushe/Unlock7 Unlock7] || bushe || iOS 6 || 2013-11-01 || ? || adds some iOS 7 lockscreen features to iOS 6<br />
|-<br />
| [https://github.com/PoomSmart/RenameFolderWithoutName Unrestricted Folders Naming] || PoomSmart || iOS 5 - 6 || 2013-11-17 || © || folder name spacing will remain, can rename folder to whatever<br />
|-<br />
| [https://github.com/Cykey/Uninstall-Application-Size Uninstall Application Size] || Cykey || iOS 6 || 2013-09-26 || ? || shows application size when prompting to uninstall<br />
|-<br />
| [https://github.com/conradev/UserAgentFaker UserAgentFaker] || conradev || iOS ? || 2012-04-12 || ? || user agent faker for browsers<br />
|-<br />
| [https://github.com/coolstar/vassistant VAssistant] || coolstar || iOS 5 - 5.1.1 || 2012-12-08 || GPL 3 || <br />
|-<br />
| [http://gitweb.saurik.com/veency.git Veency] || saurik || iOS ? - 6.1 || 2013-02-03 || AGPL 3.0 || VNC server<br />
|-<br />
| [https://github.com/rpetrich/VideoPace VideoPace] || rpetrich || iOS 4.3 - 6 || 2013-08-04 || ? || increase speed of video playback<br />
|-<br />
| [https://github.com/rpetrich/VoiceKeys VoiceKeys] || rpetrich || iOS 4 - ? || 2011-11-27 || ? || voice recognition using Google's service<br />
|-<br />
| [https://github.com/rpetrich/WebGLEnabler WebGLEnabler] || rpetrich || iOS 4.2 - ? || 2011-07-24 || ? || Enable WebGL support in apps that use UIWebView<br />
|-<br />
| [https://github.com/rpetrich/WebPreview WebPreview] || rpetrich || iOS 3 - ? || 2011-02-17 || ? || preview web links in a popup<br />
|-<br />
| [https://github.com/Xuzz/tweaks/tree/master/webscrollian Webscrollian] || Xuzz || iOS ? || 2011-07-28 || BSD || faster scrolling for web content<br />
|-<br />
| [https://github.com/iMokhles/whatsapplstimest WhatsApp LSeen TimeStamp] || iMokhles || iOS 5 - 6 || 2013-09-03 || ? || toggle WhatsApp timestamp without waiting 24 hours<br />
|-<br />
| [https://github.com/rpetrich/WiCarrier WiCarrier] || rpetrich || iOS 3 - ? || 2012-04-07 || GPL || show WiFi network name/IP in place of carrier view<br />
|-<br />
| [https://github.com/jlippold/WifiSMS WifiSMS] || jlippold || iOS 4 - 5 || 2012-04-08 || ? || iPhone webserver gateway for SMS<br />
|-<br />
| [http://gitweb.saurik.com/winterboard.git Winterboard] || saurik || iOS 2 - 6.1 || 2013-09-07 || BSD? || advanced theming system<br />
|}<br />
<br />
== Applications ==<br />
<br />
{| class="wikitable sortable"<br />
|-<br />
! Project !! Author !! Compatibility !! Updated (as of Nov 2013) !! License !! Short description<br />
|-<br />
| [http://gitweb.saurik.com/cydia.git Cydia] || saurik || iOS 2 - 6 || 2012-09-21 || Modified BSD || Graphical APT frontend<br />
|-<br />
| [https://code.google.com/p/mobileterminal/ MobileTerminal] || (multiple) || iOS 3.2 - 6 || 2011-10-26 || GPL 2 || Terminal emulator<br />
|-<br />
| [https://github.com/coolstar/RecordMyScreen/ RecordMyScreen] || coolstar || iOS 5 - 6 || 2013-07-22 || MIT || Screen Recorder<br />
|-<br />
| [https://github.com/InfiniDev/nds4ios nds4ios] || (multiple) || iOS 5 - 7 || 2013-11-11 || ? || Nintendo DS emulator<br />
|-<br />
| [https://github.com/hrydgard/ppsspp PPSSPP] || (multiple) || iOS 5 - 7 || 2013-11-17 || GPL || Sony PlayStation Portable emulator<br />
|}<br />
<br />
== Tools ==<br />
<br />
{| class="wikitable sortable"<br />
|-<br />
! Project !! Source !! Author !! Compatibility !! Updated (As of Nov 2013) !! License !! Short description<br />
|-<br />
| [[Airscan]] || [https://github.com/Cykey/airscan] || Cykey || iOS ? - 6 || 2013-08-12 || ? || iOS command-line WiFi scanner<br />
|-<br />
| [[CaptainHammer]] || [https://github.com/rpetrich/CaptainHammer] || rpetrich || iOS 3 - 6 || 2013-05-10 || GPL 3 || Simple debugging tools for iOS<br />
|-<br />
| [[Open]] || [https://github.com/conradev/Open] || conradev || iOS ? - 6 || 2013-07-24 || ? || Open apps from shell on iOS<br />
|-<br />
| [[sbutils]] || [https://github.com/innoying/iOS-sbutils] || innoying || iOS ? - 6 || 2012-25-01 || ? || A collection of utilities to access iOS functions via the command line<br />
|-<br />
| [[Theos]] || [https://github.com/DHowett/theos] || DHowett || - || 2013-11-06 || GPL 3 || Unified cross-platform iPhone Makefile system<br />
|-<br />
|}<br />
<br />
== Developer libraries ==<br />
<br />
{| class="wikitable sortable"<br />
|-<br />
! Project !! Source !! Author !! Compatibility !! Updated (As of Nov 2013) !! License !! Short description<br />
|-<br />
| [[AppList]] || [https://github.com/rpetrich/AppList] || rpetrich || iOS 3 - 6 || 2013-08-17 || ? || Allow extensions to read the list of installed apps<br />
|-<br />
| [[BTstack]] || [http://btstack.org] || mringwal || iOS 3 - 6 || 2013-04-09 || dual license || Bluetooth stack with SDP, RFCOMM, and, L2CAP APIs<br />
|-<br />
| [[Flipswitch]] || [https://github.com/a3tweaks/Flipswitch] || rpetrich and Jack Willis || iOS ? - 6 || 2013-11-08 || LGPL || Centralized toggle system for iOS<br />
|-<br />
| [[HidSupport]] || [https://code.google.com/p/hid-support] || mringwal || iOS 3 - 6 || 2013-05-07 || BSD New || Key and touch injection library<br />
|-<br />
| [[IconSupport]] || [https://github.com/Xuzz/IconSupport] || Sakurina, chpwn, ashikase || iOS 3 - 6 || 2013-09-14 || ? || Safe icon support library<br />
|-<br />
| [[Libactivator]] || [https://github.com/rpetrich/libactivator] || rpetrich || iOS 3 - 6 || 2012-06-05 || LGPL || Centralized gestures and button management<br />
|-<br />
| [[LibDisplay]] || [https://github.com/freerunnering/LibDisplay] || freerunnering || iOS ? - 6 || 2013-02-07 || ? || Manage display stacks (pre-iOS 6) and manage running applications<br />
|-<br />
| [[Libdisplaystack]] || [https://github.com/Zimm/libdisplaystack] || Zimm || iOS ? || 2010-12-30 || non-commercial || Library for launching and exiting apps<br />
|-<br />
| [[Libhide]] || [https://github.com/big-boss/Libhide] || BigBoss || iOS ? || 2011-10-13 || ? || A library for hiding icons from Springboard<br />
|-<br />
| [[Libstatusbar]] || [https://github.com/phoenix3200/libstatusbar] || phoenix3200 || iOS 3 - 6 || 2013-02-07 || ? || Custom statusbar icon library<br />
|-<br />
| [[PreferenceLoader]] || [https://github.com/DHowett/preferenceloader] || DHowett || iOS ? - 6 || 2013-05-10 || ? || Allows developers to add entries to Settings.app<br />
|-<br />
| [[SearchLoader]] || [https://github.com/theiostream/SearchLoader] || theiostream || iOS ? - 6 || 2013-07-22 || ? || Loads search bundles<br />
|}</div>
Dustin Howett
https://iphonedev.wiki/index.php?title=Jailbreak_Development_Tools&diff=1679
Jailbreak Development Tools
2013-11-21T03:26:52Z
<p>Dustin Howett: This attribution is unnecessary.</p>
<hr />
<div>The first step in developing for jailbroken devices (this includes MobileSubstrate extensions, or "tweaks") is understanding the commonly-used development tools.<br />
<br />
== Theos: Build System ==<br />
<br />
Not to be confused with a toolchain or SDK, [[Theos]] helps create and manage projects. Theos:<br />
<br />
* Creates new empty projects based on templates (see NIC, below)<br />
* Handles Makefiles for your build environment<br />
* Automates packaging (to .deb) and installation<br />
<br />
=== NIC (New Instance Creator) ===<br />
<br />
The New Instance Creator is a script, included with Theos, that creates empty projects for you to use as starting points for your development.<br />
<br />
An example of how NIC is used can be found [[Theos/Getting Started#Creating a Project|here]].<br />
<br />
== Logos ==<br />
<br />
[[Logos]] is a preprocessor that aids in MobileSubstrate extension development. It allows you to define hooks with a clear, readable syntax.<br />
<br />
== Logify ==<br />
<br />
Unlike the tools listed above, [[Logify]] isn't a tool you would use throughout a project's life cycle. Logify accepts a class header and generates a MobileSubstrate extension which hooks all of that class's methods, printing log messages when they are called. This helps a hook developer see when certain methods are invoked during use.<br />
<br />
== IOSOpenDev ==<br />
<br />
[[iOSOpenDev]] is an open-source project that sets up the iOS SDK to allow open development in Xcode of jailbreak-type projects not supported nor allowed by default and provides Xcode templates for building common jailbreak-type projects and the various tools needed for such development. <br />
<br />
== On-device toolchains ==<br />
<br />
See [[On-device toolchains]] for details.<br />
<br />
== 6.1 Toolchain For Windows ==<br />
<br />
[[User:coolstar|Coolstar]] is working on an iOS toolchain for Windows, available [http://coolstar.org/iOSToolchainOnWindows.html here.]<br />
<br />
[[Category:Development Tools]]</div>
Dustin Howett
https://iphonedev.wiki/index.php?title=PSSpecifier&diff=1503
PSSpecifier
2013-09-09T06:56:18Z
<p>Dustin Howett: More words!</p>
<hr />
<div>'''PSSpecifier''' represents a user-facing setting or actionable item in the {{fwlink|Preferences}} framework. Specifiers are typically loaded from dictionary representations, but can be created at runtime with {{ObjcCall|PSSpecifier|preferenceSpecifierNamed:target:set:get:detail:cell:edit:|ClassMethod=1}}; they are often used in conjunction with a [[PSListController]], which contains logic for rendering them into a table.<br />
<br />
Preference specifiers bear properties as documented [[Preferences specifier plist|here]]. Each specifier is given a type and may contain a default value (used for display purposes only), a preferences domain, a preferences key, and selectors to invoke for various actions.<br />
<br />
== Additions ==<br />
<br />
=== PSEditTextViewCell ===<br />
<br />
==== Custom Height ====<br />
On your PSListController subclass, to change the size of the cell override<br />
<br />
<source lang="objc"><br />
- (CGFloat)preferencesTable:(UIPreferencesTable *)table heightForRow:(NSInteger)row inGroup:(NSInteger)group withProposedHeight:(CGFloat)proposedHeight;<br />
</source><br />
<br />
Call setUserInfo on the specifier to set the inner text view height:<br />
<br />
<source lang="objc"><br />
[specifier setUserInfo:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:180] forKey:@"height"]];<br />
</source><br />
<br />
{{occlass|library=Preferences.framework|navbox=1}}</div>
Dustin Howett
https://iphonedev.wiki/index.php?title=PSSpecifier&diff=1502
PSSpecifier
2013-09-09T06:53:04Z
<p>Dustin Howett: Fill out the summary more.</p>
<hr />
<div>A '''PSSpecifier''' represents a user-visible setting or actionable item in the {{fwlink|Preferences}} framework. Specifiers are typically loaded from dictionary representations, but can be created at runtime with {{ObjcCall|PSSpecifier|preferenceSpecifierNamed:target:set:get:detail:cell:edit:|ClassMethod=1}}.<br />
<br />
Preference specifiers bear properties as documented [[Preferences specifier plist|here]].<br />
<br />
== Additions ==<br />
<br />
=== PSEditTextViewCell ===<br />
<br />
==== Custom Height ====<br />
On your PSListController subclass, to change the size of the cell override<br />
<br />
<source lang="objc"><br />
- (CGFloat)preferencesTable:(UIPreferencesTable *)table heightForRow:(NSInteger)row inGroup:(NSInteger)group withProposedHeight:(CGFloat)proposedHeight;<br />
</source><br />
<br />
Call setUserInfo on the specifier to set the inner text view height:<br />
<br />
<source lang="objc"><br />
[specifier setUserInfo:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:180] forKey:@"height"]];<br />
</source><br />
<br />
{{occlass|library=Preferences.framework|navbox=1}}</div>
Dustin Howett
https://iphonedev.wiki/index.php?title=MediaWiki:Common.js&diff=1491
MediaWiki:Common.js
2013-09-08T04:57:43Z
<p>Dustin Howett: </p>
<hr />
<div>/* Any JavaScript here will be loaded for all users on every page load. */<br />
/** Import module *************************************************************<br />
*<br />
* Description: Includes a raw wiki page as javascript or CSS, <br />
* used for including user made modules.<br />
* Maintainers: [[wikipedia:User:AzaToth]]<br />
*/<br />
importedScripts = {}; // object keeping track of included scripts, so a script ain't included twice<br />
function importScript( page ) {<br />
if( importedScripts[page] ) {<br />
return;<br />
}<br />
importedScripts[page] = true;<br />
var url = wgScriptPath<br />
+ '/index.php?title='<br />
+ encodeURIComponent( page.replace( / /g, '_' ) )<br />
+ '&action=raw&ctype=text/javascript';<br />
var scriptElem = document.createElement( 'script' );<br />
scriptElem.setAttribute( 'src' , url );<br />
scriptElem.setAttribute( 'type' , 'text/javascript' );<br />
document.getElementsByTagName( 'head' )[0].appendChild( scriptElem );<br />
}<br />
<br />
function importStylesheet( page ) {<br />
var sheet = '@import "'<br />
+ wgScriptPath<br />
+ '/index.php?title='<br />
+ encodeURIComponent( page.replace( / /g, '_' ) )<br />
+ '&action=raw&ctype=text/css";'<br />
var styleElem = document.createElement( 'style' );<br />
styleElem.setAttribute( 'type' , 'text/css' );<br />
styleElem.appendChild( document.createTextNode( sheet ) );<br />
document.getElementsByTagName( 'head' )[0].appendChild( styleElem );<br />
}<br />
<br />
/* Test if an element has a certain class **************************************<br />
*<br />
* Description: Uses regular expressions and caching for better performance.<br />
* Maintainers: [[wikipedia:User:Mike Dillon]], [[wikipedia:User:R. Koot]], [[wikipedia:User:SG]]<br />
*/<br />
<br />
var hasClass = (function () {<br />
var reCache = {};<br />
return function (element, className) {<br />
return (reCache[className] ? reCache[className] : (reCache[className] = new RegExp("(?:\\s|^)" + className + "(?:\\s|$)"))).test(element.className);<br />
};<br />
})();<br />
<br />
/** Internet Explorer bug fix **************************************************<br />
*<br />
* Description: Fixes IE horizontal scrollbar bug<br />
* Maintainers: [[wikipedia:User:Tom-]]?<br />
*/<br />
<br />
if (navigator.appName == "Microsoft Internet Explorer" && document.compatMode == "CSS1Compat")<br />
{<br />
var oldWidth;<br />
var docEl = document.documentElement;<br />
<br />
function fixIEScroll()<br />
{<br />
if (!oldWidth || docEl.clientWidth > oldWidth)<br />
doFixIEScroll();<br />
else<br />
setTimeout(doFixIEScroll, 1);<br />
<br />
oldWidth = docEl.clientWidth;<br />
}<br />
<br />
function doFixIEScroll() {<br />
docEl.style.overflowX = (docEl.scrollWidth - docEl.clientWidth < 4) ? "hidden" : "";<br />
}<br />
<br />
document.attachEvent("onreadystatechange", fixIEScroll);<br />
attachEvent("onresize", fixIEScroll);<br />
}<br />
<br />
/** Collapsible tables *********************************************************<br />
*<br />
* Description: Allows tables to be collapsed, showing only the header. See<br />
* [[Wikipedia:NavFrame]].<br />
* Maintainers: [[wikipedia:User:R. Koot]]<br />
*/<br />
<br />
var autoCollapse = 2;<br />
var collapseCaption = "hide";<br />
var expandCaption = "show";<br />
<br />
function collapseTable( tableIndex )<br />
{<br />
var Button = document.getElementById( "collapseButton" + tableIndex );<br />
var Table = document.getElementById( "collapsibleTable" + tableIndex );<br />
<br />
if ( !Table || !Button ) {<br />
return false;<br />
}<br />
<br />
var Rows = Table.rows;<br />
<br />
if ( Button.firstChild.data == collapseCaption ) {<br />
for ( var i = 1; i < Rows.length; i++ ) {<br />
Rows[i].style.display = "none";<br />
}<br />
Button.firstChild.data = expandCaption;<br />
} else {<br />
for ( var i = 1; i < Rows.length; i++ ) {<br />
Rows[i].style.display = Rows[0].style.display;<br />
}<br />
Button.firstChild.data = collapseCaption;<br />
}<br />
}<br />
<br />
function createCollapseButtons()<br />
{<br />
var tableIndex = 0;<br />
var NavigationBoxes = new Object();<br />
var Tables = document.getElementsByTagName( "table" );<br />
<br />
for ( var i = 0; i < Tables.length; i++ ) {<br />
if ( hasClass( Tables[i], "collapsible" ) ) {<br />
<br />
/* only add button and increment count if there is a header row to work with */<br />
var HeaderRow = Tables[i].getElementsByTagName( "tr" )[0];<br />
if (!HeaderRow) continue;<br />
var Header = HeaderRow.getElementsByTagName( "th" )[0];<br />
if (!Header) continue;<br />
<br />
NavigationBoxes[ tableIndex ] = Tables[i];<br />
Tables[i].setAttribute( "id", "collapsibleTable" + tableIndex );<br />
<br />
var Button = document.createElement( "span" );<br />
var ButtonLink = document.createElement( "a" );<br />
var ButtonText = document.createTextNode( collapseCaption );<br />
<br />
Button.style.styleFloat = "right";<br />
Button.style.cssFloat = "right";<br />
Button.style.fontWeight = "normal";<br />
Button.style.textAlign = "right";<br />
Button.style.width = "6em";<br />
<br />
ButtonLink.style.color = Header.style.color;<br />
ButtonLink.setAttribute( "id", "collapseButton" + tableIndex );<br />
ButtonLink.setAttribute( "href", "javascript:collapseTable(" + tableIndex + ");" );<br />
ButtonLink.appendChild( ButtonText );<br />
<br />
Button.appendChild( document.createTextNode( "[" ) );<br />
Button.appendChild( ButtonLink );<br />
Button.appendChild( document.createTextNode( "]" ) );<br />
<br />
Header.insertBefore( Button, Header.childNodes[0] );<br />
tableIndex++;<br />
}<br />
}<br />
<br />
for ( var i = 0; i < tableIndex; i++ ) {<br />
if ( hasClass( NavigationBoxes[i], "collapsed" ) || ( tableIndex >= autoCollapse && hasClass( NavigationBoxes[i], "autocollapse" ) ) ) {<br />
collapseTable( i );<br />
}<br />
}<br />
}<br />
<br />
addOnloadHook( createCollapseButtons );<br />
<br />
/** Dynamic Navigation Bars (experimental) *************************************<br />
*<br />
* Description: See [[Wikipedia:NavFrame]].<br />
* Maintainers: UNMAINTAINED<br />
*/<br />
<br />
// set up the words in your language<br />
var NavigationBarHide = '[' + collapseCaption + ']';<br />
var NavigationBarShow = '[' + expandCaption + ']';<br />
<br />
// shows and hides content and picture (if available) of navigation bars<br />
// Parameters:<br />
// indexNavigationBar: the index of navigation bar to be toggled<br />
function toggleNavigationBar(indexNavigationBar)<br />
{<br />
var NavToggle = document.getElementById("NavToggle" + indexNavigationBar);<br />
var NavFrame = document.getElementById("NavFrame" + indexNavigationBar);<br />
<br />
if (!NavFrame || !NavToggle) {<br />
return false;<br />
}<br />
<br />
// if shown now<br />
if (NavToggle.firstChild.data == NavigationBarHide) {<br />
for (<br />
var NavChild = NavFrame.firstChild;<br />
NavChild != null;<br />
NavChild = NavChild.nextSibling<br />
) {<br />
if ( hasClass( NavChild, 'NavPic' ) ) {<br />
NavChild.style.display = 'none';<br />
}<br />
if ( hasClass( NavChild, 'NavContent') ) {<br />
NavChild.style.display = 'none';<br />
}<br />
}<br />
NavToggle.firstChild.data = NavigationBarShow;<br />
<br />
// if hidden now<br />
} else if (NavToggle.firstChild.data == NavigationBarShow) {<br />
for (<br />
var NavChild = NavFrame.firstChild;<br />
NavChild != null;<br />
NavChild = NavChild.nextSibling<br />
) {<br />
if (hasClass(NavChild, 'NavPic')) {<br />
NavChild.style.display = 'block';<br />
}<br />
if (hasClass(NavChild, 'NavContent')) {<br />
NavChild.style.display = 'block';<br />
}<br />
}<br />
NavToggle.firstChild.data = NavigationBarHide;<br />
}<br />
}<br />
<br />
// adds show/hide-button to navigation bars<br />
function createNavigationBarToggleButton()<br />
{<br />
var indexNavigationBar = 0;<br />
// iterate over all < div >-elements <br />
var divs = document.getElementsByTagName("div");<br />
for(<br />
var i=0; <br />
NavFrame = divs[i]; <br />
i++<br />
) {<br />
// if found a navigation bar<br />
if (hasClass(NavFrame, "NavFrame")) {<br />
<br />
indexNavigationBar++;<br />
var NavToggle = document.createElement("a");<br />
NavToggle.className = 'NavToggle';<br />
NavToggle.setAttribute('id', 'NavToggle' + indexNavigationBar);<br />
NavToggle.setAttribute('href', 'javascript:toggleNavigationBar(' + indexNavigationBar + ');');<br />
<br />
var NavToggleText = document.createTextNode(NavigationBarHide);<br />
for (<br />
var NavChild = NavFrame.firstChild;<br />
NavChild != null;<br />
NavChild = NavChild.nextSibling<br />
) {<br />
if ( hasClass( NavChild, 'NavPic' ) || hasClass( NavChild, 'NavContent' ) ) {<br />
if (NavChild.style.display == 'none') {<br />
NavToggleText = document.createTextNode(NavigationBarShow);<br />
break;<br />
}<br />
}<br />
}<br />
<br />
NavToggle.appendChild(NavToggleText);<br />
// Find the NavHead and attach the toggle link (Must be this complicated because Moz's firstChild handling is borked)<br />
for(<br />
var j=0; <br />
j < NavFrame.childNodes.length; <br />
j++<br />
) {<br />
if (hasClass(NavFrame.childNodes[j], "NavHead")) {<br />
NavFrame.childNodes[j].appendChild(NavToggle);<br />
}<br />
}<br />
NavFrame.setAttribute('id', 'NavFrame' + indexNavigationBar);<br />
}<br />
}<br />
}<br />
<br />
addOnloadHook( createNavigationBarToggleButton );<br />
<br />
/** Extra toolbar options ******************************************************<br />
*<br />
* Description: UNDOCUMENTED<br />
* Maintainers: [[wikipedia:User:MarkS]]?, [[wikipedia:User:Voice of All]], [[wikipedia:User:R. Koot]]<br />
*/<br />
<br />
//This is a modified copy of a script by User:MarkS for extra features added by User:Voice of All.<br />
// This is based on the original code on Wikipedia:Tools/Editing tools<br />
// To disable this script, add <code>mwCustomEditButtons = [];<code> to [[Special:Mypage/monobook.js]]<br />
<br />
if (mwCustomEditButtons) {<br />
mwCustomEditButtons[mwCustomEditButtons.length] = {<br />
"imageFile": "http://upload.wikimedia.org/wikipedia/en/c/c8/Button_redirect.png",<br />
"speedTip": "Redirect",<br />
"tagOpen": "#REDIRECT [[",<br />
"tagClose": "]]",<br />
"sampleText": "Insert text"};<br />
<br />
mwCustomEditButtons[mwCustomEditButtons.length] = {<br />
"imageFile": "http://upload.wikimedia.org/wikipedia/en/c/c9/Button_strike.png",<br />
"speedTip": "Strike",<br />
"tagOpen": "<s>",<br />
"tagClose": "</s>",<br />
"sampleText": "Strike-through text"};<br />
<br />
mwCustomEditButtons[mwCustomEditButtons.length] = {<br />
"imageFile": "http://upload.wikimedia.org/wikipedia/en/1/13/Button_enter.png",<br />
"speedTip": "Line break",<br />
"tagOpen": "<br />",<br />
"tagClose": "",<br />
"sampleText": ""};<br />
<br />
mwCustomEditButtons[mwCustomEditButtons.length] = {<br />
"imageFile": "http://upload.wikimedia.org/wikipedia/en/8/80/Button_upper_letter.png",<br />
"speedTip": "Superscript",<br />
"tagOpen": "<sup>",<br />
"tagClose": "</sup>",<br />
"sampleText": "Superscript text"};<br />
<br />
mwCustomEditButtons[mwCustomEditButtons.length] = {<br />
"imageFile": "http://upload.wikimedia.org/wikipedia/en/7/70/Button_lower_letter.png",<br />
"speedTip": "Subscript",<br />
"tagOpen": "<sub>",<br />
"tagClose": "</sub>",<br />
"sampleText": "Subscript text"};<br />
<br />
mwCustomEditButtons[mwCustomEditButtons.length] = {<br />
"imageFile": "http://upload.wikimedia.org/wikipedia/en/5/58/Button_small.png",<br />
"speedTip": "Small",<br />
"tagOpen": "<small>",<br />
"tagClose": "</small>",<br />
"sampleText": "Small Text"};<br />
<br />
mwCustomEditButtons[mwCustomEditButtons.length] = {<br />
"imageFile": "http://upload.wikimedia.org/wikipedia/en/3/34/Button_hide_comment.png",<br />
"speedTip": "Insert hidden Comment",<br />
"tagOpen": "<!-- ",<br />
"tagClose": " -->",<br />
"sampleText": "Comment"};<br />
<br />
mwCustomEditButtons[mwCustomEditButtons.length] = {<br />
"imageFile": "http://upload.wikimedia.org/wikipedia/en/1/12/Button_gallery.png",<br />
"speedTip": "Insert a picture gallery",<br />
"tagOpen": "\n<gallery>\n",<br />
"tagClose": "\n</gallery>",<br />
"sampleText": "Image:Example.jpg|Caption1\nImage:Example.jpg|Caption2"};<br />
<br />
mwCustomEditButtons[mwCustomEditButtons.length] = {<br />
"imageFile": "http://upload.wikimedia.org/wikipedia/en/f/fd/Button_blockquote.png",<br />
"speedTip": "Insert block of quoted text",<br />
"tagOpen": "<blockquote>\n",<br />
"tagClose": "\n</blockquote>",<br />
"sampleText": "Block quote"};<br />
<br />
mwCustomEditButtons[mwCustomEditButtons.length] = {<br />
"imageFile": "http://upload.wikimedia.org/wikipedia/en/6/60/Button_insert_table.png",<br />
"speedTip": "Insert a table",<br />
"tagOpen": '{| class="wikitable"\n|-\n',<br />
"tagClose": "\n|}",<br />
"sampleText": "! header 1\n! header 2\n! header 3\n|-\n| row 1, cell 1\n| row 1, cell 2\n| row 1, cell 3\n|-\n| row 2, cell 1\n| row 2, cell 2\n| row 2, cell 3"};<br />
<br />
mwCustomEditButtons[mwCustomEditButtons.length] = {<br />
"imageFile": "http://upload.wikimedia.org/wikipedia/commons/7/79/Button_reflink.png",<br />
"speedTip": "Insert a reference",<br />
"tagOpen": "<ref>",<br />
"tagClose": "</ref>",<br />
"sampleText": "Insert footnote text here"};<br />
<br />
}<br />
<br />
/*</nowiki>*/<br />
<br />
/** pageview counter ***********************************************************<br />
*<br />
* Description: Please talk to de:User:LeonWeber before changing anything or <br />
* if there are any issues with that.<br />
* Maintainers: [[:de:User:LeonWeber]]?<br />
*/<br />
<br />
// this should be adjusted to a good value.<br />
// BE CAREFUL, you will break zedler if it's too low!<br />
// And then DaB. will kill Leon :-(<br />
var disable_counter = 0;<br />
var counter_factor = 6000;<br />
<br />
function pgcounter_setup()<br />
{<br />
if(disable_counter == 0)<br />
{<br />
var url = window.location.href;<br />
if(Math.floor(Math.random()*counter_factor)==42) // the probability thing<br />
{<br />
if(wgIsArticle==true || wgArticleId==0) // do not count history pages etc.<br />
{<br />
var pgcountNs = wgCanonicalNamespace;<br />
if(wgCanonicalNamespace=="")<br />
{<br />
pgcountNs = "0";<br />
}<br />
var cnt_url = "http://pgcount.wikimedia.de/index.png?ns=" + pgcountNs + "&title=" + encodeURI(wgTitle) + "&factor=" + counter_factor +"&wiki=enwiki";<br />
var img = new Image(); <br />
img.src = cnt_url;<br />
}<br />
}<br />
}<br />
}<br />
// Do not use aOnloadFunctions[aOnloadFunctions.length] = pgcounter_setup;, some browsers don't like that.<br />
pgcounter_setup();<br />
<br />
/** "Technical restrictions" title fix *****************************************<br />
*<br />
* Description:<br />
* Maintainers: wikipedia:User:Interiot, wikipedia:User:Mets501, wikipedia:User:Freakofnurture<br />
*/<br />
//<br />
// For pages that have something like Template:Lowercase, replace the title, but only if it is cut-and-pasteable as a valid wikilink.<br />
// (for instance iPod's title is updated. But [[C#]] is not an equivalent<br />
// wikilink, so [[C Sharp]] doesn't have its main title changed)<br />
// Likewise for users who have selected the U.K. date format ("1 March") the <br />
// titles of day-of-the-year articles will appear in that style. Users with any<br />
// other date setting are not affected.<br />
//<br />
// The function looks for a banner like this: <br />
// &lt;div id="RealTitleBanner"&gt; ... &lt;span id="RealTitle"&gt;title&lt;/span&gt; ... &lt;/div&gt;<br />
// An element with id=DisableRealTitle disables the function.<br />
//<br />
var disableRealTitle = 0; // users can set disableRealTitle = 1 locally to disable.<br />
if (wgIsArticle) { // don't display the RealTitle when editing, since it is apparently inconsistent (doesn't show when editing sections, doesn't show when not previewing)<br />
addOnloadHook(function() {<br />
try {<br />
var realTitleBanner = document.getElementById("RealTitleBanner");<br />
if (realTitleBanner && !document.getElementById("DisableRealTitle") && !disableRealTitle ) {<br />
var realTitle = document.getElementById("RealTitle");<br />
if (realTitle) {<br />
var realTitleHTML = realTitle.innerHTML;<br />
realTitleText = pickUpText(realTitle);<br />
<br />
var isPasteable = 0;<br />
//var containsHTML = /</.test(realTitleHTML); // contains ANY HTML<br />
var containsTooMuchHTML = /</.test( realTitleHTML.replace(/<\/?(sub|sup|small|big)>/gi, "") ); // contains HTML that will be ignored when cut-n-pasted as a wikilink<br />
// calculate whether the title is pasteable<br />
var verifyTitle = realTitleText.replace(/^ +/, ""); // trim left spaces<br />
verifyTitle = verifyTitle.charAt(0).toUpperCase() + verifyTitle.substring(1, verifyTitle.length); // uppercase first character<br />
<br />
// if the namespace prefix is there, remove it on our verification copy. If it isn't there, add it to the original realValue copy.<br />
if (wgNamespaceNumber != 0) {<br />
if (wgCanonicalNamespace == verifyTitle.substr(0, wgCanonicalNamespace.length).replace(/ /g, "_") && verifyTitle.charAt(wgCanonicalNamespace.length) == ":") {<br />
verifyTitle = verifyTitle.substr(wgCanonicalNamespace.length + 1);<br />
} else {<br />
realTitleText = wgCanonicalNamespace.replace(/_/g, " ") + ":" + realTitleText;<br />
realTitleHTML = wgCanonicalNamespace.replace(/_/g, " ") + ":" + realTitleHTML;<br />
}<br />
}<br />
<br />
// verify whether wgTitle matches<br />
verifyTitle = verifyTitle.replace(/[\s_]+/g, " "); // underscores and multiple spaces to single spaces<br />
verifyTitle = verifyTitle.replace(/^\s+/, "").replace(/\s+$/, ""); // trim left and right spaces<br />
verifyTitle = verifyTitle.charAt(0).toUpperCase() + verifyTitle.substring(1, verifyTitle.length); // uppercase first character<br />
if ( (verifyTitle == wgTitle) || (verifyTitle == wgTitle.replace(/^(.+)?(January|February|March|April|May|June|July|August|September|October|November|December)\s+([12]?[0-9]|3[0123])([^\d].*)?$/g, "$1$3 $2$4") )) isPasteable = 1;<br />
var h1 = document.getElementsByTagName("h1")[0];<br />
if (h1 && isPasteable) {<br />
h1.innerHTML = containsTooMuchHTML ? realTitleText : realTitleHTML;<br />
if (!containsTooMuchHTML)<br />
realTitleBanner.style.display = "none";<br />
}<br />
document.title = realTitleText + " - Wikipedia, the free encyclopedia";<br />
}<br />
}<br />
} catch (e) {<br />
/* Something went wrong. */<br />
}<br />
});<br />
}<br />
<br />
// similar to innerHTML, but only returns the text portions of the insides, excludes HTML<br />
function pickUpText(aParentElement) {<br />
var str = "";<br />
<br />
function pickUpTextInternal(aElement) {<br />
var child = aElement.firstChild;<br />
while (child) {<br />
if (child.nodeType == 1) // ELEMENT_NODE <br />
pickUpTextInternal(child);<br />
else if (child.nodeType == 3) // TEXT_NODE<br />
str += child.nodeValue;<br />
<br />
child = child.nextSibling;<br />
}<br />
}<br />
<br />
pickUpTextInternal(aParentElement);<br />
return str;<br />
}<br />
<br />
//fix edit summary prompt for undo<br />
//this code fixes the fact that the undo function combined with the "no edit summary prompter" causes problems if leaving the<br />
//edit summary unchanged<br />
//this was added by [[wikipedia:User:Deskana]], code by [[wikipedia:User:Tra]]<br />
addOnloadHook(function () {<br />
if (document.location.search.indexOf("undo=") != -1<br />
&& document.getElementsByName('wpAutoSummary')[0]) {<br />
document.getElementsByName('wpAutoSummary')[0].value='1';<br />
}<br />
})<br />
<br />
/** Add dismiss button to watchlist-message *************************************<br />
*<br />
* Description: Hide the watchlist message for one week.<br />
* Maintainers: [[wikipedia:User:Ruud Koot|Ruud Koot]]<br />
*/<br />
<br />
function addDismissButton() {<br />
var watchlistMessage = document.getElementById("watchlist-message");<br />
if ( watchlistMessage == null ) return;<br />
var watchlistCookieID = watchlistMessage.className.replace(/cookie\-ID\_/ig,'');<br />
<br />
if ( document.cookie.indexOf( "hidewatchlistmessage-" + watchlistCookieID + "=yes" ) != -1 ) {<br />
watchlistMessage.style.display = "none";<br />
}<br />
<br />
var Button = document.createElement( "span" );<br />
var ButtonLink = document.createElement( "a" );<br />
var ButtonText = document.createTextNode( "dismiss" );<br />
<br />
ButtonLink.setAttribute( "id", "dismissButton" );<br />
ButtonLink.setAttribute( "href", "javascript:dismissWatchlistMessage();" );<br />
ButtonLink.setAttribute( "title", "Hide this message for one week" );<br />
ButtonLink.appendChild( ButtonText );<br />
<br />
Button.appendChild( document.createTextNode( "[" ) );<br />
Button.appendChild( ButtonLink );<br />
Button.appendChild( document.createTextNode( "]" ) );<br />
<br />
watchlistMessage.appendChild( Button );<br />
}<br />
<br />
function dismissWatchlistMessage() {<br />
var e = new Date();<br />
e.setTime( e.getTime() + (7*24*60*60*1000) );<br />
var watchlistMessage = document.getElementById("watchlist-message");<br />
var watchlistCookieID = watchlistMessage.className.replace(/cookie\-ID\_/ig,'');<br />
document.cookie = "hidewatchlistmessage-" + watchlistCookieID + "=yes; expires=" + e.toGMTString() + "; path=/";<br />
watchlistMessage.style.display = "none";<br />
}<br />
<br />
addOnloadHook( addDismissButton );<br />
<br />
/** Sysop Javascript *******************************************************<br />
*<br />
* Description: Allows for sysop-specific Javascript at [[MediaWiki:Sysop.js]].<br />
* Created by: [[wikipedia:User:^demon]]<br />
*/<br />
function sysopFunctions() {<br />
if ( wgUserGroups && !window.disableSysopJS ) {<br />
for ( var g = 0; g < wgUserGroups.length; ++g ) {<br />
if ( wgUserGroups[g] == "sysop" ) {<br />
importScript( "MediaWiki:Sysop.js" );<br />
break;<br />
}<br />
}<br />
}<br />
}<br />
<br />
addOnloadHook( sysopFunctions );<br />
<br />
/** WikiMiniAtlas *******************************************************<br />
*<br />
* Description: WikiMiniAtlas is a popup click and drag world map.<br />
* This script causes all of our coordinate links to display the WikiMiniAtlas popup button.<br />
* The script itself is located on meta because it is used by many projects.<br />
* See [[Meta:WikiMiniAtlas]] for more information. <br />
* Created by: [[wikipedia:User:Dschwen]]<br />
*/<br />
<br />
function importWikiMiniAtlas() {<br />
var page = 'm:MediaWiki:Wikiminiatlas.js';<br />
if( importedScripts[page] ) {<br />
return;<br />
}<br />
importedScripts[page] = true;<br />
var url = 'http://meta.wikimedia.org/w/index.php?title=MediaWiki:Wikiminiatlas.js' <br />
+ '&action=raw&ctype=text/javascript&smaxage=21600&maxage=86400';<br />
var scriptElem = document.createElement( 'script' );<br />
scriptElem.setAttribute( 'src' , url );<br />
scriptElem.setAttribute( 'type' , 'text/javascript' );<br />
document.getElementsByTagName( 'head' )[0].appendChild( scriptElem );<br />
}<br />
importWikiMiniAtlas();<br />
<br />
/* document.write('<script type="text/javascript" src="' <br />
+ 'http://meta.wikimedia.org/w/index.php?title=MediaWiki:Wikiminiatlas.js' <br />
+ '&action=raw&ctype=text/javascript&smaxage=21600&maxage=86400"></script>'); */<br />
<br />
/** IE 6 Z-index bug workaround for anonnotice **************************<br />
*<br />
* Description: This implements a work around for the Z-index bug found in Internet Explorer.<br />
* It correctly places the anon notice on the page, even under IE6.<br />
* See this Google search for more information about the bug:<br />
* http://www.google.com/search?hl=en&client=firefox-a&rls=org.mozilla%3Aen-US%3Aofficial&hs=q74&q=z-index+ie6+bug&btnG=Search<br />
* Created by: [[wikipedia:User:Gmaxwell]]<br />
*/<br />
addOnloadHook((function (){<br />
if (wgUserName == null) {<br />
<br />
var messageEdu=new Array();<br />
messageEdu[0]='<a href="http://en.wikipedia.org/wiki/Wikipedia:Researching_with_Wikipedia" title="Wikipedia:Researching with Wikipedia">Learn&nbsp;more&nbsp;about&nbsp;using&nbsp;Wikipedia&nbsp;for&nbsp;research</a>';<br />
messageEdu[1]='<a href="http://en.wikipedia.org/wiki/Wikipedia:Ten_things_you_may_not_know_about_Wikipedia" title="Wikipedia:Ten things you may not know about Wikipedia">Ten&nbsp;things&nbsp;you&nbsp;may&nbsp;not&nbsp;know&nbsp;about&nbsp;Wikipedia</a>';<br />
messageEdu[2]='<a href="http://en.wikipedia.org/wiki/Wikipedia:Ten_things_you_may_not_know_about_images_on_Wikipedia" title="Wikipedia:Ten things you may not know about images on Wikipedia">Ten&nbsp;things&nbsp;you&nbsp;may&nbsp;not&nbsp;know&nbsp;about&nbsp;images&nbsp;on&nbsp;Wikipedia</a>';<br />
messageEdu[3]='<a href="http://en.wikipedia.org/wiki/Wikipedia:Citing_Wikipedia" title="Wikipedia:Citing Wikipedia">Learn&nbsp;more&nbsp;about&nbsp;citing&nbsp;Wikipedia</a>';<br />
messageEdu[4]='Have&nbsp;questions?&nbsp;<a href="http://en.wikipedia.org/wiki/Wikipedia:Questions" title="Wikipedia:Questions">Find&nbsp;out&nbsp;how&nbsp;to&nbsp;ask&nbsp;questions&nbsp;and&nbsp;get&nbsp;answers.</a>';<br />
messageEdu[5]='<a href="http://en.wikipedia.org/wiki/Wikipedia:Basic_navigation" title="Wikipedia:Basic navigation">Find&nbsp;out&nbsp;more&nbsp;about&nbsp;navigating&nbsp;Wikipedia&nbsp;and&nbsp;finding&nbsp;information</a>';<br />
messageEdu[6]='<a href="http://en.wikipedia.org/wiki/Wikipedia:Contributing_to_Wikipedia" title="Wikipedia:Contributing to Wikipedia">Interested&nbsp;in&nbsp;contributing&nbsp;to&nbsp;Wikipedia?</a>';<br />
var whichMessageEdu = Math.floor(Math.random()*(messageEdu.length));<br />
<br />
<br />
/** document.getElementById("contentSub").innerHTML +='<div style="position:absolute; z-index:100; right:100px; top:0px;" class="metadata" id="anontip"><div style="text-align:right; font-size:87%">•&nbsp;<i>' + messageEdu[whichMessageEdu] + '</i>&nbsp;•</div></div>';<br />
*/<br />
}<br />
}));<br />
<br />
/** <br />
* Correctly handle PNG transparency in Internet Explorer 6.<br />
* http://homepage.ntlworld.com/bobosola. Updated 18-Jan-2006.<br />
* <br />
* Adapted for Wikipedia by Remember_the_dot and Edokter.<br />
* <br />
* http://homepage.ntlworld.com/bobosola/pnginfo.htm states "This page contains more information for<br />
* the curious or those who wish to amend the script for special needs", which I take as permission to<br />
* modify or adapt this script freely. I release my changes into the public domain.<br />
*/ <br />
<br />
function PngFix()<br />
{<br />
try<br />
{<br />
if (!document.body.filters)<br />
{<br />
window.PngFixDisabled = true<br />
}<br />
}<br />
catch (e)<br />
{<br />
window.PngFixDisabled = true<br />
}<br />
if (!window.PngFixDisabled)<br />
{<br />
var documentImages = document.images<br />
var documentCreateElement = document.createElement<br />
var funcEncodeURI = encodeURI<br />
<br />
for (var i = 0; i < documentImages.length;)<br />
{<br />
var img = documentImages[i]<br />
var imgSrc = img.src<br />
<br />
if (imgSrc.substr(imgSrc.length - 3).toLowerCase() == "png" && !img.onclick)<br />
{<br />
if (img.useMap)<br />
{<br />
img.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + encodeURI(imgSrc) + "')"<br />
img.src = "http://upload.wikimedia.org/wikipedia/commons/c/ce/Transparent.gif"<br />
i++<br />
}<br />
else<br />
{<br />
var outerSpan = documentCreateElement("span")<br />
var innerSpan = documentCreateElement("span")<br />
var outerSpanStyle = outerSpan.style<br />
var innerSpanStyle = innerSpan.style<br />
var imgCurrentStyle = img.currentStyle<br />
<br />
outerSpan.id = img.id<br />
outerSpan.className = img.className<br />
outerSpanStyle.backgroundImage = imgCurrentStyle.backgroundImage<br />
outerSpanStyle.borderWidth = imgCurrentStyle.borderWidth<br />
outerSpanStyle.borderStyle = imgCurrentStyle.borderStyle<br />
outerSpanStyle.borderColor = imgCurrentStyle.borderColor<br />
outerSpanStyle.display = "inline-block"<br />
outerSpanStyle.fontSize = "0"<br />
outerSpanStyle.verticalAlign = "middle"<br />
if (img.parentElement.href) outerSpanStyle.cursor = "hand"<br />
<br />
innerSpanStyle.width = "1px"<br />
innerSpanStyle.height = "1px"<br />
innerSpanStyle.display = "inline-block"<br />
innerSpanStyle.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + funcEncodeURI(imgSrc) + "')"<br />
<br />
outerSpan.appendChild(innerSpan)<br />
img.parentNode.replaceChild(outerSpan, img)<br />
}<br />
}<br />
else<br />
{<br />
i++<br />
}<br />
}<br />
}<br />
}<br />
<br />
if (navigator.appName == "Microsoft Internet Explorer" && navigator.appVersion.substr(22, 1) == "6")<br />
{<br />
window.attachEvent("onload", PngFix)<br />
}<br />
<br />
/**<br />
* Remove need for CSS hacks regarding MSIE and IPA.<br />
*/<br />
<br />
if(navigator.userAgent.indexOf("MSIE") != -1 && document.createStyleSheet) {<br />
document.createStyleSheet().addRule('.IPA', 'font-family: "Doulos SIL", "Charis SIL", Gentium, "DejaVu Sans", Code2000, "TITUS Cyberbit Basic", "Arial Unicode MS", "Lucida Sans Unicode", "Chrysanthi Unicode";');<br />
}</div>
Dustin Howett
https://iphonedev.wiki/index.php?title=SBAwayController&diff=1349
SBAwayController
2013-08-26T23:27:52Z
<p>Dustin Howett: Refine and wikify.</p>
<hr />
<div>'''SBAwayController''' is the controller representing the lockscreen. It hosts an [[SBAwayView]].<br />
<br />
== Examples ==<br />
=== Accessing SBAwayController's SBAwayView ===<br />
<source lang="logos"><br />
[[%c(SBAwayController) sharedAwayController] awayView];<br />
</source><br />
<br />
== References ==<br />
{{IPFHeader|SpringBoard|.app}}</div>
Dustin Howett
https://iphonedev.wiki/index.php?title=MobileSafari&diff=1342
MobileSafari
2013-08-26T09:05:18Z
<p>Dustin Howett: Dustin Howett moved page MobileSafari to MobileSafari.app: this is the real direction the redirection should go</p>
<hr />
<div>#REDIRECT [[MobileSafari.app]]</div>
Dustin Howett
https://iphonedev.wiki/index.php?title=MobileSafari.app&diff=1341
MobileSafari.app
2013-08-26T09:05:18Z
<p>Dustin Howett: Dustin Howett moved page MobileSafari to MobileSafari.app: this is the real direction the redirection should go</p>
<hr />
<div>{{infobox Application<br />
| bundle = com.apple.mobilesafari<br />
| path = /Applications/MobileSafari.app<br />
| since = 1.0<br />
}}<br />
<br />
Placeholder page<br />
<br />
We will probably start by covering BrowserPanel</div>
Dustin Howett
https://iphonedev.wiki/index.php?title=MediaWiki:Monobook.css&diff=1325
MediaWiki:Monobook.css
2013-08-21T20:19:24Z
<p>Dustin Howett: The logo portlet is now customized in common.css</p>
<hr />
<div>/* CSS placed here will affect users of the MonoBook skin */<br />
/* <pre><nowiki> */<br />
<br />
/* </nowiki></pre> */</div>
Dustin Howett
https://iphonedev.wiki/index.php?title=MediaWiki:Common.css&diff=1324
MediaWiki:Common.css
2013-08-21T20:18:51Z
<p>Dustin Howett: Style the logo portlet properly in common (so that it applies to all themes.)</p>
<hr />
<div>/*<br />
ATTENTION ADMINISTRATORS:<br />
<br />
This is the CSS for all skins. <br />
<br />
Testing can be done on your own user Monobook.css. In [[wikipedia:Mozilla|Mozilla]] and<br />
[[wikipedia:Opera (web browser)|Opera]], you can also test style changes dynamically<br />
with the [http://www.squarefree.com/bookmarklets/webdevel.html test styles]<br />
bookmarklet from squarefree.com. It pops up a window for adding style rules,<br />
and updates the page as you type.<br />
<br />
Always check with the [http://tinyurl.com/28y334 W3C CSS Validation Service]<br />
([http://tinyurl.com/2g8bsk CVS version]) after any changes.<br />
<br />
See also: [[wikipedia:Wikipedia:Catalogue of CSS classes|catalogue of CSS classes]].<br />
<br />
Thank you.<br />
*/<br />
<br />
/* <pre><nowiki> */<br />
<br />
/* Edit window toolbar */<br />
#toolbar {<br />
height: 22px;<br />
margin-bottom: 6px;<br />
}<br />
<br />
/* Margins for <ol> and <ul> */<br />
#content ol, #content ul,<br />
#mw_content ol, #mw_content ul {<br />
margin-bottom: 0.5em;<br />
}<br />
<br />
/* Make the list of references in [[Template:Reflist]] smaller */<br />
.references-small { <br />
font-size: 90%;<br />
}<br />
<br />
/* VALIDATOR NOTICE: the following is correct, but the W3C validator doesn't accept it */<br />
/* -moz-* is a vendor-specific extension (CSS 2.1 4.1.2.1) */<br />
/* column-count is from the CSS3 module "CSS Multi-column Layout" */<br />
/* Please ignore any validator errors caused by these two lines */<br />
.references-2column {<br />
font-size: 90%;<br />
-moz-column-count: 2;<br />
column-count: 2;<br />
}<br />
<br />
/* Highlight clicked reference in blue to help navigation */<br />
ol.references > li:target,<br />
sup.reference:target,<br />
cite:target { <br />
background-color: #DEF;<br />
}<br />
<br />
/* Ensure refs in table headers and the like aren't bold or italic */<br />
sup.reference {<br />
font-weight: normal;<br />
font-style: normal;<br />
}<br />
<br />
<br />
/* Styling for citations */<br />
cite {<br />
font-style: normal;<br />
word-wrap: break-word;<br />
}<br />
<br />
/* For linked citation numbers and document IDs, where<br />
the number need not be shown on a screen or a handheld,<br />
but should be included in the printed version<br />
*/<br />
@media screen, handheld, projection {<br />
cite *.printonly {<br />
display: none;<br />
}<br />
}<br />
<br />
<br />
/* wikitable/prettytable class for skinning normal tables */<br />
table.wikitable,<br />
table.prettytable {<br />
margin: 1em 1em 1em 0;<br />
background: #f9f9f9;<br />
border: 1px #aaa solid;<br />
border-collapse: collapse;<br />
}<br />
.wikitable th, .wikitable td,<br />
.prettytable th, .prettytable td {<br />
border: 1px #aaa solid;<br />
padding: 0.2em;<br />
}<br />
.wikitable th,<br />
.prettytable th {<br />
background: #f2f2f2;<br />
text-align: center;<br />
}<br />
.wikitable caption,<br />
.prettytable caption {<br />
font-weight: bold;<br />
}<br />
<br />
/* Default skin for navigation boxes */<br />
table.navbox { /* Navbox container style */<br />
border: 1px solid #aaa;<br />
width: 100%; <br />
margin: auto;<br />
clear: both;<br />
font-size: 88%;<br />
text-align: center;<br />
padding: 1px;<br />
}<br />
table.navbox + table.navbox { /* Single pixel border between adjacent navboxes */<br />
margin-top: -1px; /* (doesn't work for IE6, but that's okay) */<br />
}<br />
.navbox-title,<br />
.navbox-abovebelow,<br />
table.navbox th {<br />
text-align: center; /* Title and above/below styles */<br />
padding-left: 1em;<br />
padding-right: 1em;<br />
}<br />
.navbox-group { /* Group style */<br />
white-space: nowrap;<br />
text-align: right;<br />
font-weight: bold;<br />
padding-left: 1em;<br />
padding-right: 1em;<br />
}<br />
.navbox, .navbox-subgroup {<br />
background: #fdfdfd; /* Background color */<br />
}<br />
.navbox-list {<br />
border-color: #fdfdfd; /* Must match background color */<br />
}<br />
.navbox-title,<br />
table.navbox th {<br />
background: #ccccff; /* Level 1 color */<br />
}<br />
.navbox-abovebelow,<br />
.navbox-group,<br />
.navbox-subgroup .navbox-title {<br />
background: #ddddff; /* Level 2 color */<br />
}<br />
.navbox-subgroup .navbox-group, .navbox-subgroup .navbox-abovebelow {<br />
background: #e6e6ff; /* Level 3 color */<br />
}<br />
.navbox-even {<br />
background: #f7f7f7; /* Even row striping */<br />
}<br />
.navbox-odd {<br />
background: transparent; /* Odd row striping */<br />
}<br />
<br />
.collapseButton { /* 'show'/'hide' buttons created dynamically */<br />
float: right; /* by the CollapsibleTables javascript in */<br />
font-weight: normal; /* [[MediaWiki:Common.js]]are styled here */<br />
text-align: right; /* so they can be customised. */<br />
width: auto;<br />
}<br />
.navbox .collapseButton { /* In navboxes, the show/hide button balances */<br />
width: 6em; /* the vde links from [[Template:Tnavbar]], */<br />
} /* so they need to be the same width. */<br />
<br />
<br />
/* Infobox template style */<br />
.infobox {<br />
border: 1px solid #aaa;<br />
background-color: #f9f9f9;<br />
color: black;<br />
margin: 0.5em 0 0.5em 1em;<br />
padding: 0.2em;<br />
float: right;<br />
clear: right;<br />
}<br />
.infobox td,<br />
.infobox th {<br />
vertical-align: top;<br />
}<br />
.infobox caption {<br />
font-size: larger;<br />
}<br />
.infobox.bordered {<br />
border-collapse: collapse;<br />
}<br />
.infobox.bordered td,<br />
.infobox.bordered th {<br />
border: 1px solid #aaa;<br />
}<br />
.infobox.bordered .borderless td,<br />
.infobox.bordered .borderless th {<br />
border: 0;<br />
}<br />
<br />
.infobox.sisterproject {<br />
width: 20em;<br />
font-size: 90%;<br />
}<br />
<br />
.infobox.standard-talk {<br />
border: 1px solid #c0c090;<br />
background-color: #f8eaba;<br />
}<br />
.infobox.standard-talk.bordered td,<br />
.infobox.standard-talk.bordered th {<br />
border: 1px solid #c0c090;<br />
}<br />
<br />
/* styles for bordered infobox with merged rows */<br />
.infobox.bordered .mergedtoprow td,<br />
.infobox.bordered .mergedtoprow th {<br />
border: 0;<br />
border-top: 1px solid #aaa;<br />
border-right: 1px solid #aaa;<br />
}<br />
<br />
.infobox.bordered .mergedrow td,<br />
.infobox.bordered .mergedrow th {<br />
border: 0;<br />
border-right: 1px solid #aaa;<br />
}<br />
<br />
/* Styles for geography infoboxes, eg countries,<br />
country subdivisions, cities, etc. */<br />
.infobox.geography {<br />
text-align: left;<br />
border-collapse: collapse;<br />
line-height: 1.2em; <br />
font-size: 90%;<br />
}<br />
<br />
.infobox.geography td,<br />
.infobox.geography th {<br />
border-top: solid 1px #aaa;<br />
padding: 0.4em 0.6em 0.4em 0.6em;<br />
}<br />
.infobox.geography .mergedtoprow td,<br />
.infobox.geography .mergedtoprow th {<br />
border-top: solid 1px #aaa;<br />
padding: 0.4em 0.6em 0.2em 0.6em;<br />
}<br />
<br />
.infobox.geography .mergedrow td,<br />
.infobox.geography .mergedrow th {<br />
border: 0;<br />
padding: 0 0.6em 0.2em 0.6em;<br />
}<br />
<br />
.infobox.geography .mergedbottomrow td,<br />
.infobox.geography .mergedbottomrow th {<br />
border-top: 0;<br />
border-bottom: solid 1px #aaa;<br />
padding: 0 0.6em 0.4em 0.6em;<br />
}<br />
<br />
.infobox.geography .maptable td,<br />
.infobox.geography .maptable th {<br />
border: 0;<br />
padding: 0;<br />
}<br />
<br />
/* Makes redirects appear in italics in categories and on [[Special:Allpages]] */<br />
.redirect-in-category, .allpagesredirect {<br />
font-style: italic;<br />
}<br />
<br />
/* Icons for medialist templates [[Template:Listen]],<br />
[[Template:Multi-listen_start]], [[Template:Video]],<br />
[[Template:Multi-video_start]]<br />
*/<br />
div.listenlist {<br />
background:<br />
url("http://upload.wikimedia.org/wikipedia/commons/thumb/a/a6/Gnome-speakernotes.png/30px-Gnome-speakernotes.png");<br />
padding-left: 40px;<br />
}<br />
<br />
/* Style rules for media list templates */<br />
div.medialist {<br />
min-height: 50px;<br />
margin: 1em;<br />
background-position: top left;<br />
background-repeat: no-repeat;<br />
}<br />
div.medialist ul {<br />
list-style-type: none; <br />
list-style-image: none;<br />
margin: 0;<br />
}<br />
div.medialist ul li {<br />
padding-bottom: 0.5em;<br />
}<br />
div.medialist ul li li {<br />
font-size: 91%;<br />
padding-bottom: 0;<br />
}<br />
<br />
/* Change the external link icon to an Adobe icon for all PDF files<br />
in browsers that support these CSS selectors, like Mozilla and Opera */<br />
#bodyContent a[href$=".pdf"].external, <br />
#bodyContent a[href*=".pdf?"].external, <br />
#bodyContent a[href*=".pdf#"].external,<br />
#bodyContent a[href$=".PDF"].external, <br />
#bodyContent a[href*=".PDF?"].external, <br />
#bodyContent a[href*=".PDF#"].external,<br />
#mw_content a[href$=".pdf"].external, <br />
#mw_content a[href*=".pdf?"].external, <br />
#mw_content a[href*=".pdf#"].external,<br />
#mw_content a[href$=".PDF"].external, <br />
#mw_content a[href*=".PDF?"].external, <br />
#mw_content a[href*=".PDF#"].external {<br />
background: <br />
url("http://upload.wikimedia.org/wikipedia/commons/thumb/2/23/Icons-mini-file_acrobat.gif/15px-Icons-mini-file_acrobat.gif")<br />
center right no-repeat;<br />
padding-right: 16px;<br />
}<br />
<br />
/* Change the external link icon to an Adobe icon anywhere the PDFlink class<br />
is used (notably Template:PDFlink). This works in IE, unlike the above. */<br />
#bodyContent span.PDFlink a,<br />
#mw_content span.PDFlink a {<br />
background: <br />
url("http://upload.wikimedia.org/wikipedia/commons/thumb/2/23/Icons-mini-file_acrobat.gif/15px-Icons-mini-file_acrobat.gif")<br />
center right no-repeat;<br />
padding-right: 17px;<br />
}<br />
<br />
/* Remove link styling. Already defined in monobook<br />
and modern, but not defined in the other skins. Bug 18708 */<br />
#bodyContent .plainlinks a {<br />
background: none !important;<br />
padding: 0 !important;<br />
}<br />
<br />
/* Content in columns with CSS instead of tables [[Template:Columns]] */<br />
div.columns-2 div.column {<br />
float: left;<br />
width: 50%;<br />
min-width: 300px;<br />
}<br />
div.columns-3 div.column {<br />
float: left;<br />
width: 33.3%;<br />
min-width: 200px;<br />
}<br />
div.columns-4 div.column {<br />
float: left;<br />
width: 25%;<br />
min-width: 150px;<br />
}<br />
div.columns-5 div.column {<br />
float: left;<br />
width: 20%;<br />
min-width: 120px;<br />
}<br />
<br />
/* Make sure that "external references" from templates like [[Template:Ref]] <br />
do not get URL expansion, not even when printed. The anchor itself has <br />
class "external autonumber" and the url expansion is inserted when printing <br />
(see [http://en.wikipedia.org/skins-1.5/common/commonPrint.css]) using the<br />
":after" pseudo-element.<br />
*/<br />
.nourlexpansion a.external.text:after,<br />
.nourlexpansion a.external.autonumber:after {<br />
display: none !important;<br />
}<br />
<br />
/* Messagebox templates */<br />
.messagebox {<br />
border: 1px solid #aaa;<br />
background-color: #f9f9f9;<br />
width: 80%;<br />
margin: 0 auto 1em auto;<br />
padding: .2em;<br />
}<br />
.messagebox.merge {<br />
border: 1px solid #c0b8cc;<br />
background-color: #f0e5ff;<br />
text-align: center;<br />
}<br />
.messagebox.cleanup {<br />
border: 1px solid #9f9fff;<br />
background-color: #efefff;<br />
text-align: center;<br />
}<br />
.messagebox.standard-talk {<br />
border: 1px solid #c0c090;<br />
background-color: #f8eaba;<br />
margin: 4px auto;<br />
}<br />
/* For old WikiProject banners inside banner shells. */<br />
.mbox-inside .standard-talk,<br />
.messagebox.nested-talk {<br />
border: 1px solid #c0c090;<br />
background-color: #f8eaba;<br />
width: 100%;<br />
margin: 2px 0;<br />
padding: 2px;<br />
}<br />
.messagebox.small {<br />
width: 238px;<br />
font-size: 85%;<br />
float: right;<br />
clear: both;<br />
margin: 0 0 1em 1em;<br />
line-height: 1.25em; <br />
}<br />
.messagebox.small-talk {<br />
width: 238px;<br />
font-size: 85%;<br />
float: right;<br />
clear: both;<br />
margin: 0 0 1em 1em;<br />
line-height: 1.25em; <br />
background: #F8EABA;<br />
}<br />
<br />
<br />
/* Cell sizes for ambox/tmbox/imbox/cmbox/ombox/fmbox/dmbox message boxes */<br />
th.mbox-text, td.mbox-text { /* The message body cell(s) */<br />
border: none; <br />
padding: 0.25em 0.9em; /* 0.9em left/right */<br />
width: 100%; /* Make all mboxes the same width regardless of text length */<br />
}<br />
td.mbox-image { /* The left image cell */<br />
border: none; <br />
padding: 2px 0 2px 0.9em; /* 0.9em left, 0px right */<br />
text-align: center; <br />
}<br />
td.mbox-imageright { /* The right image cell */<br />
border: none;<br />
padding: 2px 0.9em 2px 0; /* 0px left, 0.9em right */<br />
text-align: center; <br />
}<br />
td.mbox-empty-cell { /* An empty narrow cell */<br />
border: none;<br />
padding: 0px;<br />
width: 1px;<br />
}<br />
<br />
/* Article message box styles */<br />
table.ambox {<br />
margin: 0px 10%; /* 10% = Will not overlap with other elements */<br />
border: 1px solid #aaa; <br />
border-left: 10px solid #1e90ff; /* Default "notice" blue */<br />
background: #fbfbfb; <br />
}<br />
table.ambox + table.ambox { /* Single border between stacked boxes. */<br />
margin-top: -1px;<br />
}<br />
.ambox th.mbox-text, <br />
.ambox td.mbox-text { /* The message body cell(s) */<br />
padding: 0.25em 0.5em; /* 0.5em left/right */<br />
}<br />
.ambox td.mbox-image { /* The left image cell */<br />
padding: 2px 0 2px 0.5em; /* 0.5em left, 0px right */<br />
}<br />
.ambox td.mbox-imageright { /* The right image cell */<br />
padding: 2px 0.5em 2px 0; /* 0px left, 0.5em right */<br />
}<br />
<br />
table.ambox-notice {<br />
border-left: 10px solid #1e90ff; /* Blue */<br />
}<br />
table.ambox-speedy {<br />
border-left: 10px solid #b22222; /* Red */<br />
background: #fee; /* Pink */<br />
}<br />
table.ambox-delete {<br />
border-left: 10px solid #b22222; /* Red */<br />
}<br />
table.ambox-content {<br />
border-left: 10px solid #f28500; /* Orange */<br />
}<br />
table.ambox-style {<br />
border-left: 10px solid #f4c430; /* Yellow */<br />
}<br />
table.ambox-move {<br />
border-left: 10px solid #9932cc; /* Purple */<br />
}<br />
table.ambox-protection {<br />
border-left: 10px solid #bba; /* Gray-gold */<br />
}<br />
<br />
/* Image message box styles */<br />
table.imbox {<br />
margin: 4px 10%; <br />
border-collapse: collapse; <br />
border: 3px solid #1e90ff; /* Default "notice" blue */<br />
background: #fbfbfb;<br />
}<br />
.imbox .mbox-text .imbox { /* For imboxes inside imbox-text cells. */<br />
margin: 0 -0.5em; /* 0.9 - 0.5 = 0.4em left/right. */<br />
}<br />
.mbox-inside .imbox { /* For imboxes inside other templates. */<br />
margin: 4px;<br />
}<br />
<br />
table.imbox-notice {<br />
border: 3px solid #1e90ff; /* Blue */<br />
}<br />
table.imbox-speedy {<br />
border: 3px solid #b22222; /* Red */<br />
background: #fee; /* Pink */<br />
}<br />
table.imbox-delete {<br />
border: 3px solid #b22222; /* Red */<br />
}<br />
table.imbox-content {<br />
border: 3px solid #f28500; /* Orange */<br />
}<br />
table.imbox-style {<br />
border: 3px solid #f4c430; /* Yellow */<br />
}<br />
table.imbox-move {<br />
border: 3px solid #9932cc; /* Purple */<br />
}<br />
table.imbox-protection {<br />
border: 3px solid #bba; /* Gray-gold */<br />
}<br />
table.imbox-license {<br />
border: 3px solid #88a; /* Dark gray */<br />
background: #f7f8ff; /* Light gray */<br />
}<br />
table.imbox-featured {<br />
border: 3px solid #cba135; /* Brown-gold */<br />
}<br />
<br />
/* Category message box styles */<br />
table.cmbox {<br />
margin: 3px 10%;<br />
border-collapse: collapse;<br />
border: 1px solid #aaa; <br />
background: #DFE8FF; /* Default "notice" blue */<br />
}<br />
<br />
table.cmbox-notice {<br />
background: #D8E8FF; /* Blue */<br />
}<br />
table.cmbox-speedy {<br />
margin-top: 4px;<br />
margin-bottom: 4px;<br />
border: 4px solid #b22222; /* Red */<br />
background: #FFDBDB; /* Pink */<br />
}<br />
table.cmbox-delete {<br />
background: #FFDBDB; /* Red */<br />
}<br />
table.cmbox-content {<br />
background: #FFE7CE; /* Orange */<br />
}<br />
table.cmbox-style {<br />
background: #FFF9DB; /* Yellow */<br />
}<br />
table.cmbox-move {<br />
background: #E4D8FF; /* Purple */<br />
}<br />
table.cmbox-protection {<br />
background: #EFEFE1; /* Gray-gold */<br />
}<br />
<br />
/* Other pages message box styles */<br />
table.ombox {<br />
margin: 4px 10%; <br />
border-collapse: collapse; <br />
border: 1px solid #aaa; /* Default "notice" gray */<br />
background: #f9f9f9;<br />
}<br />
<br />
table.ombox-notice {<br />
border: 1px solid #aaa; /* Gray */<br />
}<br />
table.ombox-speedy {<br />
border: 2px solid #b22222; /* Red */<br />
background: #fee; /* Pink */<br />
}<br />
table.ombox-delete {<br />
border: 2px solid #b22222; /* Red */<br />
}<br />
table.ombox-content {<br />
border: 1px solid #f28500; /* Orange */<br />
}<br />
table.ombox-style {<br />
border: 1px solid #f4c430; /* Yellow */<br />
}<br />
table.ombox-move {<br />
border: 1px solid #9932cc; /* Purple */<br />
}<br />
table.ombox-protection {<br />
border: 2px solid #bba; /* Gray-gold */<br />
}<br />
<br />
/* Talk page message box styles */<br />
table.tmbox {<br />
margin: 4px 10%;<br />
border-collapse: collapse;<br />
border: 1px solid #c0c090; /* Default "notice" gray-brown */<br />
background: #f8eaba;<br />
}<br />
.mediawiki .mbox-inside .tmbox { /* For tmboxes inside other templates. The "mediawiki" */<br />
margin: 2px 0; /* class ensures that this declaration overrides other */<br />
width: 100%; /* For Safari and Opera */ /* styles (including mbox-small above) */<br />
}<br />
.mbox-inside .tmbox.mbox-small { /* "small" tmboxes should not be small when */<br />
line-height: 1.5em; /* also "nested", so reset styles that are */ <br />
font-size: 100%; /* set in "mbox-small" above. */<br />
}<br />
<br />
table.tmbox-speedy {<br />
border: 2px solid #b22222; /* Red */<br />
background: #fee; /* Pink */<br />
}<br />
table.tmbox-delete {<br />
border: 2px solid #b22222; /* Red */<br />
}<br />
table.tmbox-content {<br />
border: 2px solid #f28500; /* Orange */<br />
}<br />
table.tmbox-style {<br />
border: 2px solid #f4c430; /* Yellow */<br />
}<br />
table.tmbox-move {<br />
border: 2px solid #9932cc; /* Purple */<br />
}<br />
table.tmbox-protection,<br />
table.tmbox-notice {<br />
border: 1px solid #c0c090; /* Gray-brown */<br />
}<br />
<br />
/* Disambig and set index box styles */<br />
table.dmbox {<br />
clear: both; <br />
margin: 0.9em 1em; <br />
border-top: 1px solid #ccc; <br />
border-bottom: 1px solid #ccc; <br />
background: transparent;<br />
}<br />
<br />
/* Footer and header message box styles */<br />
table.fmbox {<br />
clear: both;<br />
margin: 0.2em 0;<br />
width: 100%;<br />
border: 1px solid #aaa;<br />
background: #f9f9f9; /* Default "system" gray */<br />
}<br />
table.fmbox-system {<br />
background: #f9f9f9;<br />
}<br />
table.fmbox-warning {<br />
border: 1px solid #bb7070; /* Dark pink */<br />
background: #ffdbdb; /* Pink */<br />
}<br />
table.fmbox-editnotice {<br />
background: transparent;<br />
}<br />
/* Div based "warning" style fmbox messages. */<br />
div.mw-warning-with-logexcerpt,<br />
div.mw-lag-warn-high,<br />
div.mw-cascadeprotectedwarning {<br />
clear: both;<br />
margin: 0.2em 0;<br />
border: 1px solid #bb7070;<br />
background: #ffdbdb;<br />
padding: 0.25em 0.9em;<br />
}<br />
/* Div based "system" style fmbox messages. Used in <br />
[[MediaWiki:Noarticletext]] and [[MediaWiki:Readonly lag]]. */<br />
div.mw-lag-warn-normal,<br />
div.noarticletext,<br />
div.fmbox-system {<br />
clear: both;<br />
margin: 0.2em 0;<br />
border: 1px solid #aaa;<br />
background: #f9f9f9;<br />
padding: 0.25em 0.9em;<br />
}<br />
<br />
/* These mbox-small classes must be placed after all other <br />
ambox/tmbox/ombox etc classes. "body.mediawiki" is so <br />
they override "table.ambox + table.ambox" above. */<br />
body.mediawiki table.mbox-small { /* For the "small=yes" option. */<br />
clear: right;<br />
float: right;<br />
margin: 4px 0 4px 1em;<br />
width: 238px;<br />
font-size: 88%;<br />
line-height: 1.25em;<br />
}<br />
body.mediawiki table.mbox-small-left { /* For the "small=left" option. */<br />
margin: 4px 1em 4px 0;<br />
width: 238px;<br />
border-collapse: collapse;<br />
font-size: 88%;<br />
line-height: 1.25em;<br />
}<br />
<br />
<br />
/* Support for Template:IPA, Template:Unicode and Template:Polytonic.<br />
The second declarations reset the styles for all browsers except<br />
IE6, which chokes on the empty comment tags. Please copy any changes<br />
to [[Template:IPA fonts]] and [[Template:Unicode fonts]].<br />
*/<br />
.IPA {<br />
font-family: "Charis SIL", "Doulos SIL", Gentium, GentiumAlt,<br />
"DejaVu Sans", Code2000, "TITUS Cyberbit Basic",<br />
"Arial Unicode MS", "Lucida Sans Unicode",<br />
"Chrysanthi Unicode";<br />
font-family /**/: inherit;<br />
}<br />
.Unicode {<br />
font-family: Code2000, Code2001, "Free Serif", "TITUS Cyberbit Basic",<br />
"Doulos SIL", "Chrysanthi Unicode", "Bitstream Cyberbit",<br />
"Bitstream CyberBase", Thryomanes, Gentium, GentiumAlt,<br />
"Lucida Grande", "Free Sans", "Arial Unicode MS",<br />
"Microsoft Sans Serif", "Lucida Sans Unicode";<br />
font-family /**/: inherit;<br />
}<br />
.latinx {<br />
font-family: Code2000, Code2001, "TITUS Cyberbit Basic", "Microsoft Sans Serif";<br />
font-family /**/: inherit;<br />
}<br />
.polytonic {<br />
font-family: "Athena Unicode", Gentium, "Palatino Linotype",<br />
"Arial Unicode MS", "Lucida Sans Unicode",<br />
"Lucida Grande", Code2000; <br />
font-family /**/: inherit;<br />
}<br />
<br />
#wpSave {<br />
font-weight: bold;<br />
}<br />
<br />
/* class hiddenStructure is defunct. See [[Wikipedia:hiddenStructure]] */<br />
.hiddenStructure {<br />
display: inline ! important;<br />
color: #f00; <br />
background-color: #0f0;<br />
}<br />
<br />
/* suppress missing interwiki image links where #ifexist cannot<br />
be used due to high number of requests see .hidden-redlink on <br />
http://meta.wikimedia.org/wiki/MediaWiki:Common.css<br />
*/<br />
.check-icon a.new {<br />
display: none; <br />
speak: none;<br />
}<br />
<br />
/* Removes underlines from links */<br />
.nounderlines a { <br />
text-decoration: none;<br />
}<br />
<br />
/* Remove underline from IPA links */<br />
.IPA a:link, .IPA a:visited {<br />
text-decoration: none;<br />
}<br />
<br />
/* Standard Navigationsleisten, aka box hiding thingy<br />
from .de. Documentation at [[Wikipedia:NavFrame]]. */<br />
div.NavFrame {<br />
margin: 0;<br />
padding: 4px;<br />
border: 1px solid #aaa;<br />
text-align: center;<br />
border-collapse: collapse;<br />
font-size: 95%;<br />
}<br />
div.NavFrame + div.NavFrame {<br />
border-top-style: none;<br />
border-top-style: hidden;<br />
}<br />
div.NavPic {<br />
background-color: #fff;<br />
margin: 0;<br />
padding: 2px;<br />
float: left;<br />
}<br />
div.NavFrame div.NavHead {<br />
height: 1.6em;<br />
font-weight: bold;<br />
background-color: #ccf;<br />
position: relative;<br />
}<br />
div.NavFrame p {<br />
font-size: 100%;<br />
}<br />
div.NavFrame div.NavContent {<br />
font-size: 100%;<br />
}<br />
div.NavFrame div.NavContent p {<br />
font-size: 100%;<br />
}<br />
div.NavEnd {<br />
margin: 0;<br />
padding: 0;<br />
line-height: 1px;<br />
clear: both;<br />
}<br />
a.NavToggle {<br />
position: absolute;<br />
top: 0;<br />
right: 3px;<br />
font-weight: normal;<br />
font-size: 90%;<br />
}<br />
<br />
/* Coloured watchlist numbers */<br />
.mw-plusminus-pos { color: #006400; } /* dark green */<br />
.mw-plusminus-neg { color: #8B0000; } /* dark red */<br />
<br />
.rellink,<br />
.dablink {<br />
font-style: italic;<br />
padding-left: 2em;<br />
}<br />
.rellink i,<br />
.dablink i {<br />
font-style: normal;<br />
}<br />
<br />
/* Style for horizontal UL lists */<br />
.horizontal ul {<br />
padding: 0;<br />
margin: 0;<br />
}<br />
.horizontal li { <br />
padding: 0 0.6em 0 0.4em;<br />
display: inline;<br />
border-right: 1px solid;<br />
}<br />
.horizontal li:last-child {<br />
border-right: none;<br />
padding-right: 0;<br />
}<br />
<br />
/* Allow transcluded pages to display in lists rather than a table.<br />
Compatible in Firefox; incompatible in IE6. */<br />
.listify td { display: list-item; }<br />
.listify tr { display: block; }<br />
.listify table { display: block; }<br />
<br />
/* Geographical coordinates defaults. See [[Template:Coord/link]]<br />
for how these are used. The classes "geo", "longitude", and<br />
"latitude" are used by the [[Geo microformat]].<br />
*/<br />
.geo-default, .geo-dms, .geo-dec { display: inline; }<br />
.geo-nondefault, .geo-multi-punct { display: none; }<br />
.longitude, .latitude { white-space: nowrap; }<br />
<br />
/* When <div class="nonumtoc"> is used on the table of contents,<br />
the ToC will display without numbers */<br />
.nonumtoc .tocnumber { display: none; }<br />
.nonumtoc #toc ul,<br />
.nonumtoc .toc ul {<br />
line-height: 1.5em;<br />
list-style: none;<br />
margin: .3em 0 0;<br />
padding: 0;<br />
}<br />
.nonumtoc #toc ul ul, <br />
.nonumtoc .toc ul ul { <br />
margin: 0 0 0 2em; <br />
}<br />
<br />
/* Allow limiting of which header levels are shown in a TOC;<br />
<div class="toclimit-3">, for instance, will limit to<br />
showing ==headings== and ===headings=== but no further<br />
(as long as there are no =headings= on the page, which<br />
there shouldn't be according to the MoS).<br />
*/<br />
.toclimit-2 .toclevel-2,<br />
.toclimit-3 .toclevel-3,<br />
.toclimit-4 .toclevel-4,<br />
.toclimit-5 .toclevel-5,<br />
.toclimit-6 .toclevel-6,<br />
.toclimit-7 .toclevel-7 { display: none; }<br />
<br />
/* Styling for Template:Quote */<br />
blockquote.templatequote { <br />
margin-top: 0; <br />
}<br />
blockquote.templatequote div.templatequotecite { <br />
line-height: 1em;<br />
text-align: left;<br />
padding-left: 2em;<br />
margin-top: 0;<br />
}<br />
blockquote.templatequote div.templatequotecite cite {<br />
font-size: 85%;<br />
}<br />
<br />
div.user-block {<br />
padding: 5px;<br />
border: 1px solid #A9A9A9;<br />
background-color: #FFEFD5;<br />
}<br />
<br />
/* Prevent line breaks in silly places: <br />
1) links when we don't want them to<br />
2) HTML formulae<br />
3) Ref tags with group names <ref group="Note"> --> "[Note 1]"<br />
*/<br />
.nowraplinks a,<br />
span.texhtml,<br />
sup.reference a { white-space: nowrap; }<br />
<br />
/* For template documentation */<br />
.template-documentation {<br />
clear: both;<br />
margin: 1em 0 0 0;<br />
border: 1px solid #aaa; <br />
background-color: #ecfcf4; <br />
padding: 5px;<br />
}<br />
<br />
.thumbinner {<br />
min-width: 100px;<br />
}<br />
<br />
/* Inline divs in ImageMaps (code borrowed from de.wiki) */<br />
.imagemap-inline div {<br />
display: inline;<br />
}<br />
<br />
/* Increase the height of the image upload box */<br />
#wpUploadDescription {<br />
height: 13em;<br />
}<br />
<br />
/* Reduce line-height for <sup> and <sub> */<br />
sup, sub {<br />
line-height: 1em;<br />
}<br />
<br />
<br />
/* The backgrounds for galleries. */<br />
#content .gallerybox div.thumb {<br />
background-color: #F9F9F9; /* Light gray padding */<br />
}<br />
/* Put a chequered background behind images, only visible if they have transparency */<br />
.gallerybox .thumb img,<br />
#file img {<br />
background: white url("http://upload.wikimedia.org/wikipedia/commons/5/5d/Checker-16x16.png") repeat;<br />
}<br />
/* But no chequered background on articles, user pages or portals. */<br />
.ns-0 .gallerybox .thumb img,<br />
.ns-2 .gallerybox .thumb img,<br />
.ns-100 .gallerybox .thumb img {<br />
background: white;<br />
}<br />
<br />
/* Prevent floating boxes from overlapping any category listings,<br />
file histories, edit previews, and edit [Show changes] views */<br />
#mw-subcategories, #mw-pages, #mw-category-media, <br />
#filehistory, #wikiPreview, #wikiDiff {<br />
clear: both;<br />
}<br />
<br />
/* Selectively hide headers in WikiProject banners */<br />
.wpb .wpb-header { display: none; }<br />
.wpbs-inner .wpb .wpb-header { display: block; } /* for IE */<br />
.wpbs-inner .wpb .wpb-header { display: table-row; } /* for real browsers */<br />
.wpbs-inner .wpb-outside { display: none; } /* hide things that should only display outside shells */<br />
<br />
/* The logo portlet should have the same size in every theme. */<br />
#p-logo a, #p-logo a:hover {<br />
background-size: 135px 135px !important;<br />
}<br />
<br />
/* </nowiki></pre> */</div>
Dustin Howett
https://iphonedev.wiki/index.php?title=Open_Source_Projects&diff=1278
Open Source Projects
2013-08-19T22:58:25Z
<p>Dustin Howett: Cydelete is 2.0-5.x, fix the appearance of some other ranges.</p>
<hr />
<div>This page is an attempt to catalogue most of the open source jailbreak<!-- Should it only be JB projects?--> projects available online.<br />
<br />
== Tweaks ==<br />
<br />
Also check out [http://tweakweek.com/ Tweakweek] for a long list of relatively simple open source tweaks, organized by rpetrich.<br />
<br />
[https://github.com/Xuzz/tweaks Xuzz (chpwn) has a repository with a bunch of tiny tweaks]: FaceForward, appslide, Covert, Empty Folder Icons, Firebreak, Five Icon Switcher, FullWebClips, Hook's Law, No Badges, No Bookmarks, No Dots, No Folder Badges.<br />
<br />
{| class="wikitable"<br />
|-<br />
! Project !! Author !! Compatibility !! Last updated (as of August 2013)<br />
|-<br />
| [https://github.com/rpetrich/AllowRotate AllowRotate] || rpetrich || ? || 3 years ago<br />
|-<br />
| [https://github.com/rpetrich/AutocorrectionBar AutocorrectionBar] || rpetrich || ? || 2 years ago<br />
|-<br />
| [https://github.com/rpetrich/BrowserChooser BrowserChooser] || rpetrich || ? || 5 months ago<br />
|-<br />
| [https://github.com/rpetrich/ClearNotifications ClearNotifications] || rpetrich || ? || 2 years ago<br />
|-<br />
| [https://github.com/DHowett/cydelete Cydelete] || DHowett || iOS 2.0 - 5.x || 2 years ago<br />
|-<br />
| [http://gitweb.saurik.com/cydget.git Cydget] || saurik || iOS 2.2 - 6.1 || 5 months ago<br />
|-<br />
| [https://github.com/rpetrich/DeepEnd DeepEnd] || rpetrich || ? || 3 years ago<br />
|-<br />
| [https://github.com/rpetrich/DietBar DietBar] || rpetrich || ? || a year ago<br />
|-<br />
| [https://github.com/rpetrich/DietBulletins DietBulletins] || rpetrich || ? || 4 months ago<br />
|-<br />
| [https://github.com/rpetrich/DisplayEffects DisplayEffects] || rpetrich || ? || 3 years ago<br />
|-<br />
| [https://github.com/rpetrich/FastBlurredNotificationCenter FastBlurredNotificationCenter] || rpetrich || ? || a year ago<br />
|-<br />
| [https://github.com/rpetrich/FullForce FullForce] || rpetrich || ? || 2 years ago<br />
|-<br />
| [https://github.com/rpetrich/IconRenamer IconRenamer] || rpetrich || ? || 2 years ago<br />
|-<br />
| [https://github.com/rpetrich/IconRotator IconRotator] || rpetrich || ? || six months ago<br />
|-<br />
| [https://github.com/rpetrich/ListLauncher ListLauncher] || rpetrich || ? || 3 years ago<br />
|-<br />
| [https://github.com/rpetrich/LiveClock LiveClock] || rpetrich || ? || 7 months ago<br />
|-<br />
| [https://github.com/rpetrich/LivePaper LivePaper] || rpetrich || ? || 2 years ago<br />
|-<br />
| [https://github.com/conradev/Tweaks/tree/master/lockseconds LockSeconds] || conradev || ? || a year ago<br />
|-<br />
| [https://github.com/rpetrich/MathAlarm MathAlarm] || rpetrich || ? || 2 years ago<br />
|-<br />
| [https://github.com/b3ll/MessageBox MessageBox] || b3ll || ? || 4 months ago<br />
|-<br />
| [https://github.com/rpetrich/MoreLinesNotificationCenter MoreLinesNotificationCenter] || rpetrich || ? || 2 years ago<br />
|-<br />
| [https://github.com/rpetrich/Multi-Slide Multi-Slide] || rpetrich || ? || 2 years ago<br />
|-<br />
| [https://github.com/rpetrich/MusicBanners MusicBanners] || rpetrich || ? || a year ago<br />
|-<br />
| [https://github.com/rpetrich/NoClearHistory NoClearHistory] || rpetrich || ? || 3 years ago<br />
|-<br />
| [https://github.com/rpetrich/NoNewsIsGoodNews NoNewsIsGoodNews] || rpetrich || ? || 2 years ago<br />
|-<br />
| [https://github.com/conradev/Tweaks/tree/master/nopasscodeblock NoPasscodeBlock] || conradev || ? || 7 months ago<br />
|-<br />
| [https://github.com/rpetrich/PagePusher PagePusher] || rpetrich || ? || 2 years ago<br />
|-<br />
| [https://github.com/rpetrich/ProSwitcher ProSwitcher] || rpetrich || ? || 3 years ago<br />
|-<br />
| [https://github.com/rpetrich/PullToDismiss PullToDismiss] || rpetrich || ? || 2 years ago<br />
|-<br />
| [https://github.com/rpetrich/QuickReply QuickReply] || rpetrich || ? || 2 years ago<br />
|-<br />
| [https://github.com/rpetrich/RotationInhibitor RotationInhibitor] || rpetrich || ? || 7 months ago<br />
|-<br />
| [https://github.com/rpetrich/RunningIndicator RunningIndicator] || rpetrich || ? || 3 months ago<br />
|-<br />
| [https://github.com/rpetrich/SBCustomIcon SBCustomIcon] || rpetrich || ? || 5 years ago<br />
|-<br />
| [https://github.com/conradev/Tweaks/tree/master/searchclear SearchClear] || conradev || ? || a year ago<br />
|-<br />
| [https://github.com/rpetrich/SliderBar SliderBar] || rpetrich || ? || 2 years ago<br />
|-<br />
| [https://github.com/rpetrich/SplitMail SplitMail] || rpetrich || ? || 2 years ago<br />
|-<br />
| [https://github.com/freerunnering/SwipeSelection SwipeSelection] || freerunnering || ? || 4 months ago<br />
|-<br />
| [https://github.com/rpetrich/SwitcherMod SwitcherMod] || rpetrich || ? || 2 years ago<br />
|-<br />
| [https://github.com/rpetrich/SwitchIcons SwitchIcons] || rpetrich || ? || 3 months ago<br />
|-<br />
| [https://github.com/rpetrich/TopographyForGoogleMaps TopographyForGoogleMaps] || rpetrich || ? || 8 months ago<br />
|-<br />
| [https://github.com/rpetrich/VideoPace VideoPace] || rpetrich || ? || 2 weeks ago<br />
|-<br />
| [https://github.com/conradev/UserAgentFaker UserAgentFaker] || conradev || ? || a year ago<br />
|-<br />
| [http://gitweb.saurik.com/veency.git Veency] || saurik || up to iOS 6.1 || 6 months ago<br />
|-<br />
| [https://github.com/rpetrich/VoiceKeys VoiceKeys] || rpetrich || ? || 2 years ago<br />
|-<br />
| [https://github.com/rpetrich/WebGLEnabler WebGLEnabler] || rpetrich || ? || 2 years ago<br />
|-<br />
| [https://github.com/rpetrich/WebPreview WebPreview] || rpetrich || ? || 3 years ago<br />
|-<br />
| [https://github.com/rpetrich/WiCarrier WiCarrier] || rpetrich || ? || a year ago<br />
|-<br />
| [http://gitweb.saurik.com/winterboard.git Winterboard] || saurik || iOS 2.0 - 6.1 || 7 months ago<br />
|}<br />
<br />
== Applications ==<br />
<!-- Should we include only jailbreak apps or all open source apps we can find? --><br />
<br />
* [http://gitweb.saurik.com/cydia.git Cydia]<br />
<br />
== Tools ==<br />
<br />
* [https://github.com/rpetrich/CaptainHammer CaptainHammer]<br />
* [https://github.com/conradev/Open Open]<br />
* [[Theos]]<br />
https://github.com/DHowett/theos<br />
<br />
== Developer libraries ==<br />
<!-- Use an internal link for the name (developer libraries, ideally, should each have their own page (like Classes)) and external links under them for Github repo. --><br />
<br />
* [[Activator]]<br />
https://github.com/rpetrich/libactivator<br />
<br />
* [[AppList]]<br />
https://github.com/rpetrich/AppList<br />
<br />
* [[Flipswitch]]<br />
https://github.com/a3tweaks/Flipswitch<br />
<br />
* [[LibDisplay]]<br />
https://github.com/freerunnering/LibDisplay<br />
<br />
* [[LibDisplayStack]]<br />
https://github.com/Zimm/libdisplaystack<br />
<br />
* [[LibStatusBar]]<br />
https://github.com/phoenix3200/libstatusbar<br />
<br />
* [[PreferenceLoader]]<br />
https://github.com/DHowett/preferenceloader<br />
<br />
== Other ==</div>
Dustin Howett
https://iphonedev.wiki/index.php?title=XCode_Logos&diff=1276
XCode Logos
2013-08-19T22:53:47Z
<p>Dustin Howett: Fix broken redirect (?)</p>
<hr />
<div>#REDIRECT [[Xcode Logos]]</div>
Dustin Howett
https://iphonedev.wiki/index.php?title=Talk:Welcome&diff=1247
Talk:Welcome
2013-07-25T02:12:31Z
<p>Dustin Howett: /* How to edit the Navbox? */</p>
<hr />
<div>I wish this could be made part of theiphonewiki, it isn't user oriented, just no one filled in the development stuff. --[[User:Geohot|Geohot]]<br />
:Sorry, geo. I'd like to keep this wiki out of the blazing glory of spam. [[User:Dustin Howett|Dustin Howett]] 04:22, 8 November 2009 (UTC)<br />
<br />
== How to edit the Navbox? ==<br />
<br />
like:<br />
{{Navbox Frameworks}}<br />
<br />
<br />
:The navbox is automatically generated based on the framework categories. Look at the category/class transclusions on the framework pages. [[User:Dustin Howett|Dustin Howett]] ([[User talk:Dustin Howett|talk]]) 19:12, 24 July 2013 (PDT)</div>
Dustin Howett
https://iphonedev.wiki/index.php?title=Preferences_specifier_plist&diff=1204
Preferences specifier plist
2013-04-27T07:27:35Z
<p>Dustin Howett: /* Constructing PSLinkCell in Run time */ Rename section.</p>
<hr />
<div>This document provides the specification of the .plist file that specifies the layout of an iPhone preference pane.<br />
<br />
== Root level ==<br />
The root level of the plist may contain these keys:<br />
<br />
<blockquote>''struct'' <tt>&lt;preferences specifier plist&gt;</tt> ::</blockquote><br />
{| class="wikitable"<br />
|-<br />
! key !! colspan="2" | type !! meaning !! depends<br />
|-<br />
| title || string || localizable string || Title of the preference pane. || -<br />
|-<br />
| items || array || ... of <tt>&lt;entry&gt;</tt>s || Array of specifier definitions. || -<br />
|-<br />
| id || colspan="2" | string || Specifier ID. || -<br />
|}<br />
<br />
=== Localization ===<br />
Some strings, e.g. the title of the preference pane is localizable. Preferences.framework can localize these strings by looking for the corresponding key in ''localizationTable''<tt>.strings</tt> in ''bundle''. If you are writing a [[PreferenceBundles]], the ''localizationTable'' is the name of the specifier plist and ''bundle'' is of course the PreferenceBundle itself.<br />
<br />
For example, if the plist is named <tt>MySettings.plist</tt>, then the corresponding strings file should be named <tt>MySettings.strings</tt>.<br />
<br />
== Specifier Entries ==<br />
You can use any keys that your controller recognizes in the plist for further customization. This table lists the internal ones:<br />
<br />
<blockquote>''struct'' <tt>&lt;entry&gt;</tt> ::</blockquote><br />
<br />
=== General keys ===<br />
<br />
{| class="wikitable"<br />
|-<br />
! key !! colspan="2" | type !! meaning !! depends<br />
|-<br />
| requiredCapabilities || array || ... of <tt>&lt;[[GSCapability|capability]]&gt;</tt>s || Required capabilities of the device such that this specifier can be shown. || -<br />
|-<br />
| cell || string || <tt>&lt;cell type&gt;</tt> || Specifier cell type. || -<br />
|-<br />
| label || string || localizable string || Label of specifier. || -<br />
|-<br />
| id || colspan="2" | string || Specifier ID. || -<br />
|-<br />
| get || string || selector || Getter. || -<br />
|-<br />
| set || string || selector || Setter. || -<br />
|-<br />
| action || string || selector || Action. || -<br />
|-<br />
| enabled || colspan="2" | boolean || Whether the control is enabled by default. || -<br />
|-<br />
| defaults || string || bundle ID || The user defaults associated with this specifier. || -<br />
|-<br />
| key || colspan="2" | string || Key of the user defaults. || ''defaults'' ≠ nil<br />
|-<br />
| default || colspan="2" | any || Default value of control. || -<br />
|-<br />
| negate || colspan="2" | boolean || If the key in the user defaults is a boolean, invert the value displayed. || -<br />
|-<br />
| PostNotification || colspan="2" | string || Darwin Notification to post when the preference is changed. || -<br />
|}<br />
<br />
Here, ''cell'' must be one of:<br />
* ''enum'' <tt>&lt;cell type&gt;</tt> ::<br />
** PSGroupCell<br />
** PSLinkCell<br />
** PSLinkListCell<br />
** PSListItemCell<br />
** PSTitleValueCell<br />
** PSSliderCell<br />
** PSSwitchCell<br />
** PSStaticTextCell<br />
** PSEditTextCell<br />
** PSSegmentCell<br />
** PSGiantIconCell<br />
** PSGiantCell<br />
** PSSecureEditTextCell<br />
** PSButtonCell<br />
** PSEditTextViewCell<br />
The cell type is actually determined from the class method {{ObjcCall|PSTableCell|cellTypeFromString:|ClassMethod=1}}.<br />
<br />
=== ''bundle''-dependent keys ===<br />
The following keys are meaningful when ''bundle'' is present. It is useful for loading extra resources and custom code.<br />
<br />
{| class="wikitable"<br />
|-<br />
! key !! colspan="2" | type !! meaning !! depends<br />
|-<br />
| bundle || string || filename || Bundle file name. This bundle will be loaded for additional resources. || -<br />
|-<br />
| internal || colspan="2" | boolean || Directory to search for the bundle.<br />If true, search in <tt>/AppleInternal/Library/PreferenceBundles/</tt>.<br />If false, search in <tt>/System/Library/PreferenceBundles/.</tt> || ''bundle'' ≠ nil<br />
|-<br />
| isController || colspan="2" | boolean || Whether the bundle contains a controller class. || ''bundle'' ≠ nil<br />
|-<br />
| overridePrincipalClass || colspan="2" | boolean || Overrides the principal class by the detail controller when bundle has a controller. || ''isController'' = true<br />
|-<br />
| detail || string || class name || [[PSDetailController|Detail controller class]]. || -<br />
|-<br />
| pane || string || class name || Edit pane class.<br />If ''bundle'' is absent, the edit pane class is obtained from the current bundle.<br />Default value is [[PSEditingPane]]. || ''detail'' ≠ nil<br />
|-<br />
| hasIcon || colspan="2" | boolean || Whether the specifier will have an icon. || ''bundle'' ≠ nil<br />
|-<br />
| icon || string || filename || File name of the icon to use. Default value is <tt>icon.png</tt>. The height of the icon should be 29px. || ''hasIcon'' = true<br />
|-<br />
| cellClass || string || class name || Customized cell class || -<br />
|-<br />
| customControllerClass || string || class name || Custom controller class to use when the view become visible || -<br />
|}<br />
<br />
''get'', ''set'' and ''action'' should respectively have signatures<br />
<source lang="objc"><br />
-(id)getSomethingForSpecifier:(PSSpecifier*)spec;<br />
-(void)setSomething:(id)something forSpecifier:(PSSpecifier*)spec;<br />
-(void)speciferPerformedAction:(PSSpecifier*)spec;<br />
</source><br />
where the type of "something" depends on the type of specifier, e.g. for a text field it should be an NSString, while for a switch it should be an NSNumber with boolean.<br />
<br />
Of course, you can ignore extra parameters, e.g. <tt>-(void)specifierPerformedAction</tt> is a valid signature too.<br />
<br />
=== Editing cells ===<br />
These keys are specific to editing cells.<br />
<br />
{| class="wikitable"<br />
|-<br />
! key !! colspan="2" | type !! meaning !! depends<br />
|-<br />
| autoCaps || string || {"<tt>sentences</tt>", "<tt>words</tt>", "<tt>all</tt>"} || Autocapitalization type for cells that requires a keyboard. || -<br />
|-<br />
| keyboard || string || {"<tt>numbers</tt>", "<tt>phone</tt>"} || Type of keyboard. || -<br />
|-<br />
| prompt || string || localizable string || Setup prompt. || ''cell'' ∈ {"<tt>PSEditTextCell</tt>", "<tt>PSSecureEditTextCell</tt>"}<br />
|-<br />
| okTitle || string || localizable string || Title for OK button in setup prompt. || ''prompt'' ≠ nil<br />
|-<br />
| cancelTitle || string || localizable string || Title for cancel button in setup prompt. || ''prompt'' ≠ nil<br />
|-<br />
| placeholder || string || localizable string || Placeholder. || ''cell'' ∈ {"<tt>PSEditTextCell</tt>", "<tt>PSSecureEditTextCell</tt>"}<br />
|-<br />
| suffix || string || localizable string || Suffix. || ''cell'' ∈ {"<tt>PSEditTextCell</tt>", "<tt>PSSecureEditTextCell</tt>"}<br />
|-<br />
| isIP || colspan="2" | boolean || Input field intended for entering IP address (Use Numbers keyboard). || -<br />
|-<br />
| isURL || colspan="2" | boolean || Input field intended for entering URL (Use URL keyboard). || -<br />
|-<br />
| isNumeric || colspan="2" | boolean || Input field intended for entering numbers (Use NumberPad keyboard). || -<br />
|-<br />
| isEmail || colspan="2" | boolean || Input field intended for entering e-mail (Use EmailAddress keyboard). || -<br />
|-<br />
| isEmailAdressing || colspan="2" | boolean || ? || -<br />
|-<br />
| bestGuess || string || selector || Initial value of text field. || ''cell'' ∈ {"<tt>PSEditTextCell</tt>", "<tt>PSSecureEditTextCell</tt>"}<br />
|-<br />
| noAutoCorrect || colspan="2" | boolean || Disable auto-correction. || ''cell'' ∈ {"<tt>PSEditTextCell</tt>", "<tt>PSSecureEditTextCell</tt>"}<br />
|}<br />
<br />
=== List cells ===<br />
These keys are specific to list cells.<br />
<br />
{| class="wikitable"<br />
|-<br />
! key !! colspan="2" | type !! meaning !! depends<br />
|-<br />
| validValues || array || ...of strings || List of values to choose from. || ''cell'' ∈ {"<tt>PSLinkListCell</tt>", "<tt>PSSegmentCell</tt>"}<br />
|-<br />
| validTitles || array || ...of localizable strings || Titles corresponding to the list of values. || ''cell'' ∈ {"<tt>PSLinkListCell</tt>", "<tt>PSSegmentCell</tt>"}<br />
|-<br />
| shortTitles || array || ...of localizable strings || Short titles. || ''cell'' ∈ {"<tt>PSLinkListCell</tt>", "<tt>PSSegmentCell</tt>"}<br />
|-<br />
| valuesDataSource || string || selector || Selector to call to get the list of values dynamically. || ''cell'' ∈ {"<tt>PSLinkListCell</tt>", "<tt>PSSegmentCell</tt>"} '''and''' ''validValues'' = nil<br />
|-<br />
| titlesDataSource || string || selector || Selector to call to get the list of titles dynamically. || ''cell'' ∈ {"<tt>PSLinkListCell</tt>", "<tt>PSSegmentCell</tt>"} '''and''' ''validTitles'' = nil<br />
|-<br />
| staticTextMessage || string || localizable string || Static text message (?). || ''cell'' = "<tt>PSLinkListCell</tt>"<br />
|}<br />
<br />
''valuesDataSource'' and ''titlesDataSource'' are performed on the target sent from {{ObjcCall|PSListController|loadSpecifiersFromPlistName:target:}}. They must return an NSArray containing the values and (localized) titles respectively. Their signatures should be<br />
<source lang="objc"><br />
-(NSArray*)dataFromTarget:(id)target;<br />
</source><br />
<br />
=== Slider and switch cells ===<br />
These keys are specific to slider and switch cells.<br />
<br />
{| class="wikitable"<br />
|-<br />
! key !! colspan="2" | type !! meaning !! depends<br />
|-<br />
| rightImage || string || filename || Image displayed next to the slider on the right. || ''cell'' = "<tt>PSSliderCell</tt>"<br />
|-<br />
| leftImage || string || filename || Image displayed next to the slider on the left. || ''cell'' = "<tt>PSSliderCell</tt>"<br />
|-<br />
| min || colspan="2" | float || Minimum value of slider. || ''cell'' = "<tt>PSSliderCell</tt>"<br />
|-<br />
| max || colspan="2" | float || Maximum value of slider. || ''cell'' = "<tt>PSSliderCell</tt>"<br />
|-<br />
| showValue || colspan="2" | boolean || Show the value. || ''cell'' = "<tt>PSSliderCell</tt>"<br />
|-<br />
| alternateColors || colspan="2" | boolean || Show the value. || ''cell'' = "<tt>PSSwitchCell</tt>"<br />
|}<br />
<br />
=== Miscellaneous control cells ===<br />
These keys are specific to other control cells.<br />
<br />
{| class="wikitable"<br />
|-<br />
! key !! colspan="2" | type !! meaning !! depends<br />
|-<br />
| alignment || colspan="2" | integer || Text alignment. 1 = center. || ''cell'' ∈ {"<tt>PSGroupCell</tt>", "<tt>PSStaticTextCell</tt>"<br />
|-<br />
| confirmation || dictionary || <tt>&lt;confirmation&gt;</tt> || Definitions of the confirmation sheet before action is performed. || ''cell'' ∈ {"<tt>PSSwitchCell</tt>", "<tt>PSButtonCell</tt>"<br />
|-<br />
| isDestructive || colspan="2" | boolean || Whether the action to be performed is destructive. The OK button will be in red if true. || ''confirmation'' ≠ nil<br />
|-<br />
| max || colspan="2" | float || Maximum value of slider. || cell = "<tt>PSSliderCell</tt>"<br />
|-<br />
| showValue || colspan="2" | boolean || Show the value. || cell = "<tt>PSSliderCell</tt>"<br />
|-<br />
| alternateColors || colspan="2" | boolean || Show the value. || cell = "<tt>PSSwitchCell</tt>"<br />
|-<br />
| isStaticText || colspan="2" | boolean || Whether the cells in this group has static text. Used in conjunction with PSStaticTextCell. || ''cell'' = "<tt>PSGroupCell</tt>"<br />
|-<br />
| height || colspan="2" | float || Height of text view. || ''cell'' = "<tt>PSTextViewCell</tt>"<br />
|-<br />
| dontIndentOnRemove || colspan="2" | boolean || ? || -<br />
|-<br />
| footerText || colspan="2" | string || Text displayed in a small font after this specifier (or, in the case of a <tt>PSGroupCell</tt>, the last specifier in the group). || -<br />
|-<br />
| footerCellClass || colspan="2" | class || The cell class using which to render the footer. || -<br />
|}<br />
<br />
Here, ''confirmation'' itself is a dictionary containing the following fields:<br />
<br />
<blockquote>''struct'' <tt>&lt;confirmation&gt;</tt> ::</blockquote><br />
{| class="wikitable"<br />
|-<br />
! key !! colspan="2" | type !! meaning<br />
|-<br />
| prompt || string || localizable string || Content of confirmation sheet.<br />
|-<br />
| cancelTitle || string || localizable string || Title of the cancel button.<br />
|-<br />
| okTitle || string || localizable string || Title of the OK button.<br />
|-<br />
| title || string || localizable string || Title of confirmation sheet.<br />
|}<br />
<br />
== <tt>PSSpecifier</tt> properties of plist keys ==<br />
The tables above only shows the keys recognized by <tt>SpecifiersForPlist</tt> when translating the plist into an array of <tt>PSSpecifier</tt>s. They may be corresponds to the actual properties of the specifier. If you would like to generate a <tt>PSSpecifier</tt> in runtime, some actions may differ:<br />
<br />
{| class="wikitable"<br />
|-<br />
! keys !! corresponding action<br />
|-<br />
| cell || Use the constructor, or change the <tt>cellType</tt> ivar.<br />
|-<br />
| label || Use the <tt>name</tt> declared property.<br />
|-<br />
| get || Use the constructor, or change the <tt>getter</tt> ivar.<br />
|-<br />
| set || Use the constructor, or change the <tt>setter</tt> ivar.<br />
|-<br />
| action || Change the <tt>action</tt> ivar.<br />
|-<br />
| default || Use the ''value'' property.<br />
|-<br />
| icon || Use the ''iconImage'' as an UIImage, or {{ObjcCall|PSSpecifier|setupIconImageWithPath:}}<br />
|-<br />
| autoCaps, keyboard, noAutoCorrect || {{ObjcCall|PSSpecifier|setKeyboardType:autoCaps:autoCorrection:}}<br />
|-<br />
| isIP, isURL, isNumeric, isEmail, isEmailAddressing || Change the <tt>textFieldType</tt> ivar.<br />
|-<br />
| bestGuess || Change the <tt>bestGuess</tt> ivar of the [[PSTextFieldSpecifier]] class.<br />
|-<br />
| validValues, validTitles, shortTitles || {{ObjcCall|PSSpecifier|setValues:titles:shortTitles:}}<br />
|-<br />
| confirmation || Create an instance of [[PSConfirmationSpecifier]].<br />
|}<br />
<br />
== Recipes ==<br />
=== Using PSLinkListCell ===<br />
In order to make a PSLinkListCell actually work like a list, you must supply the key-value pair<br />
detail = "PSListItemsController";<br />
also.<br />
<br />
=== Using PSLinkCell ===<br />
PSLinkCell is useful for linking to sub-preference-panes. The simplest example just needs 2 keys:<br />
{ cell = PSLinkCell;<br />
label = "Settings-iPhone"; }<br />
The ''label'' is the important part. When user clicked on the link cell, iPhoneOS will use the '''unlocalized''' ''label'' as the file name of the plist for the next pane. For example in above, the main settings screen will appear.<br />
<br />
If you use just 2 keys, only plists inside {{applink|Preferences}} can be loaded. In order to load your own plist, you must use a custom subclass of [[PSListController]] in ''detail'':<br />
{ cell = PSLinkCell;<br />
label = "My Awesome Pane";<br />
detail = MyListController; }<br />
MyListController can simply be an empty subclass of PSListController:<br />
<source lang="objc"><br />
@interface MyListController : PSListController {}<br />
@end<br />
@implementation MyListController<br />
@end<br />
</source><br />
The key thing is when you place MyListController inside your bundle, its bundle property will return your bundle which <tt>My Awesome Pane.plist</tt> can be found.<br />
<br />
=== Constructing a PSLinkCell at runtime ===<br />
If you want to dynamically add a specifier for a PSLinkCell linking to a bundle, do it like this:<br />
<br />
<source lang="objc"><br />
PSSpecifier* specifier = [PSSpecifier preferenceSpecifierNamed:@"title"<br />
target:self<br />
set:NULL<br />
get:NULL<br />
detail:Nil<br />
cell:PSLinkCell<br />
edit:Nil];<br />
NSBundle* bundle = [NSBundle bundleWithPath:@"/System/Library/PreferenceBundles/prefs.bundle"];<br />
[specifier setProperty:bundle forKey:@"lazy-bundle"];<br />
specifier->action = @selector(lazyLoadBundle:);<br />
// Add specifier to the PSListController<br />
</source><br />
<br />
=== Making a red delete button ===<br />
The red delete button in VPN is in fact very easy to implement. All you need to do is add the following code:<br />
<source lang="objc"><br />
#import <UIKit/UIPreferencesDeleteTableCell.h><br />
@interface PSDeleteTableCell : UIPreferencesDeleteTableCell @end<br />
@implementation PSDeleteTableCell<br />
-(void)setValueChangedTarget:(id)target action:(SEL)action userInfo:(NSDictionary*)info {<br />
[self setTarget:target];<br />
[self setAction:action];<br />
}<br />
-(UILabel*)titleTextLabel {<br />
UILabel* res = [super titleTextLabel];<br />
res.textColor = [UIColor whiteColor];<br />
return res;<br />
}<br />
@end<br />
</source><br />
and then in the specifier plist, modify your button as:<br />
...<br />
{ cell = PSButtonCell;<br />
action = nukeFromOrbit;<br />
label = "Nuke from Orbit;<br />
...<br />
'''cellClass = PSDeleteTableCell;'''<br />
},<br />
...<br />
<br />
=== Making a custom cell, header or footer ===<br />
Making a custom cell, header or footer is useful because it allows you to customize the style, add an image, etc.<br />
<br />
All you need to do is make a class that looks like:<br />
<source lang="objc"><br />
@interface CustomCell : PSTableCell <PreferencesTableCustomView> {<br />
UILabel *_label;<br />
}<br />
@end<br />
<br />
@implementation CustomCell<br />
- (id)initWithSpecifier:(PSSpecifier *)specifier<br />
{<br />
self = [super initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell" specifier:specifier];<br />
if (self) {<br />
CGRect frame = [self frame];<br />
<br />
_label = [[UILabel alloc] initWithFrame:frame];<br />
[_label setLineBreakMode:UILineBreakModeWordWrap];<br />
[_label setNumberOfLines:0];<br />
[_label setText:@"You can use attributed text to make this prettier."];<br />
[_label setBackgroundColor:[UIColor clearColor]];<br />
[_label setShadowColor:[UIColor whiteColor]];<br />
[_label setShadowOffset:CGSizeMake(0,1)];<br />
[_label setTextAlignment:UITextAlignmentCenter];<br />
<br />
[self addSubview:_label];<br />
[_label release];<br />
}<br />
return self;<br />
}<br />
<br />
- (float)preferredHeightForWidth:(float)arg1<br />
{<br />
// Return a custom cell height.<br />
return 60.f;<br />
}<br />
@end<br />
</source><br />
Then, set the <code>cellClass</code>, <code>headerCellClass</code> or <code>footerCellClass</code> in your specifier. For example:<br />
...<br />
{ <br />
cell = PSGroupCell;<br />
'''footerCellClass = CustomFooterCell;'''<br />
},<br />
...<br />
A <code>cell</code> doesn't have to be specified for custom cells.<br />
<br />
== References ==<br />
* http://code.google.com/p/networkpx/wiki/PreferencesSpecifierPlistFormat#valuesDataSource_and_titlesDataSource</div>
Dustin Howett
https://iphonedev.wiki/index.php?title=WFWiFiManager&diff=1201
WFWiFiManager
2013-04-20T07:30:16Z
<p>Dustin Howett: </p>
<hr />
<div>'''WFWiFiManager''' is a class found in the [[WiFiPicker.servicebundle|WiFiPicker]] service bundle. '''WFWiFiManager''' is used to perform WiFi related tasks such as scanning for and retrieving lists of networks. As it is a {{applink|SpringBoard}} plugin, it is not accessible elsewhere.<br />
<br />
== Example Usage ==<br />
<source lang="objc"><br />
[[objc_getClass("WFWiFiManager") sharedInstance] knownNetworks];<br />
</source><br />
<br />
You can obtain the header from [https://gist.github.com/SuperDev/5424960 here]<br />
<br />
{{occlass|library=WiFiPicker.servicebundle|navbox=1}}</div>
Dustin Howett
https://iphonedev.wiki/index.php?title=WFWiFiManager&diff=1200
WFWiFiManager
2013-04-20T07:28:34Z
<p>Dustin Howett: </p>
<hr />
<div>'''WFWiFiManager''' is a class found in the [[WiFiPicker.servicebundle|WiFiPicker]] service bundle. '''WFWiFiManager''' is used to perform WiFi related tasks such as scanning for and retrieving lists of networks.<br />
<br />
== Example Usage ==<br />
<source lang="objc"><br />
[[objc_getClass("WFWiFiManager") sharedInstance] knownNetworks];<br />
</source><br />
<br />
You can obtain the header from [https://gist.github.com/SuperDev/5424960 here]<br />
<br />
{{occlass|library=WiFiPicker.servicebundle|navbox=1}}</div>
Dustin Howett
https://iphonedev.wiki/index.php?title=WFWiFiManager&diff=1199
WFWiFiManager
2013-04-20T07:27:39Z
<p>Dustin Howett: Add occlass so that we get a navbox and a library link. Reword slightly.</p>
<hr />
<div>'''WFWiFiManager''' is a class, found in the [[WiFiPicker.servicebundle|WiFiPicker]] service bundle. '''WFWiFiManager''' is used to perform WiFi related tasks such as scanning for and retrieving lists of networks.<br />
<br />
== Example Usage ==<br />
<source lang="objc"><br />
[[objc_getClass("WFWiFiManager") sharedInstance] knownNetworks];<br />
</source><br />
<br />
You can obtain the header from [https://gist.github.com/SuperDev/5424960 here]<br />
<br />
{{occlass|library=WiFiPicker.servicebundle|navbox=1}}</div>
Dustin Howett
https://iphonedev.wiki/index.php?title=WFWiFiManager&diff=1198
WFWiFiManager
2013-04-20T07:21:05Z
<p>Dustin Howett: Throw the code example into a <source /></p>
<hr />
<div>'''WFWiFiManager''' is a class found in the WiFiPicker service bundle (/System/Library/SpringBoardPlugins/WiFiPicker.servicebundle). <br/><br />
This class is used to perform WiFi related tasks such as scanning networks, retrieving all known networks etc. <br/><br />
<br />
== Example Usage ==<br />
<source lang="objc"><br />
[[objc_getClass("WFWiFiManager") sharedInstance] knownNetworks];<br />
</source><br />
<br />
You can obtain the header from [https://gist.github.com/SuperDev/5424960 here]</div>
Dustin Howett
https://iphonedev.wiki/index.php?title=MediaWiki:Monobook.css&diff=1193
MediaWiki:Monobook.css
2013-04-16T22:05:56Z
<p>Dustin Howett: Don't set width/height, set background size in absolute px.</p>
<hr />
<div>/* CSS placed here will affect users of the MonoBook skin */<br />
/* <pre><nowiki> */<br />
#p-logo a, #p-logo a:hover {<br />
background-size: 135px 135px !important;<br />
}<br />
/* </nowiki></pre> */</div>
Dustin Howett
https://iphonedev.wiki/index.php?title=Cydia_Substrate_Pitfalls&diff=1192
Cydia Substrate Pitfalls
2013-04-16T04:03:34Z
<p>Dustin Howett: .DS_Store reference makes more sense in Best Practices than MS Pitfalls.</p>
<hr />
<div>Follow the following guidelines to avoid common MobileSubstrate mistakes:<br />
<br />
* Do not use UIDevice in your constructor if you are hooking SpringBoard!<br />
* Access ivars through their associated properties, where practical.<br />
* Always call the old implementation of a method unless you require suppressing the default behaviour. Similarly, only call the old implementation of a method from within the method hook.<br />
* Always include a [[MobileSubstrate#MobileLoader|MobileLoader]] filter plist.<br />
** If you require access to only SpringBoard, use "com.apple.springboard"; if you require access to all UIKit apps, use "com.apple.UIKit".<br />
* Avoid UIAlertView in SpringBoard--it doesn't participate in the SpringBoard-wide alert system; use a custom SBAlertItem subclass instead (not necessary for cases where you don't care if the system destroys your alert.)<br />
* Use documented/public SDK features wherever practical. Apple usually tests private APIs internally before making them public; often the public version is the same or similar to the private version that was in previous OS releases.<br />
* Preferences.framework changed drastically between 3.1 and 3.2. Use PreferenceLoader and standard preferences plists for simple panes, PSViewController + UITableView for more complex panes (PSListController is okay for simple preferences, but is less subject to OS changes; PSViewController is more powerful, but many implementations were broken between 3.1 and 3.2.)<br />
* Use autoresizingMask and layoutSubviews to make your extension resolution-independent and rotation-aware.<br />
* Don't modify OS or Cydia files; use runtime-replacement instead.<br />
* Avoid doing extra work--the methods your extension hooks may be called from inside a tight loop; disk access is considered a LOT of extra work (related: properties are actually method calls, they can be slow.)<br />
* UI* methods must be performed on the main thread (this includes UIImage! use CGImageSource and company if you need to load images from a background thread.)<br />
* Never block the main thread! Performing any operation that can take significant time on the main thread is evil (that includes '''any''' operation that hits the network.)<br />
* Access resources through NSBundle so that they may be themed via WinterBoard.<br />
* Include the proper Depends: line in your Debian control file (that way Cydia will automatically install dependencies and will alert users when they are missing required components like firmware version.)<br />
* If your extension exposes an API, document it!<br />
** Include headers '''inside''' your package so they're easy to find.<br />
* Ensure your extension is localizable; use the standard .lproj system where possible. Avoid having images that include text.<br />
* Don't make assumptions about the ivar layout of a class; these can and will change across firmware versions.<br />
* Use an established hooking framework such as substrate.h, CaptainHook.h or Logos; there is little benefit in rolling your own, and too many details have to be just right.<br />
* If accessing low-level graphics hardware, beware that first-generation devices do _not_ have a unified memory model (VRAM and regular RAM are separate regions.)<br />
* Participate in the memory warning system if your extension has a significant memory footprint; release everything you can.<br />
* Use mmap when working with large datasets--the kernel will swap it in and out of memory as necessary (but avoid heavy writes, as that's no better than virtual memory.)<br />
* Never inhibit MobileSubstrate's [[MobileSubstrate#Safe_mode|safe mode]].<br />
* If your extension manipulates icon layouts, use IconSupport so you don't stomp all over other extensions' modifications or the stock/safe-mode layout.<br />
* Compile against the earliest possible firmware you can (compile against 3.0, not 3.0.1, 3.1 or 3.1.2); use feature detection if necessary.<br />
* Respect the user's privacy.<br />
** The IMEI, telephone number, contacts list and email inbox are definitely private information.<br />
** The MAC address, Bluetooth address and UDID may be considered private information, depending on the jurisdiction.<br />
* Strip symbols if you have something to hide; use standard C (or C++) for the hidden parts--Objective-C will spill your details.<br />
* Many private frameworks have public headers available for Mac OS X; use them (also, there are header packs floating around--kennytm's is one of the best and is legal to distribute.)<br />
* Only link to the frameworks you actually need--importing unnecessary frameworks will increase app launch time (use dlopen/dlsym to load libraries and access symbols at runtime after the app has launched)<br />
** This is less of a concern on 3.1+, due to the dyld shared object cache. You still incur the overhead of library initializers, however.<br />
* Use a private prefix on classes and category methods: Objective-C has NO namespacing capabilities. (examples: two classes called Preferences that behave differently; two extensions define a -[NSData base64String] that behave slightly differently.)<br />
* Store preferences in /var/mobile/Library/Preferences to have iTunes back it up.<br />
* Store data in /var/mobile/Library/AddressBook or /var/mobile/Library/Keyboard to avoid the sandbox restrictions, if necessary.<br />
* Avoid waking the device or keeping the device from sleeping. If your extension needs to do something periodically, hook the Mail application's sync and integrate the action within that (scheduler/alarm extensions need not heed this warning.)<br />
* Avoid CPU-/GPU-/disk-intensive activity where the user would not expect it (battery life!)<br />
* Don't overuse NSLog/CFLog/fprintf(stderr, …); they're slow and synchronous.<br />
* If your extension exposes an icon, include both the 29x29 and 59x60 icon sizes (more for iPad.)<br />
* Expect others to hook the same methods you do; expect them not to have read this list and to have done crazy things.<br />
* Prefer hooking methods over hooking functions--new jailbreaks don't always have kernel patches (although this is not as much of a concern, as jailbreakers understand the need for W^X) and MobileSubstrate may not support newer ARM instructions.<br />
* Avoid changing the class of objects returned by public APIs--some App Store applications perform unnecessary checks against the class of an object and will fail.<br />
* Prefer binary plists over XML--they're much quicker (OpenSTEP-style text plists are also quick, but seem to be deprecated)<br />
* Manage memory correctly as per the Cocoa memory management guidelines; ensure all hooks comply as well.<br />
* Use MSHookMessageEx instead of MSHookMessage.<br />
** MSHookMessage allows you to specify an optional prefix which gets added to the original method, polluting the class.</div>
Dustin Howett
https://iphonedev.wiki/index.php?title=Best_Practices&diff=1191
Best Practices
2013-04-16T04:03:16Z
<p>Dustin Howett: .DS_Store reference makes more sense in Best Practices than MS Pitfalls.</p>
<hr />
<div>Use the following guidelines to avoid your package or app being fragile and to increase the chances of it being accepted by a community host.<br />
<br />
== Applications and Tweaks ==<br />
* Avoid referring to /var/mobile directly - use NSHomeDirectory() if your code is running as mobile!<br />
** If your code is running as root, use extra caution when writing files that mobile can access - you might break the file's access permissions.<br />
* See [[MobileSubstrate Pitfalls]] for additional guidelines regarding tweaks.<br />
<br />
== Packages ==<br />
* Do not create mobile-owned files and/or directories in your package. Stay out of mobile's home directory!<br />
** All package files are installed as root. Your software should create any required files or directories at runtime.<br />
** This is doubly important for preferences. A user's preferences do not belong in a package: if preferences are stored in the package, they will be overwritten when you release an update, and deleted when the user uninstalls your software (even temporarily!)<br />
* Do not use postinst/preinst/extrainst_ for file management purposes!<br />
** Do not store in the package files or directories that your software could create.<br />
** Do not enforce permissions that your package should contain. dpkg uses an expressive packaging format that has support for permissions, ownership, and links. Use that support!<br />
* Make sure your package doesn't include hidden .DS_Store, ._*, or thumbs.db files.</div>
Dustin Howett
https://iphonedev.wiki/index.php?title=Best_Practices&diff=1190
Best Practices
2013-04-16T02:44:31Z
<p>Dustin Howett: Properly indent.</p>
<hr />
<div>Use the following guidelines to avoid your package or app being fragile and to increase the chances of it being accepted by a community host.<br />
<br />
== Applications and Tweaks ==<br />
* Avoid referring to /var/mobile directly - use NSHomeDirectory() if your code is running as mobile!<br />
** If your code is running as root, use extra caution when writing files that mobile can access - you might break the file's access permissions.<br />
* See [[MobileSubstrate Pitfalls]] for additional guidelines regarding tweaks.<br />
<br />
== Packages ==<br />
* Do not create mobile-owned files and/or directories in your package. Stay out of mobile's home directory!<br />
** All package files are installed as root. Your software should create any required files or directories at runtime.<br />
** This is doubly important for preferences. A user's preferences do not belong in a package: if preferences are stored in the package, they will be overwritten when you release an update, and deleted when the user uninstalls your software (even temporarily!)<br />
* Do not use postinst/preinst/extrainst_ for file management purposes!<br />
** Do not store in the package files or directories that your software could create.<br />
** Do not enforce permissions that your package should contain. dpkg uses an expressive packaging format that has support for permissions, ownership, and links. Use that support!</div>
Dustin Howett
https://iphonedev.wiki/index.php?title=Best_Practices&diff=1189
Best Practices
2013-04-16T02:38:11Z
<p>Dustin Howett: Reword.</p>
<hr />
<div>Use the following guidelines to avoid your package or app being fragile and to increase the chances of it being accepted by a community host.<br />
<br />
== Applications and Tweaks ==<br />
* Avoid referring to /var/mobile directly - use NSHomeDirectory() if your code is running as mobile!<br />
* If your code is running as root, use extra caution when writing files that mobile can access - you might break the file's access permissions.<br />
* See [[MobileSubstrate Pitfalls]] for additional guidelines regarding tweaks.<br />
<br />
== Packages ==<br />
* Do not create mobile-owned files and/or directories in your package. Stay out of mobile's home directory!<br />
** All package files are installed as root. Your software should create any required files or directories at runtime.<br />
** This is doubly important for preferences. A user's preferences do not belong in a package: if preferences are stored in the package, they will be overwritten when you release an update, and deleted when the user uninstalls your software (even temporarily!)<br />
* Do not use postinst/preinst/extrainst_ for file management purposes!<br />
** Do not store in the package files or directories that your software could create.<br />
** Do not enforce permissions that your package should contain. dpkg uses an expressive packaging format that has support for permissions, ownership, and links. Use that support!</div>
Dustin Howett
https://iphonedev.wiki/index.php?title=MediaWiki:Monobook.css&diff=1188
MediaWiki:Monobook.css
2013-04-15T07:36:59Z
<p>Dustin Howett: Scale #p-logo's a down. This is a hack to get retina images on retina devices and not completely mess up non-retina devices.</p>
<hr />
<div>/* CSS placed here will affect users of the MonoBook skin */<br />
/* <pre><nowiki> */<br />
#p-logo a, #p-logo a:hover {<br />
width: 135px !important;<br />
height: 135px !important;<br />
background-size: 100% !important;<br />
}<br />
/* </nowiki></pre> */</div>
Dustin Howett
https://iphonedev.wiki/index.php?title=MediaWiki:Common.css&diff=1187
MediaWiki:Common.css
2013-04-15T07:34:01Z
<p>Dustin Howett: Do not, in fact, override #p-logo a here.</p>
<hr />
<div>/*<br />
ATTENTION ADMINISTRATORS:<br />
<br />
This is the CSS for all skins. <br />
<br />
Testing can be done on your own user Monobook.css. In [[wikipedia:Mozilla|Mozilla]] and<br />
[[wikipedia:Opera (web browser)|Opera]], you can also test style changes dynamically<br />
with the [http://www.squarefree.com/bookmarklets/webdevel.html test styles]<br />
bookmarklet from squarefree.com. It pops up a window for adding style rules,<br />
and updates the page as you type.<br />
<br />
Always check with the [http://tinyurl.com/28y334 W3C CSS Validation Service]<br />
([http://tinyurl.com/2g8bsk CVS version]) after any changes.<br />
<br />
See also: [[wikipedia:Wikipedia:Catalogue of CSS classes|catalogue of CSS classes]].<br />
<br />
Thank you.<br />
*/<br />
<br />
/* <pre><nowiki> */<br />
<br />
/* Edit window toolbar */<br />
#toolbar {<br />
height: 22px;<br />
margin-bottom: 6px;<br />
}<br />
<br />
/* Margins for <ol> and <ul> */<br />
#content ol, #content ul,<br />
#mw_content ol, #mw_content ul {<br />
margin-bottom: 0.5em;<br />
}<br />
<br />
/* Make the list of references in [[Template:Reflist]] smaller */<br />
.references-small { <br />
font-size: 90%;<br />
}<br />
<br />
/* VALIDATOR NOTICE: the following is correct, but the W3C validator doesn't accept it */<br />
/* -moz-* is a vendor-specific extension (CSS 2.1 4.1.2.1) */<br />
/* column-count is from the CSS3 module "CSS Multi-column Layout" */<br />
/* Please ignore any validator errors caused by these two lines */<br />
.references-2column {<br />
font-size: 90%;<br />
-moz-column-count: 2;<br />
column-count: 2;<br />
}<br />
<br />
/* Highlight clicked reference in blue to help navigation */<br />
ol.references > li:target,<br />
sup.reference:target,<br />
cite:target { <br />
background-color: #DEF;<br />
}<br />
<br />
/* Ensure refs in table headers and the like aren't bold or italic */<br />
sup.reference {<br />
font-weight: normal;<br />
font-style: normal;<br />
}<br />
<br />
<br />
/* Styling for citations */<br />
cite {<br />
font-style: normal;<br />
word-wrap: break-word;<br />
}<br />
<br />
/* For linked citation numbers and document IDs, where<br />
the number need not be shown on a screen or a handheld,<br />
but should be included in the printed version<br />
*/<br />
@media screen, handheld, projection {<br />
cite *.printonly {<br />
display: none;<br />
}<br />
}<br />
<br />
<br />
/* wikitable/prettytable class for skinning normal tables */<br />
table.wikitable,<br />
table.prettytable {<br />
margin: 1em 1em 1em 0;<br />
background: #f9f9f9;<br />
border: 1px #aaa solid;<br />
border-collapse: collapse;<br />
}<br />
.wikitable th, .wikitable td,<br />
.prettytable th, .prettytable td {<br />
border: 1px #aaa solid;<br />
padding: 0.2em;<br />
}<br />
.wikitable th,<br />
.prettytable th {<br />
background: #f2f2f2;<br />
text-align: center;<br />
}<br />
.wikitable caption,<br />
.prettytable caption {<br />
font-weight: bold;<br />
}<br />
<br />
/* Default skin for navigation boxes */<br />
table.navbox { /* Navbox container style */<br />
border: 1px solid #aaa;<br />
width: 100%; <br />
margin: auto;<br />
clear: both;<br />
font-size: 88%;<br />
text-align: center;<br />
padding: 1px;<br />
}<br />
table.navbox + table.navbox { /* Single pixel border between adjacent navboxes */<br />
margin-top: -1px; /* (doesn't work for IE6, but that's okay) */<br />
}<br />
.navbox-title,<br />
.navbox-abovebelow,<br />
table.navbox th {<br />
text-align: center; /* Title and above/below styles */<br />
padding-left: 1em;<br />
padding-right: 1em;<br />
}<br />
.navbox-group { /* Group style */<br />
white-space: nowrap;<br />
text-align: right;<br />
font-weight: bold;<br />
padding-left: 1em;<br />
padding-right: 1em;<br />
}<br />
.navbox, .navbox-subgroup {<br />
background: #fdfdfd; /* Background color */<br />
}<br />
.navbox-list {<br />
border-color: #fdfdfd; /* Must match background color */<br />
}<br />
.navbox-title,<br />
table.navbox th {<br />
background: #ccccff; /* Level 1 color */<br />
}<br />
.navbox-abovebelow,<br />
.navbox-group,<br />
.navbox-subgroup .navbox-title {<br />
background: #ddddff; /* Level 2 color */<br />
}<br />
.navbox-subgroup .navbox-group, .navbox-subgroup .navbox-abovebelow {<br />
background: #e6e6ff; /* Level 3 color */<br />
}<br />
.navbox-even {<br />
background: #f7f7f7; /* Even row striping */<br />
}<br />
.navbox-odd {<br />
background: transparent; /* Odd row striping */<br />
}<br />
<br />
.collapseButton { /* 'show'/'hide' buttons created dynamically */<br />
float: right; /* by the CollapsibleTables javascript in */<br />
font-weight: normal; /* [[MediaWiki:Common.js]]are styled here */<br />
text-align: right; /* so they can be customised. */<br />
width: auto;<br />
}<br />
.navbox .collapseButton { /* In navboxes, the show/hide button balances */<br />
width: 6em; /* the vde links from [[Template:Tnavbar]], */<br />
} /* so they need to be the same width. */<br />
<br />
<br />
/* Infobox template style */<br />
.infobox {<br />
border: 1px solid #aaa;<br />
background-color: #f9f9f9;<br />
color: black;<br />
margin: 0.5em 0 0.5em 1em;<br />
padding: 0.2em;<br />
float: right;<br />
clear: right;<br />
}<br />
.infobox td,<br />
.infobox th {<br />
vertical-align: top;<br />
}<br />
.infobox caption {<br />
font-size: larger;<br />
}<br />
.infobox.bordered {<br />
border-collapse: collapse;<br />
}<br />
.infobox.bordered td,<br />
.infobox.bordered th {<br />
border: 1px solid #aaa;<br />
}<br />
.infobox.bordered .borderless td,<br />
.infobox.bordered .borderless th {<br />
border: 0;<br />
}<br />
<br />
.infobox.sisterproject {<br />
width: 20em;<br />
font-size: 90%;<br />
}<br />
<br />
.infobox.standard-talk {<br />
border: 1px solid #c0c090;<br />
background-color: #f8eaba;<br />
}<br />
.infobox.standard-talk.bordered td,<br />
.infobox.standard-talk.bordered th {<br />
border: 1px solid #c0c090;<br />
}<br />
<br />
/* styles for bordered infobox with merged rows */<br />
.infobox.bordered .mergedtoprow td,<br />
.infobox.bordered .mergedtoprow th {<br />
border: 0;<br />
border-top: 1px solid #aaa;<br />
border-right: 1px solid #aaa;<br />
}<br />
<br />
.infobox.bordered .mergedrow td,<br />
.infobox.bordered .mergedrow th {<br />
border: 0;<br />
border-right: 1px solid #aaa;<br />
}<br />
<br />
/* Styles for geography infoboxes, eg countries,<br />
country subdivisions, cities, etc. */<br />
.infobox.geography {<br />
text-align: left;<br />
border-collapse: collapse;<br />
line-height: 1.2em; <br />
font-size: 90%;<br />
}<br />
<br />
.infobox.geography td,<br />
.infobox.geography th {<br />
border-top: solid 1px #aaa;<br />
padding: 0.4em 0.6em 0.4em 0.6em;<br />
}<br />
.infobox.geography .mergedtoprow td,<br />
.infobox.geography .mergedtoprow th {<br />
border-top: solid 1px #aaa;<br />
padding: 0.4em 0.6em 0.2em 0.6em;<br />
}<br />
<br />
.infobox.geography .mergedrow td,<br />
.infobox.geography .mergedrow th {<br />
border: 0;<br />
padding: 0 0.6em 0.2em 0.6em;<br />
}<br />
<br />
.infobox.geography .mergedbottomrow td,<br />
.infobox.geography .mergedbottomrow th {<br />
border-top: 0;<br />
border-bottom: solid 1px #aaa;<br />
padding: 0 0.6em 0.4em 0.6em;<br />
}<br />
<br />
.infobox.geography .maptable td,<br />
.infobox.geography .maptable th {<br />
border: 0;<br />
padding: 0;<br />
}<br />
<br />
/* Makes redirects appear in italics in categories and on [[Special:Allpages]] */<br />
.redirect-in-category, .allpagesredirect {<br />
font-style: italic;<br />
}<br />
<br />
/* Icons for medialist templates [[Template:Listen]],<br />
[[Template:Multi-listen_start]], [[Template:Video]],<br />
[[Template:Multi-video_start]]<br />
*/<br />
div.listenlist {<br />
background:<br />
url("http://upload.wikimedia.org/wikipedia/commons/thumb/a/a6/Gnome-speakernotes.png/30px-Gnome-speakernotes.png");<br />
padding-left: 40px;<br />
}<br />
<br />
/* Style rules for media list templates */<br />
div.medialist {<br />
min-height: 50px;<br />
margin: 1em;<br />
background-position: top left;<br />
background-repeat: no-repeat;<br />
}<br />
div.medialist ul {<br />
list-style-type: none; <br />
list-style-image: none;<br />
margin: 0;<br />
}<br />
div.medialist ul li {<br />
padding-bottom: 0.5em;<br />
}<br />
div.medialist ul li li {<br />
font-size: 91%;<br />
padding-bottom: 0;<br />
}<br />
<br />
/* Change the external link icon to an Adobe icon for all PDF files<br />
in browsers that support these CSS selectors, like Mozilla and Opera */<br />
#bodyContent a[href$=".pdf"].external, <br />
#bodyContent a[href*=".pdf?"].external, <br />
#bodyContent a[href*=".pdf#"].external,<br />
#bodyContent a[href$=".PDF"].external, <br />
#bodyContent a[href*=".PDF?"].external, <br />
#bodyContent a[href*=".PDF#"].external,<br />
#mw_content a[href$=".pdf"].external, <br />
#mw_content a[href*=".pdf?"].external, <br />
#mw_content a[href*=".pdf#"].external,<br />
#mw_content a[href$=".PDF"].external, <br />
#mw_content a[href*=".PDF?"].external, <br />
#mw_content a[href*=".PDF#"].external {<br />
background: <br />
url("http://upload.wikimedia.org/wikipedia/commons/thumb/2/23/Icons-mini-file_acrobat.gif/15px-Icons-mini-file_acrobat.gif")<br />
center right no-repeat;<br />
padding-right: 16px;<br />
}<br />
<br />
/* Change the external link icon to an Adobe icon anywhere the PDFlink class<br />
is used (notably Template:PDFlink). This works in IE, unlike the above. */<br />
#bodyContent span.PDFlink a,<br />
#mw_content span.PDFlink a {<br />
background: <br />
url("http://upload.wikimedia.org/wikipedia/commons/thumb/2/23/Icons-mini-file_acrobat.gif/15px-Icons-mini-file_acrobat.gif")<br />
center right no-repeat;<br />
padding-right: 17px;<br />
}<br />
<br />
/* Remove link styling. Already defined in monobook<br />
and modern, but not defined in the other skins. Bug 18708 */<br />
#bodyContent .plainlinks a {<br />
background: none !important;<br />
padding: 0 !important;<br />
}<br />
<br />
/* Content in columns with CSS instead of tables [[Template:Columns]] */<br />
div.columns-2 div.column {<br />
float: left;<br />
width: 50%;<br />
min-width: 300px;<br />
}<br />
div.columns-3 div.column {<br />
float: left;<br />
width: 33.3%;<br />
min-width: 200px;<br />
}<br />
div.columns-4 div.column {<br />
float: left;<br />
width: 25%;<br />
min-width: 150px;<br />
}<br />
div.columns-5 div.column {<br />
float: left;<br />
width: 20%;<br />
min-width: 120px;<br />
}<br />
<br />
/* Make sure that "external references" from templates like [[Template:Ref]] <br />
do not get URL expansion, not even when printed. The anchor itself has <br />
class "external autonumber" and the url expansion is inserted when printing <br />
(see [http://en.wikipedia.org/skins-1.5/common/commonPrint.css]) using the<br />
":after" pseudo-element.<br />
*/<br />
.nourlexpansion a.external.text:after,<br />
.nourlexpansion a.external.autonumber:after {<br />
display: none !important;<br />
}<br />
<br />
/* Messagebox templates */<br />
.messagebox {<br />
border: 1px solid #aaa;<br />
background-color: #f9f9f9;<br />
width: 80%;<br />
margin: 0 auto 1em auto;<br />
padding: .2em;<br />
}<br />
.messagebox.merge {<br />
border: 1px solid #c0b8cc;<br />
background-color: #f0e5ff;<br />
text-align: center;<br />
}<br />
.messagebox.cleanup {<br />
border: 1px solid #9f9fff;<br />
background-color: #efefff;<br />
text-align: center;<br />
}<br />
.messagebox.standard-talk {<br />
border: 1px solid #c0c090;<br />
background-color: #f8eaba;<br />
margin: 4px auto;<br />
}<br />
/* For old WikiProject banners inside banner shells. */<br />
.mbox-inside .standard-talk,<br />
.messagebox.nested-talk {<br />
border: 1px solid #c0c090;<br />
background-color: #f8eaba;<br />
width: 100%;<br />
margin: 2px 0;<br />
padding: 2px;<br />
}<br />
.messagebox.small {<br />
width: 238px;<br />
font-size: 85%;<br />
float: right;<br />
clear: both;<br />
margin: 0 0 1em 1em;<br />
line-height: 1.25em; <br />
}<br />
.messagebox.small-talk {<br />
width: 238px;<br />
font-size: 85%;<br />
float: right;<br />
clear: both;<br />
margin: 0 0 1em 1em;<br />
line-height: 1.25em; <br />
background: #F8EABA;<br />
}<br />
<br />
<br />
/* Cell sizes for ambox/tmbox/imbox/cmbox/ombox/fmbox/dmbox message boxes */<br />
th.mbox-text, td.mbox-text { /* The message body cell(s) */<br />
border: none; <br />
padding: 0.25em 0.9em; /* 0.9em left/right */<br />
width: 100%; /* Make all mboxes the same width regardless of text length */<br />
}<br />
td.mbox-image { /* The left image cell */<br />
border: none; <br />
padding: 2px 0 2px 0.9em; /* 0.9em left, 0px right */<br />
text-align: center; <br />
}<br />
td.mbox-imageright { /* The right image cell */<br />
border: none;<br />
padding: 2px 0.9em 2px 0; /* 0px left, 0.9em right */<br />
text-align: center; <br />
}<br />
td.mbox-empty-cell { /* An empty narrow cell */<br />
border: none;<br />
padding: 0px;<br />
width: 1px;<br />
}<br />
<br />
/* Article message box styles */<br />
table.ambox {<br />
margin: 0px 10%; /* 10% = Will not overlap with other elements */<br />
border: 1px solid #aaa; <br />
border-left: 10px solid #1e90ff; /* Default "notice" blue */<br />
background: #fbfbfb; <br />
}<br />
table.ambox + table.ambox { /* Single border between stacked boxes. */<br />
margin-top: -1px;<br />
}<br />
.ambox th.mbox-text, <br />
.ambox td.mbox-text { /* The message body cell(s) */<br />
padding: 0.25em 0.5em; /* 0.5em left/right */<br />
}<br />
.ambox td.mbox-image { /* The left image cell */<br />
padding: 2px 0 2px 0.5em; /* 0.5em left, 0px right */<br />
}<br />
.ambox td.mbox-imageright { /* The right image cell */<br />
padding: 2px 0.5em 2px 0; /* 0px left, 0.5em right */<br />
}<br />
<br />
table.ambox-notice {<br />
border-left: 10px solid #1e90ff; /* Blue */<br />
}<br />
table.ambox-speedy {<br />
border-left: 10px solid #b22222; /* Red */<br />
background: #fee; /* Pink */<br />
}<br />
table.ambox-delete {<br />
border-left: 10px solid #b22222; /* Red */<br />
}<br />
table.ambox-content {<br />
border-left: 10px solid #f28500; /* Orange */<br />
}<br />
table.ambox-style {<br />
border-left: 10px solid #f4c430; /* Yellow */<br />
}<br />
table.ambox-move {<br />
border-left: 10px solid #9932cc; /* Purple */<br />
}<br />
table.ambox-protection {<br />
border-left: 10px solid #bba; /* Gray-gold */<br />
}<br />
<br />
/* Image message box styles */<br />
table.imbox {<br />
margin: 4px 10%; <br />
border-collapse: collapse; <br />
border: 3px solid #1e90ff; /* Default "notice" blue */<br />
background: #fbfbfb;<br />
}<br />
.imbox .mbox-text .imbox { /* For imboxes inside imbox-text cells. */<br />
margin: 0 -0.5em; /* 0.9 - 0.5 = 0.4em left/right. */<br />
}<br />
.mbox-inside .imbox { /* For imboxes inside other templates. */<br />
margin: 4px;<br />
}<br />
<br />
table.imbox-notice {<br />
border: 3px solid #1e90ff; /* Blue */<br />
}<br />
table.imbox-speedy {<br />
border: 3px solid #b22222; /* Red */<br />
background: #fee; /* Pink */<br />
}<br />
table.imbox-delete {<br />
border: 3px solid #b22222; /* Red */<br />
}<br />
table.imbox-content {<br />
border: 3px solid #f28500; /* Orange */<br />
}<br />
table.imbox-style {<br />
border: 3px solid #f4c430; /* Yellow */<br />
}<br />
table.imbox-move {<br />
border: 3px solid #9932cc; /* Purple */<br />
}<br />
table.imbox-protection {<br />
border: 3px solid #bba; /* Gray-gold */<br />
}<br />
table.imbox-license {<br />
border: 3px solid #88a; /* Dark gray */<br />
background: #f7f8ff; /* Light gray */<br />
}<br />
table.imbox-featured {<br />
border: 3px solid #cba135; /* Brown-gold */<br />
}<br />
<br />
/* Category message box styles */<br />
table.cmbox {<br />
margin: 3px 10%;<br />
border-collapse: collapse;<br />
border: 1px solid #aaa; <br />
background: #DFE8FF; /* Default "notice" blue */<br />
}<br />
<br />
table.cmbox-notice {<br />
background: #D8E8FF; /* Blue */<br />
}<br />
table.cmbox-speedy {<br />
margin-top: 4px;<br />
margin-bottom: 4px;<br />
border: 4px solid #b22222; /* Red */<br />
background: #FFDBDB; /* Pink */<br />
}<br />
table.cmbox-delete {<br />
background: #FFDBDB; /* Red */<br />
}<br />
table.cmbox-content {<br />
background: #FFE7CE; /* Orange */<br />
}<br />
table.cmbox-style {<br />
background: #FFF9DB; /* Yellow */<br />
}<br />
table.cmbox-move {<br />
background: #E4D8FF; /* Purple */<br />
}<br />
table.cmbox-protection {<br />
background: #EFEFE1; /* Gray-gold */<br />
}<br />
<br />
/* Other pages message box styles */<br />
table.ombox {<br />
margin: 4px 10%; <br />
border-collapse: collapse; <br />
border: 1px solid #aaa; /* Default "notice" gray */<br />
background: #f9f9f9;<br />
}<br />
<br />
table.ombox-notice {<br />
border: 1px solid #aaa; /* Gray */<br />
}<br />
table.ombox-speedy {<br />
border: 2px solid #b22222; /* Red */<br />
background: #fee; /* Pink */<br />
}<br />
table.ombox-delete {<br />
border: 2px solid #b22222; /* Red */<br />
}<br />
table.ombox-content {<br />
border: 1px solid #f28500; /* Orange */<br />
}<br />
table.ombox-style {<br />
border: 1px solid #f4c430; /* Yellow */<br />
}<br />
table.ombox-move {<br />
border: 1px solid #9932cc; /* Purple */<br />
}<br />
table.ombox-protection {<br />
border: 2px solid #bba; /* Gray-gold */<br />
}<br />
<br />
/* Talk page message box styles */<br />
table.tmbox {<br />
margin: 4px 10%;<br />
border-collapse: collapse;<br />
border: 1px solid #c0c090; /* Default "notice" gray-brown */<br />
background: #f8eaba;<br />
}<br />
.mediawiki .mbox-inside .tmbox { /* For tmboxes inside other templates. The "mediawiki" */<br />
margin: 2px 0; /* class ensures that this declaration overrides other */<br />
width: 100%; /* For Safari and Opera */ /* styles (including mbox-small above) */<br />
}<br />
.mbox-inside .tmbox.mbox-small { /* "small" tmboxes should not be small when */<br />
line-height: 1.5em; /* also "nested", so reset styles that are */ <br />
font-size: 100%; /* set in "mbox-small" above. */<br />
}<br />
<br />
table.tmbox-speedy {<br />
border: 2px solid #b22222; /* Red */<br />
background: #fee; /* Pink */<br />
}<br />
table.tmbox-delete {<br />
border: 2px solid #b22222; /* Red */<br />
}<br />
table.tmbox-content {<br />
border: 2px solid #f28500; /* Orange */<br />
}<br />
table.tmbox-style {<br />
border: 2px solid #f4c430; /* Yellow */<br />
}<br />
table.tmbox-move {<br />
border: 2px solid #9932cc; /* Purple */<br />
}<br />
table.tmbox-protection,<br />
table.tmbox-notice {<br />
border: 1px solid #c0c090; /* Gray-brown */<br />
}<br />
<br />
/* Disambig and set index box styles */<br />
table.dmbox {<br />
clear: both; <br />
margin: 0.9em 1em; <br />
border-top: 1px solid #ccc; <br />
border-bottom: 1px solid #ccc; <br />
background: transparent;<br />
}<br />
<br />
/* Footer and header message box styles */<br />
table.fmbox {<br />
clear: both;<br />
margin: 0.2em 0;<br />
width: 100%;<br />
border: 1px solid #aaa;<br />
background: #f9f9f9; /* Default "system" gray */<br />
}<br />
table.fmbox-system {<br />
background: #f9f9f9;<br />
}<br />
table.fmbox-warning {<br />
border: 1px solid #bb7070; /* Dark pink */<br />
background: #ffdbdb; /* Pink */<br />
}<br />
table.fmbox-editnotice {<br />
background: transparent;<br />
}<br />
/* Div based "warning" style fmbox messages. */<br />
div.mw-warning-with-logexcerpt,<br />
div.mw-lag-warn-high,<br />
div.mw-cascadeprotectedwarning {<br />
clear: both;<br />
margin: 0.2em 0;<br />
border: 1px solid #bb7070;<br />
background: #ffdbdb;<br />
padding: 0.25em 0.9em;<br />
}<br />
/* Div based "system" style fmbox messages. Used in <br />
[[MediaWiki:Noarticletext]] and [[MediaWiki:Readonly lag]]. */<br />
div.mw-lag-warn-normal,<br />
div.noarticletext,<br />
div.fmbox-system {<br />
clear: both;<br />
margin: 0.2em 0;<br />
border: 1px solid #aaa;<br />
background: #f9f9f9;<br />
padding: 0.25em 0.9em;<br />
}<br />
<br />
/* These mbox-small classes must be placed after all other <br />
ambox/tmbox/ombox etc classes. "body.mediawiki" is so <br />
they override "table.ambox + table.ambox" above. */<br />
body.mediawiki table.mbox-small { /* For the "small=yes" option. */<br />
clear: right;<br />
float: right;<br />
margin: 4px 0 4px 1em;<br />
width: 238px;<br />
font-size: 88%;<br />
line-height: 1.25em;<br />
}<br />
body.mediawiki table.mbox-small-left { /* For the "small=left" option. */<br />
margin: 4px 1em 4px 0;<br />
width: 238px;<br />
border-collapse: collapse;<br />
font-size: 88%;<br />
line-height: 1.25em;<br />
}<br />
<br />
<br />
/* Support for Template:IPA, Template:Unicode and Template:Polytonic.<br />
The second declarations reset the styles for all browsers except<br />
IE6, which chokes on the empty comment tags. Please copy any changes<br />
to [[Template:IPA fonts]] and [[Template:Unicode fonts]].<br />
*/<br />
.IPA {<br />
font-family: "Charis SIL", "Doulos SIL", Gentium, GentiumAlt,<br />
"DejaVu Sans", Code2000, "TITUS Cyberbit Basic",<br />
"Arial Unicode MS", "Lucida Sans Unicode",<br />
"Chrysanthi Unicode";<br />
font-family /**/: inherit;<br />
}<br />
.Unicode {<br />
font-family: Code2000, Code2001, "Free Serif", "TITUS Cyberbit Basic",<br />
"Doulos SIL", "Chrysanthi Unicode", "Bitstream Cyberbit",<br />
"Bitstream CyberBase", Thryomanes, Gentium, GentiumAlt,<br />
"Lucida Grande", "Free Sans", "Arial Unicode MS",<br />
"Microsoft Sans Serif", "Lucida Sans Unicode";<br />
font-family /**/: inherit;<br />
}<br />
.latinx {<br />
font-family: Code2000, Code2001, "TITUS Cyberbit Basic", "Microsoft Sans Serif";<br />
font-family /**/: inherit;<br />
}<br />
.polytonic {<br />
font-family: "Athena Unicode", Gentium, "Palatino Linotype",<br />
"Arial Unicode MS", "Lucida Sans Unicode",<br />
"Lucida Grande", Code2000; <br />
font-family /**/: inherit;<br />
}<br />
<br />
#wpSave {<br />
font-weight: bold;<br />
}<br />
<br />
/* class hiddenStructure is defunct. See [[Wikipedia:hiddenStructure]] */<br />
.hiddenStructure {<br />
display: inline ! important;<br />
color: #f00; <br />
background-color: #0f0;<br />
}<br />
<br />
/* suppress missing interwiki image links where #ifexist cannot<br />
be used due to high number of requests see .hidden-redlink on <br />
http://meta.wikimedia.org/wiki/MediaWiki:Common.css<br />
*/<br />
.check-icon a.new {<br />
display: none; <br />
speak: none;<br />
}<br />
<br />
/* Removes underlines from links */<br />
.nounderlines a { <br />
text-decoration: none;<br />
}<br />
<br />
/* Remove underline from IPA links */<br />
.IPA a:link, .IPA a:visited {<br />
text-decoration: none;<br />
}<br />
<br />
/* Standard Navigationsleisten, aka box hiding thingy<br />
from .de. Documentation at [[Wikipedia:NavFrame]]. */<br />
div.NavFrame {<br />
margin: 0;<br />
padding: 4px;<br />
border: 1px solid #aaa;<br />
text-align: center;<br />
border-collapse: collapse;<br />
font-size: 95%;<br />
}<br />
div.NavFrame + div.NavFrame {<br />
border-top-style: none;<br />
border-top-style: hidden;<br />
}<br />
div.NavPic {<br />
background-color: #fff;<br />
margin: 0;<br />
padding: 2px;<br />
float: left;<br />
}<br />
div.NavFrame div.NavHead {<br />
height: 1.6em;<br />
font-weight: bold;<br />
background-color: #ccf;<br />
position: relative;<br />
}<br />
div.NavFrame p {<br />
font-size: 100%;<br />
}<br />
div.NavFrame div.NavContent {<br />
font-size: 100%;<br />
}<br />
div.NavFrame div.NavContent p {<br />
font-size: 100%;<br />
}<br />
div.NavEnd {<br />
margin: 0;<br />
padding: 0;<br />
line-height: 1px;<br />
clear: both;<br />
}<br />
a.NavToggle {<br />
position: absolute;<br />
top: 0;<br />
right: 3px;<br />
font-weight: normal;<br />
font-size: 90%;<br />
}<br />
<br />
/* Coloured watchlist numbers */<br />
.mw-plusminus-pos { color: #006400; } /* dark green */<br />
.mw-plusminus-neg { color: #8B0000; } /* dark red */<br />
<br />
.rellink,<br />
.dablink {<br />
font-style: italic;<br />
padding-left: 2em;<br />
}<br />
.rellink i,<br />
.dablink i {<br />
font-style: normal;<br />
}<br />
<br />
/* Style for horizontal UL lists */<br />
.horizontal ul {<br />
padding: 0;<br />
margin: 0;<br />
}<br />
.horizontal li { <br />
padding: 0 0.6em 0 0.4em;<br />
display: inline;<br />
border-right: 1px solid;<br />
}<br />
.horizontal li:last-child {<br />
border-right: none;<br />
padding-right: 0;<br />
}<br />
<br />
/* Allow transcluded pages to display in lists rather than a table.<br />
Compatible in Firefox; incompatible in IE6. */<br />
.listify td { display: list-item; }<br />
.listify tr { display: block; }<br />
.listify table { display: block; }<br />
<br />
/* Geographical coordinates defaults. See [[Template:Coord/link]]<br />
for how these are used. The classes "geo", "longitude", and<br />
"latitude" are used by the [[Geo microformat]].<br />
*/<br />
.geo-default, .geo-dms, .geo-dec { display: inline; }<br />
.geo-nondefault, .geo-multi-punct { display: none; }<br />
.longitude, .latitude { white-space: nowrap; }<br />
<br />
/* When <div class="nonumtoc"> is used on the table of contents,<br />
the ToC will display without numbers */<br />
.nonumtoc .tocnumber { display: none; }<br />
.nonumtoc #toc ul,<br />
.nonumtoc .toc ul {<br />
line-height: 1.5em;<br />
list-style: none;<br />
margin: .3em 0 0;<br />
padding: 0;<br />
}<br />
.nonumtoc #toc ul ul, <br />
.nonumtoc .toc ul ul { <br />
margin: 0 0 0 2em; <br />
}<br />
<br />
/* Allow limiting of which header levels are shown in a TOC;<br />
<div class="toclimit-3">, for instance, will limit to<br />
showing ==headings== and ===headings=== but no further<br />
(as long as there are no =headings= on the page, which<br />
there shouldn't be according to the MoS).<br />
*/<br />
.toclimit-2 .toclevel-2,<br />
.toclimit-3 .toclevel-3,<br />
.toclimit-4 .toclevel-4,<br />
.toclimit-5 .toclevel-5,<br />
.toclimit-6 .toclevel-6,<br />
.toclimit-7 .toclevel-7 { display: none; }<br />
<br />
/* Styling for Template:Quote */<br />
blockquote.templatequote { <br />
margin-top: 0; <br />
}<br />
blockquote.templatequote div.templatequotecite { <br />
line-height: 1em;<br />
text-align: left;<br />
padding-left: 2em;<br />
margin-top: 0;<br />
}<br />
blockquote.templatequote div.templatequotecite cite {<br />
font-size: 85%;<br />
}<br />
<br />
div.user-block {<br />
padding: 5px;<br />
border: 1px solid #A9A9A9;<br />
background-color: #FFEFD5;<br />
}<br />
<br />
/* Prevent line breaks in silly places: <br />
1) links when we don't want them to<br />
2) HTML formulae<br />
3) Ref tags with group names <ref group="Note"> --> "[Note 1]"<br />
*/<br />
.nowraplinks a,<br />
span.texhtml,<br />
sup.reference a { white-space: nowrap; }<br />
<br />
/* For template documentation */<br />
.template-documentation {<br />
clear: both;<br />
margin: 1em 0 0 0;<br />
border: 1px solid #aaa; <br />
background-color: #ecfcf4; <br />
padding: 5px;<br />
}<br />
<br />
.thumbinner {<br />
min-width: 100px;<br />
}<br />
<br />
/* Inline divs in ImageMaps (code borrowed from de.wiki) */<br />
.imagemap-inline div {<br />
display: inline;<br />
}<br />
<br />
/* Increase the height of the image upload box */<br />
#wpUploadDescription {<br />
height: 13em;<br />
}<br />
<br />
/* Reduce line-height for <sup> and <sub> */<br />
sup, sub {<br />
line-height: 1em;<br />
}<br />
<br />
<br />
/* The backgrounds for galleries. */<br />
#content .gallerybox div.thumb {<br />
background-color: #F9F9F9; /* Light gray padding */<br />
}<br />
/* Put a chequered background behind images, only visible if they have transparency */<br />
.gallerybox .thumb img,<br />
#file img {<br />
background: white url("http://upload.wikimedia.org/wikipedia/commons/5/5d/Checker-16x16.png") repeat;<br />
}<br />
/* But no chequered background on articles, user pages or portals. */<br />
.ns-0 .gallerybox .thumb img,<br />
.ns-2 .gallerybox .thumb img,<br />
.ns-100 .gallerybox .thumb img {<br />
background: white;<br />
}<br />
<br />
/* Prevent floating boxes from overlapping any category listings,<br />
file histories, edit previews, and edit [Show changes] views */<br />
#mw-subcategories, #mw-pages, #mw-category-media, <br />
#filehistory, #wikiPreview, #wikiDiff {<br />
clear: both;<br />
}<br />
<br />
/* Selectively hide headers in WikiProject banners */<br />
.wpb .wpb-header { display: none; }<br />
.wpbs-inner .wpb .wpb-header { display: block; } /* for IE */<br />
.wpbs-inner .wpb .wpb-header { display: table-row; } /* for real browsers */<br />
.wpbs-inner .wpb-outside { display: none; } /* hide things that should only display outside shells */<br />
<br />
/* </nowiki></pre> */</div>
Dustin Howett
https://iphonedev.wiki/index.php?title=MediaWiki:Common.css&diff=1186
MediaWiki:Common.css
2013-04-15T07:31:34Z
<p>Dustin Howett: Constrain p-logo's a's size.</p>
<hr />
<div>/*<br />
ATTENTION ADMINISTRATORS:<br />
<br />
This is the CSS for all skins. <br />
<br />
Testing can be done on your own user Monobook.css. In [[wikipedia:Mozilla|Mozilla]] and<br />
[[wikipedia:Opera (web browser)|Opera]], you can also test style changes dynamically<br />
with the [http://www.squarefree.com/bookmarklets/webdevel.html test styles]<br />
bookmarklet from squarefree.com. It pops up a window for adding style rules,<br />
and updates the page as you type.<br />
<br />
Always check with the [http://tinyurl.com/28y334 W3C CSS Validation Service]<br />
([http://tinyurl.com/2g8bsk CVS version]) after any changes.<br />
<br />
See also: [[wikipedia:Wikipedia:Catalogue of CSS classes|catalogue of CSS classes]].<br />
<br />
Thank you.<br />
*/<br />
<br />
/* <pre><nowiki> */<br />
<br />
/* Edit window toolbar */<br />
#toolbar {<br />
height: 22px;<br />
margin-bottom: 6px;<br />
}<br />
<br />
/* Margins for <ol> and <ul> */<br />
#content ol, #content ul,<br />
#mw_content ol, #mw_content ul {<br />
margin-bottom: 0.5em;<br />
}<br />
<br />
/* Make the list of references in [[Template:Reflist]] smaller */<br />
.references-small { <br />
font-size: 90%;<br />
}<br />
<br />
/* VALIDATOR NOTICE: the following is correct, but the W3C validator doesn't accept it */<br />
/* -moz-* is a vendor-specific extension (CSS 2.1 4.1.2.1) */<br />
/* column-count is from the CSS3 module "CSS Multi-column Layout" */<br />
/* Please ignore any validator errors caused by these two lines */<br />
.references-2column {<br />
font-size: 90%;<br />
-moz-column-count: 2;<br />
column-count: 2;<br />
}<br />
<br />
/* Highlight clicked reference in blue to help navigation */<br />
ol.references > li:target,<br />
sup.reference:target,<br />
cite:target { <br />
background-color: #DEF;<br />
}<br />
<br />
/* Ensure refs in table headers and the like aren't bold or italic */<br />
sup.reference {<br />
font-weight: normal;<br />
font-style: normal;<br />
}<br />
<br />
<br />
/* Styling for citations */<br />
cite {<br />
font-style: normal;<br />
word-wrap: break-word;<br />
}<br />
<br />
/* For linked citation numbers and document IDs, where<br />
the number need not be shown on a screen or a handheld,<br />
but should be included in the printed version<br />
*/<br />
@media screen, handheld, projection {<br />
cite *.printonly {<br />
display: none;<br />
}<br />
}<br />
<br />
<br />
/* wikitable/prettytable class for skinning normal tables */<br />
table.wikitable,<br />
table.prettytable {<br />
margin: 1em 1em 1em 0;<br />
background: #f9f9f9;<br />
border: 1px #aaa solid;<br />
border-collapse: collapse;<br />
}<br />
.wikitable th, .wikitable td,<br />
.prettytable th, .prettytable td {<br />
border: 1px #aaa solid;<br />
padding: 0.2em;<br />
}<br />
.wikitable th,<br />
.prettytable th {<br />
background: #f2f2f2;<br />
text-align: center;<br />
}<br />
.wikitable caption,<br />
.prettytable caption {<br />
font-weight: bold;<br />
}<br />
<br />
/* Default skin for navigation boxes */<br />
table.navbox { /* Navbox container style */<br />
border: 1px solid #aaa;<br />
width: 100%; <br />
margin: auto;<br />
clear: both;<br />
font-size: 88%;<br />
text-align: center;<br />
padding: 1px;<br />
}<br />
table.navbox + table.navbox { /* Single pixel border between adjacent navboxes */<br />
margin-top: -1px; /* (doesn't work for IE6, but that's okay) */<br />
}<br />
.navbox-title,<br />
.navbox-abovebelow,<br />
table.navbox th {<br />
text-align: center; /* Title and above/below styles */<br />
padding-left: 1em;<br />
padding-right: 1em;<br />
}<br />
.navbox-group { /* Group style */<br />
white-space: nowrap;<br />
text-align: right;<br />
font-weight: bold;<br />
padding-left: 1em;<br />
padding-right: 1em;<br />
}<br />
.navbox, .navbox-subgroup {<br />
background: #fdfdfd; /* Background color */<br />
}<br />
.navbox-list {<br />
border-color: #fdfdfd; /* Must match background color */<br />
}<br />
.navbox-title,<br />
table.navbox th {<br />
background: #ccccff; /* Level 1 color */<br />
}<br />
.navbox-abovebelow,<br />
.navbox-group,<br />
.navbox-subgroup .navbox-title {<br />
background: #ddddff; /* Level 2 color */<br />
}<br />
.navbox-subgroup .navbox-group, .navbox-subgroup .navbox-abovebelow {<br />
background: #e6e6ff; /* Level 3 color */<br />
}<br />
.navbox-even {<br />
background: #f7f7f7; /* Even row striping */<br />
}<br />
.navbox-odd {<br />
background: transparent; /* Odd row striping */<br />
}<br />
<br />
.collapseButton { /* 'show'/'hide' buttons created dynamically */<br />
float: right; /* by the CollapsibleTables javascript in */<br />
font-weight: normal; /* [[MediaWiki:Common.js]]are styled here */<br />
text-align: right; /* so they can be customised. */<br />
width: auto;<br />
}<br />
.navbox .collapseButton { /* In navboxes, the show/hide button balances */<br />
width: 6em; /* the vde links from [[Template:Tnavbar]], */<br />
} /* so they need to be the same width. */<br />
<br />
<br />
/* Infobox template style */<br />
.infobox {<br />
border: 1px solid #aaa;<br />
background-color: #f9f9f9;<br />
color: black;<br />
margin: 0.5em 0 0.5em 1em;<br />
padding: 0.2em;<br />
float: right;<br />
clear: right;<br />
}<br />
.infobox td,<br />
.infobox th {<br />
vertical-align: top;<br />
}<br />
.infobox caption {<br />
font-size: larger;<br />
}<br />
.infobox.bordered {<br />
border-collapse: collapse;<br />
}<br />
.infobox.bordered td,<br />
.infobox.bordered th {<br />
border: 1px solid #aaa;<br />
}<br />
.infobox.bordered .borderless td,<br />
.infobox.bordered .borderless th {<br />
border: 0;<br />
}<br />
<br />
.infobox.sisterproject {<br />
width: 20em;<br />
font-size: 90%;<br />
}<br />
<br />
.infobox.standard-talk {<br />
border: 1px solid #c0c090;<br />
background-color: #f8eaba;<br />
}<br />
.infobox.standard-talk.bordered td,<br />
.infobox.standard-talk.bordered th {<br />
border: 1px solid #c0c090;<br />
}<br />
<br />
/* styles for bordered infobox with merged rows */<br />
.infobox.bordered .mergedtoprow td,<br />
.infobox.bordered .mergedtoprow th {<br />
border: 0;<br />
border-top: 1px solid #aaa;<br />
border-right: 1px solid #aaa;<br />
}<br />
<br />
.infobox.bordered .mergedrow td,<br />
.infobox.bordered .mergedrow th {<br />
border: 0;<br />
border-right: 1px solid #aaa;<br />
}<br />
<br />
/* Styles for geography infoboxes, eg countries,<br />
country subdivisions, cities, etc. */<br />
.infobox.geography {<br />
text-align: left;<br />
border-collapse: collapse;<br />
line-height: 1.2em; <br />
font-size: 90%;<br />
}<br />
<br />
.infobox.geography td,<br />
.infobox.geography th {<br />
border-top: solid 1px #aaa;<br />
padding: 0.4em 0.6em 0.4em 0.6em;<br />
}<br />
.infobox.geography .mergedtoprow td,<br />
.infobox.geography .mergedtoprow th {<br />
border-top: solid 1px #aaa;<br />
padding: 0.4em 0.6em 0.2em 0.6em;<br />
}<br />
<br />
.infobox.geography .mergedrow td,<br />
.infobox.geography .mergedrow th {<br />
border: 0;<br />
padding: 0 0.6em 0.2em 0.6em;<br />
}<br />
<br />
.infobox.geography .mergedbottomrow td,<br />
.infobox.geography .mergedbottomrow th {<br />
border-top: 0;<br />
border-bottom: solid 1px #aaa;<br />
padding: 0 0.6em 0.4em 0.6em;<br />
}<br />
<br />
.infobox.geography .maptable td,<br />
.infobox.geography .maptable th {<br />
border: 0;<br />
padding: 0;<br />
}<br />
<br />
/* Makes redirects appear in italics in categories and on [[Special:Allpages]] */<br />
.redirect-in-category, .allpagesredirect {<br />
font-style: italic;<br />
}<br />
<br />
/* Icons for medialist templates [[Template:Listen]],<br />
[[Template:Multi-listen_start]], [[Template:Video]],<br />
[[Template:Multi-video_start]]<br />
*/<br />
div.listenlist {<br />
background:<br />
url("http://upload.wikimedia.org/wikipedia/commons/thumb/a/a6/Gnome-speakernotes.png/30px-Gnome-speakernotes.png");<br />
padding-left: 40px;<br />
}<br />
<br />
/* Style rules for media list templates */<br />
div.medialist {<br />
min-height: 50px;<br />
margin: 1em;<br />
background-position: top left;<br />
background-repeat: no-repeat;<br />
}<br />
div.medialist ul {<br />
list-style-type: none; <br />
list-style-image: none;<br />
margin: 0;<br />
}<br />
div.medialist ul li {<br />
padding-bottom: 0.5em;<br />
}<br />
div.medialist ul li li {<br />
font-size: 91%;<br />
padding-bottom: 0;<br />
}<br />
<br />
/* Change the external link icon to an Adobe icon for all PDF files<br />
in browsers that support these CSS selectors, like Mozilla and Opera */<br />
#bodyContent a[href$=".pdf"].external, <br />
#bodyContent a[href*=".pdf?"].external, <br />
#bodyContent a[href*=".pdf#"].external,<br />
#bodyContent a[href$=".PDF"].external, <br />
#bodyContent a[href*=".PDF?"].external, <br />
#bodyContent a[href*=".PDF#"].external,<br />
#mw_content a[href$=".pdf"].external, <br />
#mw_content a[href*=".pdf?"].external, <br />
#mw_content a[href*=".pdf#"].external,<br />
#mw_content a[href$=".PDF"].external, <br />
#mw_content a[href*=".PDF?"].external, <br />
#mw_content a[href*=".PDF#"].external {<br />
background: <br />
url("http://upload.wikimedia.org/wikipedia/commons/thumb/2/23/Icons-mini-file_acrobat.gif/15px-Icons-mini-file_acrobat.gif")<br />
center right no-repeat;<br />
padding-right: 16px;<br />
}<br />
<br />
/* Change the external link icon to an Adobe icon anywhere the PDFlink class<br />
is used (notably Template:PDFlink). This works in IE, unlike the above. */<br />
#bodyContent span.PDFlink a,<br />
#mw_content span.PDFlink a {<br />
background: <br />
url("http://upload.wikimedia.org/wikipedia/commons/thumb/2/23/Icons-mini-file_acrobat.gif/15px-Icons-mini-file_acrobat.gif")<br />
center right no-repeat;<br />
padding-right: 17px;<br />
}<br />
<br />
/* Remove link styling. Already defined in monobook<br />
and modern, but not defined in the other skins. Bug 18708 */<br />
#bodyContent .plainlinks a {<br />
background: none !important;<br />
padding: 0 !important;<br />
}<br />
<br />
/* Content in columns with CSS instead of tables [[Template:Columns]] */<br />
div.columns-2 div.column {<br />
float: left;<br />
width: 50%;<br />
min-width: 300px;<br />
}<br />
div.columns-3 div.column {<br />
float: left;<br />
width: 33.3%;<br />
min-width: 200px;<br />
}<br />
div.columns-4 div.column {<br />
float: left;<br />
width: 25%;<br />
min-width: 150px;<br />
}<br />
div.columns-5 div.column {<br />
float: left;<br />
width: 20%;<br />
min-width: 120px;<br />
}<br />
<br />
/* Make sure that "external references" from templates like [[Template:Ref]] <br />
do not get URL expansion, not even when printed. The anchor itself has <br />
class "external autonumber" and the url expansion is inserted when printing <br />
(see [http://en.wikipedia.org/skins-1.5/common/commonPrint.css]) using the<br />
":after" pseudo-element.<br />
*/<br />
.nourlexpansion a.external.text:after,<br />
.nourlexpansion a.external.autonumber:after {<br />
display: none !important;<br />
}<br />
<br />
/* Messagebox templates */<br />
.messagebox {<br />
border: 1px solid #aaa;<br />
background-color: #f9f9f9;<br />
width: 80%;<br />
margin: 0 auto 1em auto;<br />
padding: .2em;<br />
}<br />
.messagebox.merge {<br />
border: 1px solid #c0b8cc;<br />
background-color: #f0e5ff;<br />
text-align: center;<br />
}<br />
.messagebox.cleanup {<br />
border: 1px solid #9f9fff;<br />
background-color: #efefff;<br />
text-align: center;<br />
}<br />
.messagebox.standard-talk {<br />
border: 1px solid #c0c090;<br />
background-color: #f8eaba;<br />
margin: 4px auto;<br />
}<br />
/* For old WikiProject banners inside banner shells. */<br />
.mbox-inside .standard-talk,<br />
.messagebox.nested-talk {<br />
border: 1px solid #c0c090;<br />
background-color: #f8eaba;<br />
width: 100%;<br />
margin: 2px 0;<br />
padding: 2px;<br />
}<br />
.messagebox.small {<br />
width: 238px;<br />
font-size: 85%;<br />
float: right;<br />
clear: both;<br />
margin: 0 0 1em 1em;<br />
line-height: 1.25em; <br />
}<br />
.messagebox.small-talk {<br />
width: 238px;<br />
font-size: 85%;<br />
float: right;<br />
clear: both;<br />
margin: 0 0 1em 1em;<br />
line-height: 1.25em; <br />
background: #F8EABA;<br />
}<br />
<br />
<br />
/* Cell sizes for ambox/tmbox/imbox/cmbox/ombox/fmbox/dmbox message boxes */<br />
th.mbox-text, td.mbox-text { /* The message body cell(s) */<br />
border: none; <br />
padding: 0.25em 0.9em; /* 0.9em left/right */<br />
width: 100%; /* Make all mboxes the same width regardless of text length */<br />
}<br />
td.mbox-image { /* The left image cell */<br />
border: none; <br />
padding: 2px 0 2px 0.9em; /* 0.9em left, 0px right */<br />
text-align: center; <br />
}<br />
td.mbox-imageright { /* The right image cell */<br />
border: none;<br />
padding: 2px 0.9em 2px 0; /* 0px left, 0.9em right */<br />
text-align: center; <br />
}<br />
td.mbox-empty-cell { /* An empty narrow cell */<br />
border: none;<br />
padding: 0px;<br />
width: 1px;<br />
}<br />
<br />
/* Article message box styles */<br />
table.ambox {<br />
margin: 0px 10%; /* 10% = Will not overlap with other elements */<br />
border: 1px solid #aaa; <br />
border-left: 10px solid #1e90ff; /* Default "notice" blue */<br />
background: #fbfbfb; <br />
}<br />
table.ambox + table.ambox { /* Single border between stacked boxes. */<br />
margin-top: -1px;<br />
}<br />
.ambox th.mbox-text, <br />
.ambox td.mbox-text { /* The message body cell(s) */<br />
padding: 0.25em 0.5em; /* 0.5em left/right */<br />
}<br />
.ambox td.mbox-image { /* The left image cell */<br />
padding: 2px 0 2px 0.5em; /* 0.5em left, 0px right */<br />
}<br />
.ambox td.mbox-imageright { /* The right image cell */<br />
padding: 2px 0.5em 2px 0; /* 0px left, 0.5em right */<br />
}<br />
<br />
table.ambox-notice {<br />
border-left: 10px solid #1e90ff; /* Blue */<br />
}<br />
table.ambox-speedy {<br />
border-left: 10px solid #b22222; /* Red */<br />
background: #fee; /* Pink */<br />
}<br />
table.ambox-delete {<br />
border-left: 10px solid #b22222; /* Red */<br />
}<br />
table.ambox-content {<br />
border-left: 10px solid #f28500; /* Orange */<br />
}<br />
table.ambox-style {<br />
border-left: 10px solid #f4c430; /* Yellow */<br />
}<br />
table.ambox-move {<br />
border-left: 10px solid #9932cc; /* Purple */<br />
}<br />
table.ambox-protection {<br />
border-left: 10px solid #bba; /* Gray-gold */<br />
}<br />
<br />
/* Image message box styles */<br />
table.imbox {<br />
margin: 4px 10%; <br />
border-collapse: collapse; <br />
border: 3px solid #1e90ff; /* Default "notice" blue */<br />
background: #fbfbfb;<br />
}<br />
.imbox .mbox-text .imbox { /* For imboxes inside imbox-text cells. */<br />
margin: 0 -0.5em; /* 0.9 - 0.5 = 0.4em left/right. */<br />
}<br />
.mbox-inside .imbox { /* For imboxes inside other templates. */<br />
margin: 4px;<br />
}<br />
<br />
table.imbox-notice {<br />
border: 3px solid #1e90ff; /* Blue */<br />
}<br />
table.imbox-speedy {<br />
border: 3px solid #b22222; /* Red */<br />
background: #fee; /* Pink */<br />
}<br />
table.imbox-delete {<br />
border: 3px solid #b22222; /* Red */<br />
}<br />
table.imbox-content {<br />
border: 3px solid #f28500; /* Orange */<br />
}<br />
table.imbox-style {<br />
border: 3px solid #f4c430; /* Yellow */<br />
}<br />
table.imbox-move {<br />
border: 3px solid #9932cc; /* Purple */<br />
}<br />
table.imbox-protection {<br />
border: 3px solid #bba; /* Gray-gold */<br />
}<br />
table.imbox-license {<br />
border: 3px solid #88a; /* Dark gray */<br />
background: #f7f8ff; /* Light gray */<br />
}<br />
table.imbox-featured {<br />
border: 3px solid #cba135; /* Brown-gold */<br />
}<br />
<br />
/* Category message box styles */<br />
table.cmbox {<br />
margin: 3px 10%;<br />
border-collapse: collapse;<br />
border: 1px solid #aaa; <br />
background: #DFE8FF; /* Default "notice" blue */<br />
}<br />
<br />
table.cmbox-notice {<br />
background: #D8E8FF; /* Blue */<br />
}<br />
table.cmbox-speedy {<br />
margin-top: 4px;<br />
margin-bottom: 4px;<br />
border: 4px solid #b22222; /* Red */<br />
background: #FFDBDB; /* Pink */<br />
}<br />
table.cmbox-delete {<br />
background: #FFDBDB; /* Red */<br />
}<br />
table.cmbox-content {<br />
background: #FFE7CE; /* Orange */<br />
}<br />
table.cmbox-style {<br />
background: #FFF9DB; /* Yellow */<br />
}<br />
table.cmbox-move {<br />
background: #E4D8FF; /* Purple */<br />
}<br />
table.cmbox-protection {<br />
background: #EFEFE1; /* Gray-gold */<br />
}<br />
<br />
/* Other pages message box styles */<br />
table.ombox {<br />
margin: 4px 10%; <br />
border-collapse: collapse; <br />
border: 1px solid #aaa; /* Default "notice" gray */<br />
background: #f9f9f9;<br />
}<br />
<br />
table.ombox-notice {<br />
border: 1px solid #aaa; /* Gray */<br />
}<br />
table.ombox-speedy {<br />
border: 2px solid #b22222; /* Red */<br />
background: #fee; /* Pink */<br />
}<br />
table.ombox-delete {<br />
border: 2px solid #b22222; /* Red */<br />
}<br />
table.ombox-content {<br />
border: 1px solid #f28500; /* Orange */<br />
}<br />
table.ombox-style {<br />
border: 1px solid #f4c430; /* Yellow */<br />
}<br />
table.ombox-move {<br />
border: 1px solid #9932cc; /* Purple */<br />
}<br />
table.ombox-protection {<br />
border: 2px solid #bba; /* Gray-gold */<br />
}<br />
<br />
/* Talk page message box styles */<br />
table.tmbox {<br />
margin: 4px 10%;<br />
border-collapse: collapse;<br />
border: 1px solid #c0c090; /* Default "notice" gray-brown */<br />
background: #f8eaba;<br />
}<br />
.mediawiki .mbox-inside .tmbox { /* For tmboxes inside other templates. The "mediawiki" */<br />
margin: 2px 0; /* class ensures that this declaration overrides other */<br />
width: 100%; /* For Safari and Opera */ /* styles (including mbox-small above) */<br />
}<br />
.mbox-inside .tmbox.mbox-small { /* "small" tmboxes should not be small when */<br />
line-height: 1.5em; /* also "nested", so reset styles that are */ <br />
font-size: 100%; /* set in "mbox-small" above. */<br />
}<br />
<br />
table.tmbox-speedy {<br />
border: 2px solid #b22222; /* Red */<br />
background: #fee; /* Pink */<br />
}<br />
table.tmbox-delete {<br />
border: 2px solid #b22222; /* Red */<br />
}<br />
table.tmbox-content {<br />
border: 2px solid #f28500; /* Orange */<br />
}<br />
table.tmbox-style {<br />
border: 2px solid #f4c430; /* Yellow */<br />
}<br />
table.tmbox-move {<br />
border: 2px solid #9932cc; /* Purple */<br />
}<br />
table.tmbox-protection,<br />
table.tmbox-notice {<br />
border: 1px solid #c0c090; /* Gray-brown */<br />
}<br />
<br />
/* Disambig and set index box styles */<br />
table.dmbox {<br />
clear: both; <br />
margin: 0.9em 1em; <br />
border-top: 1px solid #ccc; <br />
border-bottom: 1px solid #ccc; <br />
background: transparent;<br />
}<br />
<br />
/* Footer and header message box styles */<br />
table.fmbox {<br />
clear: both;<br />
margin: 0.2em 0;<br />
width: 100%;<br />
border: 1px solid #aaa;<br />
background: #f9f9f9; /* Default "system" gray */<br />
}<br />
table.fmbox-system {<br />
background: #f9f9f9;<br />
}<br />
table.fmbox-warning {<br />
border: 1px solid #bb7070; /* Dark pink */<br />
background: #ffdbdb; /* Pink */<br />
}<br />
table.fmbox-editnotice {<br />
background: transparent;<br />
}<br />
/* Div based "warning" style fmbox messages. */<br />
div.mw-warning-with-logexcerpt,<br />
div.mw-lag-warn-high,<br />
div.mw-cascadeprotectedwarning {<br />
clear: both;<br />
margin: 0.2em 0;<br />
border: 1px solid #bb7070;<br />
background: #ffdbdb;<br />
padding: 0.25em 0.9em;<br />
}<br />
/* Div based "system" style fmbox messages. Used in <br />
[[MediaWiki:Noarticletext]] and [[MediaWiki:Readonly lag]]. */<br />
div.mw-lag-warn-normal,<br />
div.noarticletext,<br />
div.fmbox-system {<br />
clear: both;<br />
margin: 0.2em 0;<br />
border: 1px solid #aaa;<br />
background: #f9f9f9;<br />
padding: 0.25em 0.9em;<br />
}<br />
<br />
/* These mbox-small classes must be placed after all other <br />
ambox/tmbox/ombox etc classes. "body.mediawiki" is so <br />
they override "table.ambox + table.ambox" above. */<br />
body.mediawiki table.mbox-small { /* For the "small=yes" option. */<br />
clear: right;<br />
float: right;<br />
margin: 4px 0 4px 1em;<br />
width: 238px;<br />
font-size: 88%;<br />
line-height: 1.25em;<br />
}<br />
body.mediawiki table.mbox-small-left { /* For the "small=left" option. */<br />
margin: 4px 1em 4px 0;<br />
width: 238px;<br />
border-collapse: collapse;<br />
font-size: 88%;<br />
line-height: 1.25em;<br />
}<br />
<br />
<br />
/* Support for Template:IPA, Template:Unicode and Template:Polytonic.<br />
The second declarations reset the styles for all browsers except<br />
IE6, which chokes on the empty comment tags. Please copy any changes<br />
to [[Template:IPA fonts]] and [[Template:Unicode fonts]].<br />
*/<br />
.IPA {<br />
font-family: "Charis SIL", "Doulos SIL", Gentium, GentiumAlt,<br />
"DejaVu Sans", Code2000, "TITUS Cyberbit Basic",<br />
"Arial Unicode MS", "Lucida Sans Unicode",<br />
"Chrysanthi Unicode";<br />
font-family /**/: inherit;<br />
}<br />
.Unicode {<br />
font-family: Code2000, Code2001, "Free Serif", "TITUS Cyberbit Basic",<br />
"Doulos SIL", "Chrysanthi Unicode", "Bitstream Cyberbit",<br />
"Bitstream CyberBase", Thryomanes, Gentium, GentiumAlt,<br />
"Lucida Grande", "Free Sans", "Arial Unicode MS",<br />
"Microsoft Sans Serif", "Lucida Sans Unicode";<br />
font-family /**/: inherit;<br />
}<br />
.latinx {<br />
font-family: Code2000, Code2001, "TITUS Cyberbit Basic", "Microsoft Sans Serif";<br />
font-family /**/: inherit;<br />
}<br />
.polytonic {<br />
font-family: "Athena Unicode", Gentium, "Palatino Linotype",<br />
"Arial Unicode MS", "Lucida Sans Unicode",<br />
"Lucida Grande", Code2000; <br />
font-family /**/: inherit;<br />
}<br />
<br />
#wpSave {<br />
font-weight: bold;<br />
}<br />
<br />
/* class hiddenStructure is defunct. See [[Wikipedia:hiddenStructure]] */<br />
.hiddenStructure {<br />
display: inline ! important;<br />
color: #f00; <br />
background-color: #0f0;<br />
}<br />
<br />
/* suppress missing interwiki image links where #ifexist cannot<br />
be used due to high number of requests see .hidden-redlink on <br />
http://meta.wikimedia.org/wiki/MediaWiki:Common.css<br />
*/<br />
.check-icon a.new {<br />
display: none; <br />
speak: none;<br />
}<br />
<br />
/* Removes underlines from links */<br />
.nounderlines a { <br />
text-decoration: none;<br />
}<br />
<br />
/* Remove underline from IPA links */<br />
.IPA a:link, .IPA a:visited {<br />
text-decoration: none;<br />
}<br />
<br />
/* Standard Navigationsleisten, aka box hiding thingy<br />
from .de. Documentation at [[Wikipedia:NavFrame]]. */<br />
div.NavFrame {<br />
margin: 0;<br />
padding: 4px;<br />
border: 1px solid #aaa;<br />
text-align: center;<br />
border-collapse: collapse;<br />
font-size: 95%;<br />
}<br />
div.NavFrame + div.NavFrame {<br />
border-top-style: none;<br />
border-top-style: hidden;<br />
}<br />
div.NavPic {<br />
background-color: #fff;<br />
margin: 0;<br />
padding: 2px;<br />
float: left;<br />
}<br />
div.NavFrame div.NavHead {<br />
height: 1.6em;<br />
font-weight: bold;<br />
background-color: #ccf;<br />
position: relative;<br />
}<br />
div.NavFrame p {<br />
font-size: 100%;<br />
}<br />
div.NavFrame div.NavContent {<br />
font-size: 100%;<br />
}<br />
div.NavFrame div.NavContent p {<br />
font-size: 100%;<br />
}<br />
div.NavEnd {<br />
margin: 0;<br />
padding: 0;<br />
line-height: 1px;<br />
clear: both;<br />
}<br />
a.NavToggle {<br />
position: absolute;<br />
top: 0;<br />
right: 3px;<br />
font-weight: normal;<br />
font-size: 90%;<br />
}<br />
<br />
/* Coloured watchlist numbers */<br />
.mw-plusminus-pos { color: #006400; } /* dark green */<br />
.mw-plusminus-neg { color: #8B0000; } /* dark red */<br />
<br />
.rellink,<br />
.dablink {<br />
font-style: italic;<br />
padding-left: 2em;<br />
}<br />
.rellink i,<br />
.dablink i {<br />
font-style: normal;<br />
}<br />
<br />
/* Style for horizontal UL lists */<br />
.horizontal ul {<br />
padding: 0;<br />
margin: 0;<br />
}<br />
.horizontal li { <br />
padding: 0 0.6em 0 0.4em;<br />
display: inline;<br />
border-right: 1px solid;<br />
}<br />
.horizontal li:last-child {<br />
border-right: none;<br />
padding-right: 0;<br />
}<br />
<br />
/* Allow transcluded pages to display in lists rather than a table.<br />
Compatible in Firefox; incompatible in IE6. */<br />
.listify td { display: list-item; }<br />
.listify tr { display: block; }<br />
.listify table { display: block; }<br />
<br />
/* Geographical coordinates defaults. See [[Template:Coord/link]]<br />
for how these are used. The classes "geo", "longitude", and<br />
"latitude" are used by the [[Geo microformat]].<br />
*/<br />
.geo-default, .geo-dms, .geo-dec { display: inline; }<br />
.geo-nondefault, .geo-multi-punct { display: none; }<br />
.longitude, .latitude { white-space: nowrap; }<br />
<br />
/* When <div class="nonumtoc"> is used on the table of contents,<br />
the ToC will display without numbers */<br />
.nonumtoc .tocnumber { display: none; }<br />
.nonumtoc #toc ul,<br />
.nonumtoc .toc ul {<br />
line-height: 1.5em;<br />
list-style: none;<br />
margin: .3em 0 0;<br />
padding: 0;<br />
}<br />
.nonumtoc #toc ul ul, <br />
.nonumtoc .toc ul ul { <br />
margin: 0 0 0 2em; <br />
}<br />
<br />
/* Allow limiting of which header levels are shown in a TOC;<br />
<div class="toclimit-3">, for instance, will limit to<br />
showing ==headings== and ===headings=== but no further<br />
(as long as there are no =headings= on the page, which<br />
there shouldn't be according to the MoS).<br />
*/<br />
.toclimit-2 .toclevel-2,<br />
.toclimit-3 .toclevel-3,<br />
.toclimit-4 .toclevel-4,<br />
.toclimit-5 .toclevel-5,<br />
.toclimit-6 .toclevel-6,<br />
.toclimit-7 .toclevel-7 { display: none; }<br />
<br />
/* Styling for Template:Quote */<br />
blockquote.templatequote { <br />
margin-top: 0; <br />
}<br />
blockquote.templatequote div.templatequotecite { <br />
line-height: 1em;<br />
text-align: left;<br />
padding-left: 2em;<br />
margin-top: 0;<br />
}<br />
blockquote.templatequote div.templatequotecite cite {<br />
font-size: 85%;<br />
}<br />
<br />
div.user-block {<br />
padding: 5px;<br />
border: 1px solid #A9A9A9;<br />
background-color: #FFEFD5;<br />
}<br />
<br />
/* Prevent line breaks in silly places: <br />
1) links when we don't want them to<br />
2) HTML formulae<br />
3) Ref tags with group names <ref group="Note"> --> "[Note 1]"<br />
*/<br />
.nowraplinks a,<br />
span.texhtml,<br />
sup.reference a { white-space: nowrap; }<br />
<br />
/* For template documentation */<br />
.template-documentation {<br />
clear: both;<br />
margin: 1em 0 0 0;<br />
border: 1px solid #aaa; <br />
background-color: #ecfcf4; <br />
padding: 5px;<br />
}<br />
<br />
.thumbinner {<br />
min-width: 100px;<br />
}<br />
<br />
/* Inline divs in ImageMaps (code borrowed from de.wiki) */<br />
.imagemap-inline div {<br />
display: inline;<br />
}<br />
<br />
/* Increase the height of the image upload box */<br />
#wpUploadDescription {<br />
height: 13em;<br />
}<br />
<br />
/* Reduce line-height for <sup> and <sub> */<br />
sup, sub {<br />
line-height: 1em;<br />
}<br />
<br />
<br />
/* The backgrounds for galleries. */<br />
#content .gallerybox div.thumb {<br />
background-color: #F9F9F9; /* Light gray padding */<br />
}<br />
/* Put a chequered background behind images, only visible if they have transparency */<br />
.gallerybox .thumb img,<br />
#file img {<br />
background: white url("http://upload.wikimedia.org/wikipedia/commons/5/5d/Checker-16x16.png") repeat;<br />
}<br />
/* But no chequered background on articles, user pages or portals. */<br />
.ns-0 .gallerybox .thumb img,<br />
.ns-2 .gallerybox .thumb img,<br />
.ns-100 .gallerybox .thumb img {<br />
background: white;<br />
}<br />
<br />
/* Prevent floating boxes from overlapping any category listings,<br />
file histories, edit previews, and edit [Show changes] views */<br />
#mw-subcategories, #mw-pages, #mw-category-media, <br />
#filehistory, #wikiPreview, #wikiDiff {<br />
clear: both;<br />
}<br />
<br />
/* Selectively hide headers in WikiProject banners */<br />
.wpb .wpb-header { display: none; }<br />
.wpbs-inner .wpb .wpb-header { display: block; } /* for IE */<br />
.wpbs-inner .wpb .wpb-header { display: table-row; } /* for real browsers */<br />
.wpbs-inner .wpb-outside { display: none; } /* hide things that should only display outside shells */<br />
<br />
#p-logo a { width: 135px; min-width: 135px; max-width: 135px; height: 135px; min-height: 135px; max-height: 135px;}<br />
/* </nowiki></pre> */</div>
Dustin Howett
https://iphonedev.wiki/index.php?title=MediaWiki:Common.css&diff=1185
MediaWiki:Common.css
2013-04-15T07:30:50Z
<p>Dustin Howett: Constrain p-logo's size.</p>
<hr />
<div>/*<br />
ATTENTION ADMINISTRATORS:<br />
<br />
This is the CSS for all skins. <br />
<br />
Testing can be done on your own user Monobook.css. In [[wikipedia:Mozilla|Mozilla]] and<br />
[[wikipedia:Opera (web browser)|Opera]], you can also test style changes dynamically<br />
with the [http://www.squarefree.com/bookmarklets/webdevel.html test styles]<br />
bookmarklet from squarefree.com. It pops up a window for adding style rules,<br />
and updates the page as you type.<br />
<br />
Always check with the [http://tinyurl.com/28y334 W3C CSS Validation Service]<br />
([http://tinyurl.com/2g8bsk CVS version]) after any changes.<br />
<br />
See also: [[wikipedia:Wikipedia:Catalogue of CSS classes|catalogue of CSS classes]].<br />
<br />
Thank you.<br />
*/<br />
<br />
/* <pre><nowiki> */<br />
<br />
/* Edit window toolbar */<br />
#toolbar {<br />
height: 22px;<br />
margin-bottom: 6px;<br />
}<br />
<br />
/* Margins for <ol> and <ul> */<br />
#content ol, #content ul,<br />
#mw_content ol, #mw_content ul {<br />
margin-bottom: 0.5em;<br />
}<br />
<br />
/* Make the list of references in [[Template:Reflist]] smaller */<br />
.references-small { <br />
font-size: 90%;<br />
}<br />
<br />
/* VALIDATOR NOTICE: the following is correct, but the W3C validator doesn't accept it */<br />
/* -moz-* is a vendor-specific extension (CSS 2.1 4.1.2.1) */<br />
/* column-count is from the CSS3 module "CSS Multi-column Layout" */<br />
/* Please ignore any validator errors caused by these two lines */<br />
.references-2column {<br />
font-size: 90%;<br />
-moz-column-count: 2;<br />
column-count: 2;<br />
}<br />
<br />
/* Highlight clicked reference in blue to help navigation */<br />
ol.references > li:target,<br />
sup.reference:target,<br />
cite:target { <br />
background-color: #DEF;<br />
}<br />
<br />
/* Ensure refs in table headers and the like aren't bold or italic */<br />
sup.reference {<br />
font-weight: normal;<br />
font-style: normal;<br />
}<br />
<br />
<br />
/* Styling for citations */<br />
cite {<br />
font-style: normal;<br />
word-wrap: break-word;<br />
}<br />
<br />
/* For linked citation numbers and document IDs, where<br />
the number need not be shown on a screen or a handheld,<br />
but should be included in the printed version<br />
*/<br />
@media screen, handheld, projection {<br />
cite *.printonly {<br />
display: none;<br />
}<br />
}<br />
<br />
<br />
/* wikitable/prettytable class for skinning normal tables */<br />
table.wikitable,<br />
table.prettytable {<br />
margin: 1em 1em 1em 0;<br />
background: #f9f9f9;<br />
border: 1px #aaa solid;<br />
border-collapse: collapse;<br />
}<br />
.wikitable th, .wikitable td,<br />
.prettytable th, .prettytable td {<br />
border: 1px #aaa solid;<br />
padding: 0.2em;<br />
}<br />
.wikitable th,<br />
.prettytable th {<br />
background: #f2f2f2;<br />
text-align: center;<br />
}<br />
.wikitable caption,<br />
.prettytable caption {<br />
font-weight: bold;<br />
}<br />
<br />
/* Default skin for navigation boxes */<br />
table.navbox { /* Navbox container style */<br />
border: 1px solid #aaa;<br />
width: 100%; <br />
margin: auto;<br />
clear: both;<br />
font-size: 88%;<br />
text-align: center;<br />
padding: 1px;<br />
}<br />
table.navbox + table.navbox { /* Single pixel border between adjacent navboxes */<br />
margin-top: -1px; /* (doesn't work for IE6, but that's okay) */<br />
}<br />
.navbox-title,<br />
.navbox-abovebelow,<br />
table.navbox th {<br />
text-align: center; /* Title and above/below styles */<br />
padding-left: 1em;<br />
padding-right: 1em;<br />
}<br />
.navbox-group { /* Group style */<br />
white-space: nowrap;<br />
text-align: right;<br />
font-weight: bold;<br />
padding-left: 1em;<br />
padding-right: 1em;<br />
}<br />
.navbox, .navbox-subgroup {<br />
background: #fdfdfd; /* Background color */<br />
}<br />
.navbox-list {<br />
border-color: #fdfdfd; /* Must match background color */<br />
}<br />
.navbox-title,<br />
table.navbox th {<br />
background: #ccccff; /* Level 1 color */<br />
}<br />
.navbox-abovebelow,<br />
.navbox-group,<br />
.navbox-subgroup .navbox-title {<br />
background: #ddddff; /* Level 2 color */<br />
}<br />
.navbox-subgroup .navbox-group, .navbox-subgroup .navbox-abovebelow {<br />
background: #e6e6ff; /* Level 3 color */<br />
}<br />
.navbox-even {<br />
background: #f7f7f7; /* Even row striping */<br />
}<br />
.navbox-odd {<br />
background: transparent; /* Odd row striping */<br />
}<br />
<br />
.collapseButton { /* 'show'/'hide' buttons created dynamically */<br />
float: right; /* by the CollapsibleTables javascript in */<br />
font-weight: normal; /* [[MediaWiki:Common.js]]are styled here */<br />
text-align: right; /* so they can be customised. */<br />
width: auto;<br />
}<br />
.navbox .collapseButton { /* In navboxes, the show/hide button balances */<br />
width: 6em; /* the vde links from [[Template:Tnavbar]], */<br />
} /* so they need to be the same width. */<br />
<br />
<br />
/* Infobox template style */<br />
.infobox {<br />
border: 1px solid #aaa;<br />
background-color: #f9f9f9;<br />
color: black;<br />
margin: 0.5em 0 0.5em 1em;<br />
padding: 0.2em;<br />
float: right;<br />
clear: right;<br />
}<br />
.infobox td,<br />
.infobox th {<br />
vertical-align: top;<br />
}<br />
.infobox caption {<br />
font-size: larger;<br />
}<br />
.infobox.bordered {<br />
border-collapse: collapse;<br />
}<br />
.infobox.bordered td,<br />
.infobox.bordered th {<br />
border: 1px solid #aaa;<br />
}<br />
.infobox.bordered .borderless td,<br />
.infobox.bordered .borderless th {<br />
border: 0;<br />
}<br />
<br />
.infobox.sisterproject {<br />
width: 20em;<br />
font-size: 90%;<br />
}<br />
<br />
.infobox.standard-talk {<br />
border: 1px solid #c0c090;<br />
background-color: #f8eaba;<br />
}<br />
.infobox.standard-talk.bordered td,<br />
.infobox.standard-talk.bordered th {<br />
border: 1px solid #c0c090;<br />
}<br />
<br />
/* styles for bordered infobox with merged rows */<br />
.infobox.bordered .mergedtoprow td,<br />
.infobox.bordered .mergedtoprow th {<br />
border: 0;<br />
border-top: 1px solid #aaa;<br />
border-right: 1px solid #aaa;<br />
}<br />
<br />
.infobox.bordered .mergedrow td,<br />
.infobox.bordered .mergedrow th {<br />
border: 0;<br />
border-right: 1px solid #aaa;<br />
}<br />
<br />
/* Styles for geography infoboxes, eg countries,<br />
country subdivisions, cities, etc. */<br />
.infobox.geography {<br />
text-align: left;<br />
border-collapse: collapse;<br />
line-height: 1.2em; <br />
font-size: 90%;<br />
}<br />
<br />
.infobox.geography td,<br />
.infobox.geography th {<br />
border-top: solid 1px #aaa;<br />
padding: 0.4em 0.6em 0.4em 0.6em;<br />
}<br />
.infobox.geography .mergedtoprow td,<br />
.infobox.geography .mergedtoprow th {<br />
border-top: solid 1px #aaa;<br />
padding: 0.4em 0.6em 0.2em 0.6em;<br />
}<br />
<br />
.infobox.geography .mergedrow td,<br />
.infobox.geography .mergedrow th {<br />
border: 0;<br />
padding: 0 0.6em 0.2em 0.6em;<br />
}<br />
<br />
.infobox.geography .mergedbottomrow td,<br />
.infobox.geography .mergedbottomrow th {<br />
border-top: 0;<br />
border-bottom: solid 1px #aaa;<br />
padding: 0 0.6em 0.4em 0.6em;<br />
}<br />
<br />
.infobox.geography .maptable td,<br />
.infobox.geography .maptable th {<br />
border: 0;<br />
padding: 0;<br />
}<br />
<br />
/* Makes redirects appear in italics in categories and on [[Special:Allpages]] */<br />
.redirect-in-category, .allpagesredirect {<br />
font-style: italic;<br />
}<br />
<br />
/* Icons for medialist templates [[Template:Listen]],<br />
[[Template:Multi-listen_start]], [[Template:Video]],<br />
[[Template:Multi-video_start]]<br />
*/<br />
div.listenlist {<br />
background:<br />
url("http://upload.wikimedia.org/wikipedia/commons/thumb/a/a6/Gnome-speakernotes.png/30px-Gnome-speakernotes.png");<br />
padding-left: 40px;<br />
}<br />
<br />
/* Style rules for media list templates */<br />
div.medialist {<br />
min-height: 50px;<br />
margin: 1em;<br />
background-position: top left;<br />
background-repeat: no-repeat;<br />
}<br />
div.medialist ul {<br />
list-style-type: none; <br />
list-style-image: none;<br />
margin: 0;<br />
}<br />
div.medialist ul li {<br />
padding-bottom: 0.5em;<br />
}<br />
div.medialist ul li li {<br />
font-size: 91%;<br />
padding-bottom: 0;<br />
}<br />
<br />
/* Change the external link icon to an Adobe icon for all PDF files<br />
in browsers that support these CSS selectors, like Mozilla and Opera */<br />
#bodyContent a[href$=".pdf"].external, <br />
#bodyContent a[href*=".pdf?"].external, <br />
#bodyContent a[href*=".pdf#"].external,<br />
#bodyContent a[href$=".PDF"].external, <br />
#bodyContent a[href*=".PDF?"].external, <br />
#bodyContent a[href*=".PDF#"].external,<br />
#mw_content a[href$=".pdf"].external, <br />
#mw_content a[href*=".pdf?"].external, <br />
#mw_content a[href*=".pdf#"].external,<br />
#mw_content a[href$=".PDF"].external, <br />
#mw_content a[href*=".PDF?"].external, <br />
#mw_content a[href*=".PDF#"].external {<br />
background: <br />
url("http://upload.wikimedia.org/wikipedia/commons/thumb/2/23/Icons-mini-file_acrobat.gif/15px-Icons-mini-file_acrobat.gif")<br />
center right no-repeat;<br />
padding-right: 16px;<br />
}<br />
<br />
/* Change the external link icon to an Adobe icon anywhere the PDFlink class<br />
is used (notably Template:PDFlink). This works in IE, unlike the above. */<br />
#bodyContent span.PDFlink a,<br />
#mw_content span.PDFlink a {<br />
background: <br />
url("http://upload.wikimedia.org/wikipedia/commons/thumb/2/23/Icons-mini-file_acrobat.gif/15px-Icons-mini-file_acrobat.gif")<br />
center right no-repeat;<br />
padding-right: 17px;<br />
}<br />
<br />
/* Remove link styling. Already defined in monobook<br />
and modern, but not defined in the other skins. Bug 18708 */<br />
#bodyContent .plainlinks a {<br />
background: none !important;<br />
padding: 0 !important;<br />
}<br />
<br />
/* Content in columns with CSS instead of tables [[Template:Columns]] */<br />
div.columns-2 div.column {<br />
float: left;<br />
width: 50%;<br />
min-width: 300px;<br />
}<br />
div.columns-3 div.column {<br />
float: left;<br />
width: 33.3%;<br />
min-width: 200px;<br />
}<br />
div.columns-4 div.column {<br />
float: left;<br />
width: 25%;<br />
min-width: 150px;<br />
}<br />
div.columns-5 div.column {<br />
float: left;<br />
width: 20%;<br />
min-width: 120px;<br />
}<br />
<br />
/* Make sure that "external references" from templates like [[Template:Ref]] <br />
do not get URL expansion, not even when printed. The anchor itself has <br />
class "external autonumber" and the url expansion is inserted when printing <br />
(see [http://en.wikipedia.org/skins-1.5/common/commonPrint.css]) using the<br />
":after" pseudo-element.<br />
*/<br />
.nourlexpansion a.external.text:after,<br />
.nourlexpansion a.external.autonumber:after {<br />
display: none !important;<br />
}<br />
<br />
/* Messagebox templates */<br />
.messagebox {<br />
border: 1px solid #aaa;<br />
background-color: #f9f9f9;<br />
width: 80%;<br />
margin: 0 auto 1em auto;<br />
padding: .2em;<br />
}<br />
.messagebox.merge {<br />
border: 1px solid #c0b8cc;<br />
background-color: #f0e5ff;<br />
text-align: center;<br />
}<br />
.messagebox.cleanup {<br />
border: 1px solid #9f9fff;<br />
background-color: #efefff;<br />
text-align: center;<br />
}<br />
.messagebox.standard-talk {<br />
border: 1px solid #c0c090;<br />
background-color: #f8eaba;<br />
margin: 4px auto;<br />
}<br />
/* For old WikiProject banners inside banner shells. */<br />
.mbox-inside .standard-talk,<br />
.messagebox.nested-talk {<br />
border: 1px solid #c0c090;<br />
background-color: #f8eaba;<br />
width: 100%;<br />
margin: 2px 0;<br />
padding: 2px;<br />
}<br />
.messagebox.small {<br />
width: 238px;<br />
font-size: 85%;<br />
float: right;<br />
clear: both;<br />
margin: 0 0 1em 1em;<br />
line-height: 1.25em; <br />
}<br />
.messagebox.small-talk {<br />
width: 238px;<br />
font-size: 85%;<br />
float: right;<br />
clear: both;<br />
margin: 0 0 1em 1em;<br />
line-height: 1.25em; <br />
background: #F8EABA;<br />
}<br />
<br />
<br />
/* Cell sizes for ambox/tmbox/imbox/cmbox/ombox/fmbox/dmbox message boxes */<br />
th.mbox-text, td.mbox-text { /* The message body cell(s) */<br />
border: none; <br />
padding: 0.25em 0.9em; /* 0.9em left/right */<br />
width: 100%; /* Make all mboxes the same width regardless of text length */<br />
}<br />
td.mbox-image { /* The left image cell */<br />
border: none; <br />
padding: 2px 0 2px 0.9em; /* 0.9em left, 0px right */<br />
text-align: center; <br />
}<br />
td.mbox-imageright { /* The right image cell */<br />
border: none;<br />
padding: 2px 0.9em 2px 0; /* 0px left, 0.9em right */<br />
text-align: center; <br />
}<br />
td.mbox-empty-cell { /* An empty narrow cell */<br />
border: none;<br />
padding: 0px;<br />
width: 1px;<br />
}<br />
<br />
/* Article message box styles */<br />
table.ambox {<br />
margin: 0px 10%; /* 10% = Will not overlap with other elements */<br />
border: 1px solid #aaa; <br />
border-left: 10px solid #1e90ff; /* Default "notice" blue */<br />
background: #fbfbfb; <br />
}<br />
table.ambox + table.ambox { /* Single border between stacked boxes. */<br />
margin-top: -1px;<br />
}<br />
.ambox th.mbox-text, <br />
.ambox td.mbox-text { /* The message body cell(s) */<br />
padding: 0.25em 0.5em; /* 0.5em left/right */<br />
}<br />
.ambox td.mbox-image { /* The left image cell */<br />
padding: 2px 0 2px 0.5em; /* 0.5em left, 0px right */<br />
}<br />
.ambox td.mbox-imageright { /* The right image cell */<br />
padding: 2px 0.5em 2px 0; /* 0px left, 0.5em right */<br />
}<br />
<br />
table.ambox-notice {<br />
border-left: 10px solid #1e90ff; /* Blue */<br />
}<br />
table.ambox-speedy {<br />
border-left: 10px solid #b22222; /* Red */<br />
background: #fee; /* Pink */<br />
}<br />
table.ambox-delete {<br />
border-left: 10px solid #b22222; /* Red */<br />
}<br />
table.ambox-content {<br />
border-left: 10px solid #f28500; /* Orange */<br />
}<br />
table.ambox-style {<br />
border-left: 10px solid #f4c430; /* Yellow */<br />
}<br />
table.ambox-move {<br />
border-left: 10px solid #9932cc; /* Purple */<br />
}<br />
table.ambox-protection {<br />
border-left: 10px solid #bba; /* Gray-gold */<br />
}<br />
<br />
/* Image message box styles */<br />
table.imbox {<br />
margin: 4px 10%; <br />
border-collapse: collapse; <br />
border: 3px solid #1e90ff; /* Default "notice" blue */<br />
background: #fbfbfb;<br />
}<br />
.imbox .mbox-text .imbox { /* For imboxes inside imbox-text cells. */<br />
margin: 0 -0.5em; /* 0.9 - 0.5 = 0.4em left/right. */<br />
}<br />
.mbox-inside .imbox { /* For imboxes inside other templates. */<br />
margin: 4px;<br />
}<br />
<br />
table.imbox-notice {<br />
border: 3px solid #1e90ff; /* Blue */<br />
}<br />
table.imbox-speedy {<br />
border: 3px solid #b22222; /* Red */<br />
background: #fee; /* Pink */<br />
}<br />
table.imbox-delete {<br />
border: 3px solid #b22222; /* Red */<br />
}<br />
table.imbox-content {<br />
border: 3px solid #f28500; /* Orange */<br />
}<br />
table.imbox-style {<br />
border: 3px solid #f4c430; /* Yellow */<br />
}<br />
table.imbox-move {<br />
border: 3px solid #9932cc; /* Purple */<br />
}<br />
table.imbox-protection {<br />
border: 3px solid #bba; /* Gray-gold */<br />
}<br />
table.imbox-license {<br />
border: 3px solid #88a; /* Dark gray */<br />
background: #f7f8ff; /* Light gray */<br />
}<br />
table.imbox-featured {<br />
border: 3px solid #cba135; /* Brown-gold */<br />
}<br />
<br />
/* Category message box styles */<br />
table.cmbox {<br />
margin: 3px 10%;<br />
border-collapse: collapse;<br />
border: 1px solid #aaa; <br />
background: #DFE8FF; /* Default "notice" blue */<br />
}<br />
<br />
table.cmbox-notice {<br />
background: #D8E8FF; /* Blue */<br />
}<br />
table.cmbox-speedy {<br />
margin-top: 4px;<br />
margin-bottom: 4px;<br />
border: 4px solid #b22222; /* Red */<br />
background: #FFDBDB; /* Pink */<br />
}<br />
table.cmbox-delete {<br />
background: #FFDBDB; /* Red */<br />
}<br />
table.cmbox-content {<br />
background: #FFE7CE; /* Orange */<br />
}<br />
table.cmbox-style {<br />
background: #FFF9DB; /* Yellow */<br />
}<br />
table.cmbox-move {<br />
background: #E4D8FF; /* Purple */<br />
}<br />
table.cmbox-protection {<br />
background: #EFEFE1; /* Gray-gold */<br />
}<br />
<br />
/* Other pages message box styles */<br />
table.ombox {<br />
margin: 4px 10%; <br />
border-collapse: collapse; <br />
border: 1px solid #aaa; /* Default "notice" gray */<br />
background: #f9f9f9;<br />
}<br />
<br />
table.ombox-notice {<br />
border: 1px solid #aaa; /* Gray */<br />
}<br />
table.ombox-speedy {<br />
border: 2px solid #b22222; /* Red */<br />
background: #fee; /* Pink */<br />
}<br />
table.ombox-delete {<br />
border: 2px solid #b22222; /* Red */<br />
}<br />
table.ombox-content {<br />
border: 1px solid #f28500; /* Orange */<br />
}<br />
table.ombox-style {<br />
border: 1px solid #f4c430; /* Yellow */<br />
}<br />
table.ombox-move {<br />
border: 1px solid #9932cc; /* Purple */<br />
}<br />
table.ombox-protection {<br />
border: 2px solid #bba; /* Gray-gold */<br />
}<br />
<br />
/* Talk page message box styles */<br />
table.tmbox {<br />
margin: 4px 10%;<br />
border-collapse: collapse;<br />
border: 1px solid #c0c090; /* Default "notice" gray-brown */<br />
background: #f8eaba;<br />
}<br />
.mediawiki .mbox-inside .tmbox { /* For tmboxes inside other templates. The "mediawiki" */<br />
margin: 2px 0; /* class ensures that this declaration overrides other */<br />
width: 100%; /* For Safari and Opera */ /* styles (including mbox-small above) */<br />
}<br />
.mbox-inside .tmbox.mbox-small { /* "small" tmboxes should not be small when */<br />
line-height: 1.5em; /* also "nested", so reset styles that are */ <br />
font-size: 100%; /* set in "mbox-small" above. */<br />
}<br />
<br />
table.tmbox-speedy {<br />
border: 2px solid #b22222; /* Red */<br />
background: #fee; /* Pink */<br />
}<br />
table.tmbox-delete {<br />
border: 2px solid #b22222; /* Red */<br />
}<br />
table.tmbox-content {<br />
border: 2px solid #f28500; /* Orange */<br />
}<br />
table.tmbox-style {<br />
border: 2px solid #f4c430; /* Yellow */<br />
}<br />
table.tmbox-move {<br />
border: 2px solid #9932cc; /* Purple */<br />
}<br />
table.tmbox-protection,<br />
table.tmbox-notice {<br />
border: 1px solid #c0c090; /* Gray-brown */<br />
}<br />
<br />
/* Disambig and set index box styles */<br />
table.dmbox {<br />
clear: both; <br />
margin: 0.9em 1em; <br />
border-top: 1px solid #ccc; <br />
border-bottom: 1px solid #ccc; <br />
background: transparent;<br />
}<br />
<br />
/* Footer and header message box styles */<br />
table.fmbox {<br />
clear: both;<br />
margin: 0.2em 0;<br />
width: 100%;<br />
border: 1px solid #aaa;<br />
background: #f9f9f9; /* Default "system" gray */<br />
}<br />
table.fmbox-system {<br />
background: #f9f9f9;<br />
}<br />
table.fmbox-warning {<br />
border: 1px solid #bb7070; /* Dark pink */<br />
background: #ffdbdb; /* Pink */<br />
}<br />
table.fmbox-editnotice {<br />
background: transparent;<br />
}<br />
/* Div based "warning" style fmbox messages. */<br />
div.mw-warning-with-logexcerpt,<br />
div.mw-lag-warn-high,<br />
div.mw-cascadeprotectedwarning {<br />
clear: both;<br />
margin: 0.2em 0;<br />
border: 1px solid #bb7070;<br />
background: #ffdbdb;<br />
padding: 0.25em 0.9em;<br />
}<br />
/* Div based "system" style fmbox messages. Used in <br />
[[MediaWiki:Noarticletext]] and [[MediaWiki:Readonly lag]]. */<br />
div.mw-lag-warn-normal,<br />
div.noarticletext,<br />
div.fmbox-system {<br />
clear: both;<br />
margin: 0.2em 0;<br />
border: 1px solid #aaa;<br />
background: #f9f9f9;<br />
padding: 0.25em 0.9em;<br />
}<br />
<br />
/* These mbox-small classes must be placed after all other <br />
ambox/tmbox/ombox etc classes. "body.mediawiki" is so <br />
they override "table.ambox + table.ambox" above. */<br />
body.mediawiki table.mbox-small { /* For the "small=yes" option. */<br />
clear: right;<br />
float: right;<br />
margin: 4px 0 4px 1em;<br />
width: 238px;<br />
font-size: 88%;<br />
line-height: 1.25em;<br />
}<br />
body.mediawiki table.mbox-small-left { /* For the "small=left" option. */<br />
margin: 4px 1em 4px 0;<br />
width: 238px;<br />
border-collapse: collapse;<br />
font-size: 88%;<br />
line-height: 1.25em;<br />
}<br />
<br />
<br />
/* Support for Template:IPA, Template:Unicode and Template:Polytonic.<br />
The second declarations reset the styles for all browsers except<br />
IE6, which chokes on the empty comment tags. Please copy any changes<br />
to [[Template:IPA fonts]] and [[Template:Unicode fonts]].<br />
*/<br />
.IPA {<br />
font-family: "Charis SIL", "Doulos SIL", Gentium, GentiumAlt,<br />
"DejaVu Sans", Code2000, "TITUS Cyberbit Basic",<br />
"Arial Unicode MS", "Lucida Sans Unicode",<br />
"Chrysanthi Unicode";<br />
font-family /**/: inherit;<br />
}<br />
.Unicode {<br />
font-family: Code2000, Code2001, "Free Serif", "TITUS Cyberbit Basic",<br />
"Doulos SIL", "Chrysanthi Unicode", "Bitstream Cyberbit",<br />
"Bitstream CyberBase", Thryomanes, Gentium, GentiumAlt,<br />
"Lucida Grande", "Free Sans", "Arial Unicode MS",<br />
"Microsoft Sans Serif", "Lucida Sans Unicode";<br />
font-family /**/: inherit;<br />
}<br />
.latinx {<br />
font-family: Code2000, Code2001, "TITUS Cyberbit Basic", "Microsoft Sans Serif";<br />
font-family /**/: inherit;<br />
}<br />
.polytonic {<br />
font-family: "Athena Unicode", Gentium, "Palatino Linotype",<br />
"Arial Unicode MS", "Lucida Sans Unicode",<br />
"Lucida Grande", Code2000; <br />
font-family /**/: inherit;<br />
}<br />
<br />
#wpSave {<br />
font-weight: bold;<br />
}<br />
<br />
/* class hiddenStructure is defunct. See [[Wikipedia:hiddenStructure]] */<br />
.hiddenStructure {<br />
display: inline ! important;<br />
color: #f00; <br />
background-color: #0f0;<br />
}<br />
<br />
/* suppress missing interwiki image links where #ifexist cannot<br />
be used due to high number of requests see .hidden-redlink on <br />
http://meta.wikimedia.org/wiki/MediaWiki:Common.css<br />
*/<br />
.check-icon a.new {<br />
display: none; <br />
speak: none;<br />
}<br />
<br />
/* Removes underlines from links */<br />
.nounderlines a { <br />
text-decoration: none;<br />
}<br />
<br />
/* Remove underline from IPA links */<br />
.IPA a:link, .IPA a:visited {<br />
text-decoration: none;<br />
}<br />
<br />
/* Standard Navigationsleisten, aka box hiding thingy<br />
from .de. Documentation at [[Wikipedia:NavFrame]]. */<br />
div.NavFrame {<br />
margin: 0;<br />
padding: 4px;<br />
border: 1px solid #aaa;<br />
text-align: center;<br />
border-collapse: collapse;<br />
font-size: 95%;<br />
}<br />
div.NavFrame + div.NavFrame {<br />
border-top-style: none;<br />
border-top-style: hidden;<br />
}<br />
div.NavPic {<br />
background-color: #fff;<br />
margin: 0;<br />
padding: 2px;<br />
float: left;<br />
}<br />
div.NavFrame div.NavHead {<br />
height: 1.6em;<br />
font-weight: bold;<br />
background-color: #ccf;<br />
position: relative;<br />
}<br />
div.NavFrame p {<br />
font-size: 100%;<br />
}<br />
div.NavFrame div.NavContent {<br />
font-size: 100%;<br />
}<br />
div.NavFrame div.NavContent p {<br />
font-size: 100%;<br />
}<br />
div.NavEnd {<br />
margin: 0;<br />
padding: 0;<br />
line-height: 1px;<br />
clear: both;<br />
}<br />
a.NavToggle {<br />
position: absolute;<br />
top: 0;<br />
right: 3px;<br />
font-weight: normal;<br />
font-size: 90%;<br />
}<br />
<br />
/* Coloured watchlist numbers */<br />
.mw-plusminus-pos { color: #006400; } /* dark green */<br />
.mw-plusminus-neg { color: #8B0000; } /* dark red */<br />
<br />
.rellink,<br />
.dablink {<br />
font-style: italic;<br />
padding-left: 2em;<br />
}<br />
.rellink i,<br />
.dablink i {<br />
font-style: normal;<br />
}<br />
<br />
/* Style for horizontal UL lists */<br />
.horizontal ul {<br />
padding: 0;<br />
margin: 0;<br />
}<br />
.horizontal li { <br />
padding: 0 0.6em 0 0.4em;<br />
display: inline;<br />
border-right: 1px solid;<br />
}<br />
.horizontal li:last-child {<br />
border-right: none;<br />
padding-right: 0;<br />
}<br />
<br />
/* Allow transcluded pages to display in lists rather than a table.<br />
Compatible in Firefox; incompatible in IE6. */<br />
.listify td { display: list-item; }<br />
.listify tr { display: block; }<br />
.listify table { display: block; }<br />
<br />
/* Geographical coordinates defaults. See [[Template:Coord/link]]<br />
for how these are used. The classes "geo", "longitude", and<br />
"latitude" are used by the [[Geo microformat]].<br />
*/<br />
.geo-default, .geo-dms, .geo-dec { display: inline; }<br />
.geo-nondefault, .geo-multi-punct { display: none; }<br />
.longitude, .latitude { white-space: nowrap; }<br />
<br />
/* When <div class="nonumtoc"> is used on the table of contents,<br />
the ToC will display without numbers */<br />
.nonumtoc .tocnumber { display: none; }<br />
.nonumtoc #toc ul,<br />
.nonumtoc .toc ul {<br />
line-height: 1.5em;<br />
list-style: none;<br />
margin: .3em 0 0;<br />
padding: 0;<br />
}<br />
.nonumtoc #toc ul ul, <br />
.nonumtoc .toc ul ul { <br />
margin: 0 0 0 2em; <br />
}<br />
<br />
/* Allow limiting of which header levels are shown in a TOC;<br />
<div class="toclimit-3">, for instance, will limit to<br />
showing ==headings== and ===headings=== but no further<br />
(as long as there are no =headings= on the page, which<br />
there shouldn't be according to the MoS).<br />
*/<br />
.toclimit-2 .toclevel-2,<br />
.toclimit-3 .toclevel-3,<br />
.toclimit-4 .toclevel-4,<br />
.toclimit-5 .toclevel-5,<br />
.toclimit-6 .toclevel-6,<br />
.toclimit-7 .toclevel-7 { display: none; }<br />
<br />
/* Styling for Template:Quote */<br />
blockquote.templatequote { <br />
margin-top: 0; <br />
}<br />
blockquote.templatequote div.templatequotecite { <br />
line-height: 1em;<br />
text-align: left;<br />
padding-left: 2em;<br />
margin-top: 0;<br />
}<br />
blockquote.templatequote div.templatequotecite cite {<br />
font-size: 85%;<br />
}<br />
<br />
div.user-block {<br />
padding: 5px;<br />
border: 1px solid #A9A9A9;<br />
background-color: #FFEFD5;<br />
}<br />
<br />
/* Prevent line breaks in silly places: <br />
1) links when we don't want them to<br />
2) HTML formulae<br />
3) Ref tags with group names <ref group="Note"> --> "[Note 1]"<br />
*/<br />
.nowraplinks a,<br />
span.texhtml,<br />
sup.reference a { white-space: nowrap; }<br />
<br />
/* For template documentation */<br />
.template-documentation {<br />
clear: both;<br />
margin: 1em 0 0 0;<br />
border: 1px solid #aaa; <br />
background-color: #ecfcf4; <br />
padding: 5px;<br />
}<br />
<br />
.thumbinner {<br />
min-width: 100px;<br />
}<br />
<br />
/* Inline divs in ImageMaps (code borrowed from de.wiki) */<br />
.imagemap-inline div {<br />
display: inline;<br />
}<br />
<br />
/* Increase the height of the image upload box */<br />
#wpUploadDescription {<br />
height: 13em;<br />
}<br />
<br />
/* Reduce line-height for <sup> and <sub> */<br />
sup, sub {<br />
line-height: 1em;<br />
}<br />
<br />
<br />
/* The backgrounds for galleries. */<br />
#content .gallerybox div.thumb {<br />
background-color: #F9F9F9; /* Light gray padding */<br />
}<br />
/* Put a chequered background behind images, only visible if they have transparency */<br />
.gallerybox .thumb img,<br />
#file img {<br />
background: white url("http://upload.wikimedia.org/wikipedia/commons/5/5d/Checker-16x16.png") repeat;<br />
}<br />
/* But no chequered background on articles, user pages or portals. */<br />
.ns-0 .gallerybox .thumb img,<br />
.ns-2 .gallerybox .thumb img,<br />
.ns-100 .gallerybox .thumb img {<br />
background: white;<br />
}<br />
<br />
/* Prevent floating boxes from overlapping any category listings,<br />
file histories, edit previews, and edit [Show changes] views */<br />
#mw-subcategories, #mw-pages, #mw-category-media, <br />
#filehistory, #wikiPreview, #wikiDiff {<br />
clear: both;<br />
}<br />
<br />
/* Selectively hide headers in WikiProject banners */<br />
.wpb .wpb-header { display: none; }<br />
.wpbs-inner .wpb .wpb-header { display: block; } /* for IE */<br />
.wpbs-inner .wpb .wpb-header { display: table-row; } /* for real browsers */<br />
.wpbs-inner .wpb-outside { display: none; } /* hide things that should only display outside shells */<br />
<br />
.portlet#p-logo { min-width: 135px; max-width: 135px; min-height: 135px; max-height: 135px;}<br />
/* </nowiki></pre> */</div>
Dustin Howett
https://iphonedev.wiki/index.php?title=Welcome&diff=1182
Welcome
2013-03-22T19:13:07Z
<p>Dustin Howett: Undo revision 1171 by Antonizoon (talk) Sorry. I'd like to keep this wiki user-guide-free. After all, it's a development wiki. I'm sorry!</p>
<hr />
<div>== About this wiki ==<br />
<br />
The sum of all human<ref> We'll make an exception for lawyers; they may submit too. Cf. http://wiki.creativecommons.org/Frequently_Asked_Questions#How_does_a_Creative_Commons_license_operate.3F: "Creative Commons licenses are expressed in three different formats: the Commons Deed (human-readable code), the Legal Code (lawyer-readable code); and the metadata (machine readable code)."</ref> knowledge about iPhoneOS Development.<br />
<br />
== Ideas on what to add to this wiki ==<br />
<br />
* getting started section! it is a real challenge for a beginner -- where to start? I have linked to a code project article that covers the bases, but it would make sense to create a new page here and drag all of the pertinent information from that article. ( I wrote the article, but I think it is better placed in a wiki, as the situation changes and the technology evolves, and new resources become available -- Ohmu ).<br />
* Information regarding usage of iPhone OS Frameworks, both public and private, SpringBoard, system daemons (for hooking and hacking), and classes in applications included with the system<br />
* Information about third-party libraries or extensions for developers (PreferenceLoader, libhide, etc.)<br />
* Questions about development (to be answered by others; please keep questions in talk pages.)<br />
* Links to useful information<br />
* Links to open-source projects<br />
** It would be very good to catalogue and link to all of the projects available on GitHub. because currently there is no real way to search through them. There is plenty of really good code out there that never sees the light of day. maybe we could have a page for that?<br />
<br />
== Why another wiki? ==<br />
<br />
The [http://theiphonewiki.com iPhone Wiki] seems to be more user-oriented, and this wiki '''specifically''' targets development.<br />
<br />
== Quick start ==<br />
What are you looking for?<br />
<br />
* '''Getting Started''':<br />
** [http://www.codeproject.com/KB/iPhone/1prepgroundiphonedev.aspx Article on CodeProject] &bull; [http://nix.howett.net/ipf.html Makefiles]<br />
* '''Frameworks''':<br />
** {{fwlink|UIKit}} &bull; {{fwlink|GraphicsServices}} &bull; {{fwlink|AppSupport}} &bull; '''''[[Template:Navbox Frameworks|more »]]'''''<br />
* '''Applications''':<br />
** {{applink|SpringBoard}} &bull; {{applink|Preferences}} &bull; {{applink|MobileSafari}} &bull; '''''[[Template:Navbox Applications|more »]]'''''<br />
* '''Extensions''':<br />
** [[MobileSubstrate]] &bull; [[SBSettings]] &bull; [[libactivator]] &bull; '''''[[:Category:Cydia_packages|more »]]'''''<br />
* '''System directories''':<br />
** [[PreferenceBundles]] &bull; [[Carrier Bundles]] &bull; [[Internet Plug-Ins]] &bull; '''''[[Template:Navbox_Library|more »]]'''''<br />
* '''Development''':<br />
** [[Xcode#Developing_without_Provisioning_Profile|Bypass Provisioning Profile]] &bull; [[debugserver|Remote debugging]] &bull; [[SSH_Over_USB|SSH over USB without official tethering support]] &bull; [[Jailbreak Development Tools]]<br />
<br />
* '''Hardware''':<br />
** [http://code.google.com/p/btstack/wiki/iPhoneBluetooth Bluetooth]<br />
<br />
<!-- {{Navbox Frameworks}}<br />
{{Navbox Applications}} --><br />
<br />
== Editing this wiki ==<br />
<br />
* If you have anything at all to contribute, feel free to do so!<br />
* An account is required to edit pages.<br />
<br />
----<br />
<br />
<references /></div>
Dustin Howett
https://iphonedev.wiki/index.php?title=Preferences_specifier_plist&diff=1180
Preferences specifier plist
2013-03-20T02:08:53Z
<p>Dustin Howett: /* Miscellaneous control cells */ Document footer{Text,CellClass}</p>
<hr />
<div>This document provides the specification of the .plist file that specifies the layout of an iPhone preference pane.<br />
<br />
== Root level ==<br />
The root level of the plist may contain these keys:<br />
<br />
<blockquote>''struct'' <tt>&lt;preferences specifier plist&gt;</tt> ::</blockquote><br />
{| class="wikitable"<br />
|-<br />
! key !! colspan="2" | type !! meaning !! depends<br />
|-<br />
| title || string || localizable string || Title of the preference pane. || -<br />
|-<br />
| items || array || ... of <tt>&lt;entry&gt;</tt>s || Array of specifier definitions. || -<br />
|-<br />
| id || colspan="2" | string || Specifier ID. || -<br />
|}<br />
<br />
=== Localization ===<br />
Some strings, e.g. the title of the preference pane is localizable. Preferences.framework can localize these strings by looking for the corresponding key in ''localizationTable''<tt>.strings</tt> in ''bundle''. If you are writing a [[PreferenceBundles]], the ''localizationTable'' is the name of the specifier plist and ''bundle'' is of course the PreferenceBundle itself.<br />
<br />
For example, if the plist is named <tt>MySettings.plist</tt>, then the corresponding strings file should be named <tt>MySettings.strings</tt>.<br />
<br />
== Specifier Entries ==<br />
You can use any keys that your controller recognizes in the plist for further customization. This table lists the internal ones:<br />
<br />
<blockquote>''struct'' <tt>&lt;entry&gt;</tt> ::</blockquote><br />
<br />
=== General keys ===<br />
<br />
{| class="wikitable"<br />
|-<br />
! key !! colspan="2" | type !! meaning !! depends<br />
|-<br />
| requiredCapabilities || array || ... of <tt>&lt;[[GSCapability|capability]]&gt;</tt>s || Required capabilities of the device such that this specifier can be shown. || -<br />
|-<br />
| cell || string || <tt>&lt;cell type&gt;</tt> || Specifier cell type. || -<br />
|-<br />
| label || string || localizable string || Label of specifier. || -<br />
|-<br />
| id || colspan="2" | string || Specifier ID. || -<br />
|-<br />
| get || string || selector || Getter. || -<br />
|-<br />
| set || string || selector || Setter. || -<br />
|-<br />
| action || string || selector || Action. || -<br />
|-<br />
| enabled || colspan="2" | boolean || Whether the control is enabled by default. || -<br />
|-<br />
| defaults || string || bundle ID || The user defaults associated with this specifier. || -<br />
|-<br />
| key || colspan="2" | string || Key of the user defaults. || ''defaults'' ≠ nil<br />
|-<br />
| default || colspan="2" | any || Default value of control. || -<br />
|-<br />
| negate || colspan="2" | boolean || If the key in the user defaults is a boolean, invert the value displayed. || -<br />
|-<br />
| PostNotification || colspan="2" | string || Darwin Notification to post when the preference is changed. || -<br />
|}<br />
<br />
Here, ''cell'' must be one of:<br />
* ''enum'' <tt>&lt;cell type&gt;</tt> ::<br />
** PSGroupCell<br />
** PSLinkCell<br />
** PSLinkListCell<br />
** PSListItemCell<br />
** PSTitleValueCell<br />
** PSSliderCell<br />
** PSSwitchCell<br />
** PSStaticTextCell<br />
** PSEditTextCell<br />
** PSSegmentCell<br />
** PSGiantIconCell<br />
** PSGiantCell<br />
** PSSecureEditTextCell<br />
** PSButtonCell<br />
** PSEditTextViewCell<br />
The cell type is actually determined from the class method {{ObjcCall|PSTableCell|cellTypeFromString:|ClassMethod=1}}.<br />
<br />
=== ''bundle''-dependent keys ===<br />
The following keys are meaningful when ''bundle'' is present. It is useful for loading extra resources and custom code.<br />
<br />
{| class="wikitable"<br />
|-<br />
! key !! colspan="2" | type !! meaning !! depends<br />
|-<br />
| bundle || string || filename || Bundle file name. This bundle will be loaded for additional resources. || -<br />
|-<br />
| internal || colspan="2" | boolean || Directory to search for the bundle.<br />If true, search in <tt>/AppleInternal/Library/PreferenceBundles/</tt>.<br />If false, search in <tt>/System/Library/PreferenceBundles/.</tt> || ''bundle'' ≠ nil<br />
|-<br />
| isController || colspan="2" | boolean || Whether the bundle contains a controller class. || ''bundle'' ≠ nil<br />
|-<br />
| overridePrincipalClass || colspan="2" | boolean || Overrides the principal class by the detail controller when bundle has a controller. || ''isController'' = true<br />
|-<br />
| detail || string || class name || [[PSDetailController|Detail controller class]]. || -<br />
|-<br />
| pane || string || class name || Edit pane class.<br />If ''bundle'' is absent, the edit pane class is obtained from the current bundle.<br />Default value is [[PSEditingPane]]. || ''detail'' ≠ nil<br />
|-<br />
| hasIcon || colspan="2" | boolean || Whether the specifier will have an icon. || ''bundle'' ≠ nil<br />
|-<br />
| icon || string || filename || File name of the icon to use. Default value is <tt>icon.png</tt>. The height of the icon should be 29px. || ''hasIcon'' = true<br />
|-<br />
| cellClass || string || class name || Customized cell class || -<br />
|-<br />
| customControllerClass || string || class name || Custom controller class to use when the view become visible || -<br />
|}<br />
<br />
''get'', ''set'' and ''action'' should respectively have signatures<br />
<source lang="objc"><br />
-(id)getSomethingForSpecifier:(PSSpecifier*)spec;<br />
-(void)setSomething:(id)something forSpecifier:(PSSpecifier*)spec;<br />
-(void)speciferPerformedAction:(PSSpecifier*)spec;<br />
</source><br />
where the type of "something" depends on the type of specifier, e.g. for a text field it should be an NSString, while for a switch it should be an NSNumber with boolean.<br />
<br />
Of course, you can ignore extra parameters, e.g. <tt>-(void)specifierPerformedAction</tt> is a valid signature too.<br />
<br />
=== Editing cells ===<br />
These keys are specific to editing cells.<br />
<br />
{| class="wikitable"<br />
|-<br />
! key !! colspan="2" | type !! meaning !! depends<br />
|-<br />
| autoCaps || string || {"<tt>sentences</tt>", "<tt>words</tt>", "<tt>all</tt>"} || Autocapitalization type for cells that requires a keyboard. || -<br />
|-<br />
| keyboard || string || {"<tt>numbers</tt>", "<tt>phone</tt>"} || Type of keyboard. || -<br />
|-<br />
| prompt || string || localizable string || Setup prompt. || ''cell'' ∈ {"<tt>PSEditTextCell</tt>", "<tt>PSSecureEditTextCell</tt>"}<br />
|-<br />
| okTitle || string || localizable string || Title for OK button in setup prompt. || ''prompt'' ≠ nil<br />
|-<br />
| cancelTitle || string || localizable string || Title for cancel button in setup prompt. || ''prompt'' ≠ nil<br />
|-<br />
| placeholder || string || localizable string || Placeholder. || ''cell'' ∈ {"<tt>PSEditTextCell</tt>", "<tt>PSSecureEditTextCell</tt>"}<br />
|-<br />
| suffix || string || localizable string || Suffix. || ''cell'' ∈ {"<tt>PSEditTextCell</tt>", "<tt>PSSecureEditTextCell</tt>"}<br />
|-<br />
| isIP || colspan="2" | boolean || Input field intended for entering IP address (Use Numbers keyboard). || -<br />
|-<br />
| isURL || colspan="2" | boolean || Input field intended for entering URL (Use URL keyboard). || -<br />
|-<br />
| isNumeric || colspan="2" | boolean || Input field intended for entering numbers (Use NumberPad keyboard). || -<br />
|-<br />
| isEmail || colspan="2" | boolean || Input field intended for entering e-mail (Use EmailAddress keyboard). || -<br />
|-<br />
| isEmailAdressing || colspan="2" | boolean || ? || -<br />
|-<br />
| bestGuess || string || selector || Initial value of text field. || ''cell'' ∈ {"<tt>PSEditTextCell</tt>", "<tt>PSSecureEditTextCell</tt>"}<br />
|-<br />
| noAutoCorrect || colspan="2" | boolean || Disable auto-correction. || ''cell'' ∈ {"<tt>PSEditTextCell</tt>", "<tt>PSSecureEditTextCell</tt>"}<br />
|}<br />
<br />
=== List cells ===<br />
These keys are specific to list cells.<br />
<br />
{| class="wikitable"<br />
|-<br />
! key !! colspan="2" | type !! meaning !! depends<br />
|-<br />
| validValues || array || ...of strings || List of values to choose from. || ''cell'' ∈ {"<tt>PSLinkListCell</tt>", "<tt>PSSegmentCell</tt>"}<br />
|-<br />
| validTitles || array || ...of localizable strings || Titles corresponding to the list of values. || ''cell'' ∈ {"<tt>PSLinkListCell</tt>", "<tt>PSSegmentCell</tt>"}<br />
|-<br />
| shortTitles || array || ...of localizable strings || Short titles. || ''cell'' ∈ {"<tt>PSLinkListCell</tt>", "<tt>PSSegmentCell</tt>"}<br />
|-<br />
| valuesDataSource || string || selector || Selector to call to get the list of values dynamically. || ''cell'' ∈ {"<tt>PSLinkListCell</tt>", "<tt>PSSegmentCell</tt>"} '''and''' ''validValues'' = nil<br />
|-<br />
| titlesDataSource || string || selector || Selector to call to get the list of titles dynamically. || ''cell'' ∈ {"<tt>PSLinkListCell</tt>", "<tt>PSSegmentCell</tt>"} '''and''' ''validTitles'' = nil<br />
|-<br />
| staticTextMessage || string || localizable string || Static text message (?). || ''cell'' = "<tt>PSLinkListCell</tt>"<br />
|}<br />
<br />
''valuesDataSource'' and ''titlesDataSource'' are performed on the target sent from {{ObjcCall|PSListController|loadSpecifiersFromPlistName:target:}}. They must return an NSArray containing the values and (localized) titles respectively. Their signatures should be<br />
<source lang="objc"><br />
-(NSArray*)dataFromTarget:(id)target;<br />
</source><br />
<br />
=== Slider and switch cells ===<br />
These keys are specific to slider and switch cells.<br />
<br />
{| class="wikitable"<br />
|-<br />
! key !! colspan="2" | type !! meaning !! depends<br />
|-<br />
| rightImage || string || filename || Image displayed next to the slider on the right. || ''cell'' = "<tt>PSSliderCell</tt>"<br />
|-<br />
| leftImage || string || filename || Image displayed next to the slider on the left. || ''cell'' = "<tt>PSSliderCell</tt>"<br />
|-<br />
| min || colspan="2" | float || Minimum value of slider. || ''cell'' = "<tt>PSSliderCell</tt>"<br />
|-<br />
| max || colspan="2" | float || Maximum value of slider. || ''cell'' = "<tt>PSSliderCell</tt>"<br />
|-<br />
| showValue || colspan="2" | boolean || Show the value. || ''cell'' = "<tt>PSSliderCell</tt>"<br />
|-<br />
| alternateColors || colspan="2" | boolean || Show the value. || ''cell'' = "<tt>PSSwitchCell</tt>"<br />
|}<br />
<br />
=== Miscellaneous control cells ===<br />
These keys are specific to other control cells.<br />
<br />
{| class="wikitable"<br />
|-<br />
! key !! colspan="2" | type !! meaning !! depends<br />
|-<br />
| alignment || colspan="2" | integer || Text alignment. 2 = center. || ''cell'' ∈ {"<tt>PSGroupCell</tt>", "<tt>PSStaticTextCell</tt>"<br />
|-<br />
| confirmation || dictionary || <tt>&lt;confirmation&gt;</tt> || Definitions of the confirmation sheet before action is performed. || ''cell'' ∈ {"<tt>PSSwitchCell</tt>", "<tt>PSButtonCell</tt>"<br />
|-<br />
| isDestructive || colspan="2" | boolean || Whether the action to be performed is destructive. The OK button will be in red if true. || ''confirmation'' ≠ nil<br />
|-<br />
| max || colspan="2" | float || Maximum value of slider. || cell = "<tt>PSSliderCell</tt>"<br />
|-<br />
| showValue || colspan="2" | boolean || Show the value. || cell = "<tt>PSSliderCell</tt>"<br />
|-<br />
| alternateColors || colspan="2" | boolean || Show the value. || cell = "<tt>PSSwitchCell</tt>"<br />
|-<br />
| isStaticText || colspan="2" | boolean || Whether the cells in this group has static text. Used in conjunction with PSStaticTextCell. || ''cell'' = "<tt>PSGroupCell</tt>"<br />
|-<br />
| height || colspan="2" | float || Height of text view. || ''cell'' = "<tt>PSTextViewCell</tt>"<br />
|-<br />
| dontIndentOnRemove || colspan="2" | boolean || ? || -<br />
|-<br />
| footerText || colspan="2" | string || Text displayed in a small font after this specifier (or, in the case of a <tt>PSGroupCell</tt>, the last specifier in the group). || -<br />
|-<br />
| footerCellClass || colspan="2" | class || The cell class using which to render the footer. || -<br />
|}<br />
<br />
Here, ''confirmation'' itself is a dictionary containing the following fields:<br />
<br />
<blockquote>''struct'' <tt>&lt;confirmation&gt;</tt> ::</blockquote><br />
{| class="wikitable"<br />
|-<br />
! key !! colspan="2" | type !! meaning<br />
|-<br />
| prompt || string || localizable string || Content of confirmation sheet.<br />
|-<br />
| cancelTitle || string || localizable string || Title of the cancel button.<br />
|-<br />
| okTitle || string || localizable string || Title of the OK button.<br />
|-<br />
| title || string || localizable string || Title of confirmation sheet.<br />
|}<br />
<br />
== <tt>PSSpecifier</tt> properties of plist keys ==<br />
The tables above only shows the keys recognized by <tt>SpecifiersForPlist</tt> when translating the plist into an array of <tt>PSSpecifier</tt>s. They may be corresponds to the actual properties of the specifier. If you would like to generate a <tt>PSSpecifier</tt> in runtime, some actions may differ:<br />
<br />
{| class="wikitable"<br />
|-<br />
! keys !! corresponding action<br />
|-<br />
| cell || Use the constructor, or change the <tt>cellType</tt> ivar.<br />
|-<br />
| label || Use the <tt>name</tt> declared property.<br />
|-<br />
| get || Use the constructor, or change the <tt>getter</tt> ivar.<br />
|-<br />
| set || Use the constructor, or change the <tt>setter</tt> ivar.<br />
|-<br />
| action || Change the <tt>action</tt> ivar.<br />
|-<br />
| default || Use the ''value'' property.<br />
|-<br />
| icon || Use the ''iconImage'' as an UIImage, or {{ObjcCall|PSSpecifier|setupIconImageWithPath:}}<br />
|-<br />
| autoCaps, keyboard, noAutoCorrect || {{ObjcCall|PSSpecifier|setKeyboardType:autoCaps:autoCorrection:}}<br />
|-<br />
| isIP, isURL, isNumeric, isEmail, isEmailAddressing || Change the <tt>textFieldType</tt> ivar.<br />
|-<br />
| bestGuess || Change the <tt>bestGuess</tt> ivar of the [[PSTextFieldSpecifier]] class.<br />
|-<br />
| validValues, validTitles, shortTitles || {{ObjcCall|PSSpecifier|setValues:titles:shortTitles:}}<br />
|-<br />
| confirmation || Create an instance of [[PSConfirmationSpecifier]].<br />
|}<br />
<br />
== Recipes ==<br />
=== Using PSLinkListCell ===<br />
In order to make a PSLinkListCell actually work like a list, you must supply the key-value pair<br />
detail = "PSListItemsController";<br />
also.<br />
<br />
=== Using PSLinkCell ===<br />
PSLinkCell is useful for linking to sub-preference-panes. The simplest example just needs 2 keys:<br />
{ cell = PSLinkCell;<br />
label = "Settings-iPhone"; }<br />
The ''label'' is the important part. When user clicked on the link cell, iPhoneOS will use the '''unlocalized''' ''label'' as the file name of the plist for the next pane. For example in above, the main settings screen will appear.<br />
<br />
If you use just 2 keys, only plists inside {{applink|Preferences}} can be loaded. In order to load your own plist, you must use a custom subclass of [[PSListController]] in ''detail'':<br />
{ cell = PSLinkCell;<br />
label = "My Awesome Pane";<br />
detail = MyListController; }<br />
MyListController can simply be an empty subclass of PSListController:<br />
<source lang="objc"><br />
@interface MyListController : PSListController {}<br />
@end<br />
@implementation MyListController<br />
@end<br />
</source><br />
The key thing is when you place MyListController inside your bundle, its bundle property will return your bundle which <tt>My Awesome Pane.plist</tt> can be found.<br />
<br />
=== Constructing PSLinkCell in Run time ===<br />
If you want to dynamically add a specifier for a PSLinkCell linking to a bundle, do it like this:<br />
<br />
<source lang="objc"><br />
PSSpecifier* specifier = [PSSpecifier preferenceSpecifierNamed:@"title"<br />
target:self<br />
set:NULL<br />
get:NULL<br />
detail:Nil<br />
cell:PSLinkCell<br />
edit:Nil];<br />
NSBundle* bundle = [NSBundle bundleWithPath:@"/System/Library/PreferenceBundles/prefs.bundle"];<br />
[specifier setProperty:bundle forKey:@"lazy-bundle"];<br />
specifier->action = @selector(lazyLoadBundle:);<br />
// Add specifier to the PSListController<br />
</source><br />
<br />
=== Making a red delete button ===<br />
The red delete button in VPN is in fact very easy to implement. All you need to do is add the following code:<br />
<source lang="objc"><br />
#import <UIKit/UIPreferencesDeleteTableCell.h><br />
@interface PSDeleteTableCell : UIPreferencesDeleteTableCell @end<br />
@implementation PSDeleteTableCell<br />
-(void)setValueChangedTarget:(id)target action:(SEL)action userInfo:(NSDictionary*)info {<br />
[self setTarget:target];<br />
[self setAction:action];<br />
}<br />
-(UILabel*)titleTextLabel {<br />
UILabel* res = [super titleTextLabel];<br />
res.textColor = [UIColor whiteColor];<br />
return res;<br />
}<br />
@end<br />
</source><br />
and then in the specifier plist, modify your button as:<br />
...<br />
{ cell = PSButtonCell;<br />
action = nukeFromOrbit;<br />
label = "Nuke from Orbit;<br />
...<br />
'''cellClass = PSDeleteTableCell;'''<br />
},<br />
...<br />
<br />
=== Making a custom footer ===<br />
Making a custom footer is useful because it allows you to customize the style, add an image, etc.<br />
<br />
All you need to do is make a class that looks like:<br />
<source lang=objc><br />
@interface CustomFooterCell : PSTableCell <PreferencesTableCustomView> {<br />
UILabel *_label;<br />
}<br />
@end<br />
@implementation CustomFooterCell<br />
- (id)initWithSpecifier:(PSSpecifier *)specifier<br />
{<br />
self = [super initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell" specifier:specifier];<br />
if (self) {<br />
CGRect frame = [self frame];<br />
<br />
_label = [[UILabel alloc] initWithFrame:frame];<br />
[_label setLineBreakMode:UILineBreakModeWordWrap];<br />
[_label setNumberOfLines:0];<br />
[_label setText:@"You can use attributed text to make this prettier."]<br />
[_label setBackgroundColor:[UIColor clearColor]];<br />
[_label setShadowColor:[UIColor whiteColor]];<br />
[_label setShadowOffset:CGSizeMake(0,1)];<br />
[_label setTextAlignment:UITextAlignmentCenter];<br />
<br />
[self addSubview:_label];<br />
[_label release];<br />
}<br />
return self;<br />
}<br />
- (float)preferredHeightForWidth:(float)arg1<br />
{<br />
// Return a custom cell height.<br />
return 60.f;<br />
}<br />
@end<br />
</source><br />
Then, add the following in your specifier:<br />
...<br />
{ <br />
cell = PSGroupCell;<br />
'''footerCellClass = CustomFooterCell;'''<br />
},<br />
...<br />
<br />
== References ==<br />
* http://code.google.com/p/networkpx/wiki/PreferencesSpecifierPlistFormat#valuesDataSource_and_titlesDataSource</div>
Dustin Howett
https://iphonedev.wiki/index.php?title=PreferenceLoader&diff=1178
PreferenceLoader
2013-03-19T00:04:16Z
<p>Dustin Howett: PL version went up at some point.</p>
<hr />
<div>{{Infobox Package<br />
|screenshot=PrefLoaderScreenshot.png<br />
|developer=[[User:Dustin Howett|Dustin Howett]]<br />
|version=2.2.0-1<br />
|package=preferenceloader<br />
}}<br />
<br />
'''PreferenceLoader''' is an open-source<ref>[http://github.com/DHowett/preferenceloader PreferenceLoader Source]</ref> [[MobileSubstrate]] based utility that allows developers to add entries to the [[Preferences.app|Settings]] application, similar to the Settings bundles that AppStore apps use.<br />
<br />
== Entry ==<br />
<br />
The approach PreferenceLoader takes is different that other approaches in that the Settings-iPhone.plist and Settings-iPod.plist files are not modified on disk. when the [[Preferences.app|Settings]] application is loaded, entries are read from plists in <tt>/Library/PreferenceLoader/Preferences/</tt> and are dynamically added to the list. Each entry is defined in its own plist and consists of a dictionary containing an element named <tt>entry</tt>, which is also a dictionary. The entry dictionary must define a <tt>cell</tt> of type <tt>PSLinkCell</tt> and have a <tt>label</tt>. Additionally, the <tt>bundle</tt> and <tt>isController</tt> keys can be set for entries referencing [[PreferenceBundles]].<br />
<br />
<source lang="xml"><br />
<?xml version="1.0" encoding="UTF-8"?><br />
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"><br />
<plist version="1.0"><br />
<dict><br />
<key>entry</key><br />
<dict><br />
<key>cell</key><br />
<string>PSLinkCell</string><br />
<key>icon</key><br />
<string>TestIcon.png</string><br />
<key>label</key><br />
<string>Test</string><br />
</dict><br />
</dict><br />
</plist><br />
</source><br />
<br />
== Simple Approach ==<br />
<br />
In the simple approach the settings page is defined in a plist file located in the <tt>/Library/PreferenceLoader/Preferences/</tt> folder. The name of the plist file must match the label option in the entry dictionary. For example, if the label in the entry dictionary is defined as <tt>Test</tt>, then the plist that defines the settings page must be named <tt>Test.plist</tt>.<br />
<br />
Typically, the settings and entry plists are combined into a single plist. This works because the settings plist has elements named items and title, so adding an entry element does not break anything. Here's an example of a combined plist:<br />
<br />
<source lang="xml"><br />
<?xml version="1.0" encoding="UTF-8"?><br />
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"><br />
<plist version="1.0"><br />
<dict><br />
<key>entry</key><br />
<dict><br />
<key>cell</key><br />
<string>PSLinkCell</string><br />
<key>icon</key><br />
<string>TestIcon.png</string><br />
<key>label</key><br />
<string>Test</string><br />
</dict><br />
<key>items</key><br />
<array><br />
<dict><br />
<key>cell</key><br />
<string>PSSwitchCell</string><br />
<key>default</key><br />
<true/><br />
<key>defaults</key><br />
<string>com.test.TestSettings</string><br />
<key>key</key><br />
<string>testKey</string><br />
<key>label</key><br />
<string>Test Setting</string><br />
</dict><br />
</array><br />
<key>title</key><br />
<string>Test</string><br />
</dict><br />
</plist><br />
</source><br />
<br />
There is a good tutorial on how to create these settings plists on MMi at http://modmyi.com/forums/file-mods/22453-how-make-custom-menus-preferences-app-custom-preferences.html.<br />
<br />
== Localizable Simple Approach<ref name="1.2">PreferenceLoader version 1.2 and later</ref> ==<br />
<br />
This approach is similar to the Simple Approach, except the settings and entry plists are located in a sub-folder of <tt>/Library/PreferenceLoader/Preferences/</tt>. In addition to the plists and icons, the sub-folder can also contain .lproj folders with appropriate localization strings.<br />
<br />
== PreferenceBundle Approach ==<br />
<br />
With this technique, you can actually create custom settings pages that are able to execute code. The entry plist for this approach must now include a reference to the name of the [[PreferenceBundles|PreferenceBundle]] and define the <tt>isController</tt> option to <tt>true</tt>. This will cause the [[Preferences.app|Settings]] application to load the corresponding bundle located in <tt>/Library/PreferenceBundles/</tt><ref name="1.2">PreferenceLoader version 1.2 and later</ref><ref>Bundles can also be loaded from /System/Library/PreferenceBundles/, but this is no longer the preferred method as of PreferenceLoader 1.2</ref>. Unlike the simple method, all of the files except the entry plist are located inside the bundle. The following example shows an entry plist for loading a [[PreferenceBundles|PreferenceBundle]]:<br />
<br />
<source lang="xml"><br />
<?xml version="1.0" encoding="UTF-8"?><br />
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"><br />
<plist version="1.0"><br />
<dict><br />
<key>entry</key><br />
<dict><br />
<key>bundle</key><br />
<string>TestSettings</string><br />
<key>cell</key><br />
<string>PSLinkCell</string><br />
<key>icon</key><br />
<string>TestIcon.png</string><br />
<key>isController</key><br />
<true/><br />
<key>label</key><br />
<string>Test</string><br />
</dict><br />
</dict><br />
</plist><br />
</source><br />
<br />
A skeleton [[PreferenceBundles|PreferenceBundle]] project can be found at http://www.volatile-dev.com/PreferenceLoader/TestSettings.zip<br />
==Filtering<ref name="2.2.0-1">PreferenceLoader version 2.2.0-1 and later</ref>==<br />
In a way similar to that of [[MobileSubstrate#MobileLoader|MobileSubstrate]], developers may add filters to entry plists and specifiers within simple and localized simple preferences. The filter should be a dictionary at the top level of the entry plist, or within a specifier, which can contain these keys:<br />
* '''CoreFoundationVersion''' (array): The entry or specifier is loaded or displayed only if the version of [[CoreFoundation.framework]] is above the specified values. Currently, only the first 2 values are checked.<br />
{{CoreFoundation Version Table|center=1}}<br />
<br />
==Issues with OS 3.2 and 4.0==<br />
<tt>PSViewController</tt> underwent a massive change after 3.1, breaking all custom subclasses on the iPad and on 4.0 - it is now a UIViewController.<br />
<br />
Improper implementations of <tt>PSListController</tt> subclasses will fail to work properly on 4.0. You must set <tt>_specifiers</tt> within the <tt>-(id) specifiers</tt> method (instead of returning a different array of specifiers.) This is because OS 4.0 relies on _specifiers to generate specifier metadata and group indices. Example:<br />
<source lang="objc"><br />
- (id) specifiers {<br />
if (!_specifiers){<br />
_specifiers = [[self loadSpecifiersFromPlistName: kNameOfPreferencesPlist target: self] retain];<br />
}<br />
<br />
return _specifiers;<br />
}<br />
</source><br />
<br />
==Notes==<br />
<references /><br />
<br />
==References==<br />
<div class="references-2column"><br />
* [[Preferences specifier plist]]<br />
</div><br />
<br />
{{Navbox Library}}<br />
[[Category:Directories in /Library]]</div>
Dustin Howett
https://iphonedev.wiki/index.php?title=BulletinBoard.framework&diff=1177
BulletinBoard.framework
2013-03-19T00:03:26Z
<p>Dustin Howett: Wikiize.</p>
<hr />
<div>{{infobox Framework<br />
| vis = Private<br />
| since = 5.0<br />
| classID = BB<br />
| bundle = com.apple.bulletinboard<br />
}}<br />
'''BulletinBoard''' is a private framework which handles Local and Push notifications.<br />
<br />
{{Navbox Classes}}<br />
{{Navbox Frameworks}}</div>
Dustin Howett
https://iphonedev.wiki/index.php?title=Xcode&diff=1170
Xcode
2013-03-06T23:57:45Z
<p>Dustin Howett: python is distinctly not bash why would you do that</p>
<hr />
<div>Xcode is ''the'' IDE endorsed by Apple for iPhoneOS development. The latest stable version is 4.6. It comes with the official iOS SDK. <br />
<br />
== Developing without Provisioning Profile ==<br />
To develop for the devices one should first obtain a provisioning profile by joining the iPhone Developer Program (which costs $99). However, some simple tricks can be used to make Xcode compile and debug on jailbroken devices without provisioning profiles.<br />
<br />
These steps are designed for the most recent version of Xcode and iOS SDK, but should also work for versions after Xcode 3.2/iPhone SDK 3.x. If for some reason you are stuck with Xcode 3.1.x, try [http://iphonesdkdev.blogspot.com/2009/06/use-xcode-312-to-build-sdk-30-app-to-30.html].<br />
<br />
=== Compiling ===<br />
Performing these steps allows you to use Xcode to compile any applications and deploy it yourself.<br />
<br />
* '''1.''' Create a self-signed code-signing certificate with the name “iPhone Developer” on the “login” (default) keychain using Keychain Access<ref>Procedures can be found in http://developer.apple.com/mac/library/documentation/Security/Conceptual/CodeSigningGuide/Procedures/Procedures.html</ref>.<br />
* '''2.''' Open <tt>/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Info.plist</tt> (4.2 or below: <tt>/Developer/Platforms/iPhoneOS.platform/Info.plist</tt>). You may need root permission.<br />
* '''3.''' Replace all occurrences of <tt>XCiPhoneOSCodeSignContext</tt> by <tt>XCCodeSignContext</tt>. There are three of them (XCode Version 3.2.4+).<br />
* '''4.''' Save the file and restart Xcode.<br />
or<br />
Issue the following commands in terminal:<br />
<source lang="bash"><br />
#!/bin/bash<br />
InfoPlist=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Info.plist<br />
cp $InfoPlist .<br />
cp Info.plist Info.plist.original<br />
plutil -convert xml1 Info.plist.original<br />
sed -e "s/XCiPhoneOSCodeSignContext/XCCodeSignContext/g" Info.plist.original > Info.plist<br />
plutil -convert binary1 Info.plist<br />
sudo cp Info.plist InfoPlist<br />
</source><br />
<br />
If you upgrade the iOS SDK, you need to perform steps 2 – 4 again.<br />
<br />
=== Replacing codesign with ldid ===<br />
These steps are necessary for debugging, since the entitlement can no longer be inserted by performing steps 1 – 4. To actually debug your app, make sure you have add <tt>-gta</tt> to '''Other Code Signing Flags''' of your target.<br />
<br />
* '''5.''' Make sure you have ldid on your Mac<ref>If not, you can install from [http://pdb.finkproject.org/pdb/package.php/ldid Fink], compile it from git://git.saurik.com/ldid.git, or just download https://github.com/downloads/rpetrich/ldid/ldid.zip. Note that the version from [https://github.com/mxcl/homebrew/blob/master/Library/Formula/ldid.rb homebrew] was outdated!</ref>. Place a copy somewhere e.g. in <tt>/usr/local/bin</tt>.<br />
* '''6.''' Create the a Python script <tt>ldid3.py</tt> right next to the <tt>ldid</tt> program. Make it executable. Fill it with:<br />
<source lang="python"><br />
#!/usr/bin/env python<br />
<br />
from sys import argv<br />
from subprocess import check_call<br />
from os.path import basename, dirname, splitext, join<br />
from tempfile import NamedTemporaryFile<br />
<br />
app = argv[-1]<br />
ldid_path = join(dirname(__file__), 'ldid')<br />
obj_path = join(app, splitext(basename(app))[0])<br />
<br />
if '-gta' not in argv:<br />
check_call([ldid_path, '-S', obj_path])<br />
else:<br />
with NamedTemporaryFile('w+b', 0) as f:<br />
f.write("""<br />
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"><br />
<plist version="1.0"><br />
<dict><br />
<key>get-task-allow</key><br />
<true/><br />
</dict><br />
</plist><br />
""")<br />
check_call([ldid_path, '-S' + f.name, obj_path])<br />
</source><br />
* '''7.''' Open <tt>iPhoneCodeSign.xcspec</tt>. This file can be found in:<br />
<br />
{| class="wikitable"<br />
|-<br />
! Xcode version<br />
! Path<br />
|-<br />
| 4.5 - 4.6<br />
| <tt>/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Specifications/iPhoneCodeSign.xcspec</tt><br />
|-<br />
| 4.3<br />
| <tt>/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/PrivatePlugIns/iPhoneOS Build System Support.xcplugin/Contents/Resources/iPhoneCodeSign.xcspec</tt><br />
|-<br />
| 4.2 <br />
| <tt>/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/PrivatePlugIns/iPhoneOS Build System Support.xcplugin/Contents/Resources/iPhoneCodeSign.xcspec</tt><br />
|-<br />
| Before 4.2<br />
| <tt>/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Plug-ins/iPhoneOS Build System Support.xcplugin/Contents/Resources/iPhoneCodeSign.xcspec</tt><br />
|}<br />
<br />
* '''8.''' Change the entry in the file from calling <tt>codesign</tt> to <tt>ldid3.py</tt>. Specifically:<br />
** Convert the file to a human editable format (esp. in Xcode 4.6 or above). You may skip this if the file is already in plain-text or XML format.<source lang="bash"><br />
sudo plutil -convert xml1 /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Specifications/iPhoneCodeSign.xcspec<br />
</source><br />
** Replace the entry (which should be near the beginning of the file)<source lang="xml"><key>CommandLine</key><string>/usr/bin/codesign</string></source>with<source lang="xml"><key>CommandLine</key><string>/usr/local/bin/ldid3.py</string></source><br />
<br />
or <br />
<source lang="bash"><br />
#! /bin/bash<br />
xcspec=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Specifications/iPhoneCodeSign.xcspec<br />
cp $xcspec .<br />
cp iPhoneCodeSign.xcspec iPhoneCodeSign.xcspec.original<br />
sed -e "s|/usr/bin/codesign|/usr/local/bin/ldid3.py|g" iPhoneCodeSign.xcspec.original > iPhoneCodeSign.xcspec <br />
sudo cp iPhoneCodeSign.xcspec $xcspec<br />
</source><br />
<br />
* '''9.''' Save the file and restart Xcode.<br />
<br />
If you upgrade the iOS SDK, you need to perform steps 8 – 9 again.<br />
<br />
=== Allowing apps with invalid signatures to be installed ===<br />
These steps allow you to install an unsigned app to the device. This method only works for iOS 4.0 or above.<br />
<br />
* '''10.''' Create a file <tt>/var/mobile/tdmtanf</tt> on the device, to enable Apple's "TDMTANF bypass" in <tt>installd</tt> (warning: doing so will also put you in a sandboxed GameCenter<ref>https://discussions.apple.com/thread/2745420?start=0&tstart=0</ref>).<br />
<br />
If you upgrade the firmware, you need to do step 10 again.<br />
<br />
== References ==<br />
<references/></div>
Dustin Howett
https://iphonedev.wiki/index.php?title=Template:CoreFoundation_Version_Table&diff=1160
Template:CoreFoundation Version Table
2013-02-26T20:50:40Z
<p>Dustin Howett: Resurrect 5.1, add 6.1.</p>
<hr />
<div>{| {{#if: {{{center|}}} | style="margin:auto;text-align:center;"}} class="wikitable"<br />
|-<br />
! Firmware<br />
| 2.0 || 2.1 || 2.2 || 3.0 || 3.1 || 3.2 || 4.0 || 4.1 || 4.2 || 4.3 || 5.0 || 5.1 || 6.0 || 6.1<br />
|-<br />
! SourceCache version<br />
| 478.23 || 478.26.1 || 478.29 || 478.47.7 || 478.52 || 478.61 || 550.32 || 550.38.1 || 550.52 || 550.58.1<br />
|colspan="4"| ?<br />
|-<br />
! dylib version<br />
| 478.23 || 478.26.1 || 478.29 || 478.47.7 || 478.52 || 478.61 || 550.32 || 550.38.1 || 550.52 || 550.58.1 || 675.00 || 690.10<br />
|colspan="2"| 793.00<br />
|}</div>
Dustin Howett
https://iphonedev.wiki/index.php?title=PreferenceLoader&diff=1155
PreferenceLoader
2013-02-21T08:10:26Z
<p>Dustin Howett: Add notes about filtering.</p>
<hr />
<div>{{Infobox Package<br />
|screenshot=PrefLoaderScreenshot.png<br />
|developer=[[User:Dustin Howett|Dustin Howett]]<br />
|version=2.1.1-1<br />
|package=preferenceloader<br />
}}<br />
<br />
'''PreferenceLoader''' is an open-source<ref>[http://github.com/DHowett/preferenceloader PreferenceLoader Source]</ref> [[MobileSubstrate]] based utility that allows developers to add entries to the [[Preferences.app|Settings]] application, similar to the Settings bundles that AppStore apps use.<br />
<br />
== Entry ==<br />
<br />
The approach PreferenceLoader takes is different that other approaches in that the Settings-iPhone.plist and Settings-iPod.plist files are not modified on disk. when the [[Preferences.app|Settings]] application is loaded, entries are read from plists in <tt>/Library/PreferenceLoader/Preferences/</tt> and are dynamically added to the list. Each entry is defined in its own plist and consists of a dictionary containing an element named <tt>entry</tt>, which is also a dictionary. The entry dictionary must define a <tt>cell</tt> of type <tt>PSLinkCell</tt> and have a <tt>label</tt>. Additionally, the <tt>bundle</tt> and <tt>isController</tt> keys can be set for entries referencing [[PreferenceBundles]].<br />
<br />
<source lang="xml"><br />
<?xml version="1.0" encoding="UTF-8"?><br />
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"><br />
<plist version="1.0"><br />
<dict><br />
<key>entry</key><br />
<dict><br />
<key>cell</key><br />
<string>PSLinkCell</string><br />
<key>icon</key><br />
<string>TestIcon.png</string><br />
<key>label</key><br />
<string>Test</string><br />
</dict><br />
</dict><br />
</plist><br />
</source><br />
<br />
== Simple Approach ==<br />
<br />
In the simple approach the settings page is defined in a plist file located in the <tt>/Library/PreferenceLoader/Preferences/</tt> folder. The name of the plist file must match the label option in the entry dictionary. For example, if the label in the entry dictionary is defined as <tt>Test</tt>, then the plist that defines the settings page must be named <tt>Test.plist</tt>.<br />
<br />
Typically, the settings and entry plists are combined into a single plist. This works because the settings plist has elements named items and title, so adding an entry element does not break anything. Here's an example of a combined plist:<br />
<br />
<source lang="xml"><br />
<?xml version="1.0" encoding="UTF-8"?><br />
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"><br />
<plist version="1.0"><br />
<dict><br />
<key>entry</key><br />
<dict><br />
<key>cell</key><br />
<string>PSLinkCell</string><br />
<key>icon</key><br />
<string>TestIcon.png</string><br />
<key>label</key><br />
<string>Test</string><br />
</dict><br />
<key>items</key><br />
<array><br />
<dict><br />
<key>cell</key><br />
<string>PSSwitchCell</string><br />
<key>default</key><br />
<true/><br />
<key>defaults</key><br />
<string>com.test.TestSettings</string><br />
<key>key</key><br />
<string>testKey</string><br />
<key>label</key><br />
<string>Test Setting</string><br />
</dict><br />
</array><br />
<key>title</key><br />
<string>Test</string><br />
</dict><br />
</plist><br />
</source><br />
<br />
There is a good tutorial on how to create these settings plists on MMi at http://modmyi.com/forums/file-mods/22453-how-make-custom-menus-preferences-app-custom-preferences.html.<br />
<br />
== Localizable Simple Approach<ref name="1.2">PreferenceLoader version 1.2 and later</ref> ==<br />
<br />
This approach is similar to the Simple Approach, except the settings and entry plists are located in a sub-folder of <tt>/Library/PreferenceLoader/Preferences/</tt>. In addition to the plists and icons, the sub-folder can also contain .lproj folders with appropriate localization strings.<br />
<br />
== PreferenceBundle Approach ==<br />
<br />
With this technique, you can actually create custom settings pages that are able to execute code. The entry plist for this approach must now include a reference to the name of the [[PreferenceBundles|PreferenceBundle]] and define the <tt>isController</tt> option to <tt>true</tt>. This will cause the [[Preferences.app|Settings]] application to load the corresponding bundle located in <tt>/Library/PreferenceBundles/</tt><ref name="1.2">PreferenceLoader version 1.2 and later</ref><ref>Bundles can also be loaded from /System/Library/PreferenceBundles/, but this is no longer the preferred method as of PreferenceLoader 1.2</ref>. Unlike the simple method, all of the files except the entry plist are located inside the bundle. The following example shows an entry plist for loading a [[PreferenceBundles|PreferenceBundle]]:<br />
<br />
<source lang="xml"><br />
<?xml version="1.0" encoding="UTF-8"?><br />
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"><br />
<plist version="1.0"><br />
<dict><br />
<key>entry</key><br />
<dict><br />
<key>bundle</key><br />
<string>TestSettings</string><br />
<key>cell</key><br />
<string>PSLinkCell</string><br />
<key>icon</key><br />
<string>TestIcon.png</string><br />
<key>isController</key><br />
<true/><br />
<key>label</key><br />
<string>Test</string><br />
</dict><br />
</dict><br />
</plist><br />
</source><br />
<br />
A skeleton [[PreferenceBundles|PreferenceBundle]] project can be found at http://www.volatile-dev.com/PreferenceLoader/TestSettings.zip<br />
==Filtering<ref name="2.2.0-1">PreferenceLoader version 2.2.0-1 and later</ref>==<br />
In a way similar to that of [[MobileSubstrate#MobileLoader|MobileSubstrate]], developers may add filters to entry plists and specifiers within simple and localized simple preferences. The filter should be a dictionary at the top level of the entry plist, or within a specifier, which can contain these keys:<br />
* '''CoreFoundationVersion''' (array): The entry or specifier is loaded or displayed only if the version of [[CoreFoundation.framework]] is above the specified values. Currently, only the first 2 values are checked.<br />
{{CoreFoundation Version Table|center=1}}<br />
<br />
==Issues with OS 3.2 and 4.0==<br />
<tt>PSViewController</tt> underwent a massive change after 3.1, breaking all custom subclasses on the iPad and on 4.0 - it is now a UIViewController.<br />
<br />
Improper implementations of <tt>PSListController</tt> subclasses will fail to work properly on 4.0. You must set <tt>_specifiers</tt> within the <tt>-(id) specifiers</tt> method (instead of returning a different array of specifiers.) This is because OS 4.0 relies on _specifiers to generate specifier metadata and group indices. Example:<br />
<source lang="objc"><br />
- (id) specifiers {<br />
if (!_specifiers){<br />
_specifiers = [[self loadSpecifiersFromPlistName: kNameOfPreferencesPlist target: self] retain];<br />
}<br />
<br />
return _specifiers;<br />
}<br />
</source><br />
<br />
==Notes==<br />
<references /><br />
<br />
==References==<br />
<div class="references-2column"><br />
* [[Preferences specifier plist]]<br />
</div><br />
<br />
{{Navbox Library}}<br />
[[Category:Directories in /Library]]</div>
Dustin Howett
https://iphonedev.wiki/index.php?title=Cydia_Substrate&diff=1154
Cydia Substrate
2013-02-21T06:29:24Z
<p>Dustin Howett: MobileSubstrate is 0.9.4001 now.</p>
<hr />
<div>{{Infobox Package<br />
|developer=saurik<br />
|version=0.9.4001<br />
|package=mobilesubstrate<br />
}}<br />
<br />
[[MobileSubstrate]] is the ''de facto'' framework that allows 3rd-party developers to provide run-time patches (“MobileSubstrate extensions”) to system functions, similar to [http://www.unsanity.com/haxies/ape Application Enhancer] on the OS X. <br />
<br />
MobileSubstrate consists of 3 major components: MobileHooker, MobileLoader and safe mode. <br />
<br />
== MobileHooker ==<br />
MobileHooker is used to replace system functions. This process is known as hooking. There are 2 APIs that one would use:<br />
<source lang="c"><br />
IMP MSHookMessage(Class class, SEL selector, IMP replacement, const char* prefix); // prefix should be NULL.<br />
void MSHookMessageEx(Class class, SEL selector, IMP replacement, IMP *result);<br />
void MSHookFunction(void* function, void* replacement, void** p_original);<br />
</source><br />
MSHookMessage() will replace the implementation of the Objective-C message <tt>-[</tt>''class'' ''selector''<tt>]</tt> by ''replacement'', and return the original implementation. To hook a class method, provide the meta class retrieved from objc_getMetaClass in the MSHookeMessage(Ex) call and see example note below. This dynamic replacement is in fact a feature of Objective-C, and can be done using [http://developer.apple.com/mac/library/documentation/Cocoa/Reference/ObjCRuntimeRef/Reference/reference.html#//apple_ref/c/func/method_setImplementation method_setImplementation].<br />
MSHookMessage() is not thread-safe and has been deprecated in favor of MSHookMessageEx()<br />
<br />
MSHookFunction() is like MSHookMessage() but is for C/C++ functions. The replacement must be done at assembly level. Conceptually, MSHookFunction() will write instructions that jumps to the replacement function, and allocate some bytes on a custom memory location, which has the original cut-out instructions and a jump to the rest of the hooked function. Since on the iPhoneOS by default a memory page cannot be simultaneously writable and executable, a kernel patch must be applied for MSHookFunction() to work.<br />
<br />
As of the latest version of MobileSubstrate, MSHookMessage() also requires a kernel patch for supercall closures to hook all methods properly. <br />
<br />
=== Example code ===<br />
Using MSHookFunction:<br />
<source lang="c"><br />
static void (*original_CFShow)(CFTypeRef obj); // a function pointer to store the original CFShow().<br />
void replaced_CFShow(CFTypeRef obj) { // our replacement of CFShow().<br />
printf("Calling original CFShow(%p)...", obj);<br />
original_CFShow(obj); // calls the original CFShow.<br />
printf(" done.\n");<br />
}<br />
...<br />
// hook CFShow to our own implementation.<br />
MSHookFunction(CFShow, replaced_CFShow, &original_CFShow);<br />
// From now on any call to CFShow will pass through replaced_CFShow first.<br />
...<br />
CFShow(CFSTR("test"));<br />
</source><br />
<br />
Using MSHookMessageEx:<br />
<source lang="objc"><br />
static IMP original_UIView_setFrame_;<br />
void replaced_UIView_setFrame_(UIView* self, SEL _cmd, CGRect frame) { // Note the implicit self and _cmd parameters are needed explicitly here.<br />
CGRect originalFrame = self.frame;<br />
NSLog("Changing frame of %p from %@ to %@", self, NSStringFromCGRect(originalFrame), NSStringFromCGRect(frame));<br />
original_UIView_setFrame_(self, _cmd, frame); // Remember to pass self and _cmd.<br />
}<br />
...<br />
MSHookMessageEx([UIView class], @selector(setFrame:), (IMP)replaced_UIView_setFrame_, (IMP *)&original_UIView_setFrame_);<br />
...<br />
myView.frame = CGRectMake(0, 0, 100, 100);<br />
</source><br />
Note that if you are hooking a class method, you have to put a meta-class in the ''class'' argument, e.g.<br />
<source lang="objc"><br />
MSHookMessageEx(objc_getMetaClass("UIView"), @selector(commitAnimations), replaced_UIView_commitAnimations, (IMP *)&original_UIView_commitAnimations);<br />
</source><br />
<br />
Using MSHookFunction to hook private functions (in this case a C++ Method):<br />
<source lang="c"><br />
#define WebKit "/System/Library/PrivateFrameworks/WebKit.framework/WebKit"<br />
#define WebCore "/System/Library/PrivateFrameworks/WebCore.framework/WebCore"<br />
<br />
NSURLRequest* (*X_ZNK7WebCore15ResourceRequest12nsURLRequestEv)(void* something);<br />
<br />
void (*X_ZN20WebFrameLoaderClient23dispatchWillSendRequestEPN7WebCore14DocumentLoaderEmRNS0_15ResourceRequestERKNS0_16ResourceResponseE)(void* something, void* loader, unsigned long identifier, void* request, const void** response);<br />
<br />
<br />
MSHook(void, X_ZN20WebFrameLoaderClient23dispatchWillSendRequestEPN7WebCore14DocumentLoaderEmRNS0_15ResourceRequestERKNS0_16ResourceResponseE, void* something, void* loader, unsigned long identifier, void* request, const void** response) {<br />
<br />
NSURLRequest *nsRequest = X_ZNK7WebCore15ResourceRequest12nsURLRequestEv(request);<br />
//do something<br />
_X_ZN20WebFrameLoaderClient23dispatchWillSendRequestEPN7WebCore14DocumentLoaderEmRNS0_15ResourceRequestERKNS0_16ResourceResponseE(something, loader, identifier, request, response);<br />
}<br />
<br />
template <typename Type_><br />
static void nlset(Type_ &function, struct nlist *nl, size_t index) {<br />
struct nlist &name(nl[index]);<br />
uintptr_t value(name.n_value);<br />
if ((name.n_desc & N_ARM_THUMB_DEF) != 0)<br />
value |= 0x00000001;<br />
function = reinterpret_cast<Type_>(value);<br />
}<br />
<br />
...<br />
<br />
dlopen(WebKit, RTLD_LAZY | RTLD_NOLOAD);<br />
dlopen(WebCore, RTLD_LAZY | RTLD_NOLOAD);<br />
<br />
struct nlist nl[2];<br />
bzero(&nl, sizeof(struct nlist) * 2);<br />
nl[0].n_un.n_name = (char*)"__ZN20WebFrameLoaderClient23dispatchWillSendRequestEPN7WebCore14DocumentLoaderEmRNS0_15ResourceRequestERKNS0_16ResourceResponseE";<br />
<br />
if (nlist(WebKit, nl) < 0 || nl[0].n_type == N_UNDF) {<br />
fprintf(stderr, "\n nlist(%s, %s) failed\n",<br />
"WebKit",<br />
nl[0].n_un.n_name);<br />
} else {<br />
struct nlist nlsucker[2];<br />
bzero(&nlsucker, sizeof(struct nlist) * 2);<br />
nlsucker[0].n_un.n_name = (char*)"__ZNK7WebCore15ResourceRequest12nsURLRequestEv";<br />
<br />
if (nlist(WebCore, nlsucker) < 0 || nlsucker[0].n_type == N_UNDF) {<br />
fprintf(stderr, "\n nlist(%s, %s) failed\n",<br />
"WebCore",<br />
nlsucker[0].n_un.n_name);<br />
}<br />
else {<br />
<br />
nlset(X_ZNK7WebCore15ResourceRequest12nsURLRequestEv, nlsucker, 0); <br />
nlset(X_ZN20WebFrameLoaderClient23dispatchWillSendRequestEPN7WebCore14DocumentLoaderEmRNS0_15ResourceRequestERKNS0_16ResourceResponseE, nl, 0);<br />
MSHookFunction(X_ZN20WebFrameLoaderClient23dispatchWillSendRequestEPN7WebCore14DocumentLoaderEmRNS0_15ResourceRequestERKNS0_16ResourceResponseE,<br />
MSHake(X_ZN20WebFrameLoaderClient23dispatchWillSendRequestEPN7WebCore14DocumentLoaderEmRNS0_15ResourceRequestERKNS0_16ResourceResponseE));<br />
}<br />
}<br />
</source><br />
Because we want the pointer to a private symbol we have to use nlist.<br />
<br />
== MobileLoader ==<br />
MobileLoader loads 3rd-party patching code into the running application. <br />
<br />
MobileLoader will first load itself into the run application using [http://koichitamura.blogspot.com/2008/11/hooking-library-calls-on-mac.html <tt>DYLD_INSERT_LIBRARIES</tt>] environment variable. Then it looks for all dynamic libraries in the directory <tt>/Library/MobileSubstrate/DynamicLibraries/</tt>, and dlopen them. An extension should use constructor code to perform any works, e.g.<br />
<source lang="objc"><br />
...<br />
// The attribute forces this function to be called on load.<br />
__attribute__((constructor))<br />
static void initialize() {<br />
NSLog(@"MyExt: Loaded");<br />
MSHookFunction(CFShow, replaced_CFShow, &original_CFShow);<br />
}<br />
</source><br />
<br />
Developers may add filters to restrict whether the extension should be loaded or not. Filters are implemented as plist that lives beside the dylib. If the dylib is named <tt>foo.dylib</tt>, then the filter should be named <tt>foo.plist</tt>. The filter should be a dictionary with key '''Filter''', which is another dictionaries that can contain these keys:<br />
* '''CoreFoundationVersion''' (array): The extension is loaded only if the version of [[CoreFoundation.framework]] is above the specified values. Currently, only the first 2 values are checked.<br />
{{CoreFoundation Version Table|center=1}}<br />
* '''Bundles''' (array): The extension is loaded only if the bundle-ID of the running application matches the list.<br />
* '''Classes''' (array): The extension is loaded only if the one of the specified objective-C classes is implemented in the application.<br />
* '''Executables''' (array): The extension is loaded only if one of the executable names matches the running application. This is required to hook things that have no other identifiable characteristics.<br />
<br />
For example, to restrict the extension only load in {{applink|SpringBoard}}, the plist would look like<br />
Filter = {<br />
Bundles = (com.apple.springboard);<br />
};<br />
<br />
You can also use this method to restrict the extension to only load into applications that link to a specific bundle, such as UIKit. For example:<br />
Filter = {<br />
Bundles = (com.apple.UIKit);<br />
};<br />
<br />
<br />
You can use CoreFoundationVersion key and specify lower- and upper-bounds. When two values are in the array, the first is treated as greater-than-or-equal-to rule, while the second is a less-than rule. The following example shows loading restricted to firmwares from 4.0 to 4.3 only:<br />
<br />
Filter = {<br />
CoreFoundationVersion = (550.32, 675.00);<br />
};<br />
<br />
<br />
In general the rule is that if you are using more than one filter (example: Executables and Bundle) all filters have to match. You can change that by using Mode = "Any".<br />
<br />
Filter = {<br />
Executables = ("mediaserverd");<br />
Bundles = ( "com.apple.MobileSMS"; "net.whatsapp.WhatsApp" );<br />
Mode = "Any";<br />
};<br />
<br />
<br />
In addition, MobileLoader also hooks <tt>nlist()</tt> to improve its performance, and defines several signal handlers for safe mode.<br />
<br />
For setuid apps, since all inserted environment variables are ignored, the developer of the App must explicitly <tt>dlopen("/Library/MobileSubstrate/MobileSubstrate.dylib")</tt> to let MobileLoader run.<br />
<br />
== Safe mode ==<br />
<br />
When a extension crashed the SpringBoard, MobileLoader will catch that and put the device into safe mode. In safe mode all 3rd-party extensions will be disabled.<br />
<br />
The following signals will invoke safe mode:<br />
* SIGTRAP<br />
* SIGABRT<br />
* SIGILL<br />
* SIGBUS<br />
* SIGSEGV<br />
* SIGSYS<br />
<br />
{{Navbox HookingLibs}}<br />
{{Navbox Library}}<br />
[[Category:Directories in /Library]]</div>
Dustin Howett