Julien :: Skins
Home of fine skinning products since 2004

Bug reports, suggestions and other feedback

Sep 27, 2010 7:05 PM by Discussion: DesktopX

Hi everybody!

After a long time working on it, I just released a beta version of my package tracking widget.

Delivery Tracker

Delivery Tracker is a small gadget that allows you to track packages from different providers. It provides package details, a full list of package events, map tracking via Google Maps and Windows 7 taskbar integration.

This BETA version can track up to 10 packages and supports the following carriers:

  • Amazon.com
  • Amazon.ca
  • Amazon.fr
  • CanadaPost
  • Chronopost
  • DHL
  • Fedex
  • UPS
  • USPS

with more coming in the future.

It also has integrated auto-update and should show you an update window with the list of changes whenever a new version is made available.

Note: Since this is a beta version, all the features are available by default (all carriers, support for tracking more than 1 package, all time intervals).

The beta expires on 01/30/2011


You can download the widget on the gallery.


Feel free to leave feeback either through the bug tracker or directly on this thread.


8 Replies Reply 12 Referrals

Questions, Complaints, issues

Nov 7, 2009 8:37 PM by Discussion: DesktopX

Update: A new build has been released with some fixes (along with availability of the standard version). Bug reports should now be made in this thread.

DestkopX 4.0 Pro Beta 1 has been released on Impulse.

Zubaz is relaxing on his private island today (he will tell you he's sick, don't believe him!), so here is a thread to post issues.

There is no official changelog yet, but here are a few changes:

  • Plugins and data can now be found in "%ProgramData%\Stardock\DesktopX\SDPlugins". If you have custom plugins installed, you will have to manually copy them from the DesktopX folder in Program Files for your objects to work.
  • Themes, objects & gadgets are now in Public Documents\Stardock\DesktopX
  • DesktopX right-click menu to create new objects

Post anything that looks odd.  Make sure to give your system information including your OS (including 32 or 64 bit), Service Pack version and if it's hard to explain (or even if it isn't) a screenshot.

57 Replies Reply 29 Referrals

Multi-provider weather component

Jul 12, 2009 9:05 PM by Discussion: DesktopX

Hey all!

07/20: I'm looking for a few weather widget authors that would be willing to update their objects using the component and provide feedback. I'll be providing help and guidance on the use of the component if needed. Widgets that make complete use of weather.com data are preferred (current conditions + forecast with as much info presented to the user as possible).

As of today, the Weather.com provider is mostly complete and should be usable as a replacement for the old script. Weather Underground still needs a bit more work, especially on the parts that aren't available with weather.com (cameras, alerts).

If you're interested, you can PM me or send me an email. I'm also available on IRC (irc.stardock.com) under the nick "Julien".

It seems there wasn't enough Weather threads, so I decided to have my own [e digicons]O:)[/e] .

For the past few days, I've been working on a weather script component. It takes the form of an independent .wsc script file that you reference in your widget script (setting up license info and registering callbacks), calling a few methods and getting weather/location/alert data in the form of a script object with several properties.

Using this new script means rewriting a lot of the existing weather objects script, only keeping the UI handling in the widget scripts and delegating all the weather stuff to the component. It's not a short term solution for authors that need to update their widgets in the next few days, but I think it's the easier and more maintainable solution in the long run, as it would finally do away with the duplicated and slightly tweaked weather code in all weather widgets.

Note: This thread is to discuss the weather script component only. If you want to ask questions about the original weather script, existing weather widgets updates or just complain about TWC.com/Stardock/etc..., you can do so here, here and here.

The plan is to support several widget providers in the same script, in a mostly transparent way. Right now, I'm planning to have the following providers (in this order):

  • Weather Underground - 90 %
  • Weather.com (TWC) - 95 %
  • NOAA
  • WeatherBug
  • Accuweather

Using the script

I've tried to make the API as simple as possible, hiding most of the complexity in the script component. In the following, the Weather Script Component will be called WSC.

To start using the script, you need to create a new instance of the WSC and register callbacks. Those are functions that will be called when new data is available or if an error happened somewhere.


Set WeatherController = GetObject("script:" & LIB_FOLDER & "Weather.wsc")
WeatherController.RegisterCallbacks GetRef("OnLocations"), _
          GetRef("OnWeather"), _
          GetRef("OnAlerts"), _
          GetRef("OnForecast"), _
          GetRef("OnCameras"), _


