From fdfb14a5d7048a7fa8a0b51ab9dcdd516f67f329 Mon Sep 17 00:00:00 2001
From: Geoffroy Couprie <geo.couprie@gmail.com>
Date: Thu, 4 Sep 2008 12:58:52 +0200
Subject: [PATCH] WinCE: update the interface module

---
 modules/gui/wince/Modules.am              |    1 +
 modules/gui/wince/dialogs.cpp             |    8 +-
 modules/gui/wince/fileinfo.cpp            |   17 +-
 modules/gui/wince/interface.cpp           |    8 +-
 modules/gui/wince/iteminfo.cpp            |   34 +-
 modules/gui/wince/menus.cpp               |    3 +-
 modules/gui/wince/messages.cpp            |    9 +-
 modules/gui/wince/open.cpp                |   15 +-
 modules/gui/wince/playlist.cpp            |  128 ++++---
 modules/gui/wince/preferences.cpp         |  509 ++++++++++++++++++-----------
 modules/gui/wince/preferences_widgets.cpp |   26 +-
 modules/gui/wince/subtitles.cpp           |   10 +-
 modules/gui/wince/timer.cpp               |    7 +-
 modules/gui/wince/video.cpp               |    7 +-
 modules/gui/wince/wince.cpp               |   20 +-
 modules/gui/wince/wince_rc.rc             |    4 +-
 16 files changed, 487 insertions(+), 319 deletions(-)

diff --git a/modules/gui/wince/Modules.am b/modules/gui/wince/Modules.am
index de2cdf3..80ddbb3 100644
--- a/modules/gui/wince/Modules.am
+++ b/modules/gui/wince/Modules.am
@@ -23,6 +23,7 @@ SOURCES_wince = \
 	$(NULL)
 
 EXTRA_DIST += \
+    wince_rc.rc \
 	bitmaps/vlc16x16.ico \
 	bitmaps/toolbar1.bmp \
 	bitmaps/toolbar2.bmp \
diff --git a/modules/gui/wince/dialogs.cpp b/modules/gui/wince/dialogs.cpp
index 2dbc9c8..f185ec5 100644
--- a/modules/gui/wince/dialogs.cpp
+++ b/modules/gui/wince/dialogs.cpp
@@ -32,6 +32,7 @@
 #include <vlc_common.h>
 #include <vlc_aout.h>
 #include <vlc_interface.h>
+#include <vlc_playlist.h>
 
 #include "wince.h"
 
@@ -330,7 +331,7 @@ void DialogsProvider::OnOpenFileSimple( int i_arg )
 {
     OPENFILENAME ofn;
     TCHAR szFile[MAX_PATH] = _T("\0");
-    static TCHAR szFilter[] = _T("All (*.*)\0*.*\0");
+    static TCHAR szFilter[] = _T("wav (*.wav)\0*.wav\0mp3 (*.mp3 *.mpga)\0*.mp3;*.mpga\0All (*.*)\0*.*\0");
 
     playlist_t *p_playlist = pl_Yield( p_intf );
     if( p_playlist == NULL ) return;
@@ -363,7 +364,8 @@ void DialogsProvider::OnOpenFileSimple( int i_arg )
     {
         char *psz_filename = _TOMB(ofn.lpstrFile);
         playlist_Add( p_playlist, psz_filename, psz_filename,
-                      PLAYLIST_APPEND | (i_arg?PLAYLIST_GO:0), PLAYLIST_END );
+                      PLAYLIST_APPEND | (i_arg?PLAYLIST_GO:0), PLAYLIST_END,
+                      TRUE, FALSE );
     }
 
     pl_Release( p_intf );
@@ -423,7 +425,7 @@ void DialogsProvider::OnOpenDirectory( int i_arg )
             char *psz_filename = _TOMB(psz_result);
             playlist_Add( p_playlist, psz_filename, psz_filename,
                           PLAYLIST_APPEND | (i_arg ? PLAYLIST_GO : 0),
-                          PLAYLIST_END );
+                          PLAYLIST_END, TRUE, FALSE );
         }
         p_malloc->Free( pidl );
     }
diff --git a/modules/gui/wince/fileinfo.cpp b/modules/gui/wince/fileinfo.cpp
index f6e1a49..aa3d887 100644
--- a/modules/gui/wince/fileinfo.cpp
+++ b/modules/gui/wince/fileinfo.cpp
@@ -31,6 +31,7 @@
 
 #include <vlc_common.h>
 #include <vlc_interface.h>
+#include <vlc_input.h>
 
 #include "wince.h"
 
@@ -119,8 +120,10 @@ void FileInfo::UpdateFileInfo()
 
     tvi.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM;
 
-    // Set the text of the item.
-    tvi.pszText = _FROMMB( p_input->input.p_item->psz_name );
+    // Set the text of the item. Not right, but I don't know yet how to handle this
+    //tvi.pszText = _FROMMB( p_input->input.p_item->psz_name ); <- old line
+    input_item_t * inp_item = input_item_GetById( p_input, 1 );
+    tvi.pszText = _FROMMB( input_item_GetName( inp_item ) );
     tvi.cchTextMax = _tcslen( tvi.pszText );
 
     // Save the heading level in the item's application-defined data area
@@ -135,13 +138,13 @@ void FileInfo::UpdateFileInfo()
 
     hPrevRootItem = hPrev;
 
-    vlc_mutex_lock( &p_input->input.p_item->lock );
-    for( int i = 0; i < p_input->input.p_item->i_categories; i++ )
+    vlc_mutex_lock( &inp_item->lock );
+    for( int i = 0; i < inp_item->i_categories; i++ )
     {
-        info_category_t *p_cat = p_input->input.p_item->pp_categories[i];
+        info_category_t *p_cat = inp_item->pp_categories[i];
 
         // Set the text of the item.
-        tvi.pszText = _FROMMB( p_input->input.p_item->psz_name );
+        tvi.pszText = _FROMMB( inp_item->psz_name );
         tvi.cchTextMax = _tcslen( tvi.pszText );
  
         // Save the heading level in the item's application-defined data area
@@ -176,7 +179,7 @@ void FileInfo::UpdateFileInfo()
 
         TreeView_Expand( hwndTV, hPrevLev2Item, TVE_EXPANDPARTIAL|TVE_EXPAND );
     }
-    vlc_mutex_unlock( &p_input->input.p_item->lock );
+    vlc_mutex_unlock( &inp_item->lock );
 
     TreeView_Expand( hwndTV, hPrevRootItem, TVE_EXPANDPARTIAL|TVE_EXPAND );
 
diff --git a/modules/gui/wince/interface.cpp b/modules/gui/wince/interface.cpp
index d9c1463..ae53959 100644
--- a/modules/gui/wince/interface.cpp
+++ b/modules/gui/wince/interface.cpp
@@ -37,9 +37,13 @@
 #include <vlc_aout.h>
 #include <vlc_vout.h>
 #include <vlc_interface.h>
+#include <vlc_input.h>
+#include <vlc_playlist.h>
 
 #include "wince.h"
 
+#define INT64_C(val) val##LL
+
 #include <windowsx.h>
 #include <commctrl.h>
 #include <commdlg.h>
@@ -501,7 +505,7 @@ LRESULT Interface::WndProc( HWND hwnd, UINT msg, WPARAM wp, LPARAM lp )
         {
             string about = (string)"VLC media player " PACKAGE_VERSION +
                 _("\n(WinCE interface)\n\n") +
-                _("(c) 1996-2006 - the VideoLAN Team\n\n") +
+                _("(c) 1996-2008 - the VideoLAN Team\n\n") +
                 _("Compiled by ") + VLC_CompileBy() + "@" +
                 VLC_CompileHost() + "." + VLC_CompileDomain() + ".\n" +
                 _("Compiler: ") + VLC_Compiler() + ".\n" +
@@ -640,7 +644,7 @@ void Interface::OnPlayStream( void )
     playlist_t *p_playlist = pl_Yield( p_intf );
     if( p_playlist == NULL ) return;
 
-    if( p_playlist->i_size )
+    if( !playlist_IsEmpty(p_playlist) )
     {
         vlc_value_t state;
 
diff --git a/modules/gui/wince/iteminfo.cpp b/modules/gui/wince/iteminfo.cpp
index c0f967f..9b8a06a 100644
--- a/modules/gui/wince/iteminfo.cpp
+++ b/modules/gui/wince/iteminfo.cpp
@@ -31,6 +31,7 @@
 
 #include <vlc_common.h>
 #include <vlc_interface.h>
+#include <vlc_playlist.h>
 
 #include "wince.h"
 
@@ -72,6 +73,8 @@ LRESULT ItemInfoDialog::WndProc( HWND hwnd, UINT msg, WPARAM wp, LPARAM lp )
     INITCOMMONCONTROLSEX iccex;
     RECT rcClient;
 
+    char *psz_uri;
+
     switch( msg )
     {
     case WM_INITDIALOG:
@@ -104,7 +107,7 @@ LRESULT ItemInfoDialog::WndProc( HWND hwnd, UINT msg, WPARAM wp, LPARAM lp )
                         WS_CHILD | WS_VISIBLE | SS_RIGHT,
                         0, 10, 60, 15, hwnd, NULL, hInst, NULL);
 
-        char *psz_uri = input_item_GetURI( &p_item->input );
+        psz_uri = input_item_GetURI( p_item->p_input );
         uri_text = CreateWindow( _T("EDIT"), _FROMMB(psz_uri),
             WS_CHILD | WS_VISIBLE | WS_BORDER | SS_LEFT | ES_AUTOHSCROLL,
             70, 10 - 3, rcClient.right - 70 - 10, 15 + 6, hwnd, 0, hInst, 0 );
@@ -117,7 +120,7 @@ LRESULT ItemInfoDialog::WndProc( HWND hwnd, UINT msg, WPARAM wp, LPARAM lp )
                                    hwnd, NULL, hInst, NULL);
 
         name_text = CreateWindow( _T("EDIT"),
-            _FROMMB(p_item->input.psz_name),
+            _FROMMB(p_item->p_input->psz_name),
             WS_CHILD | WS_VISIBLE | WS_BORDER | SS_LEFT | ES_AUTOHSCROLL,
             70, 10 + 15 + 10 - 3, rcClient.right - 70 - 10, 15 + 6,
             hwnd, NULL, hInst, NULL);
@@ -134,7 +137,8 @@ LRESULT ItemInfoDialog::WndProc( HWND hwnd, UINT msg, WPARAM wp, LPARAM lp )
             hwnd, NULL, hInst, NULL );
 
         SendMessage( enabled_checkbox, BM_SETCHECK,
-                     p_item->b_enabled ? BST_CHECKED : BST_UNCHECKED, 0 );
+                     (p_item->i_flags & PLAYLIST_DBL_FLAG) ?
+                     BST_UNCHECKED : BST_CHECKED, 0 );
 
         /* Treeview */
         iccex.dwSize = sizeof( INITCOMMONCONTROLSEX );
