iMprOVE_WRAP extension for GameMaker Studio

Today I’ve released a new asset on the YoYoGames Marketplace, called iMprOVE_WRAP.

Many video games have the feature that exiting one side of the screen will “wrap” you around to the opposite side — notable examples of this include the smash hit classics Asteroids and Pac Man. GameMaker: Studio has a GML function, move_wrap(), which is intended to provide this feature easily, but it has a few limitations. iMprOVE_WRAP addresses these limitations, resulting in a more powerful, flexible implementation.

iMprOVE_WRAP improvements over move_wrap()

Wrap behavior is no longer based on the built-in GML speed variables.

One of the most troublesome limitations of move_wrap() is that it only works for instances that have a speed. In standard GML, the variables speed, hspeed, and vspeed are used to move instances. But you can also “move” an instance by changing it’s x and y position in the room, without setting a speed. Many GM:S users will implement their own movement systems that eschew these variables, in order to give themselves complete control over the movement engine. When they do so, they are often confused when they discover that move_wrap() doesn’t do what they expect.

iMprOVE_WRAP eliminates this dependency, so that an instance no longer need to use the GML speed variables in order to wrap; wrap behavior in iMprOVE_WRAP is based entirely on an instance’s x,y position.

iMprOVE_WRAP_animation

Wrap region no longer limited to room borders

Another problem with move_wrap() is that it is intended to work with the Outside Room or Intersect Boundary GML Events. This means that move_wrap() is only useful when an instance moves outside the room, or encounters the edge of a room. But in many games, the “play field” may not be synonymous with the entire room — the room might have a border, or “dashboard” or “heads up display” which ideally should be considered “out of bounds” with regard to the play field.

iMprOVE_WRAP allows you to define a “wrap region” — a rectangular area inside the room, which instances wrap around the borders of, rather than the borders of the room.

Independent horizontal, vertical margins

With move_wrap() the margin argument which determines the margin by which the instance must be outside of the room is the same for both horizontal and vertical travel; with iMprOVE_WRAP the horizontal and vertical margins may be set independently of each other.

Wrapping instances can (optionally) draw themselves on both sides of the border

With move_wrap(), an instance still draws its sprite in the default draw in only one location: at (x,y). If the instance is off the edge of the wrap boundary, but hasn’t yet crossed over, the instance draws on the “pre-wrap” side of the room; after the instance progresses by margin pixels over the border, then the instance’s position is moved over to the “post-wrap” side of the room, and the instance is drawn there. This is not a big deal if the instance crosses the wrap boundary quickly, and has a relatively small sprite; but for slower-moving instances, or instances with larger sprites, it creates a jarring “jump” effect, where suddenly the instance appears on the “post-wrap” side of the boundary, with no real warning, rather than gradually entering the room.

iMprOVE_WRAP solves this by providing a new function, iw_draw_self_wrap(). This new function augments the default draw by drawing the calling instance four additional times, at positions left, right, up, and down from the actual instance, the width or height of the wrap region away from the actual instance. Thus, when your wrapping instance is moving off the edge of the wrap region, one of these extra drawings is poking out on the opposite side, creating an illusion of continuity as the instance leaves one side and emerges from the other.

For a wrap region that is smaller than the room itself, it’s best to do your drawing on a surface that is sized to the area of the wrap region; otherwise the parts of the drawing that should be outside of the region will be visible outside of the wrap region. Alternately, if drawing to a surface is not something you want to do, you can “mask off” the portions of the room outside of the wrap region by layering objects at a higher depth around the border, like a picture frame or dashboard.

Collision detection on both edges of the border

To compliment the iw_draw_self_wrap() function, I’ve added a new collision function, iw_collision_wrap(). This function checks for collisions at the four places occupied by the four drawings drawn by iw_draw_self_wrap(). There are actually two iw_collision_wrap() functions.

The more basic, iw_collision_wrap() sets five instance variables in the calling instance to store the id of any instance in collision: other_center, other_up, other_down, other_left, and other_right.

The more advanced, iw_collision_wrap_map(), returns the id of a ds_map, which holds those same five instance variables as keys, which you can access using ds_map_find_value().