You can then get a list of supported providers to let the user choose the one he wants, of simply hardcode the provider you want. If the provider requires a license key, you can also set it at this time, as well as the unit system to use.


WeatherController.UseMetricSystem = True    ' Default is True
WeatherController.SetLicense "my_id", "my_key"    ' This will be ignored by the WUnderground provider as it doesn't use a license key, for other providers, check the return value to know what is required
retCode = WeatherController.SetProvider("WUnderground") ' you can use the WeatherController.Providers property to get a list of <id, display name> pairs
If (reCode <> E_OK) Then
  MsgBox "Invalid Provider!"
End If


Once your weather object is setup, you can start making queries. The WSC uses a single query object for all requests, so that we don't need to implement a separate method for each type of request.

To get a new query object, you can either create a new instance of a WeatherLocation object, or use the helper method I added to the WSC. You can then set properties on the query object, or use the CustomQueryString property (useful when you want to do a query using a search string entered by the user).


Dim query, retCode
Set query = WeatherController.GetQueryObject()
query.AirportCode = "KMQE"
retCode = WeatherController.GetWeather(query)
Select Case retCode
  Case E_OK ' query accepted and request sent
   ' Continue
  Case E_NOTIMPLEMENTED ' the chosen provider does not implement this method
   MsgBox "Method not implemented!" ' should not happen with GetWeather obviously!
  Case E_NOTAVAILABLE ' the query you used is not supported by this provider/method (for example, you called GetWeather with a country name only)
   MsgBox "Query type not available!"
  Case E_ERROR ' you forgot to set a provider or your query is empty
   MsgBox "Error!"
End Select


If an error happens after the request has been sent, you will get an error code and message through the OnError callback (for exemple, if there is a parsing error or if the response is empty, etc.)

If all goes well, we should get a response and our OnWeather callback will be called


Sub OnWeather(weatherInfo)

  ' Update your object UI using the new weather information

End Sub



A first test version is now available. Inside the Build folder, you will find 3 files:

The test object is using the minified version and is also a bit pre-processed, so if you want to check the script, you probably want to use the original version

If you plan to use the script and there is some functionality that seems to be missing, post here or PM me and we'll see if it can be added.


  • Forecast might in some case be duplicated with Weather Underground (you will get separate forecast objects of the detailed forecast followed by the normal ones)
  • Some dates have the wrong timezone (needs some tedious checks to make sure we get everything right)
  • Alerts codes use magic values directly from the provider instead of constants from WeatherConstants


Warning: The API is now relatively stable, but it might still change a little bit before 1.0, so know that you might have to slightly adjust your widget script when you get a new version of the component.

The latest version can always be downloaded from here.


  • 07/12/09: Weather Underground provider, basic architecture in place.
  • 07/13/09: Support for external providers, helper component & error codes. Station name&type + UV/Solar radiation available.
  • 07/15/09: Forecast for Weather Underground. Date parsing, misc stuff
  • 07/16/09: Weather.com provider, with caching (locations & weather only). Added support for city-only response for Weather Underground.  
  • 07/17/09: Added forecast for Weather.com. Better parsing of dates in all providers. Added contants for weather codes.
  • 07/18/09: Added cameras support and cache to Weather Underground Provider
  • 07/20/09: Finished Weather Undeground implementation (icon code is now converted to proper value)
16 Replies Reply 18 Referrals

System-level/UI/Misc stuff scripting plugin

Jun 22, 2009 11:16 AM by Discussion: DesktopX

Update: Version 1.0 has been released. Get it from here.

A new week, a new plugin [e digicons]O:)[/e]

The plan for this plugin is to include all system-related functionality that isn’t already available in the DesktopX System namespace.


You can download a test version here (set to expire on 10/5/2009).

If you have ideas for stuff to add to this plugin, feel free to post them on the DesktopX 4.x request thread.

Plugin Information

Mouse wheel

  • SystemEx_OnMouseWheel(rotation)
  • SystemEx_OnMButtonDown(x, y)
  • SystemEx_OnMButtonUp(x, y, dragged)

Monitor information

  • Monitors
  • NumberOfMonitors
  • GetMonitor(index)

MonitorInfo object:

  • IsPrimary
  • Left
  • Top
  • Bottom
  • Right


  • Volume
  • Mute
  • PeakValue (read-only)
  • SystemEx_OnVolumeEvent(volume)
  • SystemEx_OnMuteEvent(isMuted)


  • CommandLine
  • CommandLineArgs
  • IsFirstInstance
  • SystemEx_OnNewInstance(commandLineArgs)


  • VerifySignature(path, signature, type)



