##// END OF EJS Templates
Fix #4777 and #7887...
Fix #4777 and #7887 The function in charge of actually converting cursor offset to CodeMirror line number and character number was actually crashing when the cursor was at the last character (loop until undefined, then access length of variable, which is undefined). This was hiding a bug in which when you would completer to a single completion pressing tab after as-you-type filtering, the completion would be completed twice. The logic that was supposed to detect whether or not all completions had a common prefix was actually faulty as the common prefix used to be a string but was then changed to an object. Hence the logic to check whether or not there was actually a common prefix was always true, even for empty string, leading to the deletion of the line (replace by '') in some cases.

File last commit:

r13582:b21d447e
r20538:ae7f6d6a
Show More
_nope.py
126 lines | 3.6 KiB | text/x-python | PythonLexer
#-----------------------------------------------------------------------------
# Copyright (C) 2013 Min RK
#
# Distributed under the terms of the 2-clause BSD License.
#-----------------------------------------------------------------------------
from contextlib import contextmanager
import ctypes
import ctypes.util
objc = ctypes.cdll.LoadLibrary(ctypes.util.find_library('objc'))
void_p = ctypes.c_void_p
ull = ctypes.c_uint64
objc.objc_getClass.restype = void_p
objc.sel_registerName.restype = void_p
objc.objc_msgSend.restype = void_p
objc.objc_msgSend.argtypes = [void_p, void_p]
msg = objc.objc_msgSend
def _utf8(s):
"""ensure utf8 bytes"""
if not isinstance(s, bytes):
s = s.encode('utf8')
return s
def n(name):
"""create a selector name (for methods)"""
return objc.sel_registerName(_utf8(name))
def C(classname):
"""get an ObjC Class by name"""
return objc.objc_getClass(_utf8(classname))
# constants from Foundation
NSActivityIdleDisplaySleepDisabled = (1 << 40)
NSActivityIdleSystemSleepDisabled = (1 << 20)
NSActivitySuddenTerminationDisabled = (1 << 14)
NSActivityAutomaticTerminationDisabled = (1 << 15)
NSActivityUserInitiated = (0x00FFFFFF | NSActivityIdleSystemSleepDisabled)
NSActivityUserInitiatedAllowingIdleSystemSleep = (NSActivityUserInitiated & ~NSActivityIdleSystemSleepDisabled)
NSActivityBackground = 0x000000FF
NSActivityLatencyCritical = 0xFF00000000
def beginActivityWithOptions(options, reason=""):
"""Wrapper for:
[ [ NSProcessInfo processInfo]
beginActivityWithOptions: (uint64)options
reason: (str)reason
]
"""
NSProcessInfo = C('NSProcessInfo')
NSString = C('NSString')
reason = msg(NSString, n("stringWithUTF8String:"), _utf8(reason))
info = msg(NSProcessInfo, n('processInfo'))
activity = msg(info,
n('beginActivityWithOptions:reason:'),
ull(options),
void_p(reason)
)
return activity
def endActivity(activity):
"""end a process activity assertion"""
NSProcessInfo = C('NSProcessInfo')
info = msg(NSProcessInfo, n('processInfo'))
msg(info, n("endActivity:"), void_p(activity))
_theactivity = None
def nope():
"""disable App Nap by setting NSActivityUserInitiatedAllowingIdleSystemSleep"""
global _theactivity
_theactivity = beginActivityWithOptions(
NSActivityUserInitiatedAllowingIdleSystemSleep,
"Because Reasons"
)
def nap():
"""end the caffeinated state started by `nope`"""
global _theactivity
if _theactivity is not None:
endActivity(_theactivity)
_theactivity = None
def napping_allowed():
"""is napping allowed?"""
return _theactivity is None
@contextmanager
def nope_scope(
options=NSActivityUserInitiatedAllowingIdleSystemSleep,
reason="Because Reasons"
):
"""context manager for beginActivityWithOptions.
Within this context, App Nap will be disabled.
"""
activity = beginActivityWithOptions(options, reason)
try:
yield
finally:
endActivity(activity)
__all__ = [
"NSActivityIdleDisplaySleepDisabled",
"NSActivityIdleSystemSleepDisabled",
"NSActivitySuddenTerminationDisabled",
"NSActivityAutomaticTerminationDisabled",
"NSActivityUserInitiated",
"NSActivityUserInitiatedAllowingIdleSystemSleep",
"NSActivityBackground",
"NSActivityLatencyCritical",
"beginActivityWithOptions",
"endActivity",
"nope",
"nap",
"napping_allowed",
"nope_scope",
]