<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>millennium | ten</title>
    <link rel="alternate" type="text/html" href="http://www.bengoodger.com/" />
    <link rel="self" type="application/atom+xml" href="http://www.bengoodger.com/atom.xml" />
   <id>tag:www.bengoodger.com,2008://2</id>
    <link rel="service.post" type="application/atom+xml" href="http://www.bengoodger.com/mt/mt-atom.cgi/weblog/blog_id=2" title="millennium | ten" />
    <updated>2008-09-27T13:15:32Z</updated>
    <subtitle>A Weblog by Ben Goodger</subtitle>
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type 3.2</generator>
 
<entry>
    <title>Aarhus</title>
    <link rel="alternate" type="text/html" href="http://www.bengoodger.com/2008/09/rhus.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.bengoodger.com/mt/mt-atom.cgi/weblog/blog_id=2/entry_id=117" title="Aarhus" />
    <id>tag:www.bengoodger.com,2008://2.117</id>
    
    <published>2008-09-27T13:14:13Z</published>
    <updated>2008-09-27T13:15:32Z</updated>
    
    <summary>I am in Denmark this week....</summary>
    <author>
        <name>Ben</name>
        <uri>http://www.bengoodger.com/</uri>
    </author>
    
    <content type="html" xml:lang="en" xml:base="http://www.bengoodger.com/">
        <![CDATA[<p>I am in Denmark this week.</p>]]>
        
    </content>