Mouse wheel


When the mouse is over the object and the mousewheel is used, the SystemExOnMouseWheel
function will be called with the wheel rotation passed as a parameter.

The wheel rotation will be in number of lines.

Default value: 3
Default value for page scrolling: 10

A positive value indicates that the wheel was rotated forward, away from the user;
a negative value indicates that the wheel was rotated backward, toward the user.

SystemEx_OnMButtonDown(x, y) & SystemEx_OnMButtonUp(x, y, dragged)

When you middle click on your object, the SystemEx_OnMButtonDown function will be
called. When you release the button, theSystemEx_OnMButtonUp function will be called.

Both functions will have the mouse coordinates relative to your object passed as


Monitor Information

This one was asked by Zubaz to better handle multi-monitor systems. As it turns out, the virtual screen coordinates are not nearly enough to be able to position objects on multi-monitor systems. WMI is exposing monitor information, but it does not seems to work reliably (it only gives information for the first monitor on my system for example).


Gets an array of MonitorInfo objects


Returns the MonitorInfo for the given screen


Gets the number of monitors on the machine


Volume Information


When the user change the master volume through the volume mixer or another application
your object callback is called. The volume parameter will contain the current master

XP Compatibility: never called.


If the volume is muted, your object callback is called.
isMuted will be True if the volume has been muted, false otherwise.

XP Compatibility: never called.


Sets or gets the master volume.

SystemEx.Volume = <volume>
<volume> = SystemEx.Volume

<volume> should/will be between 0 and 100. Any value outside these bounds will be capped.


Mute or un-mute the audio stream

SystemEx.Mute = True
isMuted = SystemEx.Mute

Mute can take two values: True and False.
If Mute is True the audio stream is muted, otherwise it is not muted.


This is a read-only property. It allows you to get the peak level value for the
currently playing sample.

level = SystemEx.PeakValue
level will be between 0 and 100.

XP Compatibility: might not work with some cards, in which case it will always  returns 100.
It reads from the waveout device, so it won't work when reading from a CD for example.


Instance Information


Get the full command line (including the path to the executable and DesktopX-specific arguments)


Get an array of command line arguments.
Command line arguments have been cleaned up to remove DesktopX-specific arguments (in the case of single-exe gadgets)


Will be True if this is the first instance to run, False otherwise.
It is preferable to check for it at startup and close the gadget accordingly,
as only the first instance will receive a callback message when a new instance is started.


Gets called when another instance is started. The command line arguments are passed in an array.


Misc Information

SystemEx.VerifySignature(path, signature, type)
Check the signature of the file pointed to by path.

The only type of signature supported at this time is SIGNATURE_SHA1



1.0 Build 228:

  • Renamed to DXSystemEX (plugin namespace is now SystemEx)
  • Added SHA1 signature check
  • Added MouseWheel and Middle button click callbacks (merged from DXMouseWheel)
  • Added Master volume control / Mute / Peak (merged from DXVolumeControl)

1.0 Build 205:

  • First test version
21 Replies Reply 4 Referrals

command line & single instance plugin for DesktopX

Jun 18, 2009 7:08 AM by Discussion: DesktopX

Update: this plugin functionality has been merged into DXSystemEx. You can get the new plugin here.

This is a very small plugin for DesktopX that exposes command line information in your scripts, allowing you to act on certain parameters. It also adds a new callback that is called when another instance is started and gives you its command line arguments.


  • associate a gadget to a custom file type and be able to do custom processing when called with the file path as an argument.
  • make the custom categories of the jump list in Windows 7 possible (they are shortcuts to the application with command line arguments).
  • handle any other custom command line arguments like a normal application.


Remember to select “Allow multiple instances of the application to run” when exporting your gadget!

Here are the new functions/callbacks available to your scripts:


Get the full command line (including the path to the executable and DesktopX-specific arguments)


Get an array of command line arguments. Command line arguments have been cleaned up to remove DesktopX-specific arguments (in the case of single-exe gadgets)


Will be True if this is the first instance to run, False otherwise. It is preferable to check for it at startup and close the gadget accordingly, as only the first instance will receive a callback message when a new instance is started.


Gets called when another instance is started. The command line arguments are passed in an array.


You can download a test version here.