Which to use is up to you, and the style of programming you prefer. iw_collision_wrap() is easier to use, and if you don’t mind the instance variable names, is probably slightly faster at runtime. iw_collision_wrap_map() is for programmers who get pedantic about “correctness” and want their functions to return something, not cause side effects in the application state. Since it’s not possible in GML to have a function return 5 separate values, we return a data structure that stores the five values. The downside of this is that you have some overhead, namely a need to clean up the ds_map when it is no longer needed. Fortunately, it’s not hard. The example project will demonstrate how to do this properly, so don’t worry.

iMprOVE_WRAP is available at the YoYoGames Marketplace for $2.99; however I am making it free for the first 10 downloads. Please rate it and review it if you give it a try!

Get iMprOVE_WRAP

The Vulnerable Android

Recently a story about a vulnerability affecting 95% of Android devices made the rounds. The vulnerability is particularly nasty, in that it can be exploited by sending a SMS message to the target, which in some cases need not even be read by the user, and which can be deleted immediately after the device has been compromised, leaving no visible trace to the user that they have been pwnd. If the thought of this isn’t enough to make you shit your pants, it’s probably because you’re not wearing any. Compounding the problem is the slowness with which cellular carriers typically roll out updates for the phones they sell.

It’s clear that it’s not a top priority for cell carriers to update the software on your handset. If it was, they’d do it in a more timely manner. Once they stop marketing a given model, it becomes increasingly unlikely that they will spend any money in support of it; it becomes their incentive to let your old phone go out of date so that you will have to buy a new handset.

This is clearly not in the interests of the consumer. The distribution model for software updates of the base firmware needs to change. It’s trivial to take app updates from Google Play, but not the Android firmware. For firmware updates, customers have to wait for the carrier to release an update, and then users have to go into the Android settings and find the “check for updates” feature and manually initiate the update, and that’s just crazy. Just as we do not look to our ISP to provide updates for our desktop PC, we should not be looking to our cell provider for these updates either. All devices should have the shortest possible update path — that is, get the update directly from the source of the software. Cell carriers are middle-men who provide packaging, bundling, and distribution, and they need to get out of the way, and let users get updates directly from the software maintainers.

This is especially important when it comes to critical security patches. Customers should not have to root their phone to gain this level of control over a device that they paid for and own.

Consumers should reject business models that call what they buy a “service” or “subscription” or “license” and insist on true ownership. I expect it’s too late for this to change, but that won’t stop me from advocating for it.

Since we do not yet live in this world, Android users need to take steps to mitigate vulnerabilities that they cannot patch.

It’s always a good idea to think about mitigation steps anyway, since it’s always possible for an unknown, undisclosed vulnerability to be present on a system, and so you should always assume that your device is vulnerable, and thus take steps to ensure that if it is compromised, you can accept the consequences of the event. It’s just a little more difficult to come up with mitigation strategies when the vulnerabilities are not known, but not impossible. All that you need to do is use your imagination to think of what could an attacker do with your phone if they got complete access to it, and ask yourself what you can do to minimize the harm and exposure of that.

If you have a smartphone, it’s not much of a stretch to say that You are your phone. Your entire life is in there. Your contacts, photos, web browsing history, your saved passwords, access to your email accounts where you receive password reset requests for all your other accounts. An compromised device also compromises two-factor authentication. If you use two-factor authentication, one of the two “factors” involved is a 1-time key that is sent to your phone via SMS. This, plus your password, are the two “factors” that are supposed to be a more secure form of authenticating than just using a password alone. But if your phone is compromised, and the 1-time key is sent to your phone, and therefore shared with the attacker who pwnd your phone, two-factor authentication is no longer effective at protecting you. And if the attacker can read your password reset request emails, and use them to gain control over your other accounts, that’s a very serious liability. Once your attacker has access to all your accounts, they can deny you access to them, and start impersonating you.

To mitigate these risks, I recommend the following:

  1. Stop treating the google account associated with your android devices as your “home” or “primary” account. Keep the minimum information and stuff in the account that you need in order to make the phone useful for you, and have that account be a “throwaway” account, which you can discontinue using if it gets compromised. I guess that probably means just using it for storing your contacts, and maybe for photos backups.
  2. Do not use the google account associated with your android devices as a point of contact for password resets. Create a secret email just for password resets, and use it only for that purpose. Don’t log into that account from your android device. Of course, most services will send you other mail to the account you use for password resets, so you’ll have a hard time using your password email only for that purpose, but limit your use as much as possible, so you do not become overly reliant on the account for other uses.

