Blogue

Greenwich

Beau travail de la part de FadingRed. Je n’ai jamais aimé l’approche de Apple pour la traduction où les fichiers nib doivent être manuellement édités par le traducteur. Même chez Apple ça mène parfois à des résultats bizarres. Greenwich adopte une autre approche : il charge le fichier nib et traduit ensuite toutes les chaînes visible par l’utilisateur dans les objets qu’il a chargé en utilisant une table de chaînes de caractère.

J’ai quelque chose de pas mal similaire de caché dans mes tiroirs, je n’ai juste pas pris le temps nécessaire encore pour le publier. Il semblerais que Greenwich ne fonctionne pas sous Leopard, et il n’essai pas non plus d’ajuster la position et la taille des éléments. Mon système gère tout ça. Par contre il ne permet pas à un utilisateur d’ouvrir un éditeur de traduction à partir de l’application.

Est-ce que ça intéresse quelqu’un ? Je pourrais être tenté de le publier.


Gonflé

J’ai un MacBook Pro 13 pouces Unibody acheté en 2009. Cette semaine, le trackpad est devenu plutôt difficile à cliquer. En fait, sur cet ordinateur le trackpad a toujours été un peu plus dur à enfoncer du côté gauche comparé à d’autres du même modèle, mais rien de bien préoccupant. Sauf que cette semaine ça a empiré. J’ai ouvert le panneau du dessous pour voir s’il y avait possibilité de nettoyer le dessous du trackpad, mais sans succès : la batterie cache toute la zone. Mais en même temps j’ai compris pourquoi le trackpad marchait mal.

La batterie avait gonflé. Pas énormément, mais certainement assez pour bloquer le click du trackpad presque entièrement sur la gauche. Évidement, il n’y a rien à nettoyer ; la seule chose à faire est de changer la batterie. Je referme et revisse le couvercle. C’est malheureux, parce que cette batterie est encore en parfait état si on fait abstraction de sa difformité.

Aujourd’hui je suis allé au Apple Store. Le Genius n’avais jamais vu ça sur un modèle Unibody. Un petit 200$ plus tard et j’ai une batterie neuve. Ça reste tout de même cher payé pour remplacer une batterie qui fonctionnait encore parfaitement bien mais qui avait probablement un défaut de fabrication. Je suis un peu déçu.

Ceci dit, le trackpad clique maintenant mieux que jamais, mieux même que force que l’ordinateur était neuf. Je me demande quand exactement elle a commencé à gonfler…


MFIndexSetForeach

NSIndexSet peut être un peu ennuyant en Objective-C. Contrairement à NSArray, NSSet et NSDictionary, on ne peut pas itérer en utilisant une simple boucle for (a in b). C’est parce que contrairement aux autres contenants Objective-C, NSIndexSet contient des nombres, pas des objets. Depuis Mac OS X 10.6 on peut utiliser un bloc pour itérer sur un NSIndexSet, mais ce n’est pas toujours idéal : sortir de la boucle est plus compliqué et retourner à partir du bloc ne retourne pas de la fonction parente. Que peut-on faire de mieux ?

Dans un monde idéal, on pourrait écrire ceci (mais malheureusement ça ne marche pas) :

for (NSUInteger index in indexSet)
{
    // contenu de la boucle
}

Ce que MFIndexSetForeach rend possible est ceci :

MFIndexSetForeach(index, indexSet)
{
    // contenu de la boucle
}

MFIndexSetForeach parcourras tous les indexes de l’ensemble. Il remplis un petit tableau d’index à l’aide de la méthode getIndexes:maxCount:inIndexRange: de NSIndexSet, parcourt le tableau, puis remplis le tableau à nouveau jusqu’à ce que tous les index soit parcouru. C’est très similaire à la mécanique de for (a in b).

Cette boucle se comporte en tout points comme elle doit se comporter : vous pouvez utiliser break et continue, et même return pour sortir de la fonction :

MFIndexSetForeach(index, indexSet)
{
    if (index % 33) continue;
    if (index % 22) break;
    if (index % 11) return YES;
}

Oh, et les accolades sont optionnelles aussi.

Le code généré par la macro est équivalent à ceci :

NSRange _indexRange = NSMakeRange(0, NSUIntegerMax);
for (NSUInteger index,
     _bufferIndex = _bufferLength-1,
     _indexCount = 0,
     _indexBuffer[_bufferLength];
     _MFIndexSetForeachNextIndex(
         &_bufferIndex, &_indexCount, indexSet, _indexBuffer,
         _bufferLength, &_indexRange, &index);
    )
{
    if (index % 33) continue;
    if (index % 22) break;
    if (index % 11) return YES;
}

_MFIndexSetForeachNextIndex est une courte fonction qui fait tout le travail.

Vous trouverez le code ici : Index Set Foreach


La zone de redimensionnement permet de déplacer les fenêtres dans Lion

Dans le temps de Mac OS 8 et 9, les fenêtres avaient une bordure large et l’on pouvait cliquer et glisser n’importe où sur la bordure pour déplacer la fenêtre à l’écran. Ceci a disparut avec Mac OS X quand les fenêtres ont perdu leur bordure. Mac OS X Lion conservent toujours les fenêtres sans bordure, mais si vous savez où cliquer vous pouvez déplacer plusieurs fenêtres par les côtés.

Ce qui a changé dans Lion est que les fenêtres peuvent maintenant être redimensionnées par tous les côtés. Mais les fenêtres n’ont toujours pas de bordure. Comment ça marche ?

Chaque fenêtre pouvant être redimensionnée est entouré d’une zone tout autour où l’on peut glisser pour effectuer ce redimensionnement. Une partie de cette zone est à l’intérieur de la fenêtre, l’autre partie est à l’extérieur. Vous pouvez observer cette zone en observant le pointeur changer quand vous le déplacez sur le pourtour de la fenêtre.

Si vous ne faites que cliquez sur la zone intérieure (la partie orange dans l’image) mais ne glissez pas, le clic fera ce qu’il fait normalement quand vous cliquez dans cette partie de la fenêtre. Si vous cliquez et glissez, alors la fenêtre se redimensionnera. Sauf qu’il faut glisser dans la bonne direction : si vous cliquez sur la bordure gauche et glissez vers le bas, vous sortirez du mode de redimensionnement et la glisse effectuera ce qu’elle fait normalement à l’intérieur de la fenêtre (dans TextEdit par exemple, ça sélectionnera le texte).

Si vous cliquez dans la zone extérieure (la partie verte et bleu dans l’image), rien ne se produit. Si vous cliquez et déplacez, la fenêtre se redimentionnera. Mais si vous glissez vers le haut ou le bas alors que vous êtes sur un côté vertical, ou glissez vers la gauche ou la droite sur un côté horizontal, vous déplacerez la fenêtre au lieu de la redimensionner. Une fois que la fenêtre a commencé son déplacement, vous pouvez la glissez dans n’importe quelle direction.

Donc la partie bleu dans l’image ci-haut montre où vous pouvez cliquer pour déplacer une fenêtre, à condition que la glisse commence parallèle à la bordure. Notez que ça ne fonctionne seulement qu’avec les fenêtre pouvant être redimensionnées : les autres fenêtres n’ont pas cette zone invisible sur leur pourtour.



  • © 2003–2024 Michel Fortin.