Note: This plugin will not work with single-exe gadgets (or widgets)! Due to the way simple deployment gadget’s command line is handled, adding arguments will result in the gadget not even starting (it’s treating almost any command line argument as a path... [e digicons]x_x[/e] ). I sent a bug report/request to Stardock, but in the meantime, you will have to use custom deployment. I have a binary patch available for DXAppCustom.bin that fixes the command line parsing and allows gadgets to get the original command line (but disables ObjectBar-related code as it’s kind of a hack), so it’s definitely fixable. Let’s hope the next version of DX will have a fix [e digicons]:pout:[/e]

0 Replies Reply 3 Referrals

Windows 7 Extended Taskbar support for DesktopX

Jun 12, 2009 8:10 PM by Discussion: DesktopX

Hey all!

DXTaskbar7 - Preview

With Windows 7 a few months away, it was time to bring some of the new features to DesktopX. One of the things gadgets could really benefit from is the new extended taskbar. It has a few new options such as jump lists, tasks, thumbnails toolbars, icon overlays, progress bars and thumbnails.

DXTaskbar7 is a new plugin for DesktopX that allows you to access all those new features from your DesktopX scripts.

How to help

Download the DXTaskbar Dev package and start creating gadgets &widgets!

What to look for

  • Tab handling problems: tabs not appearing, tab name and icon not properly updated
  • Toolbar: icon corruption
  • crashes or memory leaks


What is broken/not working properly

  • ActiveX controls are not drawn on the tab preview (this is a problem with DesktopX)
  • This is a DEBUG build, so it's going to be slower than normal



Tabs management


Get the handle for that tab (to be used in ConfigureTab).


Set a global icon for all the tabs.

  • image: path to a 16x16 image file

ConfigureTab(name, insertAfter)

Setup the tab name and position.

  • name: title of the tab
  • insertAfter: handle of the tab after which the configured tab should be inserted. Use 0 to insert after the last tab


Set the tab as active and show it in the tab list.


Remove the tab from the list.


This function will be called when the user closes a tab in the list.



SetupButton(id, image, tooltip, flags)

Setup a new tab button.

  • id: internal id (to be passed in the Taskbar_OnButtonClicked callback when the button is clicked)
  • image: path to a 16x16 image file
  • tooltip: the tooltip to shown on mouse-over
  • flags: a list of flags (see DXTaskbarDefines.vbs)

UpdateButton(id, image, tooltip, flags)

Update an existing tab button (only after buttons have been added).

  • id: internal id (to be passed in the Taskbar_OnButtonClicked callback when the button is clicked)
  • image: path to a 16x16 image file
  • tooltip: the tooltip to shown on mouse-over
  • flags: a list of flags (see DXTaskbarDefines.vbs)


Add the list of buttons to the tab. 
A maximum of 7 buttons can be added at one time. After the buttons have been added, you cannot setup new ones. Use the UpdateButton function to modify existing buttons.


Called when the user clicks on a thumbbar button.

  • id: the button id used in SetupButton and UpdateButton



SetOverlayIcon(image, description)

Applies an overlay to a taskbar button to indicate application status or a notification to the user.

  • image: path to a 16x16 image file
  • description: an alternative text version, for accessibility purposes




Sets the type and state of the progress indicator displayed on a taskbar button.

  • flag: a progress flag (see DXTaskbarDefines.vbs)

SetProgressValue(completed, total)

Displays or updates a progress bar hosted in a taskbar button to show the specific percentage completed of the full operation.

  • completed: number of steps completed
  • total: total number of steps


Tasks and destinations

AddUserTask(name, path, arguments, icon, iconIndex, workingFolder)

Add a new user tasks (typically static links)

  • name: name of the task
  • path: path to the program to execute
  • arguments: arguments to the program
  • icon: path to .ico file to use as an icon
  • iconIndex: index of the icon to use in the .ico file (typically 0 if you only have 1 icon type)
  • workingFolder: working folder when executing the program


Add a separator

  • category: the category to add a separator to. To add a separator to the tasks, use “Tasks” as the category.


Declares that the Jump List is complete and ready for display


Discontinues a Jump List building session without committing any changes


1.0 Build 231

  • Implemented Tasks

1.0 Build 205:

  • Added parameter checking in most functions
  • Fix for Vista and XP: all functions calls are ignored on those systems but are still available to scripts, so you should not get any script error

1.0 Build 198:

  • First test version


You can download version 1.0 from here.

7 Replies Reply 15 Referrals

An old project started in 2006

Feb 12, 2009 12:21 PM by Discussion: Sneak Previews

DockletX Preview

