diff options
Diffstat (limited to 'src/qtraylabel.cpp')
-rw-r--r-- | src/qtraylabel.cpp | 130 |
1 files changed, 64 insertions, 66 deletions
diff --git a/src/qtraylabel.cpp b/src/qtraylabel.cpp index 38a8381..a74ba48 100644 --- a/src/qtraylabel.cpp +++ b/src/qtraylabel.cpp @@ -30,7 +30,7 @@ #include <tqfileinfo.h> #include <tqapplication.h> #include "trace.h" -#include "qtraylabel.h" +#include <tdeconfig.h> #include <kiconloader.h> #include <tdeglobal.h> @@ -43,9 +43,10 @@ #include <stdlib.h> #include <sys/types.h> #include <sys/wait.h> - #include "util.h" +#include "qtraylabel.h" + void TQTrayLabel::initialize(void) { mDocked = false; @@ -82,7 +83,7 @@ const char *TQTrayLabel::me(void) const { static char temp[100]; snprintf(temp, sizeof(temp), "(%s,PID=%i,WID=0x%x)", - mProgName[0].latin1(), mPid, (unsigned) mDockedWindow); + mProgName[0].local8Bit().data(), mPid, (unsigned) mDockedWindow); return temp; } @@ -128,15 +129,15 @@ void TQTrayLabel::scanClients() for(unsigned i=0; i<nchildren; i++) { Window w = XmuClientWindow(display, children[i]); - TRACE("\t%s checking 0x%x", me(), (unsigned) w); + TRACE("\t%s checking(1) 0x%x", me(), (unsigned) w); if (!isNormalWindow(display, w)) continue; - if (analyzeWindow(display, w, mPid, ename.latin1())) + if (analyzeWindow(display, w, mPid, ename.local8Bit())) { - TRACE("\t%s SOULMATE FOUND", me()); + TRACE("\t%s SOULMATE FOUND (1)", me()); setDockedWindow(w); - break; + return; } - } + } } /* @@ -222,8 +223,8 @@ void TQTrayLabel::dock(void) { TRACE("%s", me()); mDocked = true; - if (mDockedWindow == None) return; // nothing to add - + if (mDockedWindow == None) return; // nothing to add + if (mSysTray == None) // no system tray yet { TRACE("%s starting reality monitor", me()); @@ -243,7 +244,7 @@ void TQTrayLabel::dock(void) Atom tray_atom = XInternAtom(display, "_KDE_NET_WM_SYSTEM_TRAY_WINDOW_FOR", False); XChangeProperty(display, wid, tray_atom, XA_WINDOW, 32, - PropModeReplace, (unsigned char *) &wid, 1); + PropModeReplace, (unsigned char *) &wid, 1); // 3. All other KDEs tray_atom = XInternAtom(display, "KWM_DOCKWINDOW", False); @@ -254,8 +255,8 @@ void TQTrayLabel::dock(void) handleTitleChange(); handleIconChange(); - - if (mProgName.count() == 0) setAppName(mClass); + + if (mProgName.count() == 0) setAppName(mClass); /* * For Gnome, a delay is required before we do a show (dont ask me why) @@ -294,7 +295,7 @@ void TQTrayLabel::map(void) TRACE("%s", me()); mWithdrawn = false; if (mDockedWindow == None) return; - + Display *display = TQPaintDevice::x11AppDisplay(); if (mDesktop == -1) @@ -324,12 +325,12 @@ void TQTrayLabel::map(void) } XMapWindow(display, mDockedWindow); - mSizeHint.flags = USPosition; // Obsolete ? + mSizeHint.flags = USPosition; // Obsolete ? XSetWMNormalHints(display, mDockedWindow, &mSizeHint); // make it the active window long l[5] = { None, CurrentTime, None, 0, 0 }; sendMessage(display, tqt_xrootwin(), mDockedWindow, "_NET_ACTIVE_WINDOW", 32, - SubstructureNotifyMask | SubstructureRedirectMask, l, sizeof(l)); + SubstructureNotifyMask | SubstructureRedirectMask, l, sizeof(l)); // skipTaskbar modifies _NET_WM_STATE. Make sure we dont override WMs value TQTimer::singleShot(230, this, SLOT(skipTaskbar())); // disable docking when minized for some time (since we went to Iconic state) @@ -346,7 +347,7 @@ void TQTrayLabel::withdraw(void) Display *display = TQPaintDevice::x11AppDisplay(); int screen = DefaultScreen(display); long dummy; - + XGetWMNormalHints(display, mDockedWindow, &mSizeHint, &dummy); /* @@ -357,7 +358,7 @@ void TQTrayLabel::withdraw(void) * state will remove us from the taskbar. * Reference: ICCCM 4.1.4 Changing Window State */ - XIconifyWindow(display, mDockedWindow, screen); // good for effects too + XIconifyWindow(display, mDockedWindow, screen); // good for effects too XUnmapWindow(display, mDockedWindow); XUnmapEvent ev; memset(&ev, 0, sizeof(ev)); @@ -389,8 +390,8 @@ void TQTrayLabel::skipTaskbar(void) Atom _NET_WM_STATE = XInternAtom(display, "_NET_WM_STATE", True); Atom skip_atom = XInternAtom(display, "_NET_WM_STATE_SKIP_TASKBAR", False); int ret = XGetWindowProperty(display, mDockedWindow, _NET_WM_STATE, 0, - 20, False, AnyPropertyType, &type, &format, - &nitems, &left, (unsigned char **) &data); + 20, False, AnyPropertyType, &type, &format, + &nitems, &left, (unsigned char **) &data); Atom *old_states = (Atom *) data; bool append = true, replace = false; @@ -406,7 +407,7 @@ void TQTrayLabel::skipTaskbar(void) { if (num_states < nitems) { - replace = true; // need to remove skip_atom + replace = true; // need to remove skip_atom for (; num_states < nitems - 1; num_states++) old_states[num_states] = old_states[num_states + 1]; } @@ -442,6 +443,7 @@ void TQTrayLabel::setSkipTaskbar(bool skip) void TQTrayLabel::close(void) { TRACE("%s", me()); + undock(); Display *display = TQPaintDevice::x11AppDisplay(); long l[5] = { 0, 0, 0, 0, 0 }; map(); @@ -457,7 +459,7 @@ void TQTrayLabel::setTrayIcon(const TQString& icon) { mCustomIcon = icon; if (TQPixmap(mCustomIcon).isNull()) mCustomIcon = TQString::null; - TRACE("%s mCustomIcon=%s", me(), mCustomIcon.latin1()); + TRACE("%s mCustomIcon=%s", me(), mCustomIcon.local8Bit()); updateIcon(); } @@ -469,18 +471,17 @@ void TQTrayLabel::setTrayIcon(const TQString& icon) */ void TQTrayLabel::setDockedWindow(Window w) { - TRACE("%s %s reality monitor", me(), + TRACE("%s %s reality monitor", me(), mDockedWindow==None ? "Starting" : "Stopping"); // Check if we are allowed to dock this window (allows custom rules) if (w != None) mDockedWindow = canDockWindow(w) ? w : None; else mDockedWindow = None; - if (mDockedWindow == None) mRealityMonitor.start(500); - else mRealityMonitor.stop(); + if (mDockedWindow == None) mRealityMonitor.start(500); else mRealityMonitor.stop(); Display *d = TQPaintDevice::x11AppDisplay(); - + // Subscribe for window or root window events if (w == None) subscribe(d, None, SubstructureNotifyMask, true); else @@ -488,10 +489,10 @@ void TQTrayLabel::setDockedWindow(Window w) if (canUnsubscribeFromRoot()) subscribe(d, None, ~SubstructureNotifyMask, false); else subscribe(d, None, SubstructureNotifyMask, true); - + subscribe(d, w, StructureNotifyMask | PropertyChangeMask | - VisibilityChangeMask | FocusChangeMask, + VisibilityChangeMask | FocusChangeMask, true); } @@ -515,8 +516,8 @@ void TQTrayLabel::setDockedWindow(Window w) void TQTrayLabel::balloonText() { TRACE("%s BalloonText=%s ToolTipText=%s", me(), - mBalloon->text().latin1(), TQToolTip::textFor(this).latin1()); - + mBalloon->text().local8Bit(), TQToolTip::textFor(this).local8Bit()); + if (mBalloon->text() == TQToolTip::textFor(this)) return; #if 0 // I_GOT_NETWM_BALLOONING_TO_WORK // if you can get NET WM ballooning to work let me know @@ -528,7 +529,7 @@ void TQTrayLabel::balloonText() SubstructureNotifyMask | SubstructureRedirectMask, l, sizeof(l)); int length = mTitle.length(); - const char *data = mTitle.latin1(); + const char *data = mTitle.local8Bit(); while (length > 0) { sendMessage(display, mSystemTray, winId(), "_NET_SYSTEM_TRAY_MESSAGE_DATA", 8, @@ -564,7 +565,7 @@ void TQTrayLabel::handleTitleChange(void) XFetchName(display, mDockedWindow, &window_name); mTitle = window_name; - TRACE("%s has title [%s]", me(), mTitle.latin1()); + TRACE("%s has title [%s]", me(), mTitle.local8Bit()); if (window_name) XFree(window_name); XClassHint ch; @@ -698,10 +699,10 @@ bool TQTrayLabel::x11EventFilter(XEvent *ev) mWithdrawn = true; unmapEvent(); } - else if (event->type == FocusOut) - { - focusLostEvent(); - } + else if (event->type == FocusOut) + { + focusLostEvent(); + } return true; // Dont process this again } @@ -712,8 +713,8 @@ bool TQTrayLabel::x11EventFilter(XEvent *ev) Display *display = TQPaintDevice::x11AppDisplay(); Window w = XmuClientWindow(display, ((XMapEvent *) event)->window); if (!isNormalWindow(display, w)) return FALSE; - if (!analyzeWindow(display, w, mPid, - TQFileInfo(mProgName[0]).fileName().latin1())) return FALSE; + if (!analyzeWindow(display, w, mPid, + TQFileInfo(mProgName[0]).fileName().local8Bit())) return FALSE; // All right. Lets dock this baby setDockedWindow(w); return true; @@ -759,8 +760,8 @@ void TQTrayLabel::propertyChangeEvent(Atom property) unsigned long nitems, after; unsigned char *data = NULL; int r = XGetWindowProperty(display, mDockedWindow, WM_STATE, - 0, 1, False, AnyPropertyType, &type, - &format, &nitems, &after, &data); + 0, 1, False, AnyPropertyType, &type, + &format, &nitems, &after, &data); if ((r == Success) && data && (*(long *) data == IconicState)) { @@ -771,40 +772,37 @@ void TQTrayLabel::propertyChangeEvent(Atom property) } // Session Management -bool TQTrayLabel::saveState(TQSettings &settings) +void TQTrayLabel::saveState(TDEConfig *config) { TRACE("%s saving state", me()); - settings.writeEntry("/Application", mProgName.join(" ")); - settings.writeEntry("/CustomIcon", mCustomIcon); - settings.writeEntry("/BalloonTimeout", mBalloonTimeout); - settings.writeEntry("/DockWhenMinimized", mDockWhenMinimized); - settings.writeEntry("/SkipTaskbar", mSkippingTaskbar); - settings.writeEntry("/Withdraw", mWithdrawn); - return true; + config->writeEntry("Application", mProgName.join(" ")); + config->writeEntry("BalloonTimeout", mBalloonTimeout); + config->writeEntry("CustomIcon", mCustomIcon); + config->writeEntry("DockWhenMinimized", mDockWhenMinimized); + config->writeEntry("SkipTaskbar", mSkippingTaskbar); + config->writeEntry("Withdraw", mWithdrawn); } -bool TQTrayLabel::restoreState(TQSettings &settings) +bool TQTrayLabel::restoreState(TDEConfig *config) { TRACE("%s restoring state", me()); - mCustomIcon = settings.readEntry("/CustomIcon"); - setBalloonTimeout(settings.readNumEntry("/BalloonTimeout")); - setDockWhenMinimized(settings.readBoolEntry("/DockWhenMinimized")); - setSkipTaskbar(settings.readBoolEntry("/SkipTaskbar")); - mWithdrawn = settings.readBoolEntry("/Withdraw"); + setBalloonTimeout(config->readNumEntry("BalloonTimeout", 4000)); + mCustomIcon = config->readEntry("CustomIcon", TQString::null); + setDockWhenMinimized(config->readBoolEntry("DockWhenMinimized", false)); + setSkipTaskbar(config->readBoolEntry("SkipTaskbar", false)); + mWithdrawn = config->readBoolEntry("Withdraw", false); dock(); - - /* - * Since we are getting restored, it is likely that the application that we - * are interested in has already been started (if we didnt launch it). - * So we scan the list of windows and grab the first one that satisfies us - * This implicitly assumes that if mPid!=0 then we launched it. Wait till - * the application really shows itself up before we do a scan (the reason - * why we have 2s - */ - if (!mPid) TQTimer::singleShot(2000, this, SLOT(scanClients())); - - return true; + scanClients(); // Grab window + if (mWithdrawn) + { + withdraw(); + } + else + { + map(); + } + return true; } // End kicking butt |