Do you have any other ideas for limiting the value of your compromised phone or tablet to an attacker? Comment below with your ideas.

Product Review: Anker 7500mah extended battery for Samsung Galaxy S5

I recently upgraded my phone to a Samsung Galaxy S5, after several years running on a Galaxy SII. While the SII was the best phone I’d had up until that point, there were a number of problems that I had with it, which got especially aggravating toward the end of my time with it. The biggest being ongoing support of the firmware, continually degrading performance over time, necessitating periodic factory resets, and battery life.

Even when brand new, the battery drain on the SII was a serious problem for me, and led to me feeling like I was chained to a power outlet. I’d lose 10% while disconnected from charge for 40 minutes, the length of my commute to work. And yes, I looked in to every conceivable thing you could possible think of to identify causes of drain and do something about them — nothing worked. I bought an extended 3800mah battery for it, which helped a bit, but even so at times I would see the phone draining impressively fast — 1% per minute, on many occasions.

I came to the conclusion that an ideal smartphone should be about an inch thick, and be about 90% battery by weight.

When I went shopping for a new phone, I was really unsure of whether I would want to consider one of the newer generation Samsung Galaxy phones. But ultimately, I selected the Galaxy S5. The non-removable, non-upgradeable battery on the S6 is one of the main reasons why I went with the S5 over the newer model. The other major reason was the lack of a SD card slot on the S6. While looking at extended battery options for the S5, I found that there were a few super-sized batteries offering 5500mah+ — including a 7500mah battery from Anker, and a 8500mah from ZeroLemon.

I went with the Anker for two reasons: the case looked like it would be more comfortable in my pocket, being less bulky if perhaps less armored than the ZeroLemon. And two, the battery was shaped in such a way that it would not block the external speaker, which is an issue with a number of the other extended batteries.

Thankfully, I found that the S5’s battery life on the stock battery wasn’t bad at all, going 10-14 hours on a charge before it got below 20%. That’s almost a full day on the go. But I still wanted to see what it would be like to live completely free of battery anxiety, and this does it for me. Maybe someday they’ll integrate transparent solar cells into the touch screen so that we can charge while using the phone, and at that point a smaller battery might make sense. But I think, minimum, a smartphone with today’s power draw characteristics needs a good 5000mah on tap at a minimum in order to be useful.

With the 7500mah battery from Anker, I am completely satisfied. I have had days where I unplugged at 7am, and didn’t charge it at all throughout the day, used the phone quite a bit, and yet still had a 65% charge by 10pm. Knowing that I don’t have to worry about my battery draining, and can still use my phone, makes me feel like I really have a phone, and not an emergency device to use sparingly if at all. And not needing to stay within 6 feet of a power outlet all the time feels like complete freedom.

anker7500-2 anker7500

It makes the phone heavier and thicker, but these are not a big deal. It’s well worth it to have a phone that I can use all day, and really use, without running the battery critically low in just a few hours. I feel that this should be the standard battery performance for any smartphone. It’s pretty much a must-buy.

The only real downside to the battery is that the way they designed the case, it makes it basically impossible to use the fingerprint reader/heart rate monitor. If you want to use that feature on your phone, you may want to look into a different battery. Samsung makes an OEM extended battery with 3500mah capacity, which, based on the performance I saw from the stock 2800mah battery that came with my phone, is probably adequate for an estimated 16-18 hour day of moderate to heavy phone use. There are some other larger batteries between 3500 and 7500mah from various other manufacturers, but I don’t know how reputable they are, and it’s not uncommon for false, inflated capacity claims from the no-names, so be careful. The Anker, at least, is the real deal. Highly Recommended.

Buy it

Ouya that was

It was announced today that Razer has bought Ouya.

“Razer reportedly plans to continue supporting Ouya’s existing game service for a year.”

“Razer doesn’t seem to be interested in trying to continue Ouya’s original strategy.”

So what does this mean for the users? Razer will continue the Ouya service for another year, and then they are pulling the plug. After that, will an Ouya have any useful purpose? Will it boot? Probably. But you can bet that any updates there might have been for it will not be available any longer. Can users re-install games that they had purchased? It doesn’t sound like it.

