Index: /trunk/src/VBox/Frontends/VirtualBox/VirtualBox_xml.qrc
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/VirtualBox_xml.qrc	(revision 81170)
+++ /trunk/src/VBox/Frontends/VirtualBox/VirtualBox_xml.qrc	(revision 81171)
@@ -8,4 +8,5 @@
         <file alias="us_international.xml">xml/us_international.xml</file>
         <file alias="numpad.xml">xml/numpad.xml</file>                
+        <file alias="multimedia_keys.xml">xml/multimedia_keys.xml</file>
         <file alias="german.xml">xml/german.xml</file>
         <file alias="us.xml">xml/us.xml</file>
Index: /trunk/src/VBox/Frontends/VirtualBox/src/softkeyboard/UISoftKeyboard.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/softkeyboard/UISoftKeyboard.cpp	(revision 81170)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/softkeyboard/UISoftKeyboard.cpp	(revision 81171)
@@ -102,6 +102,6 @@
     KeyboardRegion_Main = 0,
     KeyboardRegion_NumPad,
-    KeyboardRegion_Multimedia,
-    KeyboardRegion_OSMenu,
+    KeyboardRegion_MultimediaKeys,
+    KeyboardRegion_OSMenuKeys,
     KeyboardRegion_Max
 };
@@ -302,4 +302,6 @@
     int defaultHeight() const;
 
+    int MaximumHeight() const;
+
     QVector<UISoftKeyboardKey> &keys();
     const QVector<UISoftKeyboardKey> &keys() const;
@@ -313,4 +315,6 @@
     int m_iDefaultWidth;
     int m_iDefaultHeight;
+    int m_iMaximumHeight;
+
     QVector<UISoftKeyboardKey> m_keys;
     int m_iSpaceHeightAfter;
@@ -477,5 +481,5 @@
 
     void drawText(int iKeyPosition, const QRect &keyGeometry, QPainter &painter);
-    void drawTextInRect(int iKeyPosition, const QRect &keyGeometry, QPainter &painter);
+    void drawTextInRect(const UISoftKeyboardKey &key, QPainter &painter);
 
 private:
@@ -609,5 +613,5 @@
       * Window key press for start menu opening. This works orthogonal to left clicks.*/
     void               modifierKeyPressRelease(UISoftKeyboardKey *pKey, bool fRelease);
-    bool               loadPhysicalLayout(const QString &strLayoutFileName, bool isNumPad = false);
+    bool               loadPhysicalLayout(const QString &strLayoutFileName, KeyboardRegion keyboardRegion = KeyboardRegion_Main);
     bool               loadKeyboardLayout(const QString &strLayoutName);
     void               prepareObjects();
@@ -629,4 +633,5 @@
     QVector<UISoftKeyboardPhysicalLayout> m_physicalLayouts;
     UISoftKeyboardPhysicalLayout          m_numPadLayout;
+    UISoftKeyboardPhysicalLayout          m_multiMediaKeysLayout;
     QVector<UISoftKeyboardLayout>         m_layouts;
     UISoftKeyboardLayout *m_pCurrentKeyboardLayout;
@@ -647,4 +652,5 @@
     bool  m_fHideOSMenuKeys;
     bool  m_fHideNumPad;
+    bool  m_fHideMultimediaKeys;
 };
 
@@ -1857,8 +1863,10 @@
 }
 
