diff -r 9ccb2c951aed -r 21c761a47bb3 include/Scintilla.h
--- a/include/Scintilla.h	Tue Jan 25 10:03:55 2011 +1100
+++ b/include/Scintilla.h	Wed Jan 26 23:06:33 2011 -0600
@@ -124,6 +124,7 @@
 #define SC_MARK_LEFTRECT 27
 #define SC_MARK_AVAILABLE 28
 #define SC_MARK_UNDERLINE 29
+#define SC_MARK_BACKFORE 3030
 #define SC_MARK_CHARACTER 10000
 #define SC_MARKNUM_FOLDEREND 25
 #define SC_MARKNUM_FOLDEROPENMID 26
@@ -168,6 +169,7 @@
 #define STYLE_CONTROLCHAR 36
 #define STYLE_INDENTGUIDE 37
 #define STYLE_CALLTIP 38
+#define STYLE_AUTOCOMPLETION 39
 #define STYLE_LASTPREDEFINED 39
 #define STYLE_MAX 255
 #define SC_CHARSET_ANSI 0
diff -r 9ccb2c951aed -r 21c761a47bb3 src/AutoComplete.cxx
--- a/src/AutoComplete.cxx	Tue Jan 25 10:03:55 2011 +1100
+++ b/src/AutoComplete.cxx	Wed Jan 26 23:06:33 2011 -0600
@@ -132,7 +132,7 @@
 	char item[maxItemLen];
 	int start = 0; // lower bound of the api array block to search
 	int end = lb->Length() - 1; // upper bound of the api array block to search