Someone will hopefully come up with a solution, a way to back up your Ouya games and run them — at least those titles that do not depend on a live service that they must connect to in order to play at all. Any games that do require a server for the client to access, will probably cease to be playable. Which is a shame. Unless perhaps the services are spun off to some other organization, or released as a product that people can obtained and run on their own hardware. But that seems quite unlikely. What profit would there be in it? The industry has interest only in selling you new product — sorry, services; it’s not fair to call it a “product” anymore when you can’t own what you are paying for — and they have no incentive to compete against what they released a few years ago, even though there might well be a long-tail niche of fans, enthusiasts, and academics who have an interest in keeping it around for amusement or research.

This weekend, I attended the 2015 CCAG Show where gamers, fans, and collectors gathered to exhibit and trade vintage and recent video games, some approaching almost 40 years old. This celebration of living video game history has been going on for 10 years now, and was made possible by the love players have for these games, and the enduring survival of the physical medium into which they were encoded. Will there be anything like this for Games as a Service consoles and mobile devices? It seems very doubtful. Once the vendor no longer wants to support the product, they will shut it down, the lights will die, and the party is over, the attendees left standing around in the dark, shuffling to music that is no longer playing, wondering what it all meant, or if it even happened at all.

Historians such as Jason ScottHenry Lowood, and others engaged in the struggle to preserve the history of the culture and industry of video games can do a great deal when it comes to archiving media and emulation of hardware, but when it comes to service-based business models, it becomes difficult if not impossible to envision how these things can be preserved so that future generations will be able to look back and see what was, and understand how we got here. The users only have access to the client side, and the service side is not only out of their reach, licensed for use but not owned, but it changes and evolves over time.

The ultimate laptop: retro modern ThinkPad

Lenovo started listening to years of ThinkPad fans griping yesterday.

Ars Technica picked up the story, and people are discussing it, really exited about the idea.

Yesterday I talked about what would make the perfect keyboard for my dream laptop.

Today I’ll talk about the features that I’d love to see on a new ThinkPad that harkens back to the best days of the product line.

Screen

  1. 15.4″ (but by all means, produce a full line of different sized ThinkPads with different screen sizes: 11″, 13″, 15″, 17″…)
  2. 16:10 aspect ratio — this is a MUST
  3. 10-bit IPS panel with at least up to 3K resolution
  4. glare-free matte surface, not glossy.
  5. not a touch screen (but I’m ok if it’s a configuration option at purchase)

Chassis

  1. Rugged, metal frame — aluminum, magnesium, or titanium
  2. Rubberized black paint finish
  3. Easy to work on. Repairing/replacing or upgrading the keyboard, RAM, and hard drive should be as easy as they were on the T61p.
  4. RAM slots sufficient to support at least 32GB of RAM
  5. Support ultrabay hard drive carrier
  6. Door/sliding cover for webcam for paranoid folks
  7. Sliding latch to securely hold lid closed
  8. Weight and thickness not primary concern, should not constrain design or compromise durability or features.
  9. Removable battery with sufficient capacity to run laptop for at least 12 hours of heavy, active use, on a charge — 18 hours would be even better. Yeah, a big bulky heavy battery. What good is the ultimate laptop if you can’t use it because it’s out of juice?

Ports

  1. Modern everything. HDMI-out or Display Port out instead of VGA. USB 3.0 slots (at least four of those).
  2. Gigabit ethernet (of course).
  3. Optional for SD card reader slot
  4. Full size slots, nothing proprietary or minimized for space

The Best Laptop Keyboard Yet Devised By Humankind

Laptop ergonomics are always a compromise. If you put in long hours on a laptop, you know how important comfort and usability are to productivity. So getting the best possible ergonomics given the constraints imposed by the design requirements is extremely important.

It seems many hardware design engineers have forgotten this. The quest for thinner, lighter, cheaper seems to have overshadowed comfort and usability, durability and ruggedness. With each passing hardware generation, we see the same refrain: “The new keyboard is not so bad, once you get used to it.” If we have to get used to a “not-so-bad” keyboard with every generation, doesn’t that suggest that they’re getting worse over time?

And yet, the keyboard is the one component of a laptop that you have the least configuration options for. There are no choices, no upgrades; the keyboard is the keyboard, and you get whatever the manufacturer designed. That means it’s all the more critical that manufacturers give their customers the best possible keyboard.

What if manufacturers gave us keyboards that didn’t take “getting used to”, but felt fantastically comfortable from the moment you used them?

