~ubuntu-branches/ubuntu/edgy/docker/edgy

« back to all changes in this revision

Viewing changes to kde.c

  • Committer: Bazaar Package Importer
  • Author(s): Ari Pollak
  • Date: 2002-11-14 19:10:14 UTC
  • Revision ID: james.westby@ubuntu.com-20021114191014-8g20u91q1xj0bi5r
Tags: upstream-1.4
ImportĀ upstreamĀ versionĀ 1.4

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#include "kde.h"
 
2
#include "docker.h"
 
3
#include "xproperty.h"
 
4
#include <assert.h>
 
5
#include <X11/Xatom.h>
 
6
 
 
7
Atom kde_systray_prop = None;
 
8
 
 
9
void kde_init()
 
10
{
 
11
  kde_systray_prop = XInternAtom(display,
 
12
                                 "_KDE_NET_SYSTEM_TRAY_WINDOWS", False);
 
13
  assert(kde_systray_prop);
 
14
 
 
15
  XSelectInput(display, root, PropertyChangeMask);
 
16
  kde_update_icons();
 
17
}
 
18
 
 
19
void kde_update_icons()
 
20
{
 
21
  gulong count = (unsigned) -1; /* grab as many as possible */
 
22
  Window *ids;
 
23
  int i;
 
24
  GSList *it, *next;
 
25
  gboolean removed = FALSE; /* were any removed? */
 
26
 
 
27
  if (! xprop_get32(root, kde_systray_prop, XA_WINDOW, sizeof(Window)*8,
 
28
                    &count, &ids))
 
29
    return;
 
30
 
 
31
  /* add new windows to our list */
 
32
  for (i = 0; i < count; ++i) {
 
33
    for (it = icons; it != NULL; it = g_slist_next(it)) {
 
34
      TrayWindow *traywin = it->data;
 
35
      if (traywin->id == ids[i])
 
36
        break;
 
37
    }
 
38
    if (!it)
 
39
      icon_add(ids[i], KDE);
 
40
  }
 
41
 
 
42
  /* remove windows from our list that no longer exist in the property */
 
43
  for (it = icons; it != NULL;) {
 
44
    TrayWindow *traywin = it->data;
 
45
    gboolean exists;
 
46
 
 
47
    if (traywin->type != KDE) {
 
48
      /* don't go removing non-kde windows */
 
49
      exists = TRUE;
 
50
    } else {
 
51
      exists = FALSE;
 
52
      for (i = 0; i < count; ++i) {
 
53
        if (traywin->id == ids[i]) {
 
54
          exists = TRUE;
 
55
          break;
 
56
        }
 
57
      }
 
58
    }
 
59
    
 
60
    next = g_slist_next(it);
 
61
    if (!exists) {
 
62
      icon_remove(it);
 
63
      removed =TRUE;
 
64
    }
 
65
    it = next;
 
66
  }
 
67
 
 
68
  if (removed) {
 
69
    /* at least one tray app was removed, so reorganize 'em all and resize*/
 
70
    reposition_icons();
 
71
    fix_geometry();
 
72
  }
 
73
 
 
74
  XFree(ids);
 
75
}