-void UISoftKeyboardLayout::drawTextInRect(int iKeyPosition, const QRect &keyGeometry, QPainter &painter)
-{
+void UISoftKeyboardLayout::drawTextInRect(const UISoftKeyboardKey &key, QPainter &painter)
+{
+    int iKeyPosition = key.position();
+    const QRect &keyGeometry = key.keyGeometry();
     QFont painterFont(painter.font());
-    int iFontSize = 25;
+    int iFontSize = 30;
 
     const QString &strBaseCaption = baseCaption(iKeyPosition);
@@ -1894,5 +1902,10 @@
             iBottomWidth = qMax(iBottomWidth, fontMetrics.width(strPart));
         int iTextWidth =  2 * iMargin + qMax(iTopWidth, iBottomWidth);
-        int iTextHeight = 2 * iMargin + 2 * fontMetrics.height();
+        int iTextHeight = 0;
+
+        if (key.keyboardRegion() == KeyboardRegion_MultimediaKeys)
+            iTextHeight = 2 * iMargin + fontMetrics.height();
+        else
+            iTextHeight = 2 * iMargin + 2 * fontMetrics.height();
 
         if (iTextWidth >= keyGeometry.width() || iTextHeight >= keyGeometry.height())
@@ -1909,7 +1922,13 @@
     painter.drawText(iMargin, iMargin + fontMetrics.height(), QString::number(iKeyPosition));
 #else
-    QRect textRect(iMargin, iMargin,
-                   keyGeometry.width() - 2 * iMargin,
-                   keyGeometry.height() - 2 * iMargin);
+    QRect textRect;
+    if (key.keyboardRegion() == KeyboardRegion_MultimediaKeys)
+        textRect = QRect(2 * iMargin, iMargin,
+                         keyGeometry.width() - 2 * iMargin,
+                         keyGeometry.height() - 2 * iMargin);
+    else
+        textRect = QRect(iMargin, iMargin,
+                         keyGeometry.width() - 2 * iMargin,
+                         keyGeometry.height() - 2 * iMargin);
 
     painter.drawText(textRect, Qt::AlignLeft | Qt::AlignTop, strTopleftString);
@@ -2038,4 +2057,5 @@
     , m_fHideOSMenuKeys(false)
     , m_fHideNumPad(false)
+    , m_fHideMultimediaKeys(false)
 {
     prepareObjects();
@@ -2089,8 +2109,12 @@
         {
             UISoftKeyboardKey &key = keys[j];
-            if (m_fHideOSMenuKeys && key.keyboardRegion() == KeyboardRegion_OSMenu)
+
+            if (m_fHideOSMenuKeys && key.keyboardRegion() == KeyboardRegion_OSMenuKeys)
                 continue;
 
             if (m_fHideNumPad && key.keyboardRegion() == KeyboardRegion_NumPad)
+                continue;
+
+            if (m_fHideMultimediaKeys && key.keyboardRegion() == KeyboardRegion_MultimediaKeys)
                 continue;
 
@@ -2111,5 +2135,5 @@
             painter.drawPolygon(key.polygon());
 
-            m_pCurrentKeyboardLayout->drawTextInRect(key.position(), key.keyGeometry(), painter);
+            m_pCurrentKeyboardLayout->drawTextInRect(key, painter);
 
             if (key.type() != KeyType_Ordinary)
@@ -2612,5 +2636,5 @@
 }
 
-bool UISoftKeyboardWidget::loadPhysicalLayout(const QString &strLayoutFileName, bool isNumPad /* = false */)
+bool UISoftKeyboardWidget::loadPhysicalLayout(const QString &strLayoutFileName, KeyboardRegion keyboardRegion /* = KeyboardRegion_Main */)
 {
     if (strLayoutFileName.isEmpty())
@@ -2618,11 +2642,15 @@
     UIPhysicalLayoutReader reader;
     UISoftKeyboardPhysicalLayout *newPhysicalLayout = 0;
-    if (!isNumPad)
+    if (keyboardRegion == KeyboardRegion_Main)
     {
         m_physicalLayouts.append(UISoftKeyboardPhysicalLayout());
         newPhysicalLayout = &(m_physicalLayouts.back());
     }
+    else if (keyboardRegion == KeyboardRegion_NumPad)
+        newPhysicalLayout = &(m_numPadLayout);
+    else if (keyboardRegion == KeyboardRegion_MultimediaKeys)
+        newPhysicalLayout = &(m_multiMediaKeysLayout);
     else
-        newPhysicalLayout = &(m_numPadLayout);
+        return false;
 
     if (!reader.parseXMLFile(strLayoutFileName, *newPhysicalLayout))
@@ -2632,17 +2660,14 @@
     }
 
-    if (isNumPad)
-    {
-        /* Mark all the key as numpad keys: */
-        for (int i = 0; i < m_numPadLayout.rows().size(); ++i)
-        {
-            UISoftKeyboardRow &row = m_numPadLayout.rows()[i];
-            for (int j = 0; j < row.keys().size(); ++j)
-            {
-                row.keys()[j].setKeyboardRegion(KeyboardRegion_NumPad);
-            }
-        }
+    for (int i = 0; i < newPhysicalLayout->rows().size(); ++i)
+    {
+        UISoftKeyboardRow &row = newPhysicalLayout->rows()[i];
+        for (int j = 0; j < row.keys().size(); ++j)
+            row.keys()[j].setKeyboardRegion(keyboardRegion);
+    }
+
+    if (keyboardRegion == KeyboardRegion_NumPad || keyboardRegion == KeyboardRegion_MultimediaKeys)
         return true;
-    }
+
     /* Go thru all the keys row by row and construct their geometries: */
     int iY = m_iTopMargin;
@@ -2651,13 +2676,19 @@
     const QVector<UISoftKeyboardRow> &numPadRows = m_numPadLayout.rows();
     QVector<UISoftKeyboardRow> &rows = newPhysicalLayout->rows();
-    int iKeyCount = 0;
+
+    /* Prepend the multimedia rows to the layout */
+    const QVector<UISoftKeyboardRow> &multimediaRows = m_multiMediaKeysLayout.rows();
+    for (int i = multimediaRows.size() - 1; i >= 0; --i)
+        rows.prepend(multimediaRows[i]);
+
     for (int i = 0; i < rows.size(); ++i)
     {
         UISoftKeyboardRow &row = rows[i];
-        /* Start adding the numpad keys after the 0th row: */
-        if (i > 0)
+        /* Insert the numpad rows at the end of keyboard rows starting with appending 0th numpad row to the
+           end of (1 + multimediaRows.size())th layout row: */
+        if (i > multimediaRows.size())
         {
-            int iNumPadRowIndex = i - 1;
-            if (iNumPadRowIndex < numPadRows.size())
+            int iNumPadRowIndex = i - (1 + multimediaRows.size());
+            if (iNumPadRowIndex >= 0 && iNumPadRowIndex < numPadRows.size())
             {
                 for (int m = 0; m < numPadRows[iNumPadRowIndex].keys().size(); ++m)
@@ -2671,5 +2702,4 @@
         for (int j = 0; j < row.keys().size(); ++j)
         {
-            ++iKeyCount;
             UISoftKeyboardKey &key = (row.keys())[j];
             if (key.position() == iScrollLockPosition ||
@@ -2777,6 +2807,8 @@
 void UISoftKeyboardWidget::loadLayouts()
 {
-    /* Load physical layouts from resources: */
-    loadPhysicalLayout(":/numpad.xml", true);
+    /* Load physical layouts from resources: Numpad and multimedia layout files should be read first
+       since we insert these to other layouts: */
+    loadPhysicalLayout(":/numpad.xml", KeyboardRegion_NumPad);
+    loadPhysicalLayout(":/multimedia_keys.xml", KeyboardRegion_MultimediaKeys);
     QStringList physicalLayoutNames;
     physicalLayoutNames << ":/101_ansi.xml"
@@ -3055,5 +3087,5 @@
         {
             if (m_xmlReader.readElementText() == "true")
-                key.setKeyboardRegion(KeyboardRegion_OSMenu);
+                key.setKeyboardRegion(KeyboardRegion_OSMenuKeys);
         }
         else
Index: /trunk/src/VBox/Frontends/VirtualBox/xml/multimedia_keys.xml
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/xml/multimedia_keys.xml	(revision 81171)
+++ /trunk/src/VBox/Frontends/VirtualBox/xml/multimedia_keys.xml	(revision 81171)
@@ -0,0 +1,32 @@
+<?xml version="1.0"?>
+<physicallayout defaultHeight="30" defaultWidth="50">
+    <name>multimedia keys</name>
+    <id>80b4c26e-43fc-44f8-b515-351cff9269ce</id>
+    <row>
+        <key><!-- WWW back -->
+            <position>300</position>
+            <usageid>0x2224</usageid>
+            <usagepage>0x0C</usagepage>
+            <scancode>0x20</scancode>
+        </key>
+        <key>
+            <position>301</position>
+            <usageid>0x54</usageid>
+            <usagepage>0x7</usagepage>
+            <scancodeprefix>0xe0</scancodeprefix>
+            <scancode>0x35</scancode>
+        </key>
+        <key>
+            <position>302</position>
+            <usageid>0x55</usageid>
+            <usagepage>0x7</usagepage>
+            <scancode>0x37</scancode>
+        </key>
+        <key><!-- Mute -->
+            <position>303</position>
+            <usageid>0xE2</usageid>
+            <usagepage>0x0C</usagepage>
+            <scancode>0x4a</scancode>
+        </key>
+    </row>
+</physicallayout>
Index: /trunk/src/VBox/Frontends/VirtualBox/xml/us_international.xml
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/xml/us_international.xml	(revision 81170)
+++ /trunk/src/VBox/Frontends/VirtualBox/xml/us_international.xml	(revision 81171)
@@ -4,4 +4,19 @@
     <id>3c7b7be7-4d2a-4f65-a21e-208ba2e4ecaf</id>
     <physicallayoutid>{368efa94-3744-48c5-9d5a-59c2f15fe5ec}</physicallayoutid>
+    <!-- multimedia keys -->
+    <key>
+        <position>300</position>
+        <basecaption>⬅</basecaption>
+        <shiftcaption></shiftcaption>
+        <altgrcaption></altgrcaption>
+        <shiftaltgrcaption></shiftaltgrcaption>
+    </key>
+    <key>
+        <position>303</position>
+        <basecaption>🔇</basecaption>
+        <shiftcaption></shiftcaption>
+        <altgrcaption></altgrcaption>
+        <shiftaltgrcaption></shiftaltgrcaption>
+    </key>
     <key>
         <position>110</position>