Not sure I'll be able to make it work properly enough (without ugly hacks) to make a public release, but that's the long-term plan [e digicons]:borg:[/e]

7 Replies Reply 9 Referrals

Konfabulator-like animation object

Jan 31, 2009 8:01 PM by Discussion: DesktopX


You can find the script along with a sample widget in the DesktopX Objects gallery.

I have this animation script I wrote 2 years ago for a widget (that I never finished [e digicons]:([/e] ), and I recently got back to work on a package tracking widget that is going to use some part of it. Still 70% of the script is never going to be used and I don't want to throw it away, especially if it can help other people.

I've noticed a lot of questions on how to animate groups of objects, and everybody seems to write semi-custom code over and over. My script takes the form of a Script Component (an external script file you reference in your DesktopX script), which means it can be reused without cut&pasting dozens of lines of code every time.


Let me give you an example. In the script below Animator is the main object (already initalized, 3 lines of code, not of interest here). The last argument of each XXXAnim.Init methods is a callback that you can use to call a function when the animation is done. It's especially interesting if you need to coordinate several complex animations. I've added variables so you can understand what each Init call does, but in practice the script would be a little bit simpler.


opacity = 75

length_fade = 1500

delay_fade = 500

toX = 300

toY = 300

length_move = 5000

delay_move  = 0


Set fadeAnim = CreateObject("DXScriptLibrary.FadeAnimation")

Set moveAnim = CreateObject("DXScriptLibrary.MoveAnimation")


fadeAnim.Init DesktopX.Object("My_Object_Layer"), opacity, length_fade, delay_fade, Animator.EaseNone, ""

moveAnim.Init DesktopX.Object("My_Object_Layer"), toX, toY, length_move, delay_move, Animator.EaseIn, ""


Animator.Add Array(fadeAnim, moveAnim)



So, what this code does is prepare 2 animations with different length and start time, give them to the animator component and then start the animations. The Animator object will automatically manage the animations, starting each one after the delay (and of course fade will apply to all child objects). You can also add a new animation while the previous ones are playing, it will be handled transparently, adjusting delays and total animation length.

As a bonus, you can specify the easing type. In the example, the object will start to move slowly and speed up as it moves through the animation.

There are 4 different animation objects (Fade, Move, Rotate, Resize) and 5 types of easing (EaseIn, EaseOut, EaseInOut, EaseOutElasticBig, BackOut). Everything is in separate components with minimal dependencies, so adding new stuff is relatively easy should you wish to so (new easing types for example)


Right now, the component has a few dependencies (I like to keep stuff clean, and I have my own pre-processor which automatically parses all that stuff and creates merged dxpacks with all needed files [e digicons]}:)[/e] ), but this can be merged in a single file to be used more easily.

If there are enough people interested, I can cleanup the component and write a quick tutorial on how to use it. Let me know what you think!



6 Replies Reply 14 Referrals

OLE Drag & Drop for DesktopX

Sep 3, 2008 10:46 AM by Discussion: DesktopX

A small DesktopX plugin that has been sitting unfinished for 1+ year in my experiments folder...

DXDragDropExtended adds true OLE drag&drop to your DesktopX objects. This means you can now drop text onto a DesktopX object in addition to files (ie. select some text in you browser, drop it on a DesktopX object and your script will get called).

The API for files is the same as the one already included in DesktopX (Object_OnDropFiles) and you get a new callback DragDrop_OnDropText(text) with text containing the selection. There is some more info in the included readme.

This could be put to good use to build some nice notes or translator gadgets.

I'm looking for a few test reports before uploading to Wincustomize. Let me know if it works OK. And if you need more options, more types of drag&drop supported, etc. please let me know too (be specific: it has to be something you need for building you widget...)

Download a test build from here.

4 Replies Reply 3 Referrals

a dynamic dream testing utility

Sep 1, 2008 12:10 AM by Discussion: Animated Wallpapers

Nightmares - Dynamic dream testing utilityNightmares is a small application created to test dynamic dreams. It runs them in a window, allowing you to debug them easily or to record a preview video.

You can set the window size (default is 800x600), chose an output file and FourCC code for the output video.

It currently only runs unprotected dreams: the dreams that come with DeskScapes will work, but any dynamic dream that you bought won't.

See the readme file for command line switches.

Download test build here.

It might feel like it's not really useful right now, but it will be soon (and it has nothing to do with the SDK).

7 Replies Reply 11 Referrals

Page 1 of 3