Theme GuidelinesAlways download Nightly build! to ensure you are updated!
XIAMultiTheme load plugins dll and Unload at exit or when you disable the today theme.
- xmt_XXXX.dll XXXX is the name to invoke in XML, these are GUI components
- xmt_sensor_YYYY.dll YYYY is the name of sensor or backend where load data
- xmt_sensor_image.dll let's load images (default backend is ImageFactory of WM2005)
- xmt_sensor_command.dll execute OnClick and OnEvents founded on XML
- There are many differences between Popup launcher interface and Today plugin feature, be carefully
- To debug your skin use the POPUP launcher and set autoclose to 10 :)
- Before start writing your skin.xml please LOOK at examples!
Before start reading components and make the skin.xml I would like to spend 2 words about XMT tools. When Users install XMT it will have the following default configuration:
- XMT files, tools, dlls into a user choosen folder
- Registry entries: Today Plugin, Default User info, XMT Paths and "selected" themes
Please LOOK at examples before start!
|Gui Objects||Name||is GUI or Sensor||Attributes||is Container||Sub Childs supported|
|Today||GUI Window must be the 1° element to create HWND||
||Yes||Any other component and: (popup) OnLostFocus set action="minimize"
If you enable dndmode or scrollmode you are going to enable the 32bit alpha blending engine which is not faster!
|AnalogClock||Draw an image||
||No||SecondHand, MinuteHand, HourHand with show="true" color="RGB(0,0,0)"|
|Image||Draw an image||
||No||You can use Convert to adjust the value of the attached sensor if any
[x,y] frame 1 + [x,y] frame 1 + .... frame 1 n= [W,n*y] put gaugemax=n if X!=Y!!
|Area||GUI Invisible object||
||No||This help you to add onclick zone on images!|
|Page||GUI container this will help you to make page navigation||
||Yes||Any other component, and also OnEvent: this will help you to write potrait or landscape skin oriented|
|Text||Draw a text or a BITMAP text||
Sensor can be manually specified by sensor="YYYY" on GUI elements or the engine will perform implicit like this: 1) *XYZ Object* does not exist?
2) load TEXT as GUI and put sensor="XYZ"
so if you write Registry as entry or Text with sensor="registry" is the same thing. (xmt_text.dll + xmt_sensor_registry.dll)
TIP: Every Object can use the common attribute "polling" this is very usefull to make very fast your theme: if you are going to draw a clock which does not have seconds you can set polling="60" and refresh="1000", or if it's a battery/signal menter and the today will refresh="100" put it very high like polling="30000"
|Battery||You can use convert to adjust or attach this sensor to Text+Folder:theme|
||If you attach this to a Text+Folder:Theme take care about 0.png, dots.png, dot.png|
type of random:
||StopWatch is a very powerful engine which let's you animate gui and also make stopwatch or timers!
|Font||Specify Font attribute for Text GUI object||
|Convert||Specify converting rules, this help you to make 1/0 sensor when you do not have 1/0 value, for example
you can blink or turn on/off an image if registry value is greater than 1 or lower than 1 (sms incoming can be a good example)
TIP: do not overhead the engine with a lot of Convert! instead try asking developers to write a dll which read the value and perform the right action (battery meter dll is a good starting point, when ready :) )
Convert when="equal" from="11" to="eleven" format="[%n=%s(%d%%)]" File="runme" Command="pars" blink="2" to a first Text
11 from sensor became [Text_0=eleven(11%)]
Convert when="notempty" from="" to="no eleven" format="[%n=%s]" File="runme" Command="pars" blink="2"
Tip: 1) Do NOT abuse or fill your theme with a lot of "Convert" INSTEAD use Text+Folder+a lot of pngs because Convert is slower
2) to="" is performed BEFORE format! if it's not empty!!!
3) take care about %% formats!
|%d||Current Value converted to integer so if string("000011") will be "11"|
|??||May be you need some extras, mail me, I will add them!|
|Tap on object||OnClick||This will launch a shell command but it's very usefull to make page navigation skins: on tap set invisiblegroup to all pages and setvisible to 1 page at time, you will have done a page navigation with 2 events!||
||Tip: if visible=0 this is NOT parsed|
|Events||OnEvent||This help you writing skin with landscape or portrait support||
#define XMT_ONEVENT_INT_BUTTON 0 // to obj when user TAP #define XMT_ONEVENT_INT_TAP 0 // to obj when user TAP #define XMT_ONEVENT_INT_TAH 1 // to obj when user Tap And Hold (NO DnD!!) #define XMT_ONEVENT_INT_START_DRAG 2 // to obj when user Start DnD #define XMT_ONEVENT_INT_DROP 3 // to the container obj when user Drop #define XMT_ONEVENT_INT_END_DRAG 41 // to source obj after dropped #define XMT_ONEVENT_INT_GO_LANDSCAPE 33 // Display change and at startup #define XMT_ONEVENT_INT_GO_PORTRAIT 34 // Display change and at startup #define XMT_ONEVENT_INT_LOST_SELECTION 35 // while on today go on another today item #define XMT_ONEVENT_INT_ACTION 36 // Action Key to the selcted obj #define XMT_ONEVENT_INT_GO_LANDSCAPE640 37 // Like above + this is when there is a VGA #define XMT_ONEVENT_INT_GO_PORTRAIT640 38 // Like above + this is when there is a VGA #define XMT_ONEVENT_INT_GO_LANDSCAPEL320 39 // Like above + this is when there is a qVGA #define XMT_ONEVENT_INT_GO_PORTRAITL320 40 // Like above + this is when there is a qVGA #define XMT_ONEVENT_INT_ENABLE_24BIT 43 // The theme will be rendered WO Alpha channel #define XMT_ONEVENT_INT_ENABLE_32BITALPHA 42 // The theme will be rendered W Alpha channel #define XMT_ONEVENT_INT_LOSTFOCUS 44 // XMT Window go on background #define XMT_ONEVENT_INT_GETFOCUS 45 // XMT Window go on foreground #define XMT_ONEVENT_INT_POWER_RESUME 49 // Power events not all may fire on all pda #define XMT_ONEVENT_INT_POWER_CHANGE 50 // Power events not all may fire on all pda #define XMT_ONEVENT_INT_POWER_INFO 51 // Power events not all may fire on all pda #define XMT_ONEVENT_INT_POWER_ON 52 // Power events not all may fire on all pda #define XMT_ONEVENT_INT_POWER_OFF 53 // Power events not all may fire on all pda #define XMT_ONEVENT_INT_POWER_CRITICAL 54 // Power events not all may fire on all pda #define XMT_ONEVENT_INT_POWER_BOOT 55 // Power events not all may fire on all pda #define XMT_ONEVENT_INT_POWER_IDLE 56 // Power events not all may fire on all pda #define XMT_ONEVENT_INT_POWER_SUSPEND 57 // Power events not all may fire on all pda #define XMT_ONEVENT_INT_POWER_RESET 58 // Power events not all may fire on all pda #define XMT_ONEVENT_INT_PASSWORD 59 // Power events not all may fire on all pda #define XMT_ONEVENT_INT_OBJ_SHOWED 60 // to the obj when isVisible=1 #define XMT_ONEVENT_INT_OBJ_HIDDEN 61 // to the obj when isVisible=0 #define XMT_ONEVENT_INT_OBJ_DONE 64 // to the obj: the same obj has done the "work" // Keys events! // Every Key of the pda is sent via WndProc of main Window // you can trap in your skin via this OnEvent button="XX" // YY is the scankey id + 0xF00 = 0xFyy // #define XMT_ONEVENT_INT_KEY_BASE 0xF00 // Send Message to Main win - WM_TIMER // TIP: the WindowText of the Main window for XMT popup are the same as // the skin name so you can do this using FindWindow(_T("XIAMultiThemeMainTodayClass"),SkinName); // than SendMessage(XMThWnd,WM_TIMER,idTimer); #define XMT_HWND_TIMER_REFRESH 1 // refresh timer/10 #define XMT_HWND_TIMER_AUTOCLOSE 2 // this fire when the wnd need to be closed #define XMT_HWND_TIMER_AFTER_500 3 // to turn of selection mark #define XMT_HWND_TIMER_REPAINT 4 // this force repaint to the window #define XMT_HWND_TIMER_DRAGGING_OFF 5 // to detach the DnD Obj
|Tip: if visible=0 this IS parsed!|
You can specify the "shell command" to run + Command="extra paramters" or one of these:
|FileFormat||if this is present is parsed like Conversion string! and the output is the "File"
These are very usefull when you need to change File or Command to be executed using the "current value" of the object, for example: if you are doing some slideshow you can make FileFormat="%s" tapping the image the shell will open your jpg
|CommandFormat||if this is present is parsed like Conversion string! and the output is the "Command"
These are very usefull when you need to change File or Command to be executed using the "current value" of the object, for example: if you are doing some slideshow you can make CommandFormat="%s" and File="path which open the jpg"