Saturday, September 22, 2012

Windows Vista / 7 - Aero Disabled Due to Mirror Driver

Problem:
Recently I installed some screen sharing software on my computer. After the installation, Windows Aero (the system that handle window decoration, coloring, and transparency) stopped working. When investigating the reason, Windows said it was due to a mirror driver.

If your only interested in the solution, skip down to Solution.

[Geek Out] What is a Mirror Driver:
A Mirror Driver is an alternate driver for the graphics card for the computer. This allows software to capture data at a low level without taking complete screenshots of your desktop as well as other optimizations. Mirror drivers are not compatible with Windows Aero so Windows will disable Aero so your mirror driver will work. Because this is a driver and not running software (more or less), closing the screen sharing application may not restore Windows Aero.

Solution:
Simply disabling the driver fixed the problem. You shouldn't need to uninstall any software to get Aero back up and running. Keep in mind, however, that you will need to enable/disable the mirror driver and restart Windows to get Aero running or the mirror driver running. Since your screen sharing software is dependent on the mirror driver, you will need the driver enabled to use the software.

Solution Guide - Enable/Disable Mirror Driver:

1. First we will need to navigate to the Computer Management console. This can be found by right-clicking Computer from either the Start Menu or your desktop. Choose 'Manage' from the context menu.

2. You should see the Computer Management console. This generally shows by having 3 columns. The far left column will have different areas in which we can manage. Click 'Device Manager'

3. The middle column will load a tree menu of your computer and the various components that make up the system. These components can have drivers. Expand the node called 'Display Adapters'.





4. You will most likely have more than 1 item listed under Display Adapters.

5. Look for an adapter (or driver) that indicates it may be a mirror driver. For me this is 'LogMeIn Mirror Driver'.

6. Right-click this item and select 'Enable' if you wish to use your screen sharing program, or 'Disable' if you wish to restore Aero effects to your desktop.

7. You can now close the Computer Management console and save any existing programs before restarting your computer. You will need to restart in order for this driver to be used or ignored by Windows.

Friday, September 7, 2012

AS3.0 VerifyError: Error #1024: Stack underflow occurred.

Problem:
I recently was publishing an AS3.0 project which was working fine during development testing. Once I published it and loaded in in the browser, the SWF file failed to load properly.

Solution:
First I had to install the debug version of Flash Player so I would be able to see errors that occurred.
Once I had installed this, I was able to see the problem:

VerifyError: Error #1024: Stack underflow occurred.
This can happen for a number or reasons, but my problem happened to be caused by what I call an noncaptured boolean expression.  Basically, it happened because I had this in my code:
DEBUG && trace('[ MainControlMenu ] resolveActionSelection');
The DEBUG variable is a constant that I can set in either the class scope or the project scope and allow me to only trace out certain parts of the application that I was actually working on. This allowed my console to not get cluttered with things that were important just not at this moment in my development.

Ultimately commenting these out or removing them will solve the problem.

Saturday, September 1, 2012

ActionScript 3.0 Binding

Problem:
I wanted to implement the equivalent to:

<fx:Script><![CDATA[
    [Bindable]
    public var str:String = "Default literal";
]]></fx:Script>

<s:Label text="{str}" />

Solution:
Using a ChangeWatcher singleton, I could identify the property I wanted to bind to and the method to call once that value changes. In this example, I use an nameless function, but you could easily use a function name and handle the callback there. Also note that this is self-referential but could reference any object available in this context.

ChangeWatcher.watch(this, "property", function(e:Event):void{
    trace(e.target);
});