@@ -190,7 +194,7 @@ LRESULT ItemInfoDialog::WndProc( HWND hwnd, UINT msg, WPARAM wp, LPARAM lp )
     tvi.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM;
 
     // Set the text of the item.
-    tvi.pszText = _FROMMB(p_item->input.psz_name);
+    tvi.pszText = _FROMMB(p_item->p_input->psz_name);
     tvi.cchTextMax = _tcslen(tvi.pszText);
 
     // Save the heading level in the item's application-defined data area
@@ -204,13 +208,13 @@ LRESULT ItemInfoDialog::WndProc( HWND hwnd, UINT msg, WPARAM wp, LPARAM lp )
     hPrevRootItem = hPrev;
 
     /* Rebuild the tree */
-    vlc_mutex_lock( &p_item->input.lock );
-    for( int i = 0; i < p_item->input.i_categories; i++ )
+    vlc_mutex_lock( &p_item->p_input->lock );
+    for( int i = 0; i < p_item->p_input->i_categories; i++ )
     {
-        info_category_t *p_cat = p_item->input.pp_categories[i];
+        info_category_t *p_cat = p_item->p_input->pp_categories[i];
 
         // Set the text of the item.
-        tvi.pszText = _FROMMB( p_item->input.psz_name );
+        tvi.pszText = _FROMMB( p_item->p_input->psz_name );
         tvi.cchTextMax = _tcslen( tvi.pszText );
  
         // Save the heading level in the item's application-defined data area
@@ -246,7 +250,7 @@ LRESULT ItemInfoDialog::WndProc( HWND hwnd, UINT msg, WPARAM wp, LPARAM lp )
         TreeView_Expand( info_tree, hPrevLev2Item,
                          TVE_EXPANDPARTIAL |TVE_EXPAND );
     }
-    vlc_mutex_unlock( &p_item->input.lock );
+    vlc_mutex_unlock( &p_item->p_input->lock );
 
     TreeView_Expand( info_tree, hPrevRootItem, TVE_EXPANDPARTIAL |TVE_EXPAND );
 }
@@ -260,14 +264,14 @@ void ItemInfoDialog::OnOk()
 
     TCHAR psz_name[MAX_PATH];
     Edit_GetText( name_text, psz_name, MAX_PATH );
-    input_item_SetName( &p_item->input, _TOMB( psz_name ) );
+    input_item_SetName( p_item->p_input, _TOMB( psz_name ) );
 
     TCHAR psz_uri[MAX_PATH];
     Edit_GetText( uri_text, psz_uri, MAX_PATH );
-    input_item_SetURI( &p_item->input, _TOMB(psz_uri) );
+    input_item_SetURI( p_item->p_input, _TOMB(psz_uri) );
 
-    vlc_mutex_lock( &p_item->input.lock );
-    bool b_old_enabled = p_item->b_enabled;
+    vlc_mutex_lock( &p_item->p_input->lock );
+    bool b_old_enabled = !(p_item->i_flags & PLAYLIST_DBL_FLAG);
 
     playlist_t * p_playlist = pl_Yield( p_intf );
     if( p_playlist != NULL )
@@ -276,7 +280,7 @@ void ItemInfoDialog::OnOk()
         pl_Release( p_intf );
     }
 
-    p_item->b_enabled = (b_state & BST_CHECKED) ? true : false ;
+    p_item->i_flags |= (b_state & BST_CHECKED) ? false : PLAYLIST_DBL_FLAG ;
 
-    vlc_mutex_unlock( &p_item->input.lock );
+    vlc_mutex_unlock( &p_item->p_input->lock );
 }
diff --git a/modules/gui/wince/menus.cpp b/modules/gui/wince/menus.cpp
index 19f6d5c..a32aaa7 100644
--- a/modules/gui/wince/menus.cpp
+++ b/modules/gui/wince/menus.cpp
@@ -31,6 +31,7 @@
 
 #include <vlc_common.h>
 #include <vlc_interface.h>
+#include <vlc_playlist.h>
 
 #include "wince.h"
 