</entry>
<entry>
    <title>Writing a Custom Window Frame</title>
    <link rel="alternate" type="text/html" href="http://www.bengoodger.com/2008/09/writing_a_custom_window_frame.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.bengoodger.com/mt/mt-atom.cgi/weblog/blog_id=2/entry_id=116" title="Writing a Custom Window Frame" />
    <id>tag:www.bengoodger.com,2008://2.116</id>
    
    <published>2008-09-17T06:18:28Z</published>
    <updated>2008-10-09T04:30:52Z</updated>
    
    <summary>In Chromium, we use custom frame windows on Windows XP, and on Windows Vista without DWM compositing enabled. We do something slightly different when DWM compositing is turned on, which I&apos;ll cover in a separate post. Right now, I&apos;m going...</summary>
    <author>
        <name>Ben</name>
        <uri>http://www.bengoodger.com/</uri>
    </author>
    
    <content type="html" xml:lang="en" xml:base="http://www.bengoodger.com/">
        <![CDATA[<p>In Chromium, we use <a href="http://dev.chromium.org/user-experience/visual-design">custom frame windows</a> on Windows XP, and on Windows Vista without DWM compositing enabled. We do something slightly different when DWM compositing is turned on, which I'll cover in a separate post. Right now, I'm going to focus on how we built and are building the custom window frame for Windows XP. There are two components to this work, rendering the contents of the window and making Windows happy.</p>

<p><strong>Rendering</strong></p>

<p>To render the UI, including the browser window chrome, we use a lightweight UI framework that we call <a href="http://dev.chromium.org/developers/design-documents/chromeviews">ChromeViews</a>. ChromeViews is a set of C++ classes that provides a layout, rendering and event processing system similar to <a href="http://developer.apple.com/documentation/Cocoa/Reference/ApplicationKit/Classes/NSView_Class/Reference/NSView.html">NSView</a>, and the rendering classes used by popular layout engines like WebKit and Gecko. At the core is the concept of a <a href="http://src.chromium.org/viewvc/chrome/trunk/src/chrome/views/view.h?view=markup">View</a>, which simply represents a rectangle. This rectangle can paint itself, lay out child views, and receive various kinds of events based on user input. By subclassing this View object we are able to develop the various bits of UI that Chrome uses. Each window is composed of a hierarchy of these View objects. The bridge between the native OS window and the View hierarchy is an object called a <a href="http://src.chromium.org/viewvc/chrome/trunk/src/chrome/views/view_container.h?view=markup">ViewContainer</a>, which hosts the <a href="http://src.chromium.org/viewvc/chrome/trunk/src/chrome/views/root_view.h?view=markup">RootView</a> that owns the hierarchy. The ViewContainer is an abstract interface that is typically implemented by <a href="http://src.chromium.org/viewvc/chrome/trunk/src/chrome/views/hwnd_view_container.h?view=markup">HWNDViewContainer</a>, which wraps a windows HWND. The window procedure for this HWND receives various messages, translates some into ChromeViews events and fires them into the hierarchy, paints the Views into a bitmap device context using a graphics API called <a href="http://src.chromium.org/viewvc/chrome/trunk/src/skia/">Skia</a>, and does various other things to make Windows happy.</p>

<p>Let's take a look at the browser window,  since it's an interesting and complex example of a custom frame window. At the top level there's a View called the RootView that contains the rest of the browser UI. Nested in layers beneath this are other Views like the TabStrip, the ToolbarView, Buttons, and so on and so forth.</p>

<p>But rendering the contents of the window is only part of the story. Since we wanted a custom look for our UI, we wanted to draw our own title bars and sizing borders too. In fact, for our browser window, we wanted to do something even stranger - we wanted to have the tabs living up in the title bar of the window - where they'd form the distinctive "skyline" of the browser. On Windows, the window title bar (called the "caption"), the sizing borders and other window controls are referred to as the "non-client area". The stuff inside them is called the "client area". We were throwing a spanner into works by having a non-rectangular client area that intrudes into the non-client area.</p>

<p>The first step was to keep things simple. We don't treat the non-client area as a separate set of stuff to paint. Rather, the non-client area is just another View in the same hierarchy that hosts the contents of the window. This had some implications though on how we implemented a ViewContainer that could host this view hierarchy to match the look we wanted.</p>

<p><strong>Keeping Windows Happy</strong></p>

<p>In the first implementation, which is what was shipped with the Google Chrome beta by the way, we create a Windows HWND with very basic window styles - because the ChromeViews hierarchy contained within is providing all the non-client area, we wanted to suppress things like WS_CAPTION etc. To make the portions of the window title bar area not occupied by tabs act like a title bar though, messages like WM_NCHITTEST were handled to determine if the mouse was in fact in a blank area, and if so HTCAPTION was returned. On the trunk now we are now somewhat more sophisticated about this - we establish hit-test masks for the tabs that closely follow their shape such that clicking in the blue area where two tabs meet is treated like a click to the title bar!</p>

<p>Because we weren't a frame window, some things like window resizing had to be implemented by hand. This had some undesirable side-effects: when Windows resizes a window it runs a modal loop that synchronously paints the window(s) being revealed... but with our system based entirely on the user dragging the mouse this didn't happen, and so we left artifacts behind as Windows caught up later and repainted the revealed window. We also found we didn't work well with Windows' built in window management features (e.g. window tiling) and various window manager extensions like SplitView didn't work because we either didn't have the appropriate window styles or just did things a little differently. The ViewContainer implementation for the browser window in the Chrome beta is called XPFrame.</p>

<p>This is where a new set of ChromeViews ViewContainers stepped in. Dialog boxes in Chrome on Windows XP are actually hosted in a different kind of window called a <a href="http://src.chromium.org/viewvc/chrome/trunk/src/chrome/views/custom_frame_window.h?view=markup">CustomFrameWindow</a>. This derives (via a class called Window) from HWNDViewContainer, a general purpose ViewContainer that wraps a HWND. Here's what CustomFrameWindow does differently:</p>

<ul>
<li>Bears the WS_CAPTION, WS_THICKFRAME, and WS_OVERLAPPED window styles, as well as the WS_EX_WINDOWEDGE and WS_EX_APPWINDOW extended styles. By having these styles, CustomFrameWindow gets a lot of the functionality that XPFrame had to do by hand for free (such as specifying the contents and enabled-state of system menu items). This did mean however some gymnastics when painting.
<li>Handles WM_NCCALCSIZE, passing the bounds of a "ClientView" as the bounds of the client area. This rectangle is smaller than the window rectangle, just like for a standard top level window. In XPFrame, the client area bounds were equal to the window bounds.
<li>Handles WM_NCHITTEST, doing more comprehensive checks to determine if the mouse is over the sizing borders etc. Doing this allows the CustomFrameWindow to be moved and sized by Windows, with all the painting benefits that come with this.
<li>Handles WM_NCPAINT, to make sure the client area is painted synchronously with the non-client area, to prevent effects where the window frame appears to "snap in" around its contents.
<li>Handles WM_NCLBUTTONDOWN, to make sure clicks to the non-client areas specifying the window controls are translated into events that are sent to the relevant ChromeView.
<li>Handles WM_SETCURSOR, to make sure the sizing cursors are set for various hit-test codes.
<li>Handles the undocumented <a href="http://www.bengoodger.com/2008/09/the_joy_of_custom_window_frame.html">WM_NCUAHDRAWCAPTION and WM_NCUAHDRAWFRAME</a> messages to suppress excessive flickering in the title bar area.
<li><strong>Update:</strong>Handle a growing list of messages, starting with WM_SETTEXT and WM_ENTERMENULOOP, removing the window's WS_VISIBLE style, calling the default window procedure and then adding the WS_VISIBLE style back. Why? Well, sometimes the window gets into a state (not reproducible via a repeatable set of steps, but always eventually) where it begins to paint the standard non-client title bar and controls over the one you rendered. Windows doesn't do this in its default WM_NCPAINT handler, rather it does it directly in its default handlers for these messages. You need to handle these messages and fake invisibility to convince Windows not to do it. If anyone knows other messages that this rule applies to please let me know!
</ul>

<p>CustomFrameWindow also taps in to a lot of the benefits offered by the <a href="http://src.chromium.org/viewvc/chrome/trunk/src/chrome/views/window.h?view=markup">Window</a>/<a href="http://src.chromium.org/viewvc/chrome/trunk/src/chrome/views/window_delegate.h?view=markup">WindowDelegate</a>/<a href="http://src.chromium.org/viewvc/chrome/trunk/src/chrome/views/non_client_view.h?view=markup">NonClientView</a>/<a href="http://src.chromium.org/viewvc/chrome/trunk/src/chrome/views/client_view.h?view=markup">ClientView</a> framework we use for our dialog boxes. As an example, the shape of our window is actually slightly different from the standard Windows shape. Windows supports rounded corners on its windows with 1-bit transparency by using window regions. This is used on Windows XP Luna to provide rounded corners at the top left and right of each window. We use a custom radius, and the ChromeViews framework allows us to easily specify a custom window shape by creating a Skia path.</p>

<p><strong>Conclusion</strong></p>

<p>In developing frameworks for building UI in Chromium, we've found that trying wherever possible to do what Windows expects means less code, better display integrity and performance, and that the more subtle features some users expect "just work". </p>

<p>A lot of what I've described are things that relate closely to Chromium source code, and design decisions that we've made to meet the objectives we've set for ourselves, and as such they may not be directly applicable to other work. But I do think many of the issues addressed in the implementation of the CustomFrameWindow ViewContainer are potentially useful to others developing custom user interfaces on Windows, especially considering the documentation for some of the things we had to do here is non-existent aside from postings similar to this!</p>

<p>If you've done work like this before, I'd be interested in hearing your thoughts on our approach. Maybe you have some good stories to share!</p>]]>
        
    </content>
