Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Make MODULE_SCOPE functions start with "Tk". Also simplify TkUtfToNSString(), making use of Tcl_UtfToUniCharDString() |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | core-8-6-branch |
Files: | files | file ages | folders |
SHA3-256: |
f98feb70beed0f7bae6d737ce9f3530b |
User & Date: | jan.nijtmans 2019-12-04 20:35:17.916 |
Context
2019-12-05
| ||
13:05 | Build without -DUNICDE -D_UNICODE, since it's not necessary any-more (all code uses implicit *W-API now). This also eliminates the need for the TK_ASCII_MAIN hack. check-in: a548d14c user: jan.nijtmans tags: core-8-6-branch | |
2019-12-04
| ||
22:38 | Merge 8.6. Introduce the new Unicode-handling functions here too: Tk 8.7 could be loaded in Tcl 8.6 .... Further improvements are still possible check-in: 2c72c39e user: jan.nijtmans tags: trunk | |
20:35 | Make MODULE_SCOPE functions start with "Tk". Also simplify TkUtfToNSString(), making use of Tcl_UtfToUniCharDString() check-in: f98feb70 user: jan.nijtmans tags: core-8-6-branch | |
14:17 | Fix [749bd9bb1b]: systemControlAccentColor can have incorrect RGB on older macOS systems. check-in: 00b45e1d user: marc_culler tags: core-8-6-branch | |
Changes
Changes to macosx/tkMacOSXClipboard.c.
︙ | ︙ | |||
31 32 33 34 35 36 37 | [type isEqualToString:NSStringPboardType]) { for (TkClipboardTarget *targetPtr = dispPtr->clipTargetPtr; targetPtr; targetPtr = targetPtr->nextPtr) { if (targetPtr->type == XA_STRING || targetPtr->type == dispPtr->utf8Atom) { for (TkClipboardBuffer *cbPtr = targetPtr->firstBufferPtr; cbPtr; cbPtr = cbPtr->nextPtr) { | | | 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | [type isEqualToString:NSStringPboardType]) { for (TkClipboardTarget *targetPtr = dispPtr->clipTargetPtr; targetPtr; targetPtr = targetPtr->nextPtr) { if (targetPtr->type == XA_STRING || targetPtr->type == dispPtr->utf8Atom) { for (TkClipboardBuffer *cbPtr = targetPtr->firstBufferPtr; cbPtr; cbPtr = cbPtr->nextPtr) { NSString *s = TkUtfToNSString(cbPtr->buffer, cbPtr->length); [string appendString:s]; [s release]; } break; } } } |
︙ | ︙ | |||
140 141 142 143 144 145 146 | * Encode the string using the encoding which is used in Tcl * when TCL_UTF_MAX = 3. This replaces each UTF-16 surrogate with * a 3-byte sequence generated using the UTF-8 algorithm. (Even * though UTF-8 does not allow encoding surrogates, the algorithm * does produce a 3-byte sequence.) */ | | | 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 | * Encode the string using the encoding which is used in Tcl * when TCL_UTF_MAX = 3. This replaces each UTF-16 surrogate with * a 3-byte sequence generated using the UTF-8 algorithm. (Even * though UTF-8 does not allow encoding surrogates, the algorithm * does produce a 3-byte sequence.) */ char *bytes = TkNSStringToUtf(string, NULL); result = proc(clientData, interp, bytes); if (bytes) { ckfree(bytes); } } } else { Tcl_SetObjResult(interp, Tcl_ObjPrintf( |
︙ | ︙ |
Changes to macosx/tkMacOSXFont.c.
︙ | ︙ | |||
100 101 102 103 104 105 106 | #pragma mark - #pragma mark Font Helpers: /* *--------------------------------------------------------------------------- * | | | 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 | #pragma mark - #pragma mark Font Helpers: /* *--------------------------------------------------------------------------- * * TkUtfToNSString -- * * When Tcl is compiled with TCL_UTF_MAX = 3 (the default for 8.6) it cannot * deal directly with UTF-8 encoded non-BMP characters, since their UTF-8 * encoding requires 4 bytes. * * As a workaround, these versions of Tcl encode non-BMP characters as a string * of length 6 in which the high and low UTF-16 surrogates have been encoded |
︙ | ︙ | |||
123 124 125 126 127 128 129 | * * Side effects: * None. *--------------------------------------------------------------------------- */ MODULE_SCOPE NSString* | | | | < < < | < < < < < | > > | | | < | | | 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 | * * Side effects: * None. *--------------------------------------------------------------------------- */ MODULE_SCOPE NSString* TkUtfToNSString( const char *source, size_t numBytes) { NSString *string; Tcl_DString ds; Tcl_DStringInit(&ds); Tcl_UtfToUniCharDString(source, numBytes, &ds); string = [[NSString alloc] initWithCharacters:(const unichar *)Tcl_DStringValue(&ds) length:(Tcl_DStringLength(&ds)>>1)]; Tcl_DStringFree(&ds); return string; } /* *--------------------------------------------------------------------------- * * TkUtfAtIndex -- * * Write a sequence of bytes up to length 6 which is an encoding of a UTF-16 * character in an NSString. Also record the unicode code point of the character. * this may be a non-BMP character constructed by reading two surrogates from * the NSString. * * Results: * Returns the number of bytes written. * * Side effects: * Bytes are written to the char array referenced by the pointer uni and * the unicode code point is written to the integer referenced by the * pointer code. * */ MODULE_SCOPE int TkUtfAtIndex( NSString *string, int index, char *uni, unsigned int *code) { char *ptr = uni; UniChar uniChar = [string characterAtIndex: index]; |
︙ | ︙ | |||
194 195 196 197 198 199 200 | return strlen(uni); } } /* *--------------------------------------------------------------------------- * | | | | | 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 | return strlen(uni); } } /* *--------------------------------------------------------------------------- * * TkNSStringToUtf -- * * Encodes the unicode string represented by an NSString object with the * internal encoding that Tcl uses when TCL_UTF_MAX = 3. This encoding * is similar to UTF-8 except that non-BMP characters are encoded as two * successive 3-byte sequences which are constructed from UTF-16 surrogates * by applying the UTF-8 algorithm. Even though the UTF-8 encoding does not * allow encoding surrogates, the algorithm does produce a well-defined * 3-byte sequence. * * Results: * Returns a pointer to a null-terminated byte array which encodes the * NSString. * * Side effects: * Memory is allocated to hold the byte array, which must be freed with * ckalloc. If the pointer numBytes is not NULL the number of non-null * bytes written to the array is stored in the integer it references. */ MODULE_SCOPE char* TkNSStringToUtf( NSString *string, int *numBytes) { unsigned int code; int i; char *ptr, *bytes = ckalloc(6*[string length] + 1); ptr = bytes; if (ptr) { for (i = 0; i < [string length]; i++) { ptr += TkUtfAtIndex(string, i, ptr, &code); if (code > 0xffff){ i++; } } *ptr = '\0'; } if (numBytes) { |
︙ | ︙ | |||
982 983 984 985 986 987 988 | (maxLength == 0 && !(flags & TK_AT_LEAST_ONE))) { *lengthPtr = 0; return 0; } if (maxLength > 32767) { maxLength = 32767; } | | | 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 | (maxLength == 0 && !(flags & TK_AT_LEAST_ONE))) { *lengthPtr = 0; return 0; } if (maxLength > 32767) { maxLength = 32767; } string = TkUtfToNSString((const char *)source, numBytes); if (!string) { length = 0; fit = rangeLength; goto done; } attributedString = [[NSAttributedString alloc] initWithString:string attributes:fontPtr->nsAttributes]; |
︙ | ︙ | |||
1261 1262 1263 1264 1265 1266 1267 | int h; if (rangeStart < 0 || rangeLength <= 0 || rangeStart + rangeLength > numBytes || !TkMacOSXSetupDrawingContext(drawable, gc, 1, &drawingContext)) { return; } | | | 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 | int h; if (rangeStart < 0 || rangeLength <= 0 || rangeStart + rangeLength > numBytes || !TkMacOSXSetupDrawingContext(drawable, gc, 1, &drawingContext)) { return; } string = TkUtfToNSString((const char *)source, numBytes); if (!string) { return; } context = drawingContext.context; fg = TkMacOSXCreateCGColor(gc, gc->foreground); attributes = [fontPtr->nsAttributes mutableCopy]; [attributes setObject:(id)fg forKey:(id)kCTForegroundColorAttributeName]; |
︙ | ︙ |
Changes to macosx/tkMacOSXKeyEvent.c.
︙ | ︙ | |||
343 344 345 346 347 348 349 | * sequence using the UTF-8 algorithm (ignoring the fact that the UTF-8 * encoding specification does not allow encoding UTF-16 surrogates). * This gives a 6-byte encoding of the non-BMP character which we write into * the trans_chars field of the XEvent. */ for (i = 0; i < len; i++) { | | | 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 | * sequence using the UTF-8 algorithm (ignoring the fact that the UTF-8 * encoding specification does not allow encoding UTF-16 surrogates). * This gives a 6-byte encoding of the non-BMP character which we write into * the trans_chars field of the XEvent. */ for (i = 0; i < len; i++) { xEvent.xkey.nbytes = TkUtfAtIndex(str, i, xEvent.xkey.trans_chars, &xEvent.xkey.keycode); if (xEvent.xkey.keycode > 0xffff){ i++; } xEvent.xany.type = KeyPress; Tk_QueueWindowEvent(&xEvent, TCL_QUEUE_TAIL); } |
︙ | ︙ |
Changes to macosx/tkMacOSXPrivate.h.
︙ | ︙ | |||
139 140 141 142 143 144 145 | MODULE_SCOPE long tkMacOSXMacOSXVersion; /* * Prototypes for TkMacOSXRegion.c. */ | < < < < | 139 140 141 142 143 144 145 146 147 148 149 150 151 152 | MODULE_SCOPE long tkMacOSXMacOSXVersion; /* * Prototypes for TkMacOSXRegion.c. */ MODULE_SCOPE HIShapeRef TkMacOSXGetNativeRegion(TkRegion r); MODULE_SCOPE void TkMacOSXSetWithNativeRegion(TkRegion r, HIShapeRef rgn); MODULE_SCOPE void TkMacOSXOffsetRegion(TkRegion r, short dx, short dy); MODULE_SCOPE HIShapeRef TkMacOSXHIShapeCreateEmpty(void); MODULE_SCOPE HIMutableShapeRef TkMacOSXHIShapeCreateMutableWithRect( const CGRect *inRect); |
︙ | ︙ | |||
235 236 237 238 239 240 241 | Tcl_Obj *const objv[]); MODULE_SCOPE void TkMacOSXDrawSolidBorder(Tk_Window tkwin, GC gc, int inset, int thickness); MODULE_SCOPE int TkMacOSXServices_Init(Tcl_Interp *interp); MODULE_SCOPE int TkMacOSXRegisterServiceWidgetObjCmd(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); | | | | | 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 | Tcl_Obj *const objv[]); MODULE_SCOPE void TkMacOSXDrawSolidBorder(Tk_Window tkwin, GC gc, int inset, int thickness); MODULE_SCOPE int TkMacOSXServices_Init(Tcl_Interp *interp); MODULE_SCOPE int TkMacOSXRegisterServiceWidgetObjCmd(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); MODULE_SCOPE NSString* TkUtfToNSString(const char *source, size_t numBytes); MODULE_SCOPE int TkUtfAtIndex(NSString *string, int index, char *uni, unsigned int *code); MODULE_SCOPE char* TkNSStringToUtf(NSString *string, int *numBytes); #pragma mark Private Objective-C Classes #define VISIBILITY_HIDDEN __attribute__((visibility("hidden"))) enum { tkMainMenu = 1, tkApplicationMenu, tkWindowsMenu, tkHelpMenu}; |
︙ | ︙ |
Changes to macosx/tkMacOSXRegion.c.
︙ | ︙ | |||
171 172 173 174 175 176 177 | * * Side effects: * None. * *---------------------------------------------------------------------- */ | | | 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 | * * Side effects: * None. * *---------------------------------------------------------------------- */ static int TkMacOSXIsEmptyRegion( TkRegion r) { return HIShapeIsEmpty((HIMutableShapeRef) r) ? 1 : 0; } /* |
︙ | ︙ |