@@ -222,7 +223,7 @@ void PopupMenu( intf_thread_t *p_intf, HWND p_parent, POINT point )
     else
     {
         playlist_t * p_playlist = pl_Yield( p_intf );
-        if( p_playlist && p_playlist->i_size )
+        if( p_playlist && !playlist_IsEmpty( p_playlist ) )
         {
             AppendMenu( hmenu, MF_SEPARATOR, 0, _T("") );
             AppendMenu( hmenu, MF_STRING, PlayStream_Event, _T("Play") );
diff --git a/modules/gui/wince/messages.cpp b/modules/gui/wince/messages.cpp
index c5338a0..1d42350 100644
--- a/modules/gui/wince/messages.cpp
+++ b/modules/gui/wince/messages.cpp
@@ -206,17 +206,20 @@ void Messages::UpdateLog()
         for( i_start = p_sub->i_start; i_start != i_stop;
              i_start = (i_start+1) % VLC_MSG_QSIZE )
         {
+            vlc_value_t val;
+            var_Get( p_intf->p_libvlc, "verbose", &val );
+
             switch( p_sub->p_msg[i_start].i_type )
             {
             case VLC_MSG_ERR:
             case VLC_MSG_INFO:
-                if( p_intf->p_libvlc_global->i_verbose < 0 ) continue;
+                if( val.i_int < 0 )  continue;
                 break;
             case VLC_MSG_WARN:
-                if( p_intf->p_libvlc_global->i_verbose < 1 ) continue;
+                if( val.i_int < 1 ) continue;
                 break;
             case VLC_MSG_DBG:
-                if( p_intf->p_libvlc_global->i_verbose < 2 ) continue;
+                if( val.i_int < 2 ) continue;
                 break;
             }
 
diff --git a/modules/gui/wince/open.cpp b/modules/gui/wince/open.cpp
index 6a2d3e1..24d2bad 100644
--- a/modules/gui/wince/open.cpp
+++ b/modules/gui/wince/open.cpp
@@ -31,6 +31,7 @@
 
 #include <vlc_common.h>
 #include <vlc_interface.h>
+#include <vlc_playlist.h>
 
 #include "wince.h"
 
@@ -601,32 +602,32 @@ void OpenDialog::OnOk()
     GetWindowText( mrl_combo, psz_text, 2048 );
 
     int i_args;
-    char **pp_args = vlc_parse_cmdline( _TOMB(psz_text), &i_args );
+    /*char **pp_args = vlc_parse_cmdline( _TOMB(psz_text), &i_args );
 
     ComboBox_AddString( mrl_combo, psz_text );
     if( ComboBox_GetCount( mrl_combo ) > 10 )
         ComboBox_DeleteString( mrl_combo, 0 );
-    ComboBox_SetCurSel( mrl_combo, ComboBox_GetCount( mrl_combo ) - 1 );
+    ComboBox_SetCurSel( mrl_combo, ComboBox_GetCount( mrl_combo ) - 1 );*/
 
     /* Update the playlist */
     playlist_t *p_playlist = pl_Yield( p_intf );
     if( p_playlist == NULL ) return;
 
-    for( int i = 0; i < i_args; i++ )
+ /*   for( int i = 0; i < i_args; i++ )
     {
         bool b_start = !i && i_open_arg;
         playlist_item_t *p_item =
             playlist_ItemNew( p_playlist, pp_args[i], pp_args[i] );
 
         /* Insert options */
-        while( i + 1 < i_args && pp_args[i + 1][0] == ':' )
+/*        while( i + 1 < i_args && pp_args[i + 1][0] == ':' )
         {
             playlist_ItemAddOption( p_item, pp_args[i + 1] );
             i++;
-        }
+        }*/
 
         /* Get the options from the subtitles dialog */
-        if( (SendMessage( subsfile_checkbox, BM_GETCHECK, 0, 0 ) & BST_CHECKED)
+/*        if( (SendMessage( subsfile_checkbox, BM_GETCHECK, 0, 0 ) & BST_CHECKED)
             && subsfile_mrl.size() )
         {
             for( int j = 0; j < (int)subsfile_mrl.size(); j++ )
@@ -654,7 +655,7 @@ void OpenDialog::OnOk()
     {
         free( pp_args[i_args] );
         if( !i_args ) free( pp_args );
-    }
+    }*/
     pl_Release( p_intf );
 }
 
diff --git a/modules/gui/wince/playlist.cpp b/modules/gui/wince/playlist.cpp
index 5d4f0dc..47e7ec7 100644
--- a/modules/gui/wince/playlist.cpp
+++ b/modules/gui/wince/playlist.cpp
@@ -31,6 +31,7 @@
 
 #include <vlc_common.h>
 #include <vlc_interface.h>
+#include <vlc_playlist.h>
 
 #include "wince.h"
 
@@ -80,21 +81,21 @@ enum
 // The TBBUTTON structure contains information the toolbar buttons.
 static TBBUTTON tbButton2[] =
 {
-  {0, ID_MANAGE_OPENPL,        TBSTATE_ENABLED, TBSTYLE_BUTTON},
-  {1, ID_MANAGE_SAVEPL,       TBSTATE_ENABLED, TBSTYLE_BUTTON},
-  {0, 0,              TBSTATE_ENABLED, TBSTYLE_SEP},
-  {2, ID_MANAGE_ADDFILE,       TBSTATE_ENABLED, TBSTYLE_BUTTON},
-  {3, ID_MANAGE_ADDMRL,        TBSTATE_ENABLED, TBSTYLE_BUTTON},
-  {4, ID_SEL_DELETE,       TBSTATE_ENABLED, TBSTYLE_BUTTON},
-  {0, 0,              TBSTATE_ENABLED, TBSTYLE_SEP},
-  {5, Infos_Event,      TBSTATE_ENABLED, TBSTYLE_BUTTON},
-  {0, 0,              TBSTATE_ENABLED, TBSTYLE_SEP},
-  {6, Up_Event,      TBSTATE_ENABLED, TBSTYLE_BUTTON},
-  {7, Down_Event,      TBSTATE_ENABLED, TBSTYLE_BUTTON},
-  {0, 0,              TBSTATE_ENABLED, TBSTYLE_SEP},
-  {8, Random_Event,      TBSTATE_ENABLED, TBSTYLE_CHECK},
-  {9, Loop_Event,       TBSTATE_ENABLED, TBSTYLE_CHECK},
-  {10, Repeat_Event,       TBSTATE_ENABLED, TBSTYLE_CHECK}
+  {0,  ID_MANAGE_OPENPL,        TBSTATE_ENABLED, TBSTYLE_BUTTON },
+  {1,  ID_MANAGE_SAVEPL,        TBSTATE_ENABLED, TBSTYLE_BUTTON },
+  {0,  0,                       TBSTATE_ENABLED, TBSTYLE_SEP    },
+  {2,  ID_MANAGE_ADDFILE,       TBSTATE_ENABLED, TBSTYLE_BUTTON },
+  {3,  ID_MANAGE_ADDMRL,        TBSTATE_ENABLED, TBSTYLE_BUTTON },
+  {4,  ID_SEL_DELETE,           TBSTATE_ENABLED, TBSTYLE_BUTTON },
+  {0,  0,                       TBSTATE_ENABLED, TBSTYLE_SEP    },
+  {5,  Infos_Event,             TBSTATE_ENABLED, TBSTYLE_BUTTON },
+  {0,  0,                       TBSTATE_ENABLED, TBSTYLE_SEP    },
+  {6,  Up_Event,                TBSTATE_ENABLED, TBSTYLE_BUTTON },
+  {7,  Down_Event,              TBSTATE_ENABLED, TBSTYLE_BUTTON },
+  {0,  0,                       TBSTATE_ENABLED, TBSTYLE_SEP    },
+  {8,  Random_Event,            TBSTATE_ENABLED, TBSTYLE_CHECK  },
+  {9,  Loop_Event,              TBSTATE_ENABLED, TBSTYLE_CHECK  },
+  {10, Repeat_Event,            TBSTATE_ENABLED, TBSTYLE_CHECK  }
 };
 
 // Toolbar ToolTips
@@ -518,21 +519,21 @@ LRESULT Playlist::ProcessCustomDraw( LPARAM lParam )
     case CDDS_ITEMPREPAINT: //Before an item is drawn
         playlist_t *p_playlist = pl_Yield( p_intf );
         if( p_playlist == NULL ) return CDRF_DODEFAULT;
-        if( (int)lplvcd->nmcd.dwItemSpec == p_playlist->i_index )
+        if( (int)lplvcd->nmcd.dwItemSpec == p_playlist->i_current_index )
         {
             lplvcd->clrText = RGB(255,0,0);
             pl_Release( p_intf );
             return CDRF_NEWFONT;
         }
  
-        playlist_item_t *p_item = playlist_ItemGetByPos( p_playlist,
-                                        (int)lplvcd->nmcd.dwItemSpec );
+        playlist_item_t *p_item = playlist_ItemGetById( p_playlist,
+                                        (int)lplvcd->nmcd.dwItemSpec, FALSE );
         if( !p_item )
         {
             pl_Release( p_intf );
             return CDRF_DODEFAULT;
         }
-        if( p_item->b_enabled == false )
+        if( p_item->i_flags & PLAYLIST_DBL_FLAG )
         {
             lplvcd->clrText = RGB(192,192,192);
             pl_Release( p_intf );
@@ -594,13 +595,13 @@ void Playlist::UpdatePlaylist()
     /* Update the colour of items */
 
     vlc_object_lock( p_playlist );
-    if( p_intf->p_sys->i_playing != p_playlist->i_index )
+    if( p_intf->p_sys->i_playing != playlist_CurrentSize( p_playlist ) )
     {
         // p_playlist->i_index in RED
         Rebuild();
 
         // if exists, p_intf->p_sys->i_playing in BLACK
-        p_intf->p_sys->i_playing = p_playlist->i_index;
+        p_intf->p_sys->i_playing = p_playlist->i_current_index;
     }
     vlc_object_unlock( p_playlist );
 
@@ -623,8 +624,13 @@ void Playlist::Rebuild()
 
     /* ...and rebuild it */
     vlc_object_lock( p_playlist );
-    for( int i = 0; i < p_playlist->i_size; i++ )
+
+    playlist_item_t * p_root = p_playlist->p_local_onelevel;
+    playlist_item_t * p_child = NULL;
+
+    for( int i = 0; i < playlist_NodeChildrenCount( p_playlist, p_root ); i++ )
     {
+        p_child = playlist_GetNextLeaf( p_playlist, p_root, p_child, FALSE, FALSE);
         LVITEM lv;
         lv.mask = LVIF_TEXT;
         lv.pszText = _T("");
@@ -633,8 +639,9 @@ void Playlist::Rebuild()
         lv.iItem = i;
         ListView_InsertItem( hListView, &lv );
         ListView_SetItemText( hListView, lv.iItem, 0,
-            _FROMMB(p_playlist->pp_items[i]->input.psz_name) );
-        UpdateItem( i );
+            _FROMMB(p_child->p_input->psz_name) );
+
+        UpdateItem( p_child->i_id );
     }
     vlc_object_unlock( p_playlist );
 
@@ -657,7 +664,7 @@ void Playlist::UpdateItem( int i )
 
     if( p_playlist == NULL ) return;
 
-    playlist_item_t *p_item = playlist_ItemGetByPos( p_playlist, i );
+    playlist_item_t *p_item = playlist_ItemGetById( p_playlist, i, FALSE );
 
     if( !p_item )
     {
@@ -665,17 +672,19 @@ void Playlist::UpdateItem( int i )
         return;
     }
 
-    ListView_SetItemText( hListView, i, 0, _FROMMB(p_item->input.psz_name) );
+    ListView_SetItemText( hListView, i, 0, _FROMMB(p_item->p_input->psz_name) );
+
     ListView_SetItemText( hListView, i, 1,
-                          _FROMMB( input_item_GetInfo( &p_item->input,
+                          _FROMMB( input_item_GetInfo( p_item->p_input,
                                    _("General") , _("Author") ) ) );
 
     char psz_duration[MSTRTIME_MAX_SIZE];
-    mtime_t dur = input_item_GetDuration( p_item );
+    mtime_t dur = input_item_GetDuration( p_item->p_input );
+
     if( dur != -1 ) secstotimestr( psz_duration, dur/1000000 );
     else memcpy( psz_duration , "-:--:--", sizeof("-:--:--") );
 
-    ListView_SetItemText( hListView, i, 3, _FROMMB(psz_duration) );
+    ListView_SetItemText( hListView, i, 2, _FROMMB(psz_duration) );
 
     pl_Release( p_intf );
 }
@@ -688,7 +697,7 @@ void Playlist::DeleteItem( int item )
     playlist_t *p_playlist = pl_Yield( p_intf );
     if( p_playlist == NULL ) return;
 
-    playlist_Delete( p_playlist, item );
+    playlist_DeleteFromInput( p_playlist, item, FALSE );
     ListView_DeleteItem( hListView, item );
 
     pl_Release( p_intf );
@@ -746,7 +755,7 @@ static void OnSaveCB( intf_dialog_args_t *p_arg )
                 psz_export = "export-pls";
             else psz_export = "export-m3u";
 
-            playlist_Export( p_playlist, p_arg->psz_results[0], psz_export );
+            playlist_Export( p_playlist, p_arg->psz_results[0], p_playlist->p_local_onelevel, psz_export );
             pl_Release( p_intf );
         }
     }
@@ -809,8 +818,8 @@ void Playlist::OnEnableSelection()
         if( ListView_GetItemState( hListView, item, LVIS_SELECTED ) )
         {
             playlist_item_t *p_item =
-                playlist_ItemGetByPos( p_playlist, item );
-            playlist_Enable( p_playlist, p_item );
+                playlist_ItemGetById( p_playlist, item, FALSE );
+            p_item->i_flags ^= PLAYLIST_DBL_FLAG;
             UpdateItem( item );
         }
     }
@@ -829,8 +838,8 @@ void Playlist::OnDisableSelection()
         {
             /*XXX*/
             playlist_item_t *p_item =
-                playlist_ItemGetByPos( p_playlist, item );
-            playlist_Disable( p_playlist, p_item );
+                playlist_ItemGetById( p_playlist, item, FALSE );
+            p_item->i_flags |= PLAYLIST_DBL_FLAG;
             UpdateItem( item );
         }
     }
@@ -851,7 +860,7 @@ void Playlist::OnActivateItem( int i_item )
     playlist_t *p_playlist = pl_Yield( p_intf );
     if( p_playlist == NULL ) return;
 