-	while ((start <= end) && (location == -1)) { // Binary searching loop
+	while (lenWord && (start <= end) && (location == -1)) { // Binary searching loop
 		int pivot = (start + end) / 2;
 		lb->GetValue(pivot, item, maxItemLen);
 		int cond;
diff -r 9ccb2c951aed -r 21c761a47bb3 src/Document.cxx
--- a/src/Document.cxx	Tue Jan 25 10:03:55 2011 +1100
+++ b/src/Document.cxx	Wed Jan 26 23:06:33 2011 -0600
@@ -1190,7 +1190,7 @@
 	if (pos > 0) {
 		CharClassify::cc ccPos = WordCharClass(CharAt(pos));
 		return (ccPos == CharClassify::ccWord || ccPos == CharClassify::ccPunctuation) &&
-			(ccPos != WordCharClass(CharAt(pos - 1)));
+			(ccPos != WordCharClass(CharAt(NextPosition(pos, -1))));
 	}
 	return true;
 }
@@ -1201,7 +1201,7 @@
  */
 bool Document::IsWordEndAt(int pos) {
 	if (pos < Length()) {
-		CharClassify::cc ccPrev = WordCharClass(CharAt(pos-1));
+		CharClassify::cc ccPrev = WordCharClass(CharAt(NextPosition(pos, -1)));
 		return (ccPrev == CharClassify::ccWord || ccPrev == CharClassify::ccPunctuation) &&
 			(ccPrev != WordCharClass(CharAt(pos)));
 	}
diff -r 9ccb2c951aed -r 21c761a47bb3 src/Editor.cxx
--- a/src/Editor.cxx	Tue Jan 25 10:03:55 2011 +1100
+++ b/src/Editor.cxx	Wed Jan 26 23:06:33 2011 -0600
@@ -2620,7 +2620,8 @@
 	if (!overrideBackground) {
 		int marks = pdoc->GetMark(line);
 		for (int markBit = 0; (markBit < 32) && marks; markBit++) {
-			if ((marks & 1) && (vsDraw.markers[markBit].markType == SC_MARK_BACKGROUND) &&
+			if ((marks & 1) && ((vsDraw.markers[markBit].markType == SC_MARK_BACKGROUND) ||
+				(vsDraw.markers[markBit].markType == SC_MARK_BACKFORE)) &&
 			        (vsDraw.markers[markBit].alpha == SC_ALPHA_NOALPHA)) {
 				background = vsDraw.markers[markBit].back.allocated;
 				overrideBackground = true;
@@ -2840,6 +2841,15 @@
 				if (vsDraw.hotspotForegroundSet)
 					textFore = vsDraw.hotspotForeground.allocated;
 			}
+
+			marks = pdoc->GetMark(line);
+			for (markBit = 0; (markBit < 32) && marks; markBit++) {
+				if ((marks & 1) && (vsDraw.markers[markBit].markType == SC_MARK_BACKFORE)) {
+					textFore = vsDraw.markers[markBit].fore.allocated;
+				}
+				marks >>= 1;
+			}
+
 			const int inSelection = hideSelection ? 0 : sel.CharacterInSelection(iDoc);
 			if (inSelection && (vsDraw.selforeset)) {
 				textFore = (inSelection == 1) ? vsDraw.selforeground.allocated : vsDraw.selAdditionalForeground.allocated;
@@ -3051,7 +3061,8 @@
 	}
 	marks = pdoc->GetMark(line);
 	for (markBit = 0; (markBit < 32) && marks; markBit++) {
-		if ((marks & 1) && (vsDraw.markers[markBit].markType == SC_MARK_BACKGROUND)) {
+		if ((marks & 1) && ((vsDraw.markers[markBit].markType == SC_MARK_BACKGROUND) ||
+			(vsDraw.markers[markBit].markType == SC_MARK_BACKFORE))) {
 			SimpleAlphaRectangle(surface, rcSegment, vsDraw.markers[markBit].back.allocated, vsDraw.markers[markBit].alpha);
 		} else if ((marks & 1) && (vsDraw.markers[markBit].markType == SC_MARK_UNDERLINE)) {
 			PRectangle rcUnderline = rcSegment;
@@ -3272,6 +3283,15 @@
 					rcCaret.right = rcCaret.left + vsDraw.caretWidth;
 				}
 				ColourAllocated caretColour = mainCaret ? vsDraw.caretcolour.allocated : vsDraw.additionalCaretColour.allocated;
+
+				int marks = pdoc->GetMark(lineDoc);
+				for (int markBit = 0; (markBit < 32) && marks; markBit++) {
+					if ((marks & 1) && (vsDraw.markers[markBit].markType == SC_MARK_BACKFORE)) {
+						caretColour = vsDraw.markers[markBit].fore.allocated;
+					}
+					marks >>= 1;
+				}
+
 				if (drawBlockCaret) {
 					DrawBlockCaret(surface, vsDraw, ll, subLine, xStart, offset, posCaret.Position(), rcCaret, caretColour);
 				} else {
diff -r 9ccb2c951aed -r 21c761a47bb3 src/LineMarker.cxx
--- a/src/LineMarker.cxx	Tue Jan 25 10:03:55 2011 +1100
+++ b/src/LineMarker.cxx	Wed Jan 26 23:06:33 2011 -0600
@@ -155,7 +155,8 @@
 		surface->RectangleDraw(rcSmall, fore.allocated, back.allocated);
 
 	} else if (markType == SC_MARK_EMPTY || markType == SC_MARK_BACKGROUND ||
-		markType == SC_MARK_UNDERLINE || markType == SC_MARK_AVAILABLE) {
+		markType == SC_MARK_UNDERLINE || markType == SC_MARK_AVAILABLE ||
+		markType == SC_MARK_BACKFORE) {
 		// An invisible marker so don't draw anything
 
 	} else if (markType == SC_MARK_VLINE) {
diff -r 9ccb2c951aed -r 21c761a47bb3 src/ScintillaBase.cxx
--- a/src/ScintillaBase.cxx	Tue Jan 25 10:03:55 2011 +1100
+++ b/src/ScintillaBase.cxx	Wed Jan 26 23:06:33 2011 -0600
@@ -220,7 +220,7 @@
 		}
 	}
 	ac.Start(wMain, idAutoComplete, sel.MainCaret(), PointMainCaret(),
-				lenEntered, vs.lineHeight, IsUnicodeMode());
+				lenEntered, vs.styles[STYLE_AUTOCOMPLETION].lineHeight, IsUnicodeMode());
 
 	PRectangle rcClient = GetClientRectangle();
 	Point pt = LocationFromPosition(sel.MainCaret() - lenEntered);
@@ -250,8 +250,8 @@
 	rcac.right = rcac.left + widthLB;
 	rcac.bottom = Platform::Minimum(rcac.top + heightLB, rcPopupBounds.bottom);
 	ac.lb->SetPositionRelative(rcac, wMain);
-	ac.lb->SetFont(vs.styles[STYLE_DEFAULT].font);
-	unsigned int aveCharWidth = vs.styles[STYLE_DEFAULT].aveCharWidth;
+	ac.lb->SetFont(vs.styles[STYLE_AUTOCOMPLETION].font);
+	unsigned int aveCharWidth = vs.styles[STYLE_AUTOCOMPLETION].aveCharWidth;
 	ac.lb->SetAverageCharWidth(aveCharWidth);
 	ac.lb->SetDoubleClickAction(AutoCompleteDoubleClick, this);
 
@@ -275,9 +275,7 @@
 	rcList.bottom = rcList.top + heightAlloced;
 	ac.lb->SetPositionRelative(rcList, wMain);
 	ac.Show(true);
-	if (lenEntered != 0) {
-		AutoCompleteMoveToCurrentWord();
-	}
+	AutoCompleteMoveToCurrentWord();
 }
 
 void ScintillaBase::AutoCompleteCancel() {
@@ -299,7 +297,10 @@
 	char wordCurrent[1000];
 	int i;
 	int startWord = ac.posStart - ac.startLen;
-	for (i = startWord; i < sel.MainCaret() && i - startWord < 1000; i++)
+	int endWord = sel.MainCaret();
+	//if (ac.selectRestOfWord)
+		endWord = pdoc->ExtendWordSelect(endWord, 1, true);
+	for (i = startWord; i < endWord && i - startWord < 1000; i++)
 		wordCurrent[i - startWord] = pdoc->CharAt(i);
 	wordCurrent[Platform::Minimum(i - startWord, 999)] = '\0';
 	ac.Select(wordCurrent);
diff -r 9ccb2c951aed -r 21c761a47bb3 src/ViewStyle.cxx
--- a/src/ViewStyle.cxx	Tue Jan 25 10:03:55 2011 +1100
+++ b/src/ViewStyle.cxx	Wed Jan 26 23:06:33 2011 -0600
@@ -301,9 +301,9 @@
 	for (unsigned int i=0; i<stylesSize; i++) {
 		if (i != STYLE_DEFAULT) {
 			styles[i].Realise(surface, zoomLevel, &styles[STYLE_DEFAULT], extraFontFlag);
-			if (maxAscent < styles[i].ascent)
+			if (maxAscent < styles[i].ascent && i != STYLE_AUTOCOMPLETION)
 				maxAscent = styles[i].ascent;
-			if (maxDescent < styles[i].descent)
+			if (maxDescent < styles[i].descent && i != STYLE_AUTOCOMPLETION)
 				maxDescent = styles[i].descent;
 		}
 		if (styles[i].IsProtected()) {
diff -r 9ccb2c951aed -r 21c761a47bb3 win32/PlatWin.cxx
--- a/win32/PlatWin.cxx	Tue Jan 25 10:03:55 2011 +1100
+++ b/win32/PlatWin.cxx	Wed Jan 26 23:06:33 2011 -0600
@@ -1396,7 +1396,7 @@
 };
 
 const Point ListBoxX::ItemInset(0, 0);
-const Point ListBoxX::TextInset(2, 0);
+const Point ListBoxX::TextInset(2, 1);
 const Point ListBoxX::ImageInset(1, 0);
 
 ListBox *ListBox::Allocate() {
diff -r 9ccb2c951aed -r 21c761a47bb3 win32/ScintillaWin.cxx
--- a/win32/ScintillaWin.cxx	Tue Jan 25 10:03:55 2011 +1100
+++ b/win32/ScintillaWin.cxx	Wed Jan 26 23:06:33 2011 -0600
@@ -695,7 +695,9 @@
 
 		case WM_TIMER:
 			if (wParam == standardTimerID && timer.ticking) {
-				Tick();
+				HWND capWnd = ::GetCapture();
+				if (!capWnd || capWnd == MainHWND())
+					Tick();
 			} else if (wParam == idleTimerID && idler.state) {
 				SendMessage(MainHWND(), SC_WIN_IDLE, 0, 1);
 			} else {
@@ -885,6 +887,7 @@
 					!(::IsChild(wThis, wOther) || (wOther == wCT))) {
 					SetFocusState(false);
 					DestroySystemCaret();
+					SetTicking(false);
 				}
 			}
 			//RealizeWindowPalette(true);
