Changeset f3efada


Ignore:
Timestamp:
06/26/14 10:29:22 (11 months ago)
Author:
Ken Moore <ken@…>
Branches:
master, releng/10.0.3, releng/10.1, releng/10.1.1, releng/10.1.2
Children:
32d3dd2
Parents:
164b720 (diff), 9b97c0b (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge branch 'master' of github.com:pcbsd/pcbsd

Files:
2 added
12 edited

Legend:

Unmodified
Added
Removed
  • src-qt4/warden-gui/dialogwarden.cpp

    rba606f5 raadcedc  
    100100   connect( pushStart, SIGNAL(clicked()), this, SLOT(slotStartJail() ) ); 
    101101 
    102    // Snapshot / Clone support 
    103    connect( pushAddClone, SIGNAL(clicked()), this, SLOT(slotAddClone() ) ); 
    104    connect( pushRemoveClone, SIGNAL(clicked()), this, SLOT(slotRemoveClone() ) ); 
     102   // Snapshot support 
    105103   connect( pushCreateSnap, SIGNAL(clicked()), this, SLOT(slotCreateSnap() ) ); 
    106104   connect( pushRestoreSnap, SIGNAL(clicked()), this, SLOT(slotRestoreSnap() ) ); 
     
    603601                  pushTerminal->setEnabled(true); 
    604602                  pushStart->setEnabled(true); 
     603                  pushStart->setText(tr("&Stop Jail")); 
    605604                  pushStart->setIcon(QIcon(":stopjail.png")); 
    606605                  pushStart->setIconSize(QSize(16,16)); 
     
    609608                  pushPackageManager->setEnabled(false); 
    610609                  pushTerminal->setEnabled(false); 
     610                  pushStart->setText(tr("&Start Jail")); 
    611611                  pushStart->setEnabled(true); 
    612612                  pushStart->setIcon(QIcon(":running.png")); 
     
    646646          popup->addAction( tr("Toggle Autostart") , this, SLOT(slotToggleAutostartClicked() )  ); 
    647647          popup->addAction( tr("Export jail to .wdn file") , this, SLOT(slotExportJail() )  ); 
     648          popup->addAction( tr("Clone this Jail") , this, SLOT(slotMakeClone() )  ); 
    648649          popup->addSeparator(); 
    649650          popup->addAction( tr("Delete Jail") , this, SLOT(slotDeleteJail() )  ); 
     
    12341235   // Grab the ZFS snapshot list 
    12351236   QProcess m; 
    1236    m.start(QString("warden"), QStringList() << "zfslistsnap" << IP ); 
     1237   m.start(QString("warden"), QStringList() << "snap" << "list" << IP ); 
    12371238   while(m.state() == QProcess::Starting || m.state() == QProcess::Running) { 
    12381239      m.waitForFinished(200); 
     
    12781279     pushRestoreSnap->setEnabled(false); 
    12791280     pushRemoveSnap->setEnabled(false); 
    1280      pushAddClone->setEnabled(false); 
    1281      pushRemoveClone->setEnabled(false); 
    12821281     return; 
    12831282   } 
     
    12871286   sliderSnaps->setValue(snapshotList.count() -1 ); 
    12881287   tmp=""; 
    1289    if ( hasClone(snapshotList.at(snapshotList.count()-1)) ) 
    1290       tmp = tr("(Cloned)"); 
    12911288  
    12921289   labelSnap->setText(getSnapDateReadable(snapshotList.at(snapshotList.count()-1)) + " ("+ snapshotComments.at(snapshotList.count()-1) + ") " + tmp); 
     
    12941291   pushRestoreSnap->setEnabled(true); 
    12951292   pushRemoveSnap->setEnabled(true); 
    1296  
    1297    slotLoadClones(); 
    1298 } 
    1299  
    1300 bool dialogWarden::hasClone(QString snap) 
    1301 { 
    1302    for (int i = 0; i < cloneList.size(); ++i) 
    1303      if ( cloneList.at(i) == snap ) 
    1304         return true; 
    1305  
    1306    return false; 
    1307 } 
    1308  
    1309 void dialogWarden::slotLoadClones() 
    1310 { 
    1311    if ( ! listJails->currentItem() ) 
    1312       return; 
    1313  
    1314    labelClone->setText(tr("Loading clones...")); 
    1315  
    1316    QString IP = listJails->currentItem()->text(0); 
    1317  
    1318    // Grab the ZFS clone list 
    1319    QProcess m; 
    1320    m.start(QString("warden"), QStringList() << "zfslistclone" << IP ); 
    1321    while(m.state() == QProcess::Starting || m.state() == QProcess::Running) { 
    1322       m.waitForFinished(200); 
    1323       QCoreApplication::processEvents(); 
    1324    } 
    1325  
    1326    // Check if the user changed jails before we finished loading snaps 
    1327    if ( ! listJails->currentItem() ) 
    1328       return; 
    1329    if ( IP != listJails->currentItem()->text(0)) 
    1330      return; 
    1331  
    1332    cloneList.clear(); 
    1333    QString tmp; 
    1334    bool ok, ok2; 
    1335  
    1336    qDebug() << "Getting ZFS clones for " + IP; 
    1337  
    1338    // Get output of ZFS Clones 
    1339    while (m.canReadLine()) { 
    1340       tmp = m.readLine().simplified(); 
    1341       tmp.section("-", 0, 0).toInt(&ok); 
    1342       tmp.section("-", 1, 1).toInt(&ok2); 
    1343       if (ok && ok2) { 
    1344          cloneList << tmp; 
    1345       } 
    1346    } 
    1347  
    1348    qDebug() << "Available Clones:" << cloneList; 
    1349  
    1350    if ( snapshotList.count() <= 0 ) { 
    1351      pushRemoveClone->setEnabled(false); 
    1352      pushAddClone->setEnabled(false); 
    1353    } else 
    1354      slotSnapSliderChanged(snapshotList.count()-1); 
    1355  
    1356    // If we did something and want to show the same snapshot 
    1357    if ( currentSnapshot != -1 ) { 
    1358      sliderSnaps->setValue(currentSnapshot ); 
    1359      slotSnapSliderChanged(currentSnapshot); 
    1360    } 
    1361       
    1362  
    13631293   groupSnaps->setEnabled(true);  
     1294 
    13641295} 
    13651296 
     
    14041335     pushTerminal->setEnabled(true); 
    14051336     pushPackageManager->setEnabled(true); 
     1337     pushStart->setText(tr("&Stop Jail")); 
    14061338     pushStart->setIcon(QIcon(":stopjail.png")); 
    14071339     pushStart->setIconSize(QSize(16,16)); 
     
    14121344     pushTerminal->setEnabled(false); 
    14131345     pushPackageManager->setEnabled(false); 
     1346     pushStart->setText(tr("&Start Jail")); 
    14141347     pushStart->setIcon(QIcon(":running.png")); 
    14151348     pushStart->setIconSize(QSize(16,16)); 
     
    14881421} 
    14891422 
    1490 void dialogWarden::slotAddClone() 
     1423void dialogWarden::slotMakeClone() 
    14911424{ 
    14921425   if ( ! listJails->currentItem() ) 
    14931426      return; 
    14941427 
    1495    // Update status 
    1496    groupSnaps->setEnabled(false);  
    1497    labelSnap->setText(tr("Cloning snapshot... Please wait...")); 
     1428 
     1429   bool ok; 
     1430   QString newJail = QInputDialog::getText(this, tr("Enter hostname for cloned jail"), 
     1431                                          tr("Cloned jail hostname:"), QLineEdit::Normal, 
     1432                                          "", &ok, 0, Qt::ImhUrlCharactersOnly); 
     1433   if ( ! ok || newJail.isEmpty() ) 
     1434      return; 
     1435    
    14981436 
    14991437   QString IP = listJails->currentItem()->text(0); 
     
    15031441   QString program = "warden"; 
    15041442   QStringList args; 
    1505    args << "zfsclonesnap" << IP << snapshotList.at(sliderSnaps->value()); 
     1443   args << "clone" << IP << newJail; 
     1444 
     1445   // Connect the exited signal and start the process 
     1446   createJailProc->setProcessChannelMode(QProcess::MergedChannels); 
     1447   createJailProc->setReadChannel(QProcess::StandardOutput); 
     1448   connect( createJailProc, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(refreshJails() ) ); 
     1449   createJailProc->start(program, args); 
     1450 
     1451} 
     1452 
     1453void dialogWarden::slotCreateSnap() 
     1454{ 
     1455   if ( ! listJails->currentItem() ) 
     1456      return; 
     1457 
     1458   currentSnapshot = -1; 
     1459 
     1460   // Update status 
     1461   groupSnaps->setEnabled(false);  
     1462   labelSnap->setText(tr("Creating new snapshot... Please wait...")); 
     1463 
     1464   QString IP = listJails->currentItem()->text(0); 
     1465 
     1466   // Ask user for comment to this snapshot 
     1467   bool ok; 
     1468   QString comment = QInputDialog::getText (this, tr("Snapshot comment"), tr("Snapshot comment"), QLineEdit::Normal, "GUI snapshot", &ok); 
     1469   if ( ! ok ) 
     1470      comment = "GUI snapshot"; 
     1471 
     1472   // Now start the script to stop this jail 
     1473   createJailProc = new QProcess( this );  
     1474   QString program = "warden"; 
     1475   QStringList args; 
     1476   args << "snap" << "make" << IP << comment; 
    15061477 
    15071478   // Connect the exited signal and start the process 
     
    15111482   createJailProc->start(program, args); 
    15121483 
    1513    currentSnapshot = sliderSnaps->value(); 
    1514  
    1515 } 
    1516  
    1517 void dialogWarden::slotRemoveClone() 
    1518 { 
    1519    if ( ! listJails->currentItem() ) 
    1520       return; 
    1521  
    1522    // Update status 
    1523    groupSnaps->setEnabled(false);  
    1524    labelSnap->setText(tr("Removing clone... Please wait...")); 
    1525  
    1526    QString IP = listJails->currentItem()->text(0); 
    1527  
    1528    // Now start the script to stop this jail 
    1529    createJailProc = new QProcess( this );  
    1530    QString program = "warden"; 
    1531    QStringList args; 
    1532    args << "zfsrmclone" << IP << snapshotList.at(sliderSnaps->value()); 
    1533  
    1534    // Connect the exited signal and start the process 
    1535    createJailProc->setProcessChannelMode(QProcess::MergedChannels); 
    1536    createJailProc->setReadChannel(QProcess::StandardOutput); 
    1537    connect( createJailProc, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(slotLoadSnapshots() ) ); 
    1538    createJailProc->start(program, args); 
    1539  
    1540    currentSnapshot = sliderSnaps->value(); 
    1541 } 
    1542  
    1543  
    1544 void dialogWarden::slotCreateSnap() 
    1545 { 
    1546    if ( ! listJails->currentItem() ) 
    1547       return; 
    1548  
    1549    currentSnapshot = -1; 
    1550  
    1551    // Update status 
    1552    groupSnaps->setEnabled(false);  
    1553    labelSnap->setText(tr("Creating new snapshot... Please wait...")); 
    1554  
    1555    QString IP = listJails->currentItem()->text(0); 
    1556  
    1557    // Ask user for comment to this snapshot 
    1558    bool ok; 
    1559    QString comment = QInputDialog::getText (this, tr("Snapshot comment"), tr("Snapshot comment"), QLineEdit::Normal, "GUI snapshot", &ok); 
    1560    if ( ! ok ) 
    1561       comment = "GUI snapshot"; 
    1562  
    1563    // Now start the script to stop this jail 
    1564    createJailProc = new QProcess( this );  
    1565    QString program = "warden"; 
    1566    QStringList args; 
    1567    args << "zfsmksnap" << IP << comment; 
    1568  
    1569    // Connect the exited signal and start the process 
    1570    createJailProc->setProcessChannelMode(QProcess::MergedChannels); 
    1571    createJailProc->setReadChannel(QProcess::StandardOutput); 
    1572    connect( createJailProc, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(slotLoadSnapshots() ) ); 
    1573    createJailProc->start(program, args); 
    1574  
    15751484} 
    15761485 
     
    15831492 
    15841493   int ret = QMessageBox::question(this, tr("Warden"), 
    1585                                 tr("Are you sure you want to revert to the snapshot:") + "\n" + getSnapDateReadable(snapshotList.at(sliderSnaps->value() ) ) + "?" + "\n" + tr("Any newer snapshots and mounted clones will be lost, and the jail will be restarted!"), 
     1494                                tr("Are you sure you want to revert to the snapshot:") + "\n" + getSnapDateReadable(snapshotList.at(sliderSnaps->value() ) ) + "?" + "\n" + tr("Any newer snapshots will be lost, and the jail will be restarted!"), 
    15861495                                QMessageBox::Yes | QMessageBox::No, 
    15871496                                QMessageBox::No); 
     
    16041513   QString program = "warden"; 
    16051514   QStringList args; 
    1606    args << "zfsrevertsnap" << IP << snapshotList.at(sliderSnaps->value()); 
     1515   args << "snap" << "revert" << IP << snapshotList.at(sliderSnaps->value()); 
    16071516 
    16081517   // Connect the exited signal and start the process 
     
    16391548   QString program = "warden"; 
    16401549   QStringList args; 
    1641    args << "zfsrmsnap" << IP << snapshotList.at(sliderSnaps->value()); 
     1550   args << "snap" << "remove" << IP << snapshotList.at(sliderSnaps->value()); 
    16421551 
    16431552   // Connect the exited signal and start the process 
     
    16541563   QString IP = listJails->currentItem()->text(0); 
    16551564   QString tmp; 
    1656    int cloneId = -1; 
    1657    if ( hasClone(snapshotList.at(newVal)) ) { 
    1658       tmp = tr("(Cloned)"); 
    1659       pushAddClone->setEnabled(false); 
    1660       pushRemoveClone->setEnabled(true); 
    1661       pushRemoveSnap->setEnabled(false); 
    1662  
    1663       for (int i = 0; i < cloneList.size(); ++i) 
    1664         if ( cloneList.at(i) == snapshotList.at(newVal) ) 
    1665            cloneId = i; 
    1666  
    1667       if ( cloneId != -1 ) 
    1668         // List the clone 
    1669         labelClone->setText(tr("Mounted on: ") + "/usr/jails/clones/" + IP + "-" + cloneList.at(cloneId) ); 
    1670  
    1671    } else { 
    1672       labelClone->setText(tr("Snapshot not mounted")); 
    1673       pushAddClone->setEnabled(true); 
    1674       pushRemoveClone->setEnabled(false); 
    1675       pushRemoveSnap->setEnabled(true); 
    1676    } 
     1565   pushRemoveSnap->setEnabled(true); 
    16771566   labelSnap->setText(getSnapDateReadable(snapshotList.at(newVal)) + " (" + snapshotComments.at(newVal) + ") " + tmp); 
    16781567} 
     
    16911580     qDebug() << "Enabling cron snapshots"; 
    16921581     QProcess m; 
    1693      m.start(QString("warden"), QStringList() << "zfscronsnap" << IP << "start" << comboSnapFrequency->currentText() << QString::number(spinSnapDays->value()) ); 
     1582     m.start(QString("warden"), QStringList() << "cronsnap" << IP << "start" << comboSnapFrequency->currentText() << QString::number(spinSnapDays->value()) ); 
    16941583     while(m.state() == QProcess::Starting || m.state() == QProcess::Running) { 
    16951584        m.waitForFinished(200); 
     
    16991588     qDebug() << "Disabling cron snapshots"; 
    17001589     QProcess m; 
    1701      m.start(QString("warden"), QStringList() << "zfscronsnap" << IP << "stop" ); 
     1590     m.start(QString("warden"), QStringList() << "cronsnap" << IP << "stop" ); 
    17021591     while(m.state() == QProcess::Starting || m.state() == QProcess::Running) { 
    17031592        m.waitForFinished(200); 
  • src-qt4/warden-gui/dialogwarden.h

    r9d5cf20 raadcedc  
    8585    void slotRestoreSnap(); 
    8686    void slotRemoveSnap(); 
    87     void slotLoadClones(); 
    88     void slotAddClone(); 
    89     void slotRemoveClone(); 
     87    void slotMakeClone(); 
    9088    void slotCronSnapshotChanged(); 
    9189 
  • src-qt4/warden-gui/dialogwarden.ui

    rba606f5 raadcedc  
    529529                   <iconset resource="warden.qrc"> 
    530530                    <normaloff>:/restoresnap.png</normaloff>:/restoresnap.png</iconset> 
    531                   </property> 
    532                  </widget> 
    533                 </item> 
    534                 <item> 
    535                  <widget class="QPushButton" name="pushAddClone"> 
    536                   <property name="minimumSize"> 
    537                    <size> 
    538                     <width>32</width> 
    539                     <height>32</height> 
    540                    </size> 
    541                   </property> 
    542                   <property name="maximumSize"> 
    543                    <size> 
    544                     <width>100</width> 
    545                     <height>32</height> 
    546                    </size> 
    547                   </property> 
    548                   <property name="toolTip"> 
    549                    <string>Mount the snapshot</string> 
    550                   </property> 
    551                   <property name="text"> 
    552                    <string>&amp;Mount</string> 
    553                   </property> 
    554                   <property name="icon"> 
    555                    <iconset resource="warden.qrc"> 
    556                     <normaloff>:/running.png</normaloff>:/running.png</iconset> 
    557                   </property> 
    558                  </widget> 
    559                 </item> 
    560                 <item> 
    561                  <widget class="QPushButton" name="pushRemoveClone"> 
    562                   <property name="minimumSize"> 
    563                    <size> 
    564                     <width>32</width> 
    565                     <height>32</height> 
    566                    </size> 
    567                   </property> 
    568                   <property name="maximumSize"> 
    569                    <size> 
    570                     <width>100</width> 
    571                     <height>32</height> 
    572                    </size> 
    573                   </property> 
    574                   <property name="toolTip"> 
    575                    <string>Unmount the snapshot</string> 
    576                   </property> 
    577                   <property name="text"> 
    578                    <string>&amp;Unmount</string> 
    579                   </property> 
    580                   <property name="icon"> 
    581                    <iconset resource="warden.qrc"> 
    582                     <normaloff>:/stopped.png</normaloff>:/stopped.png</iconset> 
    583531                  </property> 
    584532                 </widget> 
     
    858806           <property name="maximumSize"> 
    859807            <size> 
    860              <width>32</width> 
     808             <width>300</width> 
    861809             <height>32</height> 
    862810            </size> 
     
    866814           </property> 
    867815           <property name="text"> 
    868             <string/> 
     816            <string>&amp;Start Jail</string> 
    869817           </property> 
    870818           <property name="icon"> 
     
    899847           <property name="maximumSize"> 
    900848            <size> 
    901              <width>32</width> 
     849             <width>400</width> 
    902850             <height>32</height> 
    903851            </size> 
     
    907855           </property> 
    908856           <property name="text"> 
    909             <string/> 
     857            <string>J&amp;ail Configuration</string> 
    910858           </property> 
    911859           <property name="icon"> 
     
    944892           <property name="maximumSize"> 
    945893            <size> 
    946              <width>32</width> 
     894             <width>300</width> 
    947895             <height>32</height> 
    948896            </size> 
     
    952900           </property> 
    953901           <property name="text"> 
    954             <string/> 
     902            <string>&amp;New Jail</string> 
    955903           </property> 
    956904           <property name="icon"> 
     
    976924           <property name="maximumSize"> 
    977925            <size> 
    978              <width>32</width> 
     926             <width>300</width> 
    979927             <height>32</height> 
    980928            </size> 
     
    984932           </property> 
    985933           <property name="text"> 
    986             <string/> 
     934            <string>&amp;Remove Jail</string> 
    987935           </property> 
    988936           <property name="icon"> 
  • src-sh/port-files/pkg-plist

    r060b819 r273247c  
    1717bin/pc-ldapctl 
    1818bin/de-info 
     19bin/de-logout 
    1920bin/pc-thinclient 
    2021bin/pc-xdgutil 
  • src-sh/warden/bin/warden

    rd2b5358 r9b97c0b  
    6666         snap - Jail snapshot management 
    6767        clone - Clone an existing jail to a new jail 
    68          cron - Schedule snapshot creation via cron 
     68     cronsnap - Schedule snapshot creation via cron 
    6969__EOF__ 
    7070}; 
     
    7979Available options: 
    8080 
     81             iface: Lets you see the network interface for this jail 
    8182              ipv4: Lets you see the IPv4 address for this jail 
    8283              ipv6: Lets you see the IPv6 address for this jail 
     
    114115Available options: 
    115116 
     117             iface: Set the network interface for this jail 
    116118              ipv4: Set the IPv4 address for this jail 
    117119              ipv6: Set the IPv6 address for this jail 
     
    689691         case $OPT in 
    690692             flags) cat "${JMETADIR}/jail-flags" 2>/dev/null | sed 's| |,|g' ;; 
     693             iface) cat "${JMETADIR}/iface"  2>/dev/null ;; 
    691694              ipv4) cat "${JMETADIR}/ipv4"  2>/dev/null | sed 's| |,|g' ;; 
    692695              ipv6) cat "${JMETADIR}/ipv6"  2>/dev/null | sed 's| |,|g' ;; 
     
    711714 
    712715         case $OPT in 
     716          iface) IFACE="${4}" 
     717                 ifconfig $IFACE 2>/dev/null >/dev/null 
     718                 if [ $? -eq 0 ] ; then 
     719                    echo "WARNING: The interface ($IFACE) does not exist" 
     720                 fi 
     721                 echo $IFACE > "${JMETADIR}/iface" 
     722                 ;; 
    713723             ipv4) IP4="${4}" 
    714724                 get_ip_and_netmask "${IP4}" 
  • lumina/libLumina/LuminaXDG.cpp

    rc47b1152 r164b720  
    8080} 
    8181 
    82 bool LXDG::checkValidity(XDGDesktop dFile){ 
     82bool LXDG::checkValidity(XDGDesktop dFile, bool showAll){ 
    8383  bool ok=true; 
    8484  bool DEBUG = false; 
     
    106106      if(DEBUG){ qDebug() << " - Unknown file type"; }  
    107107  } 
    108   if(!dFile.showInList.isEmpty() && !dFile.showInList.contains("Lumina")){ ok=false; } 
    109   else if(!dFile.notShowInList.isEmpty() && dFile.notShowInList.contains("Lumina")){ ok=false; } 
     108  if(!dFile.showInList.isEmpty() && !dFile.showInList.contains("Lumina") && !showAll){ ok=false; } 
     109  else if(!dFile.notShowInList.isEmpty() && dFile.notShowInList.contains("Lumina") && !showAll){ ok=false; } 
    110110  return ok; 
    111111} 
     
    138138} 
    139139 
    140 QList<XDGDesktop> LXDG::systemDesktopFiles(bool showHidden){ 
     140QList<XDGDesktop> LXDG::systemDesktopFiles(bool showAll, bool showHidden){ 
    141141  //Returns a list of all the unique *.desktop files that were found 
    142142  QStringList appDirs = LXDG::systemApplicationDirs(); 
     
    150150        ok=false; 
    151151        XDGDesktop dFile = LXDG::loadDesktopFile(dir.absoluteFilePath(apps[a]),ok); 
    152         if( LXDG::checkValidity(dFile) ){ 
     152        if( LXDG::checkValidity(dFile, showAll) ){ 
    153153          if( !found.contains(dFile.name) && (!dFile.isHidden || showHidden) ){ 
    154154            out << dFile; 
  • lumina/libLumina/LuminaXDG.h

    r214f3d5 r164b720  
    5555        //Read a *.desktop file 
    5656        static XDGDesktop loadDesktopFile(QString filePath, bool& ok); 
    57         //Check a *.desktop file for validity 
    58         static bool checkValidity(XDGDesktop dFile); 
     57        //Check a *.desktop file for validity (showAll skips the DE-exclusivity checks) 
     58        static bool checkValidity(XDGDesktop dFile, bool showAll = true);  
    5959        //Check for a valid executable 
    6060        static bool checkExec(QString exec); 
     
    6262        static QStringList systemApplicationDirs(); 
    6363        //Get a list of all the *.desktop files available on the system 
    64         static QList<XDGDesktop> systemDesktopFiles(bool showHidden = false); 
     64        static QList<XDGDesktop> systemDesktopFiles(bool showAll = true, bool showHidden = false); 
    6565        //Sort a list of Desktop files into the proper categories 
    6666        static QHash< QString, QList<XDGDesktop> > sortDesktopCats(QList<XDGDesktop> apps); 
  • lumina/lumina-config/LPlugins.cpp

    rb6c1838 r164b720  
    118118    info.icon = "utilities-terminal"; 
    119119  MENU.insert(info.ID, info); 
     120  //File Manager 
     121  info = LPI(); //clear it 
     122    info.name = QObject::tr("File Manager"); 
     123    info.description = QObject::tr("Browse the system with the default file manager."); 
     124    info.ID = "filemanager"; 
     125    info.icon = "system-file-manager"; 
     126  MENU.insert(info.ID, info); 
    120127  //Applications 
    121128  info = LPI(); //clear it 
     
    139146    info.icon = "configure"; 
    140147  MENU.insert(info.ID, info); 
    141  
     148  //Settings 
     149  info = LPI(); //clear it 
     150    info.name = QObject::tr("Custom App"); 
     151    info.description = QObject::tr("Start a custom application"); 
     152    info.ID = "app"; 
     153    info.icon = "application-x-desktop"; 
     154  MENU.insert(info.ID, info); 
    142155} 
  • lumina/lumina-config/mainUI.cpp

    rdd4f3c1 r164b720  
    2929    ui->spin_screen->setMaximum(desktop->screenCount()); 
    3030  } 
    31  
     31  sysApps = LXDG::sortDesktopNames( LXDG::systemDesktopFiles() ); 
    3232  //Setup the buttons signal/slot connections 
    3333  connect(ui->spin_screen, SIGNAL(valueChanged(int)), this, SLOT(loadCurrentSettings()) ); 
     
    345345  //Menu Items 
    346346  QStringList items = settings->value("menu/itemlist", QStringList() ).toStringList(); 
    347   if(items.isEmpty()){ items << "terminal" << "applications" << "line" << "settings"; } 
     347  if(items.isEmpty()){ items << "terminal" << "filemanager" << "applications" << "line" << "settings"; } 
    348348  //qDebug() << "Menu Items:" << items; 
    349349  ui->list_menu_items->clear(); 
    350350  for(int i=0; i<items.length(); i++){ 
    351351    LPI info = PINFO->menuPluginInfo(items[i]); 
     352    if(items[i].startsWith("app::::")){ 
     353      bool ok = false; 
     354      XDGDesktop desk = LXDG::loadDesktopFile(items[i].section("::::",1,1), ok); 
     355      if(!ok){ continue; } //invalid application file (no longer installed?) 
     356      QListWidgetItem *item = new QListWidgetItem(); 
     357        item->setWhatsThis( items[i] ); 
     358        item->setIcon( LXDG::findIcon(desk.icon) ); 
     359        item->setText( desk.name ); 
     360        item->setToolTip( desk.comment ); 
     361      ui->list_menu_items->addItem(item); 
     362      continue; //now go to the next item 
     363    } 
    352364    if(info.ID.isEmpty()){ continue; } //invalid plugin 
    353365    //qDebug() << "Add Menu Item:" << info.ID; 
     
    385397 
    386398void MainUI::addMenuItem(QAction* act){ 
    387   QListWidgetItem *item = new QListWidgetItem(); 
    388     item->setWhatsThis( act->whatsThis() ); 
    389     item->setIcon( act->icon() ); 
    390     item->setText( act->text() ); 
    391     item->setToolTip( act->toolTip() ); 
    392   ui->list_menu_items->addItem(item); 
     399  if(act->whatsThis()=="app"){ 
     400    //Need to prompt for the exact application to add to the menu 
     401    // Note: whatsThis() format: "app::::< *.desktop file path >" 
     402    QStringList apps; 
     403    for(int i=0; i<sysApps.length(); i++){ 
     404      if(sysApps[i].comment.isEmpty()){ apps << sysApps[i].name; } 
     405      else{ apps << sysApps[i].name + " ("+sysApps[i].comment+")"; } 
     406    } 
     407    QString app = QInputDialog::getItem(this, tr("Select Application"), tr("App Name:"), apps, false); 
     408    int index = apps.indexOf(app); 
     409    if(app.isEmpty() || index < 0){ return; } //nothing selected 
     410    //Now add this item to the  list 
     411    QListWidgetItem *item = new QListWidgetItem(); 
     412      item->setWhatsThis( act->whatsThis()+"::::"+sysApps[index].filePath ); 
     413      item->setIcon( LXDG::findIcon(sysApps[index].icon) ); 
     414      item->setText( sysApps[index].name ); 
     415      item->setToolTip( sysApps[index].comment ); 
     416    ui->list_menu_items->addItem(item); 
     417  }else{ 
     418    QListWidgetItem *item = new QListWidgetItem(); 
     419      item->setWhatsThis( act->whatsThis() ); 
     420      item->setIcon( act->icon() ); 
     421      item->setText( act->text() ); 
     422      item->setToolTip( act->toolTip() ); 
     423    ui->list_menu_items->addItem(item); 
     424  } 
    393425} 
    394426 
  • lumina/lumina-config/mainUI.h

    rdd4f3c1 r164b720  
    1616#include <QColorDialog> 
    1717#include <QColor> 
     18#include <QInputDialog> 
    1819 
    1920// libLumina includes 
     
    4344        QMenu *ppmenu, *mpmenu; 
    4445        QString panelcolor; 
     46        QList<XDGDesktop> sysApps; 
    4547 
    4648        //General purpose functions (not connected to buttons) 
  • lumina/lumina-desktop/LDesktop.cpp

    r29587c6 r164b720  
    1818  } 
    1919  deskMenu = new QMenu(0); 
     20    connect(deskMenu, SIGNAL(triggered(QAction*)), this, SLOT(SystemApplication(QAction*)) ); 
    2021  appmenu = new AppMenu(0); 
    2122  workspacelabel = new QLabel(0); 
     
    6263} 
    6364 
     65void LDesktop::SystemFileManager(){ 
     66  QProcess::startDetached("lumina-fm");  
     67} 
     68 
     69void LDesktop::SystemApplication(QAction* act){ 
     70  if(!act->whatsThis().isEmpty()){ 
     71    QProcess::startDetached("lumina-open \""+act->whatsThis()+"\""); 
     72  } 
     73} 
     74 
    6475// ===================== 
    6576//     PRIVATE SLOTS  
     
    8596  deskMenu->addSeparator(); 
    8697  //Now load the user's menu setup and fill the menu 
    87   QStringList items = settings->value("menu/itemlist", QStringList()<< "terminal" << "applications" << "line" << "settings" ).toStringList(); 
     98  QStringList items = settings->value("menu/itemlist", QStringList()<< "terminal" << "filemanager" <<"applications" << "line" << "settings" ).toStringList(); 
    8899  for(int i=0; i<items.length(); i++){ 
    89100    if(items[i]=="terminal"){ deskMenu->addAction(LXDG::findIcon("utilities-terminal",""), tr("Terminal"), this, SLOT(SystemTerminal()) ); } 
     101    else if(items[i]=="filemanager"){ deskMenu->addAction( LXDG::findIcon("system-file-manager",""), tr("Browse System"), this, SLOT(SystemFileManager()) ); } 
    90102    else if(items[i]=="applications"){ deskMenu->addMenu( LSession::applicationMenu() ); } 
    91103    else if(items[i]=="line"){ deskMenu->addSeparator(); } 
    92104    else if(items[i]=="settings"){ deskMenu->addMenu( LSession::settingsMenu() ); } 
     105    else if(items[i].startsWith("app::::") && items[i].endsWith(".desktop")){ 
     106      //Custom *.desktop application 
     107      QString file = items[i].section("::::",1,1).simplified(); 
     108      bool ok = false; 
     109      XDGDesktop xdgf = LXDG::loadDesktopFile(file, ok); 
     110      if(ok){ 
     111        deskMenu->addAction( LXDG::findIcon(xdgf.icon,""), xdgf.name)->setWhatsThis(file); 
     112        }else{ 
     113          qDebug() << "Could not load application file:" << file; 
     114        } 
     115    } 
    93116  } 
    94117  //Now add the system quit options 
  • lumina/lumina-desktop/LDesktop.h

    r29587c6 r164b720  
    3838        void SystemLogout(){ LSession::systemWindow(); } 
    3939        void SystemTerminal(); 
     40        void SystemFileManager(); 
     41        void SystemApplication(QAction*); 
    4042         
    4143private: 
Note: See TracChangeset for help on using the changeset viewer.