-    playlist_Goto( p_playlist, i_item );
+    playlist_Skip( p_playlist, i_item - p_playlist->i_current_index );
 
     pl_Release( p_intf );
 }
@@ -862,7 +871,7 @@ void Playlist::ShowInfos( HWND hwnd, int i_item )
     if( p_playlist == NULL ) return;
 
     vlc_object_lock( p_playlist);
-    playlist_item_t *p_item = playlist_ItemGetByPos( p_playlist, i_item );
+    playlist_item_t *p_item = playlist_ItemGetById( p_playlist, i_item, true );
     vlc_object_unlock( p_playlist );
 
     if( p_item )
@@ -889,9 +898,9 @@ void Playlist::OnUp()
     long i_item =
         ListView_GetNextItem( hListView, -1, LVIS_SELECTED | LVNI_ALL );
 
-    if( i_item > 0 && i_item < p_playlist->i_size )
+    if( i_item > 0 && i_item < playlist_CurrentSize( p_playlist ) )
     {
-        playlist_Move( p_playlist , i_item, i_item - 1);
+        playlist_Prev( p_playlist );
         if( i_item > 1 )
         {
             ListView_SetItemState( hListView, i_item - 1, LVIS_FOCUSED,
@@ -917,9 +926,9 @@ void Playlist::OnDown()
     long i_item =
         ListView_GetNextItem( hListView, -1, LVIS_SELECTED | LVNI_ALL );
 
-    if( i_item >= 0 && i_item < p_playlist->i_size - 1 )
+    if( i_item >= 0 && i_item < playlist_CurrentSize( p_playlist ) - 1 )
     {
-        playlist_Move( p_playlist , i_item, i_item + 2 );
+        playlist_Next( p_playlist );
         ListView_SetItemState( hListView, i_item + 1, LVIS_FOCUSED,
                                LVIS_STATEIMAGEMASK );
     }
@@ -981,19 +990,24 @@ void Playlist::OnSort( UINT event )
     switch( event )
     {
     case ID_SORT_TITLE:
-        playlist_SortTitle( p_playlist , ORDER_NORMAL );
+        playlist_RecursiveNodeSort(p_playlist , p_playlist->p_root_onelevel,
+                                    SORT_TITLE, ORDER_NORMAL);
         break;
     case ID_SORT_RTITLE:
-        playlist_SortTitle( p_playlist , ORDER_REVERSE );
+        playlist_RecursiveNodeSort(p_playlist , p_playlist->p_root_onelevel,
+                                    SORT_TITLE, ORDER_REVERSE );
         break;
     case ID_SORT_AUTHOR:
-        playlist_SortAuthor(p_playlist , ORDER_NORMAL );
+        playlist_RecursiveNodeSort(p_playlist , p_playlist->p_root_onelevel,
+                                    SORT_ARTIST, ORDER_NORMAL);
         break;
     case ID_SORT_RAUTHOR:
-        playlist_SortAuthor( p_playlist , ORDER_REVERSE );
+        playlist_RecursiveNodeSort(p_playlist , p_playlist->p_root_onelevel,
+                                    SORT_ARTIST, ORDER_REVERSE);
         break;
     case ID_SORT_SHUFFLE:
-        playlist_Sort( p_playlist , SORT_RANDOM, ORDER_NORMAL );
+        playlist_RecursiveNodeSort(p_playlist , p_playlist->p_root_onelevel,
+                                    SORT_RANDOM, ORDER_NORMAL);
         break;
     }
 
@@ -1014,24 +1028,28 @@ void Playlist::OnColSelect( int iSubItem )
     case 0:
         if( i_title_sorted != 1 )
         {
-            playlist_SortTitle( p_playlist, ORDER_NORMAL );
+            playlist_RecursiveNodeSort(p_playlist , p_playlist->p_root_onelevel,
+                                    SORT_TITLE, ORDER_NORMAL);
             i_title_sorted = 1;
         }
         else
         {
-            playlist_SortTitle( p_playlist, ORDER_REVERSE );
+            playlist_RecursiveNodeSort(p_playlist , p_playlist->p_root_onelevel,
+                                    SORT_TITLE, ORDER_REVERSE );
             i_title_sorted = -1;
         }
         break;
     case 1:
         if( i_author_sorted != 1 )
         {
-            playlist_SortAuthor( p_playlist, ORDER_NORMAL );
+            playlist_RecursiveNodeSort(p_playlist , p_playlist->p_root_onelevel,
+                                    SORT_ARTIST, ORDER_NORMAL);
             i_author_sorted = 1;
         }
         else
         {
-            playlist_SortAuthor( p_playlist, ORDER_REVERSE );
+            playlist_RecursiveNodeSort(p_playlist , p_playlist->p_root_onelevel,
+                                    SORT_ARTIST, ORDER_REVERSE);
             i_author_sorted = -1;
         }
         break;
@@ -1059,7 +1077,7 @@ void Playlist::OnPopupPlay()
 
     if( i_popup_item != -1 )
     {
-        playlist_Goto( p_playlist, i_popup_item );
+        playlist_Skip( p_playlist, i_popup_item - p_playlist->i_current_index );
     }
 
     pl_Release( p_intf );
@@ -1082,16 +1100,16 @@ void Playlist::OnPopupEna()
     if( p_playlist == NULL ) return;
 
     playlist_item_t *p_item =
-        playlist_ItemGetByPos( p_playlist, i_popup_item );
+        playlist_ItemGetById( p_playlist, i_popup_item, FALSE );
 
-    if( p_playlist->pp_items[i_popup_item]->b_enabled )
+    if( !(p_playlist->items.p_elems[i_popup_item]->i_flags & PLAYLIST_DBL_FLAG) )
         //playlist_IsEnabled( p_playlist, i_popup_item ) )
     {
-        playlist_Disable( p_playlist, p_item );
+        p_item->i_flags |= PLAYLIST_DBL_FLAG;
     }
     else
     {
-        playlist_Enable( p_playlist, p_item );
+        p_item->i_flags ^= PLAYLIST_DBL_FLAG;
     }
 
     pl_Release( p_intf );
diff --git a/modules/gui/wince/preferences.cpp b/modules/gui/wince/preferences.cpp
index 3905575..6f541e6 100644
--- a/modules/gui/wince/preferences.cpp
+++ b/modules/gui/wince/preferences.cpp
@@ -44,9 +44,10 @@
 
 #include "preferences_widgets.h"
 
-#define GENERAL_ID 1242
-#define PLUGIN_ID 1243
-#define CAPABILITY_ID 1244
+#define TYPE_CATEGORY 0
+#define TYPE_CATSUBCAT 1  /* Category with embedded subcategory */
+#define TYPE_SUBCATEGORY 2
+#define TYPE_MODULE 3
 
 /*****************************************************************************
  * Event Table.
@@ -98,7 +99,7 @@ public:
 
     PrefsPanel() { }
     PrefsPanel( HWND parent, HINSTANCE hInst, intf_thread_t *_p_intf,
-                PrefsDialog *, int i_object_id, char *, char * );
+                PrefsDialog *, module_t *p_module, char *, char *, ConfigTreeData * );
     virtual ~PrefsPanel() {}
 
     void Hide();
@@ -126,17 +127,20 @@ class ConfigTreeData
 {
 public:
 
-    ConfigTreeData() { b_submodule = 0; panel = NULL; psz_section = NULL;
+    ConfigTreeData() { b_submodule = 0; panel = NULL; psz_name = NULL;
                        psz_help = NULL; }
     virtual ~ConfigTreeData() { delete panel;
-                                free( psz_section );
+                                free( psz_name );
                                 free( psz_help ); }
 
     bool b_submodule;
 
     PrefsPanel *panel;
+    module_t *p_module;
     int i_object_id;
-    char *psz_section;
+    int i_subcat_id;
+    int i_type;
+    char *psz_name;
     char *psz_help;
 };
 
@@ -318,7 +322,7 @@ PrefsTreeCtrl::PrefsTreeCtrl( intf_thread_t *_p_intf,
                               HINSTANCE hInst )
 {
     vlc_list_t      *p_list;
-    module_t        *p_module;
+    module_t        *p_module = NULL;
     module_config_t *p_item;
     int i_index;
 
@@ -331,7 +335,7 @@ PrefsTreeCtrl::PrefsTreeCtrl( intf_thread_t *_p_intf,
     size_t i_capability_count = 0;
     size_t i_child_index;
 
-    HTREEITEM capability_item;
+    HTREEITEM category_item, subcategory_item;
 
     /* Initializations */
     p_intf = _p_intf;
@@ -366,9 +370,9 @@ PrefsTreeCtrl::PrefsTreeCtrl( intf_thread_t *_p_intf,
      * Build a tree of the main options
      */
     ConfigTreeData *config_data = new ConfigTreeData;
-    config_data->i_object_id = GENERAL_ID;
-    config_data->psz_help = strdup("nothing");//strdup( GENERAL_HELP );
-    config_data->psz_section = strdup( GENERAL_TITLE );
+    config_data->i_object_id = TYPE_CATEGORY;
+    config_data->psz_help = strdup(MAIN_HELP);
+    config_data->psz_name = strdup( GENERAL_TITLE );
     tvi.pszText = _T("General settings");
     tvi.cchTextMax = lstrlen(_T("General settings"));
     tvi.lParam = (long)config_data;
@@ -379,174 +383,241 @@ PrefsTreeCtrl::PrefsTreeCtrl( intf_thread_t *_p_intf,
     // Add the item to the tree-view control.
     hPrev = (HTREEITEM) TreeView_InsertItem( hwndTV, &tvins);
     general_item = hPrev;
-
+    /* Build the categories list */
     for( i_index = 0; i_index < p_list->i_count; i_index++ )
     {
         p_module = (module_t *)p_list->p_values[i_index].p_object;
-        if( !strcmp( p_module->psz_object_name, "main" ) )
+        if( strcmp( module_GetObjName( p_module ), "main" ) == 0 )
             break;
     }
+    /* TODO a remplacer par
+     * p_module = module_GetMainModule( p_intf );
+     */
     if( i_index < p_list->i_count )
     {
+        unsigned int confsize;
+        const char *psz_help;
+        module_config_t * p_config;
+
         /* We found the main module */
 
         /* Enumerate config categories and store a reference so we can
          * generate their config panel them when it is asked by the user. */
-        p_item = p_module->p_config;
+        p_config = module_GetConfig (p_module, &confsize);
 
-        if( p_item ) do
+        for( size_t i = 0; i < confsize; i++ )
         {
-            switch( p_item->i_type )
-            {
-            case CONFIG_HINT_CATEGORY:
-                ConfigTreeData *config_data = new ConfigTreeData;
-                config_data->psz_section = strdup( p_item->psz_text );
-                if( p_item->psz_longtext )
-                {
-                    config_data->psz_help =
-                        strdup( p_item->psz_longtext );
-                }
-                else
-                {
-                    config_data->psz_help = NULL;
-                }
-                config_data->i_object_id = p_module->i_object_id;
-
-                /* Add the category to the tree */
-                // Set the text of the item.
-                tvi.pszText = _FROMMB(p_item->psz_text);
-                tvi.cchTextMax = _tcslen(tvi.pszText);
-                tvi.lParam = (long)config_data;
-                tvins.item = tvi;
-                tvins.hInsertAfter = hPrev;
-                tvins.hParent = general_item; //level 3
- 
-                // Add the item to the tree-view control.
-                hPrev = (HTREEITEM)TreeView_InsertItem( hwndTV, &tvins );
+        /* Work on a new item */
+            module_config_t *p_item = p_config + i;
 
-                break;
-            }
-        }
-        while( p_item->i_type != CONFIG_HINT_END && p_item++ );
+                switch( p_item->i_type )
+                {
+                    case CONFIG_CATEGORY:
+                        if( p_item->value.i == -1 )   break; // Don't display it
+                        config_data = new ConfigTreeData;
+                        config_data->psz_name = strdup( config_CategoryNameGet(p_item->value.i ) );
+                        psz_help = config_CategoryHelpGet( p_item->value.i );
+                        if( psz_help )
+                        {
+                            config_data->psz_help = wraptext( strdup( psz_help ), 72 );
+                        }
+                        else
+                        {
+                            config_data->psz_help = NULL;
+                        }
+
+                        config_data->i_type = TYPE_CATEGORY;
+                        config_data->i_object_id = p_item->value.i;
+                        config_data->p_module =  p_module;
+                        tvi.pszText = _FROMMB(config_data->psz_name);
+                        tvi.cchTextMax = _tcslen(tvi.pszText);
+
+                        /* Add the category to the tree */
+                        tvi.lParam = (long)config_data;
+                        tvins.item = tvi;
+                        tvins.hInsertAfter = hPrev;
+                        tvins.hParent = general_item; //level 3
+
+                        // Add the item to the tree-view control.
+                        hPrev = (HTREEITEM)TreeView_InsertItem( hwndTV, &tvins );
+                        break;
+
+                    case CONFIG_SUBCATEGORY:
+                        if( p_item->value.i == -1 ) break; // Don't display it
+                        /* Special case: move the "general" subcategories to their parent category */
+                        if(config_data && p_item->value.i == SUBCAT_VIDEO_GENERAL ||
+                            p_item->value.i == SUBCAT_ADVANCED_MISC ||
+                            p_item->value.i == SUBCAT_INPUT_GENERAL ||
+                            p_item->value.i == SUBCAT_INTERFACE_GENERAL ||
+                            p_item->value.i == SUBCAT_SOUT_GENERAL||
+                            p_item->value.i == SUBCAT_PLAYLIST_GENERAL||
+                            p_item->value.i == SUBCAT_AUDIO_GENERAL )
+                        {
+
+                            config_data->i_type = TYPE_CATSUBCAT;
+                            config_data->i_subcat_id = p_item->value.i;
+                            free( config_data->psz_name );
+                            config_data->psz_name = strdup( config_CategoryNameGet( p_item->value.i ) );
+
+                            free( config_data->psz_help );
+                            const char *psz_help = config_CategoryHelpGet( p_item->value.i );
+                            if( psz_help )
+                            {
+                                config_data->psz_help = wraptext( strdup( psz_help ), 72 );
+                            }
+                            else
+                            {
+                                config_data->psz_help = NULL;
+                            }
+                            continue;
+                        }
+
+                        config_data = new ConfigTreeData;
+
+                        config_data->psz_name = strdup(  config_CategoryNameGet( p_item->value.i ) );
+                        psz_help = config_CategoryHelpGet( p_item->value.i );
+                        if( psz_help )
+                        {
+                            config_data->psz_help = wraptext( strdup( psz_help ), 72 );
+                        }
+                        else
+                        {
+                            config_data->psz_help = NULL;
+                        }
+                        config_data->i_type = TYPE_SUBCATEGORY;
+                        config_data->i_object_id = p_item->value.i;
+
+                        tvi.pszText = _FROMMB(config_data->psz_name);
+                        tvi.cchTextMax = _tcslen(tvi.pszText);
+
+                        tvi.lParam = (long)config_data;
+                        tvins.item = tvi;
+                        tvins.hInsertAfter = hPrev;
+                        tvins.hParent = hPrev;
+
+                        // Add the item to the tree-view control.
+                        TreeView_InsertItem( hwndTV, &tvins );
+                        break;
 
+                }
+         }
         TreeView_SortChildren( hwndTV, general_item, 0 );
+
+        module_PutConfig( p_config );
     }
- 
-    /*
-     * Build a tree of all the plugins
-     */
-    config_data = new ConfigTreeData;
-    config_data->i_object_id = PLUGIN_ID;
-    config_data->psz_help = strdup("nothing");//strdup( PLUGIN_HELP );
-    config_data->psz_section = strdup("nothing");//strdup( PLUGIN_TITLE );
-    tvi.pszText = _T("Modules");
-    tvi.cchTextMax = lstrlen(_T("Modules"));
-    tvi.lParam = (long)config_data;
-    tvins.item = tvi;
-    tvins.hInsertAfter = TVI_LAST;
-    tvins.hParent = TVI_ROOT;
 
-    // Add the item to the tree-view control.
-    hPrev = (HTREEITEM) TreeView_InsertItem( hwndTV, &tvins);
-    plugins_item = hPrev;
 
-    i_capability_count = 0;
+    module_config_t *p_config;
+    /*
+    * Build a tree of all the plugins
+    */
     for( i_index = 0; i_index < p_list->i_count; i_index++ )
     {
-        i_child_index = 0;
-
+        /* Take every module */
         p_module = (module_t *)p_list->p_values[i_index].p_object;
 
         /* Exclude the main module */
-        if( !strcmp( p_module->psz_object_name, "main" ) )
+        if( !strcmp( module_GetObjName( p_module ), "main" ) )
             continue;
 
         /* Exclude empty plugins (submodules don't have config options, they
          * are stored in the parent module) */
-        if( p_module->b_submodule )
-            p_item = ((module_t *)p_module->p_parent)->p_config;
-        else
-            p_item = p_module->p_config;
 
-        if( !p_item ) continue;
-        do
+        unsigned int confsize;
+        i_child_index = 0;
+        int i_category = 0, i_subcategory = 0, i_options = 0;
+        bool b_options = false;
+
+        p_config = module_GetConfig( (module_t *) p_module,&confsize);
+
+        /* Loop through the configurations items */
+        for( size_t i = 0; i < confsize; i++ )
         {
+            module_config_t *p_item = p_config + i;
+            if( p_item->i_type == CONFIG_CATEGORY )
+                i_category = p_item->value.i;
+            else if( p_item->i_type == CONFIG_SUBCATEGORY )
+                i_subcategory = p_item->value.i;
+
             if( p_item->i_type & CONFIG_ITEM )
+                b_options = true;
+
+            if( b_options && i_category && i_subcategory )
                 break;
         }
-        while( p_item->i_type != CONFIG_HINT_END && p_item++ );
-        if( p_item->i_type == CONFIG_HINT_END ) continue;
+        module_PutConfig (p_config);
 
-        /* Find the capability child item */
-        /*long cookie; size_t i_child_index;*/
-        capability_item = TreeView_GetChild( hwndTV, plugins_item );
-        while( capability_item != 0 )
-        {
-            TVITEM capability_tvi = {0};
-            TCHAR psz_text[256];
-            i_child_index++;
-
-            capability_tvi.mask = TVIF_TEXT;
-            capability_tvi.pszText = psz_text;
-            capability_tvi.cchTextMax = 256;
-            capability_tvi.hItem = capability_item;
-            TreeView_GetItem( hwndTV, &capability_tvi );
-            if( !strcmp( _TOMB(capability_tvi.pszText),
-                         p_module->psz_capability ) ) break;
- 
-            capability_item =
-                TreeView_GetNextSibling( hwndTV, capability_item );
-        }
+        //if( !i_options ) continue;
+        /* Dummy item, please proceed */
+        if( !b_options || i_category == 0 || i_subcategory == 0 ) continue;
 
-        if( i_child_index == i_capability_count &&
-            p_module->psz_capability && *p_module->psz_capability )
+        category_item = TreeView_GetChild( hwndTV, general_item );
+        while(category_item != 0)
         {
-            /* We didn't find it, add it */
-            ConfigTreeData *config_data = new ConfigTreeData;
-            config_data->psz_section =
-                strdup( GetCapabilityHelp( p_module->psz_capability , 1 ) );
-            config_data->psz_help =
-                strdup( GetCapabilityHelp( p_module->psz_capability , 2 ) );
-            config_data->i_object_id = CAPABILITY_ID;
-            tvi.pszText = _FROMMB(p_module->psz_capability);
-            tvi.cchTextMax = _tcslen(tvi.pszText);
-            tvi.lParam = (long)config_data;
-            tvins.item = tvi;
-            tvins.hInsertAfter = plugins_item;
-            tvins.hParent = plugins_item;// level 3
-
-            // Add the item to the tree-view control.
-            capability_item = (HTREEITEM) TreeView_InsertItem( hwndTV, &tvins);
-
-            i_capability_count++;
+            TVITEM category_tvi = {0};
+
+            category_tvi.mask = TVIF_PARAM;
+            category_tvi.lParam = NULL;
+            category_tvi.hItem = category_item;
+            TreeView_GetItem( hwndTV, &category_tvi );
+
+            ConfigTreeData * data = (ConfigTreeData *)category_tvi.lParam;
+
+            if( data->i_object_id == i_category )
+            {
+                subcategory_item = TreeView_GetChild( hwndTV, category_item );
+
+                while(subcategory_item != 0)
+                {
+                    TVITEM subcategory_tvi = {0};
+
+                    subcategory_tvi.mask = TVIF_PARAM;
+                    subcategory_tvi.lParam = NULL;
+                    subcategory_tvi.hItem = subcategory_item;
+                    TreeView_GetItem( hwndTV, &subcategory_tvi );
+
+                    ConfigTreeData * subdata = (ConfigTreeData *)subcategory_tvi.lParam;
+
+                    if( subdata->i_object_id == i_subcategory )
+                    {
+                        config_data = new ConfigTreeData;
+
+                        config_data->psz_name = strdup( module_GetObjName( p_module ) );
+                        config_data->psz_help = NULL;
+                        config_data->i_type = TYPE_MODULE;
+                        config_data->i_object_id = p_item->value.i;
+                        config_data->p_module = p_module;
+
+                        tvi.pszText = _FROMMB(module_GetName( p_module, false ));
+                        tvi.cchTextMax = _tcslen(tvi.pszText);
+
+                        tvi.lParam = (long)config_data;
+                        tvins.item = tvi;
+                        tvins.hInsertAfter = subcategory_item;
+                        tvins.hParent = subcategory_item;
+
+                // Add the item to the tree-view control.
+                        hPrev = (HTREEITEM)TreeView_InsertItem( hwndTV, &tvins );
+                        break;
+                    }
+                    subcategory_item = TreeView_GetNextSibling( hwndTV, subcategory_item );
+                }
+
+                break;
+            }
+
+            category_item = TreeView_GetNextSibling( hwndTV, category_item );
         }
 
-        /* Add the plugin to the tree */
-        ConfigTreeData *config_data = new ConfigTreeData;
-        config_data->b_submodule = p_module->b_submodule;
-        config_data->i_object_id = p_module->b_submodule ?
-            ((module_t *)p_module->p_parent)->i_object_id :
-            p_module->i_object_id;
-        config_data->psz_help = NULL;
-        tvi.pszText = _FROMMB(p_module->psz_object_name);
-        tvi.cchTextMax = _tcslen(tvi.pszText);
-        tvi.lParam = (long)config_data;
-        tvins.item = tvi;
-        tvins.hInsertAfter = capability_item;
-        tvins.hParent = capability_item;// level 4
-
-        // Add the item to the tree-view control.
-        TreeView_InsertItem( hwndTV, &tvins );
     }
 
     /* Sort all this mess */
-    /*long cookie; size_t i_child_index;*/
-    TreeView_SortChildren( hwndTV, plugins_item, 0 );
-    capability_item = TreeView_GetChild( hwndTV, plugins_item );
-    while( capability_item != 0 )
+    TreeView_SortChildren( hwndTV, general_item, 0 );
+    category_item = TreeView_GetChild( hwndTV, general_item );
+    while( category_item != 0 )
     {
-        TreeView_SortChildren( hwndTV, capability_item, 0 );
-        capability_item = TreeView_GetNextSibling( hwndTV, capability_item );
+        TreeView_SortChildren( hwndTV, category_item, 0 );
+        category_item = TreeView_GetNextSibling( hwndTV, category_item );
     }
 
     /* Clean-up everything */
@@ -561,7 +632,6 @@ PrefsTreeCtrl::~PrefsTreeCtrl()
 
 void PrefsTreeCtrl::ApplyChanges()
 {
-    /*long cookie, cookie2;*/
     ConfigTreeData *config_data;
 
     /* Apply changes to the main module */
@@ -582,20 +652,25 @@ void PrefsTreeCtrl::ApplyChanges()
     }
 
     /* Apply changes to the plugins */
-    item = TreeView_GetChild( hwndTV, plugins_item );
+    item = TreeView_GetChild( hwndTV, general_item );
     while( item != 0 )
     {
         HTREEITEM item2 = TreeView_GetChild( hwndTV, item );
         while( item2 != 0 )
         {
-            TVITEM tvi = {0};
-            tvi.mask = TVIF_PARAM;
-            tvi.hItem = item2;
-            TreeView_GetItem( hwndTV, &tvi );
-            config_data = (ConfigTreeData *)tvi.lParam;
-            if( config_data && config_data->panel )
+            HTREEITEM item3 = TreeView_GetChild( hwndTV, item2 );
+            while(item3 !=0)
             {
-                config_data->panel->ApplyChanges();
+                TVITEM tvi = {0};
+                tvi.mask = TVIF_PARAM;
+                tvi.hItem = item3;
+                TreeView_GetItem( hwndTV, &tvi );
+                config_data = (ConfigTreeData *)tvi.lParam;
+                if( config_data && config_data->panel )
+                {
+                    config_data->panel->ApplyChanges();
+                }
+                item3 = TreeView_GetNextSibling( hwndTV, item3 );
             }
             item2 = TreeView_GetNextSibling( hwndTV, item2 );
         }
@@ -605,31 +680,32 @@ void PrefsTreeCtrl::ApplyChanges()
 
 ConfigTreeData *PrefsTreeCtrl::FindModuleConfig( ConfigTreeData *config_data )
 {
-    /* We need this complexity because submodules don't have their own config
-     * options. They use the parent module ones. */
-
-    if( !config_data || !config_data->b_submodule )
+    if( !config_data || !config_data->p_module )
     {
         return config_data;
     }
 
-    /*long cookie, cookie2;*/
     ConfigTreeData *config_new;
-    HTREEITEM item = TreeView_GetChild( hwndTV, plugins_item );
+    HTREEITEM item = TreeView_GetChild( hwndTV, general_item );
     while( item != 0 )
     {
         HTREEITEM item2 = TreeView_GetChild( hwndTV, item );
+
         while( item2 != 0 )
         {
-            TVITEM tvi = {0};
-            tvi.mask = TVIF_PARAM;
-            tvi.hItem = item2;
-            TreeView_GetItem( hwndTV, &tvi );
-            config_new = (ConfigTreeData *)tvi.lParam;
-            if( config_new && !config_new->b_submodule &&
-                config_new->i_object_id == config_data->i_object_id )
+            HTREEITEM item3 = TreeView_GetChild( hwndTV, item2 );
+            while( item3 != 0 )
             {
-                return config_new;
+                TVITEM tvi = {0};
+                tvi.mask = TVIF_PARAM;
+                tvi.hItem = item3;
+                TreeView_GetItem( hwndTV, &tvi );
+                config_new = (ConfigTreeData *)tvi.lParam;
+                if( config_new && config_new->p_module == config_data->p_module )
+                {
+                    return config_new;
+                }
+                item3 = TreeView_GetNextSibling( hwndTV, item3 );
             }
             item2 = TreeView_GetNextSibling( hwndTV, item2 );
         }
@@ -659,6 +735,7 @@ void PrefsTreeCtrl::OnSelectTreeItem( LPNM_TREEVIEW pnmtv, HWND parent,
     tvi.hItem = TreeView_GetSelection( hwndTV );
     TreeView_GetItem( hwndTV, &tvi );
     config_data = FindModuleConfig( (ConfigTreeData *)tvi.lParam );
+
     if( config_data )
     {
         if( !config_data->panel )
@@ -666,9 +743,9 @@ void PrefsTreeCtrl::OnSelectTreeItem( LPNM_TREEVIEW pnmtv, HWND parent,
             /* The panel hasn't been created yet. Let's do it. */
             config_data->panel =
                 new PrefsPanel( parent, hInst, p_intf, p_prefs_dialog,
-                                config_data->i_object_id,
-                                config_data->psz_section,
-                                config_data->psz_help );
+                                config_data->p_module,
+                                config_data->psz_name,
+                                config_data->psz_help, config_data );
         }
         else
         {
@@ -682,21 +759,20 @@ void PrefsTreeCtrl::OnSelectTreeItem( LPNM_TREEVIEW pnmtv, HWND parent,
  *****************************************************************************/
 PrefsPanel::PrefsPanel( HWND parent, HINSTANCE hInst, intf_thread_t *_p_intf,
                         PrefsDialog *_p_prefs_dialog,
-                        int i_object_id, char *psz_section, char *psz_help )
+                        module_t *p_module, char *psz_name, char *psz_help, ConfigTreeData * config_data )
 {
-    module_config_t *p_item;
-    module_t *p_module = NULL;
+    module_config_t *p_item, *p_config, *p_end;
 
     /* Initializations */
     p_intf = _p_intf;
     p_prefs_dialog = _p_prefs_dialog;
+    vlc_list_t *p_list = NULL;
 
     b_advanced = true;
 
-    if( i_object_id == PLUGIN_ID || i_object_id == GENERAL_ID ||
-        i_object_id == CAPABILITY_ID )
+    if( config_data->i_type == TYPE_CATEGORY )
     {
-        label = CreateWindow( _T("STATIC"), _FROMMB(psz_section),
+        label = CreateWindow( _T("STATIC"), _FROMMB(psz_name),
                               WS_CHILD | WS_VISIBLE | SS_LEFT,
                               5, 10 + (15 + 10), 200, 15,
                               parent, NULL, hInst, NULL );
@@ -705,33 +781,79 @@ PrefsPanel::PrefsPanel( HWND parent, HINSTANCE hInst, intf_thread_t *_p_intf,
     else
     {
         /* Get a pointer to the module */
-        p_module = (module_t *)vlc_object_get( i_object_id );
+        if( config_data->i_type == TYPE_MODULE )
+        {
+            p_module = config_data->p_module;
+        }
+        else
+        {
+            /* List the plugins */
+            int i_index;
+            bool b_found = false;
+            p_list = vlc_list_find( p_intf, VLC_OBJECT_MODULE, FIND_ANYWHERE );
+            if( !p_list ) return;
+
+            for( i_index = 0; i_index < p_list->i_count; i_index++ )
+            {
+                p_module = (module_t *)p_list->p_values[i_index].p_object;
+                if( !strcmp( module_GetObjName(p_module), "main" ) )
+                {
+                    b_found = true;
+                    break;
+                }
+            }
+            if( !p_module && !b_found )
+            {
+                msg_Warn( p_intf, "unable to create preferences "
+                        "(main module not found)" );
+                return;
+            }
+        }
 
         /* Enumerate config options and add corresponding config boxes
          * (submodules don't have config options, they are stored in the
          *  parent module) */
-        if( p_module->b_submodule )
-            p_item = ((module_t *)p_module->p_parent)->p_config;
-        else
-            p_item = p_module->p_config;
+        unsigned confsize;
+        p_config = module_GetConfig( (module_t *) p_module,&confsize);
+
+        p_item = p_config;
+        p_end = p_config + confsize;
 
         /* Find the category if it has been specified */
-        if( psz_section && p_item->i_type == CONFIG_HINT_CATEGORY )
+        if( config_data->i_type == TYPE_SUBCATEGORY ||
+            config_data->i_type == TYPE_CATSUBCAT )
         {
-            while( !(p_item->i_type == CONFIG_HINT_CATEGORY) ||
-                   strcmp( psz_section, p_item->psz_text ) )
+            for( ; p_item && p_item < p_end ; p_item++ )
             {
-                if( p_item->i_type == CONFIG_HINT_END ) break;
-                p_item++;
+                if( p_item->i_type == CONFIG_SUBCATEGORY &&
+                    ( config_data->i_type == TYPE_SUBCATEGORY &&
+                    p_item->value.i == config_data->i_object_id ) ||
+                    ( config_data->i_type == TYPE_CATSUBCAT &&
+                    p_item->value.i == config_data->i_subcat_id ) )
+                {
+                    break;
+                }
             }
         }
 
         /* Add a head title to the panel */
-        label = CreateWindow( _T("STATIC"), _FROMMB(psz_section ?
-                        p_item->psz_text : p_module->psz_longname),
+        const char *psz_head;
+        if( config_data->i_type == TYPE_SUBCATEGORY ||
+            config_data->i_type == TYPE_CATSUBCAT )
+        {
+            psz_head = config_data->psz_name;
+            p_item++;
+        }
+        else
+        {
+            psz_head = module_GetLongName(p_module);
+        }
+
+        label = CreateWindow( _T("STATIC"), _FROMMB(psz_head ?
+                psz_head : _("Unknown")),
                         WS_CHILD | WS_VISIBLE | SS_LEFT,
                         5, 10 + (15 + 10), 250, 15,
-                        parent, NULL, hInst, NULL );
+                                 parent, NULL, hInst, NULL );
 
         WNDCLASS wc;
         memset( &wc, 0, sizeof(wc) );
@@ -754,17 +876,22 @@ PrefsPanel::PrefsPanel( HWND parent, HINSTANCE hInst, intf_thread_t *_p_intf,
                         WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_BORDER,
                         5, 10 + 2*(15 + 10), rc.right - 5 - 7, 105,
                         parent, NULL, hInst, (void *) _p_prefs_dialog );
-
         int y_pos = 5;
-        if( p_item ) do
+
+        for( ; p_item && p_item < p_end ; p_item++ )
         {
             /* If a category has been specified, check we finished the job */
-            if( psz_section && p_item->i_type == CONFIG_HINT_CATEGORY &&
-                strcmp( psz_section, p_item->psz_text ) )
+            if( ( ( config_data->i_type == TYPE_SUBCATEGORY &&
+                    p_item->value.i != config_data->i_object_id ) ||
+                    ( config_data->i_type == TYPE_CATSUBCAT  &&
+                    p_item->value.i != config_data->i_subcat_id ) ) &&
+                    (p_item->i_type == CONFIG_CATEGORY ||
+                    p_item->i_type == CONFIG_SUBCATEGORY ) )
                 break;
 
-            ConfigControl *control =
-                CreateConfigControl( VLC_OBJECT(p_intf),
+            ConfigControl *control = NULL;
+
+            control = CreateConfigControl( VLC_OBJECT(p_intf),
                                      p_item, config_window,
                                      hInst, &y_pos );
 
@@ -774,8 +901,7 @@ PrefsPanel::PrefsPanel( HWND parent, HINSTANCE hInst, intf_thread_t *_p_intf,
             /* Add the config data to our array so we can keep a trace of it */
             config_array.push_back( control );
         }
-        while( p_item->i_type != CONFIG_HINT_END && p_item++ );
- 
+
         GetWindowRect( config_window, &rc);
         maxvalue = y_pos - (rc.bottom - rc.top) + 5;
         oldvalue = 0;
@@ -798,7 +924,6 @@ void PrefsPanel::Show()
 void PrefsPanel::ApplyChanges()
 {
     vlc_value_t val;
-
     for( size_t i = 0; i < config_array.size(); i++ )
     {
         ConfigControl *control = config_array[i];
diff --git a/modules/gui/wince/preferences_widgets.cpp b/modules/gui/wince/preferences_widgets.cpp
index bdfefea..d41bfdb 100644
--- a/modules/gui/wince/preferences_widgets.cpp
+++ b/modules/gui/wince/preferences_widgets.cpp
@@ -193,7 +193,7 @@ KeyConfigControl::KeyConfigControl( vlc_object_t *p_this,
     alt = CreateWindow( _T("BUTTON"), _T("Alt"),
                         WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX,
                         20, *py_pos, 15, 15, parent, NULL, hInst, NULL );
-    Button_SetCheck( alt, p_item->i_value & KEY_MODIFIER_ALT ? BST_CHECKED :
+    Button_SetCheck( alt, p_item->i_type & KEY_MODIFIER_ALT ? BST_CHECKED :
                      BST_UNCHECKED );
 
     alt_label = CreateWindow( _T("STATIC"), _T("Alt"),
@@ -204,7 +204,7 @@ KeyConfigControl::KeyConfigControl( vlc_object_t *p_this,
                 WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX,
                 20 + 15 + 5 + 30 + 5, *py_pos, 15, 15,
                 parent, NULL, hInst, NULL );
-    Button_SetCheck( ctrl, p_item->i_value & KEY_MODIFIER_CTRL ? BST_CHECKED :
+    Button_SetCheck( ctrl, p_item->i_type & KEY_MODIFIER_CTRL ? BST_CHECKED :
                      BST_UNCHECKED );
 
     ctrl_label = CreateWindow( _T("STATIC"), _T("Ctrl"),
@@ -216,7 +216,7 @@ KeyConfigControl::KeyConfigControl( vlc_object_t *p_this,
                 WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX,
                 20 + 15 + 5 + 2*(30 + 5) + 15 + 5, *py_pos, 15, 15,
                 parent, NULL, hInst, NULL );
-    Button_SetCheck( shift, p_item->i_value & KEY_MODIFIER_SHIFT ?
+    Button_SetCheck( shift, p_item->i_type & KEY_MODIFIER_SHIFT ?
                      BST_CHECKED : BST_UNCHECKED );
 
     shift_label = CreateWindow( _T("STATIC"), _T("Shift"),
@@ -238,7 +238,7 @@ KeyConfigControl::KeyConfigControl( vlc_object_t *p_this,
         ComboBox_AddString( combo, _FROMMB(m_keysList[i].c_str()) );
         ComboBox_SetItemData( combo, i, (void*)vlc_keys[i].i_key_code );
         if( (unsigned int)vlc_keys[i].i_key_code ==
-            ( ((unsigned int)p_item->i_value) & ~KEY_MODIFIER ) )
+            ( ((unsigned int)p_item->i_type) & ~KEY_MODIFIER ) )
         {
             ComboBox_SetCurSel( combo, i );
             ComboBox_SetText( combo, _FROMMB(m_keysList[i].c_str()) );
@@ -315,13 +315,13 @@ ModuleConfigControl::ModuleConfigControl( vlc_object_t *p_this,
     {
         p_parser = (module_t *)p_list->p_values[i_index].p_object ;
 
-        if( !strcmp( p_parser->psz_capability, p_item->psz_type ) )
+        if( module_IsCapable( p_parser, p_item->psz_type ) )
         {
-            ComboBox_AddString( combo, _FROMMB(p_parser->psz_longname) );
+            ComboBox_AddString( combo, _FROMMB(module_GetLongName( p_parser ) ));
             ComboBox_SetItemData( combo, i_index,
-                                  (void*)p_parser->psz_object_name );
-            if( p_item->psz_value && !strcmp(p_item->psz_value,
-                                             p_parser->psz_object_name) )
+                                  (void *) module_GetObjName( p_parser ) );
+            if( p_item->value.psz && !strcmp( p_item->value.psz,
+                                             module_GetObjName( p_parser )) )
             {
                 ComboBox_SetCurSel( combo, i_index );
                 //ComboBox_SetText( combo, _FROMMB(p_parser->psz_longname) );
@@ -360,8 +360,8 @@ StringConfigControl::StringConfigControl( vlc_object_t *p_this,
 
     *py_pos += 15 + 10;
 
-    textctrl = CreateWindow( _T("EDIT"), p_item->psz_value ?
-                             _FROMMB(p_item->psz_value) : _T(""),
+    textctrl = CreateWindow( _T("EDIT"), p_item->psz_type ?
+                             _FROMMB(p_item->psz_type) : _T(""),
                              WS_CHILD | WS_VISIBLE | WS_BORDER | SS_LEFT |
                              ES_AUTOHSCROLL, 20, *py_pos - 3, 180, 15 + 3,
                              parent, NULL, hInst, NULL );
@@ -733,7 +733,7 @@ FloatConfigControl::FloatConfigControl( vlc_object_t *p_this,
     *py_pos += 15 + 10;
 
     TCHAR psz_string[100];
-    _stprintf( psz_string, _T("%f"), p_item->f_value );
+    _stprintf( psz_string, _T("%d"), p_item->i_type );
     textctrl = CreateWindow( _T("EDIT"), psz_string,
         WS_CHILD | WS_VISIBLE | WS_BORDER | SS_RIGHT | ES_AUTOHSCROLL,
         20, *py_pos - 3, 70, 15 + 3, parent, NULL, hInst, NULL );
@@ -776,7 +776,7 @@ BoolConfigControl::BoolConfigControl( vlc_object_t *p_this,
                              WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX,
                              5, *py_pos, 15, 15,
                              parent, NULL, hInst, NULL );
-    Button_SetCheck( checkbox, p_item->i_value ? BST_CHECKED : BST_UNCHECKED );
+    Button_SetCheck( checkbox, config_GetInt(p_this, p_item->psz_name) ? BST_CHECKED : BST_UNCHECKED );
 
     checkbox_label = CreateWindow( _T("STATIC"), _FROMMB(p_item->psz_text),
                                    WS_CHILD | WS_VISIBLE | SS_LEFT,
diff --git a/modules/gui/wince/subtitles.cpp b/modules/gui/wince/subtitles.cpp
index 2f1edb4..a1067bb 100644
--- a/modules/gui/wince/subtitles.cpp
+++ b/modules/gui/wince/subtitles.cpp
@@ -139,7 +139,7 @@ LRESULT SubsFileDialog::WndProc( HWND hwnd, UINT msg, WPARAM wp, LPARAM lp )
                 hwnd, NULL, hInst, NULL );
 
             encoding_combo = CreateWindow( _T("COMBOBOX"),
-                _FROMMB(p_item->psz_value),
+                _FROMMB(p_item->value.psz),
                 WS_CHILD | WS_VISIBLE | CBS_AUTOHSCROLL | CBS_DROPDOWNLIST |
                 LBS_SORT  | WS_VSCROLL,
                 rcClient.right - 150 - 10, 10 + 5*(15 + 10) - 3, 150, 5*15 + 6,
@@ -152,15 +152,15 @@ LRESULT SubsFileDialog::WndProc( HWND hwnd, UINT msg, WPARAM wp, LPARAM lp )
                 ComboBox_AddString( encoding_combo,
                                     _FROMMB(p_item->ppsz_list[i_index]) );
 
-                if( p_item->psz_value &&
-                    !strcmp( p_item->psz_value, p_item->ppsz_list[i_index] ) )
+                if( p_item->value.psz &&
+                    !strcmp( p_item->value.psz, p_item->ppsz_list[i_index] ) )
                     ComboBox_SetCurSel( encoding_combo, i_index );
             }
 
-            if( p_item->psz_value )
+            if( p_item->value.psz )
             {
                 ComboBox_SelectString( encoding_combo, 0,
-                                       _FROMMB(p_item->psz_value) );
+                                       _FROMMB(p_item->value.psz) );
 
             }
         }
diff --git a/modules/gui/wince/timer.cpp b/modules/gui/wince/timer.cpp
index 5135609..fdacaf5 100644
--- a/modules/gui/wince/timer.cpp
+++ b/modules/gui/wince/timer.cpp
@@ -32,6 +32,8 @@
 #include <vlc_common.h>
 #include <vlc_aout.h>
 #include <vlc_interface.h>
+#include <vlc_input.h>
+#include <vlc_playlist.h>
 
 #include "wince.h"
 
@@ -105,9 +107,10 @@ void Timer::Notify( void )
             ShowWindow( p_main_interface->hwndVol, SW_SHOW );
 
             // only for local file, check if works well with net url
-            shortname = strrchr( p_intf->p_sys->p_input->input.p_item->psz_name, '\\' );
+            input_item_t *p_item =input_GetItem(p_intf->p_sys->p_input);
+            shortname = strrchr( input_item_GetURL(p_item), '\\' );
             if (! shortname)
-                shortname = p_intf->p_sys->p_input->input.p_item->psz_name;
+                shortname = input_item_GetURL(p_item);
             else shortname++;
  
             SendMessage( p_main_interface->hwndSB, SB_SETTEXT,
diff --git a/modules/gui/wince/video.cpp b/modules/gui/wince/video.cpp
index 6e307ba..0c93e9e 100644
--- a/modules/gui/wince/video.cpp
+++ b/modules/gui/wince/video.cpp
@@ -100,9 +100,10 @@ VideoWindow::VideoWindow( intf_thread_t *_p_intf, HWND _p_parent )
 
     p_vout = NULL;
 
-    p_intf->pf_request_window = ::GetWindow;
-    p_intf->pf_release_window = ::ReleaseWindow;
-    p_intf->pf_control_window = ::ControlWindow;
+    // Changeset 138da19...
+    //p_intf->pf_request_window = ::GetWindow;
+    //p_intf->pf_release_window = ::ReleaseWindow;
+    //p_intf->pf_control_window = ::ControlWindow;
 
     p_intf->p_sys->p_video_window = this;
 
diff --git a/modules/gui/wince/wince.cpp b/modules/gui/wince/wince.cpp
index 539f639..a8a87f0 100644
--- a/modules/gui/wince/wince.cpp
+++ b/modules/gui/wince/wince.cpp
@@ -32,6 +32,7 @@
 #include <vlc_common.h>
 #include <vlc_plugin.h>
 #include <vlc_interface.h>
+#include <vlc_input.h>
 
 #if defined( UNDER_CE ) && defined(__MINGW32__)
 /* This is a gross hack for the wince gcc cross-compiler */
@@ -51,7 +52,7 @@ static void Run    ( intf_thread_t * );
 
 static int  OpenDialogs( vlc_object_t * );
 
-static void* MainLoop  ( intf_thread_t * );
+static void* MainLoop  ( vlc_object_t * );
 static void ShowDialog( intf_thread_t *, int, int, intf_dialog_args_t * );
 
 /*****************************************************************************
@@ -62,11 +63,13 @@ static void ShowDialog( intf_thread_t *, int, int, intf_dialog_args_t * );
     "of having it in a separate window.")
 
 vlc_module_begin();
+    set_shortname( "WinCE" );
     set_description( (char *) _("WinCE interface module") );
     set_capability( "interface", 100 );
     set_callbacks( Open, Close );
     add_shortcut( "wince" );
-
+    set_category( CAT_INTERFACE );
+    set_subcategory( SUBCAT_INTERFACE_MAIN );
     add_bool( "wince-embed", 1, NULL,
               EMBED_TEXT, EMBED_LONGTEXT, false );
 
@@ -152,10 +155,11 @@ static int OpenDialogs( vlc_object_t *p_this )
 static void Close( vlc_object_t *p_this )
 {
     intf_thread_t *p_intf = (intf_thread_t *)p_this;
+    intf_sys_t    *p_sys = p_intf->p_sys;
 
-    if( p_intf->p_sys->p_input )
+    if( p_sys->p_input )
     {
-        vlc_object_release( p_intf->p_sys->p_input );
+        vlc_object_release( p_sys->p_input );
     }
 
     MenuItemExt::ClearList( p_intf->p_sys->p_video_menu );
@@ -194,19 +198,17 @@ static void Run( intf_thread_t *p_intf )
         /* The module is used in dialog provider mode */
 
         /* Create a new thread for the dialogs provider */
-        if( vlc_thread_create( p_intf, "Skins Dialogs Thread",
+        if( vlc_thread_create( p_intf, "WinCE Dialogs Thread",
                                MainLoop, 0, true ) )
         {
-            msg_Err( p_intf, "cannot create Skins Dialogs Thread" );
+            msg_Err( p_intf, "cannot create WinCE Dialogs Thread" );
             p_intf->pf_show_dialog = NULL;
         }
     }
     else
     {
-        int canc = vlc_savecancel();
         /* The module is used in interface mode */
-        MainLoop( p_intf );
-        vlc_restorecancel( canc );
+        MainLoop( VLC_OBJECT(p_intf) );
     }
 }
 
diff --git a/modules/gui/wince/wince_rc.rc b/modules/gui/wince/wince_rc.rc
index b8262b1..3a5d8cb 100644
--- a/modules/gui/wince/wince_rc.rc
+++ b/modules/gui/wince/wince_rc.rc
@@ -134,7 +134,7 @@ END
 
 // Icon with lowest ID value placed first to ensure application icon
 // remains consistent on all systems.
-#ifdef __MINGW32__
+#ifdef UNDER_CE
 IDI_ICON1               ICON    DISCARDABLE     "bitmaps/vlc16x16.ico"
 #else
 IDI_ICON1               ICON    DISCARDABLE     "bitmaps\\vlc16x16.ico"
@@ -145,7 +145,7 @@ IDI_ICON1               ICON    DISCARDABLE     "bitmaps\\vlc16x16.ico"
 // Bitmap
 //
 
-#ifdef __MINGW32__
+#ifdef UNDER_CE
 IDB_BITMAP1             BITMAP  DISCARDABLE     "bitmaps/toolbar1.bmp"
 IDB_BITMAP2             BITMAP  DISCARDABLE     "bitmaps/toolbar2.bmp"
 IDB_BITMAP3             BITMAP  DISCARDABLE     "bitmaps/toolbar3.bmp"
-- 
1.5.4.3