Without a doubt, the best keyboard I have ever seen or used on a laptop has been the keyboard of my Lenovo ThinkPad T61p. It’s no secret, and everyone who’s used one knows how good they are and how far short any other laptop keyboard compares. This keyboard is so good that I’ve continued to use my T61p originally purchased in 2007. After my original T61p died this January, I shopped around looking at the new ThinkPads… and after looking at what was available, I went to eBay and bought myself another T61p.

I won’t be able to do that forever. Already, I feel a need for a machine that can support more than 8GB of RAM, and the new Core i7 CPUs are so much faster than my by-no-means inadequate 2.4GHz Core 2 Duo. And the battery life we see with the current generation of “ultrabooks” in 2015 is impressive.

Will we ever see a return to the keyboards of yore? It wish that it was not in doubt. But I have hope. It appears that Lenovo has finally responded to customer feedback, when this spring they brough back the old style trackpads with physical buttons that had disappeared with the 540 generation. And today, it appears that they are actively soliciting fans of the old ThinkPad brand to ask them what features made the old ThinkPad so legendary. And they updated the X1 Carbon with a more standard keyboard layout in response to complaints and criticism over a senseless radical departure from the norm. Perhaps we’ll glimpse perfection again someday.

To be sure, we will not if we fail to recognize the things that made the best keyboard so great.

Close to perfection

Behold, The T61p keyboard in all its glory.

T61 keyboard - crop

Let’s take a look at what makes this keyboard so great.

The Good

Full-size keys, spaced the correct distance apart. This makes typing for long periods of time less tiresome, especially for people with larger hands.

Scissor Switch technology allows for longer travel for a laptop keyboard, which is more comfortable than “chiclet” keys. It’s not a full height keyboard like you’d find on a desktop class machine, but it’s very close, giving it a good feel and making it more comfortable again for long typing sessions.

The layout of the non-standard keys is ideal.

It’s important to appreciate how critical the placement of these keys is. Let’s look at them in detail.

A full row of Function Keys, F1-F12. In many newer layouts, this row is eliminated and the F-keys are combined with other keys. This makes compound keystrokes impossible if the F-key needs to be pressed at the same time as the key it is combined with. That’s probably pretty rare, but it is still nice to have this row of keys to themselves. I think keyboard designers eliminated this row in order to make room for larger trackpads. I don’t like large trackpads for a few reasons, which we’ll get into in the Trackpad section.

A full row of real F-keys

The arrow key cluster. Most importantly, the arrow keys are all full-sized, and arranged in a T. Many keyboards save a key by squishing the up and down arrow keys into the space of a single key, putting all four arrow keys in a line, but this space savings comes at a cost of making up and down half sized, and makes controlling games that use the arrow keys way harder.

The other important thing about this cluster is the presence of the “Previous page” and “Next Page” buttons to either side of the up arrow. These are often replaced with “Pg Up and Pg Dn” buttons. I like “previous” and “next” here because it makes navigating web pages with this cluster very fast. I don’t have to move my fingers at all and I can scroll and hit the Back button or Forward button in a web browser. It’s very convenient, and I really miss it whenever I have to use a keyboard that doesn’t have this layout.Arrow Keys + Fwd-Bck buttons = awesome document & browser navigationThe Insert|Delete|Home|End|PgUp|PgDn cluster. I really like these where they are, too. Home and End and PgUp and PgDn go very naturally together. These are navigational shortcuts and are a great alternative to scrolling with the mouse wheel, and for moving the cursor when text editing. Insert and Delete change the cursor mode, Home and End can take you to the beginning or end of a line of text, while Ctrl+Home or Ctrl+End will take you to the beginning or end of the entire document. Pg Up and Pg Dn are better for scrolling than the mouse is, moving an entire window height up or down at a single keystroke. Clustering them in this arrangement makes for very intuitive and quick document navigation using the cursor, and enables me to be much more productive when working in text files or reading than if I have to move my hand to the trackpad or mouse.

Insert-Delete-Home-End-PgUp-PgDn = logical layout perfection

Print Screen, Scroll Lock, and Pause/Break. These don’t get used a whole lot by most people. I use Print Screen all the time, but the other two hardly at all. Putting them up here out of the way works. Having Print Screen at the end of the row makes it easy to find by touch, without having to take my eyes off the screen to look for it.

PrScnSysRq-ScrLkNumLock-PauseBreak

