Changeset 6058

Show
Ignore:
Timestamp:
01/24/08 21:40:25 (9 months ago)
Author:
eugene
Message:

Major docking fix.

Location:
branches/qt-gui_qt4/src
Files:
13 modified

Legend:

Unmodified
Added
Removed
  • branches/qt-gui_qt4/src/dockicons/CMakeLists.txt

    r5777 r6058  
    22set(dockicons_SRCS 
    33  dockicon.cpp 
    4   dockiconwidget.cpp 
    54  systemtrayicon.cpp 
    65) 
     
    87# Other dock icons not available with kde 
    98if (NOT WITH_KDE) 
    10   list(APPEND dockicons_SRCS defaultdockicon.cpp themeddockicon.cpp) 
     9  list(APPEND dockicons_SRCS dockiconwidget.cpp defaultdockicon.cpp themeddockicon.cpp) 
    1110endif (NOT WITH_KDE) 
    1211 
  • branches/qt-gui_qt4/src/dockicons/defaultdockicon.cpp

    r5837 r6058  
    4848 
    4949DefaultDockIcon::DefaultDockIcon(QMenu* menu) 
    50   : DockIcon(menu) 
     50  : DockIcon() 
    5151{ 
     52  myIcon = new DockIconWidget(menu); 
     53  relayDockIconSignals(); 
    5254  updateConfig(); 
    53 } 
    54  
    55 DefaultDockIcon::~DefaultDockIcon() 
    56 { 
    57   delete pix; 
    5855} 
    5956 
     
    6259  myFortyEight = Config::General::instance()->defaultIconFortyEight(); 
    6360 
    64   delete myIcon; 
     61  QPixmap* pic = new QPixmap(myFortyEight ? back48_xpm : back64_xpm); 
     62  QBitmap bmp = QBitmap(myFortyEight ? mask48_xpm : mask64_xpm); 
     63  pic->setMask(bmp); 
     64  myIcon->setFace(pic); 
     65  delete pic; 
    6566 
    66   if (myFortyEight) 
    67   { 
    68     pix = new QPixmap(back48_xpm); 
    69     QBitmap b; 
    70     b = QPixmap(mask48_xpm); 
    71     pix->setMask(b); 
    72     myIcon = new DockIconWidget(pix, this); 
    73   } 
    74   else 
    75   { 
    76     pix = new QPixmap(back64_xpm); 
    77     QBitmap b; 
    78     b = QPixmap(mask64_xpm); 
    79     pix->setMask(b); 
    80     myIcon = new DockIconWidget(pix, this); 
    81   } 
    82   X11Init(); 
     67  updateStatusIcon(); 
     68  updateIconMessages(myNewMsg, mySysMsg); 
    8369} 
    8470 
     
    8773  DockIcon::updateStatusIcon(); 
    8874 
     75  if (!myFortyEight && myNewMsg == 0 && mySysMsg == 0) 
     76    drawIcon64(myStatusIcon); 
     77 
    8978  QPixmap m; 
    90   switch (myStatus) 
    91   { 
    92     case ICQ_STATUS_ONLINE: m = QPixmap(online_xpm); break; 
    93     case ICQ_STATUS_AWAY: m = QPixmap(away_xpm); break; 
    94     case ICQ_STATUS_NA: m = QPixmap(na_xpm); break; 
    95     case ICQ_STATUS_OCCUPIED: m = QPixmap(occupied_xpm); break; 
    96     case ICQ_STATUS_DND: m = QPixmap(dnd_xpm); break; 
    97     case ICQ_STATUS_FREEFORCHAT: m = QPixmap(ffc_xpm); break; 
    98     case ICQ_STATUS_OFFLINE: m = QPixmap(offline_xpm); break; 
    99   } 
    10079  if (myInvisible) 
    10180    m = QPixmap(invisible_xpm); 
     81  else 
     82    switch (myStatus) 
     83    { 
     84      case ICQ_STATUS_ONLINE: m = QPixmap(online_xpm); break; 
     85      case ICQ_STATUS_AWAY: m = QPixmap(away_xpm); break; 
     86      case ICQ_STATUS_NA: m = QPixmap(na_xpm); break; 
     87      case ICQ_STATUS_OCCUPIED: m = QPixmap(occupied_xpm); break; 
     88      case ICQ_STATUS_DND: m = QPixmap(dnd_xpm); break; 
     89      case ICQ_STATUS_FREEFORCHAT: m = QPixmap(ffc_xpm); break; 
     90      case ICQ_STATUS_OFFLINE: m = QPixmap(offline_xpm); break; 
     91    } 
    10292 
    103   QPainter painter(myIcon->vis); 
    104   if (!myFortyEight) 
    105   { 
    106     painter.drawPixmap(0, 44, m); 
    107     // Draw the little icon if no new messages 
    108     if (myNewMsg == 0 && mySysMsg == 0) 
    109     { 
    110       QPixmap* p = &myStatusIcon; 
    111       painter.fillRect(31, 6, 27, 16, QColor(0,0,0)); 
    112       if (p != NULL) 
    113       { 
    114         int w = p->width() > 27 ? 27 : p->width(); 
    115         int h = p->height() > 16 ? 16 : p->height(); 
    116         int x = 45 - (w / 2); 
    117         int y = 14 - (h / 2); 
    118         painter.drawPixmap(x, y, *p, 0, 0, w, h); 
    119       } 
    120     } 
    121   } 
    122   else 
    123     painter.drawPixmap(0, 27, m); 
     93  QPixmap* face = myIcon->face(); 
     94  QPainter painter(face); 
     95  painter.drawPixmap(0, myFortyEight ? 27 : 44, m); 
    12496  painter.end(); 
    12597 
    126   myIcon->repaint(); 
    127   repaint(); 
    128 } 
    129  
    130 void DefaultDockIcon::splitDigits(int num, int& low, int &high) 
    131 { 
    132   if (num > 99) 
    133   { 
    134     low = 9; 
    135     high = 9; 
    136   } 
    137   else 
    138   { 
    139     low = num % 10; 
    140     high = num / 10; 
    141   } 
     98  myIcon->setFace(face); 
     99  delete face; 
    142100} 
    143101 
    144102void DefaultDockIcon::updateIconMessages(int newMsg, int sysMsg) 
    145103{ 
    146   QPainter p(myIcon->vis); 
    147   int d1, d10; 
     104  DockIcon::updateIconMessages(newMsg, sysMsg); 
    148105 
    149   // set the new msg digits 
    150   splitDigits(newMsg, d1, d10); 
     106  int low, high; 
    151107 
    152   if (!myFortyEight) 
    153   { 
    154     p.drawPixmap(44, 26, digits[d10]); 
    155     p.drawPixmap(50, 26, digits[d1]); 
    156   } 
    157   else 
    158   { 
    159     p.drawPixmap(44, 9, digits[d10]); 
    160     p.drawPixmap(50, 9, digits[d1]); 
    161   } 
     108#define SPLIT(num) \ 
     109  (num) = qMin(num, 99); \ 
     110  low = (num) % 10; \ 
     111  high = (num) / 10; 
    162112 
    163   // set the system msg digits 
    164   splitDigits(sysMsg, d1, d10); 
     113  QPixmap* face = myIcon->face(); 
     114  QPainter p(face); 
    165115 
    166   if (!myFortyEight) 
    167   { 
    168     p.drawPixmap(44, 38, digits[d10]); 
    169     p.drawPixmap(50, 38, digits[d1]); 
    170   } 
    171   else 
    172   { 
    173     p.drawPixmap(44, 21, digits[d10]); 
    174     p.drawPixmap(50, 21, digits[d1]); 
    175   } 
     116  SPLIT(newMsg); 
     117  p.drawPixmap(44, myFortyEight ? 8 : 26, digits[high]); 
     118  p.drawPixmap(50, myFortyEight ? 8 : 26, digits[low]); 
     119 
     120  SPLIT(sysMsg); 
     121  p.drawPixmap(44, myFortyEight ? 20 : 38, digits[high]); 
     122  p.drawPixmap(50, myFortyEight ? 20 : 38, digits[low]); 
     123 
    176124  p.end(); 
    177125 
    178   // Base class will trigger updateEventIcon to actually paint the icon 
    179   DockIcon::updateIconMessages(newMsg, sysMsg); 
     126  myIcon->setFace(face); 
     127  delete face; 
    180128} 
    181129 
    182130void DefaultDockIcon::updateEventIcon() 
    183131{ 
    184   if (!myFortyEight) 
    185   { 
    186     QPainter p(myIcon->vis); 
     132  DockIcon::updateEventIcon(); 
    187133 
    188     // Draw the little icon now 
    189     QPixmap* m = NULL; 
    190     if (mySysMsg > 0 || myNewMsg > 0) 
    191       m = &myEventIcon; 
    192     else 
    193       m = &myStatusIcon; 
    194     p.fillRect(31, 6, 27, 16, QColor(0,0,0)); 
    195     if (m != NULL) 
    196     { 
    197       int w = m->width() > 27 ? 27 : m->width(); 
    198       int h = m->height() > 16 ? 16 : m->height(); 
    199       int x = 45 - (w / 2); 
    200       int y = 14 - (h / 2); 
    201       p.drawPixmap(x, y, *m, 0, 0, w, h); 
    202     } 
     134  if (myFortyEight) 
     135    return; 
    203136 
    204     p.end(); 
    205   } 
     137  drawIcon64((mySysMsg > 0 || myNewMsg > 0) ? myEventIcon : myStatusIcon); 
     138} 
    206139 
    207   myIcon->repaint(); 
    208   repaint(); 
     140void DefaultDockIcon::drawIcon64(QPixmap* icon) 
     141{ 
     142  if (icon == NULL || icon->isNull()) 
     143    return; 
     144 
     145  QPixmap* face = myIcon->face(); 
     146  QPainter p(face); 
     147 
     148  // Clear the icon area 
     149  p.fillRect(31, 6, 27, 16, Qt::black); 
     150 
     151  // Calculate drawing coordinates 
     152  int w = qMin(icon->width(), 27); 
     153  int h = qMin(icon->height(), 16); 
     154  int x = 45 - (w / 2); 
     155  int y = 14 - (h / 2); 
     156 
     157  p.drawPixmap(x, y, *icon, 0, 0, w, h); 
     158  p.end(); 
     159 
     160  myIcon->setFace(face); 
     161  delete face; 
    209162} 
  • branches/qt-gui_qt4/src/dockicons/defaultdockicon.h

    r5837 r6058  
    2222#define DEFAULTDOCKICON_H 
    2323 
     24class QMenu; 
     25class QPixmap; 
     26 
    2427#include "dockicon.h" 
    2528 
     
    4144   */ 
    4245  DefaultDockIcon(QMenu* menu); 
    43  
    44   /** 
    45    * Destructor 
    46    */ 
    47   virtual ~DefaultDockIcon(); 
    4846 
    4947  /** 
     
    7371private: 
    7472  /** 
    75    * Get the two lower digits from a number 
     73   * Draws a given @a icon into the 64x64 dock icon area 
    7674   * 
    77    * @param num Number to split 
    78    * @param low Return variable for lower digit 
    79    * @param high Return variable for second lowest digit 
     75   * @param icon The icon to draw 
    8076   */ 
    81   void splitDigits(int num, int& low, int& high); 
     77  void drawIcon64(QPixmap* icon); 
    8278 
    83   QPixmap* pix; 
    8479  bool myFortyEight; 
    8580}; 
  • branches/qt-gui_qt4/src/dockicons/dockicon.cpp

    r5990 r6058  
    2323#include "config.h" 
    2424 
    25 #include <QBitmap> 
    26 #include <QCloseEvent> 
    27 #include <QMenu> 
    28 #include <QMouseEvent> 
    29 #include <QPainter> 
    30  
    31 #ifdef Q_WS_X11 
    32 #include <QX11Info> 
    33 #include <X11/Xlib.h> 
    34 #include <X11/Xutil.h> 
    35 #undef Status 
    36 #endif 
    37  
    3825#include <licq_user.h> 
    3926 
     
    4229 
    4330#include "helpers/licqstrings.h" 
    44 #include "helpers/support.h" 
    4531 
    4632#include "dockiconwidget.h" 
     
    4935/* TRANSLATOR LicqQtGui::DockIcon */ 
    5036 
    51 DockIcon::DockIcon(QMenu* menu) 
    52   : QWidget(NULL), 
    53     myMenu(menu), 
     37DockIcon::DockIcon() 
     38  : QObject(), 
    5439    myIcon(NULL), 
    5540    myNewMsg(0), 
     
    5843    myInvisible(false) 
    5944{ 
    60   Support::setWidgetProps(this, "Wharf"); 
    61   setWindowFlags(Qt::Window); 
    62   setWindowTitle("LicqWharf"); 
    63   setBackgroundRole(QPalette::NoRole); 
    64  
    6545  // Get icon set updates 
    6646  connect(IconManager::instance(), SIGNAL(statusIconsChanged()), SLOT(updateStatusIcon())); 
     
    6949  // Get configuration updates 
    7050  connect(Config::General::instance(), SIGNAL(dockChanged()), SLOT(updateConfig())); 
     51 
     52  unsigned short sysMsg = 0; 
     53 
     54  FOR_EACH_OWNER_START(LOCK_R) 
     55  { 
     56    sysMsg += pOwner->NewMessages(); 
     57  } 
     58  FOR_EACH_OWNER_END 
     59 
     60  unsigned short newMsg = ICQUser::getNumUserEvents() - sysMsg; 
     61 
     62  updateIconMessages(newMsg, sysMsg); 
     63  updateIconStatus(); 
    7164} 
    7265 
     
    7467{ 
    7568  delete myIcon; 
    76 } 
    77  
    78 void DockIcon::X11Init() 
    79 { 
    80   // set the hints 
    81 #if defined(Q_WS_X11) && !defined(USE_KDE) 
    82   Display* dsp = x11Info().display();  // get the display 
    83   WId win = winId();     // get the window 
    84  
    85   XSizeHints sizeHints; 
    86   sizeHints.flags = USPosition; 
    87   sizeHints.x = 0; 
    88   sizeHints.y = 0; 
    89   XSetWMNormalHints(dsp, win, &sizeHints); 
    90  
    91   XWMHints* hints = XAllocWMHints();  // hints 
    92   hints->initial_state = WithdrawnState; 
    93   hints->icon_x = 0; 
    94   hints->icon_y = 0; 
    95   hints->icon_window = myIcon->winId(); 
    96   hints->window_group = win;  // set the window hint 
    97   hints->flags = WindowGroupHint | IconWindowHint | IconPositionHint | StateHint; // set the window group hint 
    98   XSetWMHints(dsp, win, hints);  // set the window hints for WM to use. 
    99   XFree(hints); 
    100  
    101   XMapWindow(dsp, myIcon->winId()); 
    102   XMapWindow(dsp, win); 
    103   XSync(dsp, False); 
    104  
    105 #endif /* defined(Q_WS_X11) && !defined(USE_KDE) */ 
    106  
    107   resize(myIcon->size()); 
    108   setMask(myIcon->mask()); 
    109   move(-100, -100); 
    110   updateToolTip(); 
    111   show(); 
    112 #if defined(Q_WS_X11) && !defined(USE_KDE) 
    113   XWithdrawWindow(dsp, win, XScreenNumberOfScreen(DefaultScreenOfDisplay(dsp))); 
    114 #endif /* defined(Q_WS_X11) && !defined(USE_KDE) */ 
    11569} 
    11670 
     
    12478  { 
    12579    OwnerList* ol = gUserManager.LockOwnerList(LOCK_R); 
    126     for (OwnerList::iterator i = ol->begin(); i != ol->end(); i++) 
    127     { 
    128       o = *i; 
    129       o->Lock(LOCK_R); 
    130       break; 
    131     } 
     80    o = ol->front(); 
     81    o->Lock(LOCK_R); 
    13282    gUserManager.UnlockOwnerList(); 
    13383  } 
     
    159109void DockIcon::updateStatusIcon() 
    160110{ 
    161   myStatusIcon = IconManager::instance()->iconForStatus(myFullStatus, myId, myPpid); 
     111  myStatusIcon = const_cast<QPixmap*> 
     112    (&IconManager::instance()->iconForStatus(myFullStatus, myId, myPpid)); 
    162113} 
    163114 
     
    174125{ 
    175126  if (mySysMsg > 0) 
    176     myEventIcon = IconManager::instance()->getIcon(IconManager::ReqAuthorizeMessageIcon); 
     127    myEventIcon = const_cast<QPixmap*> 
     128      (&IconManager::instance()->getIcon(IconManager::ReqAuthorizeMessageIcon)); 
    177129  else if (myNewMsg > 0) 
    178     myEventIcon = IconManager::instance()->getIcon(IconManager::StandardMessageIcon); 
     130    myEventIcon = const_cast<QPixmap*> 
     131      (&IconManager::instance()->getIcon(IconManager::StandardMessageIcon)); 
    179132  else 
    180     myEventIcon = QPixmap(); 
     133    myEventIcon = NULL; 
    181134} 
    182135 
     
    201154    myIcon->setToolTip(s); 
    202155  else 
    203     setToolTip(s); 
     156    emit newToolTip(s); 
    204157} 
    205158 
    206 void DockIcon::closeEvent(QCloseEvent* event) 
     159void DockIcon::relayDockIconSignals() 
    207160{ 
    208   event->ignore(); 
     161  if (myIcon == NULL) 
     162    return; 
     163 
     164  connect(myIcon, SIGNAL(clicked()), SIGNAL(clicked())); 
     165  connect(myIcon, SIGNAL(middleClicked()), SIGNAL(middleClicked())); 
    209166} 
    210  
    211 void DockIcon::mousePressEvent(QMouseEvent* event) 
    212 { 
    213   switch (event->button()) 
    214   { 
    215     case Qt::LeftButton: 
    216       emit clicked(); 
    217       break; 
    218  
    219     case Qt::MidButton: 
    220       emit middleClicked(); 
    221       break; 
    222  
    223     case Qt::RightButton: 
    224       myMenu->popup(event->globalPos()); 
    225       break; 
    226  
    227     default: 
    228       break; 
    229   } 
    230 } 
    231  
    232 void DockIcon::paintEvent(QPaintEvent* /* event */) 
    233 { 
    234   QPainter painter(this); 
    235   myIcon->drawIcon(painter); 
    236   painter.end(); 
    237 } 
  • branches/qt-gui_qt4/src/dockicons/dockicon.h

    r5837 r6058  
    2222#define DOCKICON_H 
    2323 
    24 #include <QWidget> 
     24#include <QObject> 
    2525 
    26 class QMenu; 
     26class QPixmap; 
    2727 
    2828class ICQOwner; 
     
    3636 * Only holds state and common functions needed by dock icon implementations 
    3737 */ 
    38 class DockIcon : public QWidget 
     38class DockIcon : public QObject 
    3939{ 
    4040  Q_OBJECT 
     
    4343  /** 
    4444   * Constructor 
    45    * 
    46    * @param menu System menu to popup from dock icon on right click 
    4745   */ 
    48   DockIcon(QMenu* menu); 
     46  DockIcon(); 
    4947 
    5048  /** 
     
    7977  void middleClicked(); 
    8078 
     79  /** 
     80   * New tooltip is available 
     81   * Emitted when myIcon isn't set 
     82   */ 
     83  void newToolTip(QString tooltip); 
     84 
    8185protected slots: 
    8286  /** 
     
    97101protected: 
    98102  /** 
    99    * Setup X hints needed to mark icon window as dockable by some window managers 
    100    */ 
    101   void X11Init(); 
    102  
    103   /** 
    104103   * Update tool tip text for dock icon 
    105104   */ 
     
    107106 
    108107  /** 
    109    * User has clicked on icon 
    110    * 
    111    * @param event Event object 
     108   * Connects signals from myIcon onto this 
    112109   */ 
    113   virtual void mousePressEvent(QMouseEvent* event); 
     110  void relayDockIconSignals(); 
    114111 
    115   /** 
    116    * User tried to close icon window 
    117    * 
    118    * @param event Event object 
    119    */ 
    120   virtual void closeEvent(QCloseEvent* event); 
    121  
    122   /** 
    123    * Repaint icon window 
    124    * 
    125    * @param event Event object 
    126    */ 
    127   virtual void paintEvent(QPaintEvent* event); 
    128  
    129   QMenu* myMenu; 
    130112  DockIconWidget* myIcon; 
    131113  int myNewMsg; 
     
    134116  unsigned short myStatus; 
    135117  bool myInvisible; 
    136   QPixmap myStatusIcon; 
    137   QPixmap myEventIcon; 
    138  
    139   friend class DockIconWidget; 
     118  QPixmap* myStatusIcon; 
     119  QPixmap* myEventIcon; 
    140120 
    141121private: 
  • branches/qt-gui_qt4/src/dockicons/dockiconwidget.cpp

    r5837 r6058  
    2323#include "config.h" 
    2424 
     25#include <QCloseEvent> 
    2526#include <QBitmap> 
     27#include <QMenu> 
    2628#include <QPainter> 
     29 
     30#include "helpers/support.h" 
    2731 
    2832#include "dockicon.h" 
     
    3034using namespace LicqQtGui; 
    3135 
    32 DockIconWidget::DockIconWidget(QPixmap* pix, DockIcon* parent) 
    33   : QWidget(parent), 
    34     vis(NULL) 
     36DockIconWidget::DockIconWidget(QMenu* menu) 
     37  : QWidget(), 
     38    myMenu(menu), 
     39    myFace(NULL) 
    3540{ 
    36   setObjectName("DockIconWidget"); 
    37   Set(pix); 
    38 } 
    39  
    40 void DockIconWidget::Set(QPixmap* pix) 
    41 { 
    42   delete vis; 
    43   vis = new QPixmap(*pix); 
    44   resize(vis->size()); 
    45   setMask(vis->mask()); 
    46   repaint(); 
     41  resize(64, 64); 
     42  setAttribute(Qt::WA_NoSystemBackground, true); 
     43  setAttribute(Qt::WA_AlwaysShowToolTips, true); 
     44  Support::setWidgetProps(this, "DockIconWidget"); 
     45  myHandler = Support::dockWindow(winId()); 
     46  show(); 
    4747} 
    4848 
    4949DockIconWidget::~DockIconWidget() 
    5050{ 
    51   delete vis; 
     51  Support::undockWindow(winId(), myHandler); 
     52  delete myFace; 
     53} 
     54 
     55void DockIconWidget::setFace(QPixmap* newFace, bool updateMask) 
     56{ 
     57  if (newFace == NULL || newFace->isNull()) 
     58    return; 
     59 
     60  delete myFace; 
     61  myFace = new QPixmap(*newFace); 
     62  resize(myFace->size()); 
     63  if (updateMask) 
     64    setMask(myFace->mask()); 
     65  update(); 
     66} 
     67 
     68QPixmap* DockIconWidget::face() 
     69{ 
     70  if (myFace == NULL) 
     71    return NULL; 
     72 
     73  return new QPixmap(*myFace); 
     74} 
     75 
     76void DockIconWidget::closeEvent(QCloseEvent* event) 
     77{ 
     78  event->ignore(); 
    5279} 
    5380 
    5481void DockIconWidget::mousePressEvent(QMouseEvent* event) 
    5582{ 
    56   dynamic_cast<DockIcon*>(parent())->mousePressEvent(event); 
     83  switch (event->button()) 
     84  { 
     85    case Qt::LeftButton: 
     86      emit clicked(); 
     87      break; 
     88 
     89    case Qt::MidButton: 
     90      emit middleClicked(); 
     91      break; 
     92  
     93    case Qt::RightButton: 
     94      myMenu->popup(event->globalPos()); 
     95      break; 
     96 
     97    default: 
     98      break; 
     99  } 
    57100} 
    58101 
    59 void DockIconWidget::drawIcon(QPainter& painter) 
     102void DockIconWidget::paintEvent(QPaintEvent* event) 
    60103{ 
    61   if (!vis) 
     104  if (myFace == NULL) 
    62105    return; 
    63   painter.drawPixmap(0, 0, *vis); 
     106 
     107  event->ignore(); 
     108  QPainter painter(this); 
     109  painter.drawPixmap(0, 0, *myFace); 
    64110} 
    65  
    66 void DockIconWidget::paintEvent(QPaintEvent* /* event */) 
    67 { 
    68   QPainter painter(this); 
    69   drawIcon(painter); 
    70   painter.end(); 
    71 } 
  • branches/qt-gui_qt4/src/dockicons/dockiconwidget.h

    r5837 r6058  
    2424#include <QWidget> 
    2525 
     26class QMenu; 
     27 
    2628