/*************************************************************************** susehwitemhandler.cpp - description ------------------- copyright : (C) 2002 SUSE AG email : Oliver.Ries@suse.de ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/ #include "susehwitemhandler.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include static HWItemHandler *handler = 0; HWItemHandler::HWItemHandler() : QObject(0, "HWHandler") { handler = this; dialogdisplayed = false; halc = libhal_ctx_new(); // Main loop integration kdDebug() << "Main loop integration" << endl; DBusError error; dbus_error_init(&error); DBusConnection *dbus_connection = dbus_bus_get(DBUS_BUS_SYSTEM, &error); if (dbus_error_is_set(&error)) { kdDebug() << "dcop error" << endl; halc = 0; return; } DBusQt::Connection *m_dBusQtConnection = new DBusQt::Connection(this); m_dBusQtConnection->dbus_connection_setup_with_qt_main(dbus_connection); libhal_ctx_set_dbus_connection(halc, dbus_connection); if (!libhal_ctx_init(halc, NULL)) { kdDebug() << "Failed to init HAL context!" << endl; halc = 0; return; } } void HWItemHandler::sessioninit() { checkFor75dpi(); if (!halc) exit(1); int numDevices; char** halDeviceList = libhal_get_all_devices(halc, &numDevices, NULL); if (!halDeviceList) exit(1); bool added = false; for (int i = 0; i < numDevices; i++) { if (handle(halDeviceList[i])) added = true; } if (!added) kapp->quit(); } bool HWItemHandler::handle(const QString &udi) { if (!halc) return false; HWItem *newone = new HWItem(halc, udi, handler); if (!newone->added()) { delete newone; return false; } else return true; } HWItemHandler::~HWItemHandler(){ //clear up maps QString tmpl = "mv \"%1\" \"%2/%3_%4.desktop\""; QString cmdline; QDictIterator it( items ); for( ; it.current(); ++it) { delete it.current(); } } /******************************** Dialog stuff ****************************************/ void HWItemHandler::queueDialogforPopup(HWItem *p){ /*** called by HWItem::plugin() instead of a direct call to HWItem::newHardwarePopup() ***/ if(!dialogQueue.find(p->udi())) //just to be sure that this item isn't already queued dialogQueue.insert(p->udi(), p); //queue it else return; kdDebug() << "queue " << p->udi() << endl; if(!dialogdisplayed){ //display it,if no dialog is displayed atm dialogdisplayed=true; p->showPopup(); } } void HWItemHandler::queuedDialogDone(HWItem *p) { kdDebug() << "done with " << p->udi() << endl; /*** called by one of the dialog buttons***/ dialogdisplayed=false; //no dialog is shown atm dialogQueue.remove(p->udi()); //dequeue it if(dialogQueue.isEmpty()) { kapp->quit(); return; } dialogdisplayed=true; QDictIterator it(dialogQueue); //get next (first) item in queue it.current()->showPopup(); } void HWItemHandler::dequeueAll() { dialogdisplayed=false; dialogQueue.clear(); } #include void HWItemHandler::checkFor75dpi() { KConfig *c = KGlobal::config(); c->setGroup("Default"); if (c->readBoolEntry("CheckFor75dpi", true)){ double xres, yres; xres = ((((double) DisplayWidth(qt_xdisplay(),0)) * 25.4 / ((double) DisplayWidthMM(qt_xdisplay(),0)))) + 0.5; yres = ((((double) DisplayHeight(qt_xdisplay(),0)) * 25.4 / ((double) DisplayHeightMM(qt_xdisplay(),0)))) + 0.5; if ( 75 == (int)xres && 75 == (int)yres ){ QString msg = i18n("Your monitor did not report its X and Y Size. " "This might cause display problems like unreadable fonts.\n" "Configure your monitor geometry manually?" ); if ( KMessageBox::questionYesNo( 0, msg ) == KMessageBox::Yes ){ KProcess p; p << "kdesu" << "--nonewdcop" << "--" << "/usr/sbin/SaX2" << "--dialog" << "Monitor"; p.start(KProcess::DontCare); } } c->setGroup("Default"); c->writeEntry("CheckFor75dpi", false); c->sync(); } } #include "susehwitemhandler.moc"