While we’re looking at this group, note the power button (the circular button at left.) While not part of the keyboard, proper, I will remark that I found the power button difficult to find by touch. If I’m fumbling around in the dark, it’s easier to find the ThinkVantage key, which feels more like I’d expect the power button to feel like. So, one thing I could recommend is change the power button, locating it closer to a corner of the keyboard, and give it a shape and feel more befitting a power button.

Keycaps shape and feel

All the keys are just shaped right. These keycaps are close to what old classic IBM Selectric typewriters and Model M keyboards felt like, and those were some of the best keyboards ever manufactured
The best type of keys for a laptop

The Enter key isn’t L-shaped, which leaves room for the \| key directly above. The \| key doesn’t really have a reason to be larger, but it keeps symmetry with the Tab key on the left side, and helps a touch typist feel this edge of the keyboard. Esc isn’t double-sized, as it is on some later model Lenovo keyboards — I think making it the size of the Ctrl key, slightly larger than the standard key, would make it easier to find by touch. Ctrl is slightly wider than standard, but I like that, although it would be better if Ctrl were in the position occupied by Fn, where it belongs. Backspace is another good key to be larger than standard, as it is used frequently by most, and this makes it easier to find in the top right corner.

Nitpicks

Fn/Ctrl positions should be swapped

On most keyboards, the Fn key is nested between the Ctrl and Windows keys. On the T61p layout, this is reversed. There’s no reason for it, and it’s one of the most common complaints about the T61 layout. In fact, there are even third party firmware hacks to remap the keys into their preferred positions: Ctrl outside, Fn to the right. In the ideal keyboard layout, Ctrl should go first.

switch Ctrl-Fn positions

Controversial items

10-Key or not 10-Key?

Many widescreen laptops have 10-key keyboards these days, much like 104-key extended keyboards on desktop keyboards. This forces the main keyboard off-center with respect to the screen. Thankfully, the trackpad is still centered under the space bar, keeping it directly between the hands on most laptops with extended keyboards that incorporate a 10-key pad. But typing on the QWERTY keyboard, with the hands offset relative to the screen is less comfortable. The extra keys of the 10-key pad also add to the complexity and cost of the keyboard.

Most users don’t need a 10-key pad, and can live without. Unless you’re doing heavy numerical data entry, they don’t add a lot of value. You could always buy a USB 10-key pad as a peripheral and use that if you needed one. Before laptops started sporting 10-key pads on the right of the main keyboard, they used to use the Fn key to use the right half of the keyboard as a sort of slanted 10-key option. I’ve never bothered switching into this mode, and don’t miss a 10-key pad. So, my preference would be for a regular QWERTY keyboard, without a 10-key pad, and the QWERTY keyboard and touchpad centered in the laptop chassis.

Still, some people will want 10-key pads and others will not — and the number who do not is not inconsequential. But the number of people who can’t live without a 10-key pad is smaller than the number of people who don’t need it. I would prefer not to have a 10-key pad in my ideal laptop. This would be a good item to make a configuration option at time of purchase. Modular, interchangeable keyboard FRUs that have or omit the 10-key pad would be a great solution.

Are backlit keyboards necessary?

Again, some people like them, and some don’t. Illuminated keys can be helpful when typing in low light conditions, but they drain battery and add cost to manufacturing, although probably not significantly, since most laptop keyboards seem to use them these days. Most of them have an option to turn the backlight off and adjust the brightness level, and this seems to be the best choice. It enables everyone to be happy. On laptops which have this feature, I just turn the backlight off, and touch type as always.

Which type of switches is the best?

This is subjective and people can have their own opinions. These days, there are three main types of keyboard: chiclet, dome, and buckling spring. The T61p keyboard had scissor switches, a type of dome switch. These work and feel great — almost as great as buckling spring switches.

I find “chiclet” keys to be fine, I can use a chiclet keyboard without issue, and type fast and with confidence with them, but I still prefer the feel of the scissor switch keys on my T61p. Some people prefer the lower travel of the chiclet key, and manufacturers favor them today because they enable thinner designs. But I really prefer the feel of the full travel key caps, and the scissor switches in the T61p keyboard give a closer approximation of the way full travel keyboards feel.