</entry>
<entry>
    <title>The Joy of Custom Window Frames</title>
    <link rel="alternate" type="text/html" href="http://www.bengoodger.com/2008/09/the_joy_of_custom_window_frame.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.bengoodger.com/mt/mt-atom.cgi/weblog/blog_id=2/entry_id=115" title="The Joy of Custom Window Frames" />
    <id>tag:www.bengoodger.com,2008://2.115</id>
    
    <published>2008-09-12T01:04:30Z</published>
    <updated>2008-09-23T03:50:19Z</updated>
    
    <summary>A colleague and I were looking at an interesting bug today. For a little while I&apos;ve been working on some new frames for the Chromium browser window. These frames are based on the CustomFrameWindow/Window ChromeViews classes that we use to...</summary>
    <author>
        <name>Ben</name>
        <uri>http://www.bengoodger.com/</uri>
    </author>
    
    <content type="html" xml:lang="en" xml:base="http://www.bengoodger.com/">
        <![CDATA[<p>A colleague and I were looking at an interesting bug today. For a little while I've been working on some new frames for the Chromium browser window. These frames are based on the <a href="http://src.chromium.org/viewvc/chrome/trunk/src/chrome/views/custom_frame_window.cc?view=markup">CustomFrameWindow</a>/<a href="http://src.chromium.org/viewvc/chrome/trunk/src/chrome/views/window.cc?view=markup">Window</a> ChromeViews classes that we use to contain much of the UI. Anyway the frames handle various windows non-client messages to implement Chromium's custom looking UI while still using the standard window styles expected of a resizable top level frame window, so that other system level window management functionality works properly (and window management add-ins like <a href="http://www.splitview.com/">SplitView</a> work better too).</p>

<p>One issue preventing the frames from being turned on on the trunk is an annoying flicker in the title bar when switching tabs (or loading a page, or doing just about anything that causes painting to happen near the top of the window). It wasn't happening in an easily reproducible fashion, however it nearly always happened after using the browser for a while. You'd switch tabs and it looked like Windows was trying to paint the standard windows title bar. Then our custom code would kick in and paint our window contents, which would result in an ugly flash.</p>

<p>After trying some elementary logging and poking around in our <code>WM_NCPAINT</code> handling, we looked at the message log sent to each window as the tab was switched, and compared that against the message log sent to a window using the old frames.</p>

<p>The new frames received this string of messages:<br />
<code><br />
S WM_COMMAND wNotifyCode:0400 wID:36648 hwndCtl:073C0244 [wParam:04008F28 lParam:073C0244]<br />
R WM_COMMAND lResult:00000000<br />
S WM_ERASEBKGND hdc:9D0164EB [wParam:9D0164EB lParam:00000000]<br />
R WM_ERASEBKGND fErased:True [lResult:00000001]<br />
S WM_SETTEXT lpsz:0012E8B8 ("Netvibes (200) - Chromium") [wParam:00000000 lParam:0012E8B8]<br />
S message:0x00AE [Unknown] wParam:00000008 lParam:00000000<br />
S WM_GETTEXT cchTextMax:510 lpszText:0012D730 [wParam:000001FE lParam:0012D730]<br />
R WM_GETTEXT cchCopied:25 lpszText:0012D730 ("N") [lResult:00000019]<br />
R message:0x00AE [Unknown] lResult:00000000<br />
</code></p>

<p>The first <code>WM_COMMAND</code> is the Ctrl+PageUp sent to the window when I switched to the previous tab. Then comes the background erase message <code>WM_ERASEBKGND</code>. At this point code in <code>BrowserView2</code> updates the native window title using <code>WM_SETTEXT</code>. This is done so that the Windows Taskbar title is in sync with the newly selected tab. Then things get interesting.</p>

<p>We receive an "[Unknown]" message <code>0x00AE</code>, which wraps a <code>WM_GETTEXT</code> message. This message is <em>not</em> sent to the window using the old frames. I theorize that the <code>WM_GETTEXT</code> is being called from some Windows routine that's painting the native titlebar. Since this is all asynchronous that explains the flashing.</p>

<p>A quick Google search reveals that in fact yes, this mystery message <code>0x00AE</code> is the cause of the problem. Under the hood it maps to <strong><code>WM_NCUAHDRAWCAPTION</code></strong>, which is not <code>#defined</code> in winuser.h. It has a sibling <code>0x00AF</code> (which apparently maps to <strong><code>WM_NCUAHDRAWFRAME</code></strong>). The <a href="http://www.google.com/search?rlz=1C1GGLD_enUS285&sourceid=chrome&ie=UTF-8&q=WM_NCUAHDRAWCAPTION">forums I found</a> discussing this message all suggest that if you are drawing a custom frame (as we are with Chromium), then you must handle these messages to prevent <code>DefWindowProc</code> from doing it (and trying to paint the caption).</p>

<p>I have applied this change now to <code>HWNDViewContainer</code> and <code>CustomFrameWindow</code>, and things are going smoothly! I'm hoping that the code in ChromeViews will be a good reference for others wanting to build custom window frames on Windows, since the pathway here is far from clear. I may do another post later on describing all the things that need to be done, but in the mean time you can just look at the code in <a href="http://src.chromium.org/viewvc/chrome/trunk/src/chrome/views/custom_frame_window.cc?view=markup">custom_frame_window.cc</a>/<a href="http://src.chromium.org/viewvc/chrome/trunk/src/chrome/views/custom_frame_window.h?view=markup">h</a> and go from there. At the very least, we are another step closer to turning on <code>--magic_browzR</code> by default!</p>]]>
        
    </content>
</entry>
<entry>
    <title>Google Chrome &amp; Chromium</title>
    <link rel="alternate" type="text/html" href="http://www.bengoodger.com/2008/09/get_google_chrome.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.bengoodger.com/mt/mt-atom.cgi/weblog/blog_id=2/entry_id=114" title="Google Chrome &amp; Chromium" />
    <id>tag:www.bengoodger.com,2008://2.114</id>
    
    <published>2008-09-03T00:16:28Z</published>
    <updated>2008-09-23T03:50:59Z</updated>
    
    <summary>Google Chrome has launched, download it now. The source is available under a permissive BSD style license. Find out more at the Chromium website and blog. I love browsers, and so I&apos;m really excited that this project and the amazing...</summary>
    <author>
        <name>Ben</name>
        <uri>http://www.bengoodger.com/</uri>
    </author>
    
    <content type="html" xml:lang="en" xml:base="http://www.bengoodger.com/">
        <![CDATA[<p><a href="http://googleblog.blogspot.com/2008/09/fresh-take-on-browser.html">Google</a> <a href="http://www.google.com/chrome/intl/en/features.html">Chrome</a> <a href="http://www.mattcutts.com/blog/download-google-chrome-browser-beta/">has</a> <a href="http://news.google.com/?ncl=1241595050&hl=en&topic=h">launched</a>, <a href="http://www.google.com/chrome">download it now</a>. The source is available under a permissive BSD style license. Find out more at the <a href="http://www.chromium.org/">Chromium website</a> and <a href="http://blog.chromium.org/">blog</a>.</p>

<p><a href="http://www.bengoodger.com/plate.jpg">I love browsers</a>, and so I'm really excited that this project and the amazing team that I've been lucky enough to be a part of has finally shipped.</p>]]>
        
    </content>
</entry>
<entry>
    <title>Goodbye Fake Steve, Hello Linux Hater</title>
    <link rel="alternate" type="text/html" href="http://www.bengoodger.com/2008/07/goodbye_fake_steve_hello_linux.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.bengoodger.com/mt/mt-atom.cgi/weblog/blog_id=2/entry_id=113" title="Goodbye Fake Steve, Hello Linux Hater" />
    <id>tag:www.bengoodger.com,2008://2.113</id>
    
    <published>2008-07-10T22:09:04Z</published>
    <updated>2008-09-23T03:51:29Z</updated>
    
    <summary>Fake Steve may be closing shop, but at least we now have Linux Hater......</summary>
    <author>
        <name>Ben</name>
        <uri>http://www.bengoodger.com/</uri>
    </author>
    
    <content type="html" xml:lang="en" xml:base="http://www.bengoodger.com/">
        <![CDATA[<p>Fake Steve may be <a href="http://fakesteve.blogspot.com/2008/07/i-am-so-friggin-high-its-not-funny.html">closing shop</a>, but at least we now have <a href="http://linuxhaters.blogspot.com/">Linux Hater</a>...</p>]]>
        
    </content>
</entry>
<entry>
    <title>Updaters</title>
    <link rel="alternate" type="text/html" href="http://www.bengoodger.com/2008/03/updaters.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.bengoodger.com/mt/mt-atom.cgi/weblog/blog_id=2/entry_id=109" title="Updaters" />
    <id>tag:www.bengoodger.com,2008://2.109</id>
    
    <published>2008-03-21T22:23:44Z</published>
    <updated>2008-09-23T03:52:41Z</updated>
    
    <summary>Back when we were building the Application Update Service for Firefox 1.5, I decided it would be a good idea to show users an informational dialog box letting them know that an update was available, and that they would be...</summary>
    <author>
        <name>Ben</name>
        <uri>http://www.bengoodger.com/</uri>
    </author>
    
    <content type="html" xml:lang="en" xml:base="http://www.bengoodger.com/">
        <![CDATA[<p>Back when we were building the Application Update Service for Firefox 1.5, I decided it would be a good idea to show users an informational dialog box letting them know that an update was available, and that they would be updated the next time they restarted. This turns out to have been one of those miserable user interface decisions that as a developer you really wish you hadn't made.</p>

<center><img src="http://www.bengoodger.com/images/screens/firefox-update.png"></center>
<center><em>A familiar sight for Firefox users</em></center>

<p>This dialog box is so annoying, and it's compounded by the fact that when the user clicks "Later" - basically "Sod off you stupid dialog box" the situation is made worse by <strong>another</strong> dialog box telling the user that they will be updated anyway the next time they restart. At this point the natural reaction is <strong>"I DON'T CARE GO AWAY"</strong>.</p>

<p>Software Update is something that users expect to be pretty transparent, and the fact that it isn't in a lot of software is a cause of annoyance (and <a href="http://img441.imageshack.us/img441/671/lolfirefoxrj1.jpg">occasional hilarity</a>).</p>

<p>One of the worst offenders I think is Adobe. Today I'm going to bitch about their updater. It pops up every time Crap-o-bat is started, offering some cryptically worded and I'm convinced irrelevant update to one of the myriad pieces of shared code junk Adobe software installs onto my computer. In general, the Crap-o-bat user experience is among the worst of desktop software, but I'll stay focused on the updater. I swat this annoying dialog box away over and over, until eventually other circumstances cause me to have to restart the computer.</p>

<p>At startup, Windows does its usual charming thing of showing the desktop approximately 3-4 minutes before anything's actually interactive, and so I sit here dumbly waiting for all the startup items and tray icons to load. After a short while, the Adobe updater appears. I figure what the heck, I've rebooted, let's let it do its thing.</p>

<center><img src="http://www.bengoodger.com/images/screens/adobe-updater.png"></center>
<center><em>The Adobe Updater</em></center>

<p>One of the first rules of progress meters is to make sure that progress is shown immediately and that it's constantly updated, even if the steps are very small. This provides the user with a sense of satisfaction that something is happening and that they are slowly getting towards their goal state. The Adobe Updater appears and sits for about 2-3 minutes with an empty progress bar. Is it hung? No, the window is still interactive. I wonder if this is not some retarded Windows MSI database checking phase. Eventually the updater begins chugging through each update. The best (and by best I mean worst) part is that Adobe seems to have invented a new kind of progress meter, which shows indeterminate progress within a particular step of a multi-step install progress within a single master progress meter. The updater achieves this by having the progress meter step up, and then once it reaches some arbitrary limit fall back to where it was at the start of the step, and repeats this process over and over until that step is complete. This is very disconcerting to the user since it looks like something is failing causing progress to be reset. Since little in the UI changes, I began to think the updater had jammed and was about to close it until after another 3 minutes or so it continued on to the next step and I figured out what it was doing.</p>

<p>In all, the process took about 20 minutes to complete, which is staggeringly long considering the software being updated. In the process, the updater dropped an unwanted Crap-o-bat icon on my desktop. Why they felt the need to do this I'll never know - especially since Crap-o-bat is one of those pieces of software that actually needs no icons anywhere on your computer, since the way you typically launch it is either through its browser plugin or by double clicking on a PDF file in Explorer. Why their updater felt like their software deserved a spot on my precious desktop is beyond me, except perhaps to think that their marketing department holds users in utter contempt and that simply branding people's computing experiences with unnecessary junk bearing their company name is worthwhile.<br />
</p>]]>
        
    </content>
</entry>
<entry>
    <title>McCain Shows His Stuff</title>
    <link rel="alternate" type="text/html" href="http://www.bengoodger.com/2008/03/mccain_shows_his_stuff.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.bengoodger.com/mt/mt-atom.cgi/weblog/blog_id=2/entry_id=108" title="McCain Shows His Stuff" />
    <id>tag:www.bengoodger.com,2008://2.108</id>
    
    <published>2008-03-16T06:59:11Z</published>
    <updated>2008-03-16T07:02:49Z</updated>
    
    <summary>... and why he&apos;s going to be no cake-walk opponent for the Dems this November in his very respectable and reasonable handling of the Baby Jesus:...</summary>
    <author>
        <name>Ben</name>
        <uri>http://www.bengoodger.com/</uri>
    </author>
    
    <content type="html" xml:lang="en" xml:base="http://www.bengoodger.com/">
        <![CDATA[<p>... and why he's going to be no cake-walk opponent for the Dems this November in his very respectable and reasonable handling of the Baby Jesus:</p>

<center><object width="425" height="355"><param name="movie" value="http://www.youtube.com/v/-VCqn-WgYkQ&hl=en"></param><param name="wmode" value="transparent"></param><embed src="http://www.youtube.com/v/-VCqn-WgYkQ&hl=en" type="application/x-shockwave-flash" wmode="transparent" width="425" height="355"></embed></object></center>]]>
        
    </content>
</entry>
<entry>
    <title>It Can All Be Over Now...</title>
    <link rel="alternate" type="text/html" href="http://www.bengoodger.com/2008/03/it_can_all_be_over_now.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.bengoodger.com/mt/mt-atom.cgi/weblog/blog_id=2/entry_id=107" title="It Can All Be Over Now..." />
    <id>tag:www.bengoodger.com,2008://2.107</id>
    
    <published>2008-03-16T05:44:56Z</published>
    <updated>2008-03-16T06:08:21Z</updated>
    
    <summary>To beat out Obama&apos;s 168 pledged delegate lead, Clinton would have to win the remaining contests at nearly 80% (nearly 70% if you include revotes for both Florida and Michigan). This is not realistically possible. Not without a truckload more...</summary>
    <author>
        <name>Ben</name>
        <uri>http://www.bengoodger.com/</uri>
    </author>
    
    <content type="html" xml:lang="en" xml:base="http://www.bengoodger.com/">
        <![CDATA[<p>To beat out Obama's <a href="http://www.realclearpolitics.com/">168 pledged delegate lead</a>, Clinton would have to win the remaining contests at nearly 80% (nearly 70% if you include revotes for both Florida and Michigan).</p>

<p>This is not realistically possible. Not without a truckload more kitchen sinks, ruinous lies and other deceit at least. </p>

<p>Despite what the MSM says, Obama's 168 delegate lead is not "fragile." It's a lead in pledged delegates - support from voters, and it's 13.5% of Hillary's entire pledged delegate count. This is no razor thin margin.</p>

<p>And even if it <em>was</em> a thin margin - since when does coming second, no matter by how much, mean that you should be crowned victorious? What was that old quote about how an election won by just one vote should be cherished as much as one won unanimously?</p>

<p>So, given the lack of realistic chances of Clinton winning with the numbers she needs to to reverse Obama's lead, and the very realistic likelihood that she will bring out more of the bad stuff and attempt to ruin Obama, if the superdels want to wrap this up early, feel free. It can end as soon as this week if they want it to, Florida and Michigan can save a bunch of money, and work can start to unite the Democratic party now and get started preparing for the November general. Every day this mess drags on, the uphill climb to the general will be all the steeper.</p>

<p>Oh and this idea that caucuses should be made to count less by considering the "popular vote" as equivalent in importance to delegate count is stupid. If you're going to sanction a particular type of election and use it to accumulate delegates - the standard of success as defined by the rules - then don't change those rules in the middle and say that since the voting system was less representative that those delegates don't count as much. Either use caucuses and back their results fully, or don't use them at all. </p>]]>
        
    </content>
</entry>
<entry>
    <title>Hillary Clinton is Destroying the Democratic Party</title>
    <link rel="alternate" type="text/html" href="http://www.bengoodger.com/2008/03/hillary_clinton_is_destroying.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.bengoodger.com/mt/mt-atom.cgi/weblog/blog_id=2/entry_id=106" title="Hillary Clinton is Destroying the Democratic Party" />
    <id>tag:www.bengoodger.com,2008://2.106</id>
    
    <published>2008-03-15T00:48:12Z</published>
    <updated>2008-03-15T01:04:17Z</updated>
    
    <summary>Last week, while claiming that both she and John McCain had passed the Commander in Chief bar, Hillary Clinton told reporters that they would have to &quot;ask Senator Obama with respect to his candidacy&quot; on the issue. This week, Clinton&apos;s...</summary>
    <author>
        <name>Ben</name>
        <uri>http://www.bengoodger.com/</uri>
    </author>
    
    <content type="html" xml:lang="en" xml:base="http://www.bengoodger.com/">
        <![CDATA[<p>Last week, while claiming that both she and John McCain had passed the Commander in Chief bar, Hillary Clinton told reporters that they would have to "ask Senator Obama with respect to his candidacy" on the issue. This week, Clinton's chief strategist Mark Penn is willing to do the work for them:</p>

<p><em>"Look, we believe that the road to 1600 Pennyslvania Avenue goes right through the state of Pennsylvania, and if Barack Obama can't win there, how can he win the general election? I mean he doesn't seem to be passing the Commander in Chief test, he's not passing the Steward of the Economy Test, and it looks like he's saying he won't pass the Keystone Test."</em></p>

<p>We're now into the realms of the patently disgusting.</p>

<p><strong>Hillary Clinton can no longer win this fair and square</strong>, aside from Barack Obama dropping out or some other similarly dramatic change in the race.</p>

<p>Despite this she pushes on, pouring on these destructive attacks that give fuel to the Republicans' (or more specifically their 527s) campaigns in the fall. Her hope is clearly that she can conjure up some way to steal the nomination despite the will of the people. </p>

<p>My idealistic wishes:</p>

<ul>
<li>Hillary Clinton realizes the writing is on the wall and graciously bows out, which would help unify the party and make everyone who had lost respect for her during this process regain a whole lot of it.
<li><strong>The Democratic Party should censure her campaign for damaging tactics.</strong>
</ul>

<p>I hope that if Barack Obama becomes the nominee he does not make Clinton his VP - for an unusual reason: given the levels she's stooped to (as demonstrated above), he would have to watch his back in the very literal sense. Just a thought.</p>]]>
        
    </content>
</entry>
<entry>
    <title>wtf?</title>
    <link rel="alternate" type="text/html" href="http://www.bengoodger.com/2008/03/wtf.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.bengoodger.com/mt/mt-atom.cgi/weblog/blog_id=2/entry_id=105" title="wtf?" />
    <id>tag:www.bengoodger.com,2008://2.105</id>
    
    <published>2008-03-12T00:25:14Z</published>
    <updated>2008-03-12T00:28:20Z</updated>
    
    <summary>Many commentators in the media are now saying Obama may have to &quot;settle&quot; for a VP slot and that he would be encouraged to do so by some of his top supporters in the interests of party unity. Tell me...</summary>
    <author>
        <name>Ben</name>
        <uri>http://www.bengoodger.com/</uri>
    </author>
    
    <content type="html" xml:lang="en" xml:base="http://www.bengoodger.com/">
        <![CDATA[<p>Many commentators in  the media are now saying Obama may have to "settle" for a VP slot and that he would be encouraged to do so by some of his top supporters in the interests of party unity.</p>

<p>Tell me how unity is fostered by having some mad cow steal the nomination when her votes and delegates dont support it?</p>

<p>For those saying Obama would have a shot at the presidency again in 8 years I direct you to Al Gore, who Leslie calls "Our president in exile." Do we really want the effects of another 8 years of Clintonian politics?</p>]]>
        
    </content>
</entry>
<entry>
    <title>Link Roundup</title>
    <link rel="alternate" type="text/html" href="http://www.bengoodger.com/2008/03/link_roundup.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.bengoodger.com/mt/mt-atom.cgi/weblog/blog_id=2/entry_id=104" title="Link Roundup" />
    <id>tag:www.bengoodger.com,2008://2.104</id>
    
    <published>2008-03-10T06:02:22Z</published>
    <updated>2008-03-10T06:15:24Z</updated>
    
    <summary>Some outstanding hubris from the Clinton camp: Obama likely Veep choice. As Tom Daschle says talking to the Washington Post, &quot;It&apos;s really a rare occurrence, maybe the first time in history, that the person who&apos;s running No. 2 would offer...</summary>
    <author>
        <name>Ben</name>
        <uri>http://www.bengoodger.com/</uri>
    </author>
    
    <content type="html" xml:lang="en" xml:base="http://www.bengoodger.com/">
        <![CDATA[<p>Some outstanding hubris from the Clinton camp: Obama likely Veep choice. As Tom Daschle says <a href="http://www.washingtonpost.com/wp-dyn/content/article/2008/03/09/AR2008030902005.html?hpid=topnews">talking to the Washington Post</a>, <em>"It's really a rare occurrence, maybe the first time in history, that the person who's running No. 2 would offer the person who's running No. 1 the No. 2 position."</em></p>

<p><a href="http://www.cbsnews.com/stories/2008/03/07/opinion/main3916817.shtml?source=mostpop_story">Hillary Clinton, Fratricidal Maniac</a> - Jonathan Chait, The New Republic<br><br />
<a href="http://www.realclearpolitics.com/articles/2008/03/its_still_over_for_hillary.html">It's Still Over For Hillary</a> - Dick Morris, The Hill<br><br />
<a href="http://www.timesonline.co.uk/tol/comment/columnists/andrew_sullivan/article3510778.ece">The Clintons, a horror film that never ends</a> - Andrew Sullivan, The Sunday Times<br><br />
<a href="http://www.huffingtonpost.com/gary-hart/breaking-the-final-rule_b_90420.html">Breaking the Final Rule</a> - Gary Hart, The Huffington Post<br><br />
<a href="http://www.chicagotribune.com/news/nationworld/chi-experiencemar07,0,2390719.story">Clinton's experience claim under scrutiny</a> - Mike Dorning and Christi Parsons, The Chicago Tribune<br><br />
<a href="http://www.huffingtonpost.com/seth-grahamesmith/the-monster-a-loyal-clin_b_90632.html">The Monster: A Loyal Clinton Soldier Turns In His Badge</a> - Seth Grahame-Smith, The Huffington Post</p>

<p>With every day, it becomes clear that Hillary will not be able to win the nomination fair and square. The question is - will she let her personal lust for power destroy the party? This business of Obama as VP is just a distraction and is frankly disgusting and a sign of a desperate campaign. iIt's time for her to step down.</p>]]>
        
    </content>
</entry>
<entry>
    <title>In the Ghetto...</title>
    <link rel="alternate" type="text/html" href="http://www.bengoodger.com/2008/02/in_the_ghetto.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.bengoodger.com/mt/mt-atom.cgi/weblog/blog_id=2/entry_id=101" title="In the Ghetto..." />
    <id>tag:www.bengoodger.com,2008://2.101</id>
    
    <published>2008-02-21T07:20:09Z</published>
    <updated>2008-09-23T03:54:04Z</updated>
    
    <summary>I&apos;ve posted on this topic before, but today I was thinking about the Start Menu again and am just constantly reminded of what a sewer it is. Granted it has improved a great deal with Windows XP and even more...</summary>
    <author>
        <name>Ben</name>
        <uri>http://www.bengoodger.com/</uri>
    </author>
    
    <content type="html" xml:lang="en" xml:base="http://www.bengoodger.com/">
        <![CDATA[<p>I've posted on this topic before, but today I was thinking about the Start Menu again and am just constantly reminded of what a sewer it is. Granted it has improved a great deal with Windows XP and even more with Vista in some areas, but it still is guilty of high crimes of UI design. Specifically:</p>

<ul>
<li>Navigating cascading menus is hard. On Windows XP the Start menu is implemented as a one. Cascading menus are notoriously hard for users to navigate without a lot of hand-eye coordination with the mouse. Microsoft seems to have learned this lesson and remedied this in Vista by embedding a tree view inline. 
<li>Every app and their cousin build ridiculously complex folder hierarchies, sometimes for no reason other than pure vanity. Having to burrow through hierarchies like this: Start->Programs->TurdSoft->TurdSoft Crapr 1.0->TurdSoft Crapr are not uncommon. How often do you really want all this junk in there? Also many Open Source tools and command line utilities that have no real front end install shortcuts to documentation here. Ick!
<li>Because of the crappiness of Windows' Uninstall UI ("Add/Remove Programs"), every app feels compelled to also litter the menu with Uninstall shortcuts, causing each program to require a subfolder just for itself - its launcher and its uninstall shortcut.
<li>On Windows XP, the menu takes an unbelievably long time to generate. I have no idea why it's so hard to display a list of items. For my system, the dropshadow of the menu draws then some time later the menu pops in. It can take over 2-3 minutes for the menu to actually appear.
<li>On Windows XP, applications starting can steal focus from the start menu and close it up. This happens at system startup if you have a bunch of apps configured to start automatically - their windows appearing cause the Start Menu to disappear, which is frustrating if you've just waited 3-4 minutes for it to populate!
</ul>

<p>Microsoft seems to have largely given up on "All Programs", and have improved the usability of this menu a great deal in Windows XP with the most often used programs section. But the ghetto within is a sorry reminder of good intentions gone wrong, abuse of privilege by application developers and the shortcomings of other aspects of Windows.</p>]]>
        
    </content>
</entry>
<entry>
    <title>Unpledged Allegiance</title>
    <link rel="alternate" type="text/html" href="http://www.bengoodger.com/2008/02/unpledged_allegiance.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.bengoodger.com/mt/mt-atom.cgi/weblog/blog_id=2/entry_id=100" title="Unpledged Allegiance" />
    <id>tag:www.bengoodger.com,2008://2.100</id>
    
    <published>2008-02-19T22:53:46Z</published>
    <updated>2008-02-20T05:21:01Z</updated>
    
    <summary>The HRC campaign comes out with some new and progressively slimier way to win by distorting to rules. It&apos;d really be hard to top this one, though. Nice to know all the primaries and caucuses are just a charade, and...</summary>
    <author>
        <name>Ben</name>
        <uri>http://www.bengoodger.com/</uri>
    </author>
    
    <content type="html" xml:lang="en" xml:base="http://www.bengoodger.com/">
        <![CDATA[<p>The HRC campaign comes out with some new and progressively slimier way to win by distorting to rules. It'd really be hard to top <a href="http://www.politico.com/news/stories/0208/8583.html">this one</a>, though. Nice to know all the primaries and caucuses are just a charade, and that everyone who participated has just been wasting their time, though I guess the HRC campaign would argue that's what was happening in Florida and Michigan, so why not apply it nationally! Seriously though, this is the stuff of banana republics.</p>

<p>At what point does the Clinton family's lust for coronation become so great that it causes them to destroy the very things that they are supposedly fighting for? No politician is perfect, but this is just gross.</p>

<p>There's a song by the Kaiser Chiefs called "I Predict A Riot", and it seems applicable now.<br />
</p>]]>
        
    </content>
</entry>
<entry>
    <title>Michigan</title>
    <link rel="alternate" type="text/html" href="http://www.bengoodger.com/2008/02/michigan.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.bengoodger.com/mt/mt-atom.cgi/weblog/blog_id=2/entry_id=98" title="Michigan" />
    <id>tag:www.bengoodger.com,2008://2.98</id>
    
    <published>2008-02-16T13:41:15Z</published>
    <updated>2008-02-16T13:45:36Z</updated>
    
    <summary> It isn&apos;t a victory if you&apos;re the only name on the ballot......</summary>
    <author>
        <name>Ben</name>
        <uri>http://www.bengoodger.com/</uri>
    </author>
    
    <content type="html" xml:lang="en" xml:base="http://www.bengoodger.com/">
        <![CDATA[<center><img src="http://www.bengoodger.com/images/misc/saddam.jpg"></center>

<p>It isn't a victory if you're the only name on the ballot...<br />
</p>]]>
        
    </content>
</entry>
<entry>
    <title>Whips</title>
    <link rel="alternate" type="text/html" href="http://www.bengoodger.com/2008/02/whips.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.bengoodger.com/mt/mt-atom.cgi/weblog/blog_id=2/entry_id=97" title="Whips" />
    <id>tag:www.bengoodger.com,2008://2.97</id>
    
    <published>2008-02-13T09:22:11Z</published>
    <updated>2008-02-13T09:23:22Z</updated>
    
    <summary>If the Democratic party leadership is unable to exercise control of its members through the use of whips (as is customary in many other governments), then why all the blustering about impeachment being off the table?...</summary>
    <author>
        <name>Ben</name>
        <uri>http://www.bengoodger.com/</uri>
    </author>
    
    <content type="html" xml:lang="en" xml:base="http://www.bengoodger.com/">
        <![CDATA[<p>If the Democratic party leadership is <a href="http://www.senate.gov/legislative/LIS/roll_call_lists/roll_call_vote_cfm.cfm?congress=110&session=2&vote=00015">unable to exercise control of its members</a> through the use of whips (as is customary in many other governments), then why all the blustering about impeachment being off the table?</p>]]>
        
    </content>
</entry>

</feed> 

