DeviceConfDialog.cc
上传用户:weiliju62
上传日期:2007-01-06
资源大小:619k
文件大小:18k
源码类别:

SCSI/ASPI

开发平台:

MultiPlatform

  1. /*  cdrdao - write audio CD-Rs in disc-at-once mode
  2.  *
  3.  *  Copyright (C) 1998, 1999  Andreas Mueller <mueller@daneb.ping.de>
  4.  *
  5.  *  This program is free software; you can redistribute it and/or modify
  6.  *  it under the terms of the GNU General Public License as published by
  7.  *  the Free Software Foundation; either version 2 of the License, or
  8.  *  (at your option) any later version.
  9.  *
  10.  *  This program is distributed in the hope that it will be useful,
  11.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.  *  GNU General Public License for more details.
  14.  *
  15.  *  You should have received a copy of the GNU General Public License
  16.  *  along with this program; if not, write to the Free Software
  17.  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18.  */
  19. /*
  20.  * $Log: DeviceConfDialog.cc,v $
  21.  * Revision 1.1  1999/09/06 09:09:37  mueller
  22.  * Initial revision
  23.  *
  24.  */
  25. static char rcsid[] = "$Id: DeviceConfDialog.cc,v 1.1 1999/09/06 09:09:37 mueller Exp mueller $";
  26. #include <stdio.h>
  27. #include <limits.h>
  28. #include <math.h>
  29. #include <assert.h>
  30. #include "DeviceConfDialog.h"
  31. #include "CdDevice.h"
  32. #include "guiUpdate.h"
  33. #include "util.h"
  34. #define MAX_DEVICE_TYPE_ID 2
  35. static CdDevice::DeviceType ID2DEVICE_TYPE[MAX_DEVICE_TYPE_ID + 1] = {
  36.   CdDevice::CD_ROM,
  37.   CdDevice::CD_R,
  38.   CdDevice::CD_RW
  39. };
  40.     
  41. DeviceConfDialog::DeviceConfDialog()
  42. {
  43.   int i;
  44.   Gtk_Label *label;
  45.   Gtk_Table *table;
  46.   Gtk_HBox *hbox;
  47.   Gtk_VBox *vbox;
  48.   Gtk_Button *button;
  49.   active_ = 0;
  50.   selectedRow_ = -1;
  51.   set_title(string("Configure Devices"));
  52.   set_usize(0, 500);
  53.   list_ = new Gtk_CList(6);
  54.   applyButton_ = new Gtk_Button(string(" Apply "));
  55.   list_->set_column_title(0, string("Bus"));
  56.   list_->set_column_justification(0, GTK_JUSTIFY_CENTER);
  57.   list_->set_column_title(1, string("Id"));
  58.   list_->set_column_justification(1, GTK_JUSTIFY_CENTER);
  59.   list_->set_column_title(2, string("Lun"));
  60.   list_->set_column_justification(2, GTK_JUSTIFY_CENTER);
  61.   list_->set_column_title(3, string("Vendor"));
  62.   list_->set_column_justification(3, GTK_JUSTIFY_LEFT);
  63.   list_->set_column_title(4, string("Model"));
  64.   list_->set_column_justification(4, GTK_JUSTIFY_LEFT);
  65.   list_->set_column_title(5, string("Status"));
  66.   list_->set_column_justification(5, GTK_JUSTIFY_LEFT);
  67.   list_->column_titles_show();
  68.   list_->column_titles_passive();
  69.   list_->set_selection_mode(GTK_SELECTION_BROWSE);
  70.   connect_to_method(list_->select_row, this,
  71.     &DeviceConfDialog::selectRow);
  72.   connect_to_method(list_->unselect_row, this,
  73.     &DeviceConfDialog::unselectRow);
  74.   driverMenuFactory_ = new Gtk_ItemFactory_Menu("<Main>");
  75.   for (i = 0; i <= CdDevice::maxDriverId(); i++) {
  76.     string s("/");
  77.     s += CdDevice::driverName(i);
  78.     driverMenuFactory_->create_item(s, 0, "<Item>", ItemFactoryConnector<DeviceConfDialog, int>(this, &DeviceConfDialog::setDriverId, i));
  79.   }
  80.   driverMenu_ = new Gtk_OptionMenu;
  81.   driverMenu_->set_menu(driverMenuFactory_->get_menu_widget(string("")));
  82.   devtypeMenuFactory_ = new Gtk_ItemFactory_Menu("<Main>");
  83.   for (i = 0; i <= MAX_DEVICE_TYPE_ID; i++) {
  84.     string s("/");
  85.     s += CdDevice::deviceType2string(ID2DEVICE_TYPE[i]);
  86.     devtypeMenuFactory_->create_item(s, 0, "<Item>",
  87.      ItemFactoryConnector<DeviceConfDialog, int>(this, &DeviceConfDialog::setDeviceType, i));
  88.   }
  89.   devtypeMenu_ = new Gtk_OptionMenu;
  90.   devtypeMenu_->set_menu(devtypeMenuFactory_->get_menu_widget(string("")));
  91.   Gtk_Adjustment *adjust = new Gtk_Adjustment(0.0, 0.0, 16.0);
  92.   busEntry_ = new Gtk_SpinButton(*adjust, 1.0, 1);
  93.   busEntry_->set_numeric(true);
  94.   adjust = new Gtk_Adjustment(0.0, 0.0, 15.0);
  95.   idEntry_ = new Gtk_SpinButton(*adjust, 1.0, 1);
  96.   idEntry_->set_numeric(true);
  97.   adjust = new Gtk_Adjustment(0.0, 0.0, 8.0);
  98.   lunEntry_ = new Gtk_SpinButton(*adjust, 1.0, 1);
  99.   lunEntry_->set_numeric(true);
  100.   vendorEntry_ = new Gtk_Entry(8);
  101.   productEntry_ = new Gtk_Entry(16);
  102.   specialDeviceEntry_ = new Gtk_Entry;
  103.   driverOptionsEntry_ = new Gtk_Entry;
  104.   Gtk_VBox *contents = new Gtk_VBox;
  105.   contents->set_spacing(10);
  106.   // device list
  107.   Gtk_HBox *listHBox = new Gtk_HBox;
  108.   Gtk_VBox *listVBox = new Gtk_VBox;
  109.   Gtk_VBox *listBox = new Gtk_VBox;
  110.   listBox->set_spacing(5);
  111.   hbox = new Gtk_HBox;
  112.   hbox->pack_start(*list_, TRUE, TRUE);
  113.   list_->show();
  114.   adjust = new Gtk_Adjustment(0.0, 0.0, 0.0);
  115.   Gtk_VScrollbar *scrollBar = new Gtk_VScrollbar(*adjust);
  116.   hbox->pack_start(*scrollBar, FALSE, FALSE);
  117.   scrollBar->show();
  118.   list_->set_vadjustment(*adjust);
  119.   listBox->pack_start(*hbox, TRUE, TRUE);
  120.   hbox->show();
  121.   Gtk_ButtonBox *bbox = new Gtk_HButtonBox(GTK_BUTTONBOX_SPREAD);  //, 5);
  122.   button = new Gtk_Button(string("Rescan"));
  123.   bbox->pack_start(*button);
  124.   button->show();
  125.   connect_to_method(button->clicked, this, &DeviceConfDialog::rescanAction);
  126.   button = new Gtk_Button(string("Delete"));
  127.   bbox->pack_start(*button);
  128.   button->show();
  129.   connect_to_method(button->clicked, this, &DeviceConfDialog::deleteDeviceAction);
  130.   listBox->pack_start(*bbox, FALSE);
  131.   bbox->show();
  132.   listHBox->pack_start(*listBox, TRUE, TRUE, 5);
  133.   listBox->show();
  134.   listVBox->pack_start(*listHBox, TRUE, TRUE, 5);
  135.   listHBox->show();
  136.   Gtk_Frame *listFrame = new Gtk_Frame(string("Devices"));
  137.   listFrame->add(*listVBox);
  138.   listVBox->show();
  139.   contents->pack_start(*listFrame, TRUE, TRUE);
  140.   listFrame->show();
  141.   // device settings
  142.   Gtk_Frame *settingFrame = new Gtk_Frame(string("Device Settings"));
  143.   table = new Gtk_Table(2, 4, FALSE);
  144.   table->set_row_spacings(5);
  145.   table->set_col_spacings(5);
  146.   hbox = new Gtk_HBox;
  147.   hbox->pack_start(*table, FALSE, FALSE, 5);
  148.   vbox = new Gtk_VBox;
  149.   vbox->pack_start(*hbox, FALSE, FALSE, 5);
  150.   settingFrame->add(vbox);
  151.   vbox->show();
  152.   hbox->show();
  153.   table->show();
  154.   
  155.   label = new Gtk_Label(string("Device Type:"));
  156.   hbox = new Gtk_HBox;
  157.   hbox->pack_end(*label, FALSE, FALSE);
  158.   table->attach(*hbox, 0, 1, 0, 1);
  159.   label->show();
  160.   hbox->show();
  161.   hbox = new Gtk_HBox;
  162.   hbox->pack_start(*devtypeMenu_, FALSE, FALSE);
  163.   table->attach(*hbox, 1, 2, 0, 1);
  164.   devtypeMenu_->show();
  165.   hbox->show();
  166.   label = new Gtk_Label(string("Driver:"));
  167.   hbox = new Gtk_HBox;
  168.   hbox->pack_end(*label, FALSE, FALSE);
  169.   table->attach(*hbox, 0, 1, 1, 2);
  170.   label->show();
  171.   hbox->show();
  172.   hbox = new Gtk_HBox;
  173.   hbox->pack_start(*driverMenu_, FALSE, FALSE);
  174.   table->attach(*hbox, 1, 2, 1, 2);
  175.   driverMenu_->show();
  176.   hbox->show();
  177.   label = new Gtk_Label(string("Driver Options:"));
  178.   hbox = new Gtk_HBox;
  179.   hbox->pack_end(*label, FALSE, FALSE);
  180.   table->attach(*hbox, 0, 1, 2, 3);
  181.   label->show();
  182.   hbox->show();
  183.   hbox = new Gtk_HBox;
  184.   hbox->pack_start(*driverOptionsEntry_, FALSE, FALSE);
  185.   table->attach(*hbox, 1, 2, 2, 3);
  186.   driverOptionsEntry_->show();
  187.   hbox->show();
  188.   label = new Gtk_Label(string("Device Node:"));
  189.   hbox = new Gtk_HBox;
  190.   hbox->pack_end(*label, FALSE, FALSE);
  191.   table->attach(*hbox, 0, 1, 3, 4);
  192.   label->show();
  193.   hbox->show();
  194.   hbox = new Gtk_HBox;
  195.   hbox->pack_start(*specialDeviceEntry_, FALSE, FALSE);
  196.   table->attach(*hbox, 1, 2, 3, 4);
  197.   specialDeviceEntry_->show();
  198.   hbox->show();
  199.   contents->pack_start(*settingFrame, FALSE, FALSE);
  200.   settingFrame->show();
  201.   // add device
  202.   Gtk_Frame *addDeviceFrame = new Gtk_Frame(string("Add Device"));
  203.   Gtk_VBox *addDeviceBox = new Gtk_VBox;
  204.   addDeviceBox->set_spacing(5);
  205.   hbox = new Gtk_HBox;
  206.   hbox->set_spacing(5);
  207.   label = new Gtk_Label(string("Bus:"));
  208.   hbox->pack_start(*label, FALSE);
  209.   hbox->pack_start(*busEntry_, FALSE);
  210.   label->show();
  211.   busEntry_->show();
  212.   label = new Gtk_Label(string("Id:"));
  213.   hbox->pack_start(*label, FALSE);
  214.   hbox->pack_start(*idEntry_, FALSE);
  215.   label->show();
  216.   idEntry_->show();
  217.   label = new Gtk_Label(string("Lun:"));
  218.   hbox->pack_start(*label, FALSE);
  219.   hbox->pack_start(*lunEntry_, FALSE);
  220.   label->show();
  221.   lunEntry_->show();
  222.   addDeviceBox->pack_start(*hbox, FALSE);
  223.   hbox->show();
  224.   table = new Gtk_Table(2, 2, FALSE);
  225.   table->set_row_spacings(5);
  226.   table->set_col_spacings(5);
  227.   addDeviceBox->pack_start(*table, FALSE);
  228.   table->show();
  229.   label = new Gtk_Label(string("Vendor:"));
  230.   hbox = new Gtk_HBox;
  231.   hbox->pack_end(*label, FALSE, FALSE);
  232.   table->attach(*hbox, 0, 1, 0, 1);
  233.   label->show();
  234.   hbox->show();
  235.   hbox = new Gtk_HBox;
  236.   hbox->pack_start(*vendorEntry_, TRUE, TRUE);
  237.   table->attach(*hbox, 1, 2, 0, 1);
  238.   vendorEntry_->show();
  239.   hbox->show();
  240.   label = new Gtk_Label(string("Product:"));
  241.   hbox = new Gtk_HBox;
  242.   hbox->pack_end(*label, FALSE, FALSE);
  243.   table->attach(*hbox, 0, 1, 1, 2);
  244.   label->show();
  245.   hbox->show();
  246.   hbox = new Gtk_HBox;
  247.   hbox->pack_start(*productEntry_, TRUE, TRUE);
  248.   table->attach(*hbox, 1, 2, 1, 2);
  249.   productEntry_->show();
  250.   hbox->show();
  251.   bbox = new Gtk_HButtonBox(GTK_BUTTONBOX_START);
  252.   Gtk_Button *addButton = new Gtk_Button(string(" Add "));
  253.   bbox->pack_start(*addButton);
  254.   addButton->show();
  255.   connect_to_method(addButton->clicked, this, &DeviceConfDialog::addDeviceAction);
  256.   addDeviceBox->pack_start(*bbox, FALSE);
  257.   bbox->show();
  258.   hbox = new Gtk_HBox;
  259.   hbox->pack_start(*addDeviceBox, FALSE, FALSE, 5);
  260.   addDeviceBox->show();
  261.   vbox = new Gtk_VBox;
  262.   vbox->pack_start(*hbox, FALSE, FALSE, 5);
  263.   addDeviceFrame->add(vbox);
  264.   vbox->show();
  265.   hbox->show();
  266.   
  267.   contents->pack_start(*addDeviceFrame, FALSE, FALSE);
  268.   addDeviceFrame->show();
  269.   
  270.   Gtk_HBox *contentsHBox = new Gtk_HBox;
  271.   contentsHBox->pack_start(*contents, TRUE, TRUE, 10);
  272.   contents->show();
  273.   get_vbox()->pack_start(*contentsHBox, TRUE, TRUE, 10);
  274.   contentsHBox->show();
  275.   get_vbox()->show();
  276.   bbox = new Gtk_HButtonBox(GTK_BUTTONBOX_SPREAD);
  277.   bbox->pack_start(*applyButton_);
  278.   applyButton_->show();
  279.   connect_to_method(applyButton_->clicked, this, &DeviceConfDialog::applyAction);
  280.   
  281.   Gtk_Button *resetButton = new Gtk_Button(string(" Reset "));
  282.   bbox->pack_start(*resetButton);
  283.   resetButton->show();
  284.   connect_to_method(resetButton->clicked, this, &DeviceConfDialog::resetAction);
  285.   Gtk_Button *cancelButton = new Gtk_Button(string(" Cancel "));
  286.   bbox->pack_start(*cancelButton);
  287.   cancelButton->show();
  288.   connect_to_method(cancelButton->clicked, this,
  289.     &DeviceConfDialog::cancelAction);
  290.   get_action_area()->pack_start(*bbox);
  291.   bbox->show();
  292.   get_action_area()->show();
  293. }
  294. DeviceConfDialog::~DeviceConfDialog()
  295. {
  296.   delete list_;
  297.   list_ = NULL;
  298.   delete applyButton_;
  299.   applyButton_ = NULL;
  300. }
  301. void DeviceConfDialog::start(TocEdit *tocEdit)
  302. {
  303.   if (active_) {
  304.     get_window().raise();
  305.     return;
  306.   }
  307.   active_ = 1;
  308.   update(UPD_CD_DEVICES, tocEdit);
  309.   show();
  310. }
  311. void DeviceConfDialog::stop()
  312. {
  313.   if (active_) {
  314.     hide();
  315.     active_ = 0;
  316.   }
  317. }
  318. void DeviceConfDialog::update(unsigned long level, TocEdit *)
  319. {
  320.   if (!active_)
  321.     return;
  322.   if (level & UPD_CD_DEVICES)
  323.     import();
  324.   else if (level & UPD_CD_DEVICE_STATUS)
  325.     importStatus();
  326. }
  327. gint DeviceConfDialog::delete_event_impl(GdkEventAny*)
  328. {
  329.   stop();
  330.   return 1;
  331. }
  332. void DeviceConfDialog::cancelAction()
  333. {
  334.   stop();
  335. }
  336. void DeviceConfDialog::resetAction()
  337. {
  338.   import();
  339. }
  340. void DeviceConfDialog::applyAction()
  341. {
  342.   if (selectedRow_ >= 0)
  343.     exportConfiguration(selectedRow_);
  344.   exportData();
  345.   guiUpdate(UPD_CD_DEVICES);
  346. }
  347. void DeviceConfDialog::addDeviceAction()
  348. {
  349.   const char *s;
  350.   string vendor;
  351.   string product;
  352.   int bus = busEntry_->get_value_as_int();
  353.   int id = idEntry_->get_value_as_int();
  354.   int lun = lunEntry_->get_value_as_int();
  355.   CdDevice *dev;
  356.   if ((s = checkString(vendorEntry_->get_text())) == NULL)
  357.     return;
  358.   vendor = s;
  359.   if ((s = checkString(productEntry_->get_text())) == NULL)
  360.     return;
  361.   product = s;
  362.   if (CdDevice::find(bus, id, lun) != NULL) 
  363.     return;
  364.   dev = CdDevice::add(bus, id, lun, vendor.c_str(), product.c_str());
  365.   appendTableEntry(dev);
  366.   list_->cause_select_row(list_->rows() - 1, 0);
  367.   list_->moveto(list_->rows() - 1, 0, 1.0, 0.0);
  368.   guiUpdate(UPD_CD_DEVICES);
  369. }
  370. void DeviceConfDialog::deleteDeviceAction()
  371. {
  372.   DeviceData *data;
  373.   int row = selectedRow_;
  374.   CdDevice *dev;
  375.   if (row >= 0 &&
  376.       (data = (DeviceData*)list_->get_row_data(selectedRow_)) != NULL) {
  377.     dev = CdDevice::find(data->bus, data->id, data->lun);
  378.     if (dev == NULL || dev->status() == CdDevice::DEV_RECORDING ||
  379.  dev->status() == CdDevice::DEV_BLANKING) {
  380.       // don't remove device that is currently busy
  381.       return;
  382.     }
  383.     CdDevice::remove(data->bus, data->id, data->lun);
  384.     selectedRow_ = -1;
  385.     list_->remove_row(row);
  386.     delete data;
  387.     guiUpdate(UPD_CD_DEVICES);
  388.   }
  389. }
  390. void DeviceConfDialog::rescanAction()
  391. {
  392.   CdDevice::scan();
  393.   guiUpdate(UPD_CD_DEVICES);
  394. }
  395. void DeviceConfDialog::appendTableEntry(CdDevice *dev)
  396. {
  397.   DeviceData *data;
  398.   char buf[50];
  399.   string idStr;
  400.   string busStr;
  401.   string lunStr;
  402.   const gchar *rowStr[6];
  403.   data = new DeviceData;
  404.   data->bus = dev->bus();
  405.   data->id = dev->id();
  406.   data->lun = dev->lun();
  407.   data->driverId = dev->driverId();
  408.   data->options = dev->driverOptions();
  409.   if (dev->specialDevice() != NULL)
  410.     data->specialDevice = dev->specialDevice();
  411.   switch (dev->deviceType()) {
  412.   case CdDevice::CD_ROM:
  413.     data->deviceType = 0;
  414.     break;
  415.   case CdDevice::CD_R:
  416.     data->deviceType = 1;
  417.     break;
  418.   case CdDevice::CD_RW:
  419.     data->deviceType = 2;
  420.     break;
  421.   }
  422.   sprintf(buf, "%d", data->bus);
  423.   busStr = buf;
  424.   rowStr[0] = busStr.c_str();
  425.   sprintf(buf, "%d", data->id);
  426.   idStr = buf;
  427.   rowStr[1] = idStr.c_str();
  428.   sprintf(buf, "%d", data->lun);
  429.   lunStr = buf;
  430.   rowStr[2] = lunStr.c_str();
  431.   rowStr[3] = dev->vendor();
  432.   rowStr[4] = dev->product();
  433.   
  434.   rowStr[5] = CdDevice::status2string(dev->status());
  435.   list_->append(rowStr);
  436.   list_->set_row_data(list_->rows() - 1, data);
  437. }
  438. void DeviceConfDialog::import()
  439. {
  440.   CdDevice *drun;
  441.   DeviceData *data;
  442.   selectedRow_ = -1;
  443.   list_->freeze();
  444.   while (list_->rows() > 0) {
  445.     data = (DeviceData*)list_->get_row_data(0);
  446.     list_->remove_row(0);
  447.     delete data;
  448.   }
  449.   for (drun = CdDevice::first(); drun != NULL; drun = CdDevice::next(drun)) {
  450.     appendTableEntry(drun);
  451.   }
  452.   list_->thaw();
  453.   if (list_->rows() > 0) {
  454.     list_->columns_autosize();
  455.     list_->cause_select_row(0, 0);
  456.     list_->moveto(0, 0, 0.0, 0.0);
  457.   }
  458.  
  459. }
  460. void DeviceConfDialog::importConfiguration(int row)
  461. {
  462.   char buf[50];
  463.   DeviceData *data;
  464.   if (row >= 0 && (data = (DeviceData*)list_->get_row_data(row)) != NULL) {
  465.     driverMenu_->set_sensitive(true);
  466.     driverMenu_->set_history(data->driverId);
  467.     devtypeMenu_->set_sensitive(true);
  468.     devtypeMenu_->set_history(data->deviceType);
  469.     driverOptionsEntry_->set_sensitive(true);
  470.     sprintf(buf, "0x%lx", data->options);
  471.     driverOptionsEntry_->set_text(string(buf));
  472.     specialDeviceEntry_->set_sensitive(true);
  473.     specialDeviceEntry_->set_text(data->specialDevice);
  474.   }
  475.   else {
  476.     driverMenu_->set_history(0);
  477.     driverMenu_->set_sensitive(false);
  478.     devtypeMenu_->set_history(0);
  479.     devtypeMenu_->set_sensitive(false);
  480.     driverOptionsEntry_->set_text(string(""));
  481.     driverOptionsEntry_->set_sensitive(false);
  482.     specialDeviceEntry_->set_text(string(""));
  483.     specialDeviceEntry_->set_sensitive(false);
  484.   }
  485. }
  486. void DeviceConfDialog::importStatus()
  487. {
  488.   int i;
  489.   DeviceData *data;
  490.   CdDevice *dev;
  491.   for (i = 0; i < list_->rows(); i++) {
  492.     if ((data = (DeviceData*)list_->get_row_data(i)) != NULL &&
  493. (dev = CdDevice::find(data->bus, data->id, data->lun)) != NULL) {
  494.       list_->set_text(i, 5, string(CdDevice::status2string(dev->status())));
  495.     }
  496.   }
  497.   list_->columns_autosize();
  498. }
  499. void DeviceConfDialog::exportConfiguration(int row)
  500. {
  501.   DeviceData *data;
  502.   const char *s;
  503.   if (row >= 0 && (data = (DeviceData*)list_->get_row_data(row)) != NULL) {
  504.     data->options = strtoul(driverOptionsEntry_->get_text().c_str(), NULL, 0);
  505.     s = checkString(specialDeviceEntry_->get_text());
  506.     if (s == NULL)
  507.       data->specialDevice = "";
  508.     else
  509.       data->specialDevice = s;
  510.   }
  511. }
  512. void DeviceConfDialog::exportData()
  513. {
  514.   int i;
  515.   DeviceData *data;
  516.   CdDevice *dev;
  517.   string s;
  518.   for (i = 0; i < list_->rows(); i++) {
  519.     if ((data = (DeviceData*)list_->get_row_data(i)) != NULL) {
  520.       if ((dev = CdDevice::find(data->bus, data->id, data->lun)) != NULL) {
  521. if (dev->driverId() != data->driverId) {
  522.   dev->driverId(data->driverId);
  523.   dev->manuallyConfigured(1);
  524. }
  525. if (dev->deviceType() != ID2DEVICE_TYPE[data->deviceType]) {
  526.   dev->deviceType(ID2DEVICE_TYPE[data->deviceType]);
  527.   dev->manuallyConfigured(1);
  528. }
  529. if (dev->driverOptions() != data->options) {
  530.   dev->driverOptions(data->options);
  531.   dev->manuallyConfigured(1);
  532. }
  533. if ((dev->specialDevice() == NULL && data->specialDevice.c_str()[0] != 0) ||
  534.     (dev->specialDevice() != NULL &&
  535.      strcmp(dev->specialDevice(), data->specialDevice.c_str()) != 0)) {
  536.   dev->specialDevice(data->specialDevice.c_str());
  537.   dev->manuallyConfigured(1);
  538. }
  539.       }
  540.     }
  541.   }
  542. }
  543. void DeviceConfDialog::setDriverId(int id)
  544. {
  545.   DeviceData *data;
  546.   if (selectedRow_ >= 0 && id >= 0 && id <= CdDevice::maxDriverId() &&
  547.       (data = (DeviceData*)list_->get_row_data(selectedRow_)) != NULL) {
  548.     data->driverId = id;
  549.   }
  550. }
  551. void DeviceConfDialog::setDeviceType(int id)
  552. {
  553.   DeviceData *data;
  554.   if (selectedRow_ >= 0 && id >= 0 && id <= CdDevice::maxDriverId() &&
  555.       (data = (DeviceData*)list_->get_row_data(selectedRow_)) != NULL) {
  556.     data->deviceType = id;
  557.   }
  558. }
  559. void DeviceConfDialog::selectRow(gint row, gint column, GdkEvent *event)
  560. {
  561.   selectedRow_ = row;
  562.   importConfiguration(row);
  563. }
  564. void DeviceConfDialog::unselectRow(gint row, gint column, GdkEvent *event)
  565. {
  566.   if (selectedRow_ >= 0)
  567.     exportConfiguration(selectedRow_);
  568.   selectedRow_ = -1;
  569.   importConfiguration(-1);
  570. }
  571. const char *DeviceConfDialog::checkString(const string &str)
  572. {
  573.   static char *buf = NULL;
  574.   static long bufLen = 0;
  575.   char *p, *s;
  576.   long len = strlen(str.c_str());
  577.   if (len == 0)
  578.     return NULL;
  579.   if (buf == NULL || len + 1 > bufLen) {
  580.     delete[] buf;
  581.     bufLen = len + 1;
  582.     buf = new char[bufLen];
  583.   }
  584.   strcpy(buf, str.c_str());
  585.   s = buf;
  586.   p = buf + len - 1;
  587.   while (*s != 0 && isspace(*s))
  588.     s++;
  589.   if (*s == 0)
  590.     return NULL;
  591.   while (p > s && isspace(*p)) {
  592.     *p = 0;
  593.     p--;
  594.   }
  595.   
  596.   return s;
  597. }