The biggest disadvantage of the scissor-switch keyboard is that it adds to the overall thickness of the machine, but I strongly believe that thinness is a highly overrated feature. With ultra-thin laptops approaching 0.5 inches, there’s not much room left to go thinner. And there’s plenty of leeyway for making a laptop a little thicker to allow for a better keyboard. The T61p is 1.4 inches thick, and I’ve never once felt that it was an issue. I would much rather have a thicker, heavier laptop that is more rugged and will hold up to years of heavy use, an has more room for expansion or battery, than a ultra thin and light laptop.

Really, though, on the switch type, I could go either way. Chiclet keys feel nice enough to be acceptable, but for longer typing sessions I truly like the additional travel and resistance of scissor switches. This is an area where making it a configurable option would be nice. A modular, interchangeable FRU keyboard offering the user their choice of chiclet or scissor switch keys would make everyone happy.

Pointing devices

While we’re at it, let’s look at the pointing devices. First, we have the TrackPoint stick, the red nub. People who use them really love them, and they don’t get in the way of people who don’t. They’re a vital part of the ThinkPad brand and image, and should never be done away with.

Next, we have the touchpad. The touchpad is surrounded top and bottom with phyisical mouse buttons. these are well designed and robust. Positioning them top and bottom is important because it makes them reachable to both the thumb and fingers, regardless of where the hand is positioned on the keyboard or touchpad, which makes using the buttons quicker. We also see a middle mouse button, which is useful for Linux users.

As for the touchpad itself, it is only 2.25 x 1.5 inches — which is ideal. Newer generation notebook PCs have trended toward larger touchpads, but I really prefer this smaller size. It is not so large that it becomes an easy target for accidental bumps by the palm of the hand. I never accidentally brush the touchpad on my T61p with the heel or palm of my hand when typing, which means I never accidentally click the mouse cursor away from where I’m typing. I do have this problem on many newer model laptop keyboards, and it is a huge annoyance.

The touchpad is not multi-touch capable, and that would be a good improvement to add to this design. It does have scroll regions at the right and bottom edge, which are configurable.

The UltraNav touchpad driver is excellent, with lots of configuration options to get it to work just how the user prefers.

T61-trackpad

What else?

It’d be great if keyboards were more interchangeable in laptops, across different models and manufacturers. It would take a great effort of the industry to standardize the top half of all laptop chassis to have the same shape and size space for a keyboard. But there’s no reason it couldn’t happen, if manufacturers decided to standardize, or if a manufacturer decided standardize within their own product lines. The computer industry has standardized on other things, so why not a standard to allow laptop keyboards to be more interchangeable between different models and makers? This could spur innovation in improving keyboards, since users would not longer be stuck with whatever the designers engineered for a particular model — users would be free to upgrade and choose the style and layout that they prefer.

I doubt that it will happen on an industry-wide level, that we’ll be able to buy generic commodity keyboards from any maker and put it into any laptop, there’s just too much inertia for it. But it could happen if the industry decided it wanted to. Even if it didn’t want to, manufactures could standardize more within their own model lines, and offer a greater variety of keycap types and layouts to satisfy the preferences of different customers. I expect the main reasons they don’t do so have to do with cost, and to some extent integration and aesthetics issues. But these are not insurmountable issues.

For me, a better keyboard is still well worth paying some premium for. A keyboard that doesn’t feel cramped, has a familiar layout for ALL keys, and a satisfying feel, for me, would be something I’d easily pay another $50-100 for, if it were an option to purchase an upgraded keyboard that was just the way I like it.

Mouse Double Click extension for GameMaker Studio provides double-click detection

Mouse Double Click is an Extension that provides two new GML functions, mouse_doubleclick_init() and mouse_check_doubleclick() 

Written in pure GML, these new functions round out the built-in Mouse functions, allowing you to easily check for double-click events.

To use it, first call the mouse_doubleclick_init() function in the Create event for the object that will be handling click actions. This creates an instance variable used to perform timing checks for the double-click, like so:

//Create Event:
mouse_doubleclick_init();

In a Step or Mouse event, call mouse_check_doubleclick(), passing in parameters for the mouse button to test for, and the doubleclick delay in microseconds (1/1,000,000th of a second).

//Mouse Event
mouse_check_doubleclick(mb_left, 250000); //250000 microseconds = 1/4 of a second

mouse_check_doubleclick() will return true if there were two clicks within the duration specified by the second argument, and false if no double click is detected.

That’s all there is to it.