summaryrefslogtreecommitdiff
path: root/net_wm_state_skip_taskbar.c
blob: 46a3056d44a246f83e745cf8f1e7e6429d43be18 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
// gcc -o net_wm_state_skip_taskbar net_wm_state_skip_taskbar.c -lX11 `pkg-config --cflags --libs gtk+-2.0`

#include <X11/X.h>
#include <X11/Xlib.h>
#include <X11/Xatom.h>
#include <assert.h>
#include <stdio.h>

//  gcc net_wm_state_skip_taskbar.c -lX11
//
// test case for _NET_WM_STATE_SKIP_TASKBAR
//
#if 0
int main()
{
  // Open the display
  Display *dpy = XOpenDisplay(NULL);
  assert(dpy);

  // Get some colors
  int blackColor = BlackPixel(dpy, DefaultScreen(dpy));
  int whiteColor = WhitePixel(dpy, DefaultScreen(dpy));

  // Create the window
  Window w = XCreateSimpleWindow(dpy, DefaultRootWindow(dpy), 0, 0, 200, 100, 0, blackColor, blackColor);

  // Set the properties
  Atom skip_taskbar = XInternAtom(dpy, "_NET_WM_STATE_SKIP_TASKBAR",False);
  Atom net_wm_state = XInternAtom(dpy, "_NET_WM_STATE",False);

  // Map the window
  XMapWindow(dpy, w);

  XFlush(dpy);

  XChangeProperty(dpy, w, net_wm_state, XA_ATOM, 32,
                  PropModeAppend, (unsigned char *)&skip_taskbar, 1);

  XFlush(dpy);

  // Wait for ever
  while (1)
    {
      sleep(1);
    }
}
#endif

// 
// gcc -Wall -o skip_taskbar net_wm_state_skip_taskbar.c `pkg-config --cflags --libs gtk+-2.0 glib-2.0`
//

#include <glib/gprintf.h>
#include <gtk/gtk.h>
#include <gdk/gdkx.h>

GtkWidget *main_window;

static void toggle_prop( GtkWidget *widget,
                         gpointer   data )
{
  static Bool toggle = TRUE;
  Display *dpy = GDK_DISPLAY();
  Window w = GDK_WINDOW_XWINDOW(main_window->window);

  Atom skip_taskbar = XInternAtom(dpy, "_NET_WM_STATE_SKIP_TASKBAR",False);
  Atom net_wm_state = XInternAtom(dpy, "_NET_WM_STATE",False);

  if (toggle)
    {
      XChangeProperty(dpy, w, net_wm_state, XA_ATOM, 32, PropModeReplace, (unsigned char *)&skip_taskbar, 1);
    }
  else
    {
      XDeleteProperty(dpy, w, net_wm_state);
    }

  toggle = !toggle;

  XFlush(dpy);
}

static void destroy( GtkWidget *widget,
                     gpointer   data )
{
  gtk_main_quit ();
}

int main( int   argc,
          char *argv[] )
{
    GtkWidget *button;
    gtk_init (&argc, &argv);

    main_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    gtk_window_set_decorated (GTK_WINDOW(main_window), TRUE);

    g_signal_connect (G_OBJECT (main_window), "destroy",
		      G_CALLBACK (destroy), NULL);
    gtk_container_set_border_width (GTK_CONTAINER (main_window), 10);

    button = gtk_button_new_with_label ("Toggle");
    g_signal_connect (G_OBJECT (button), "clicked",
		      G_CALLBACK (toggle_prop), NULL);

    gtk_container_add (GTK_CONTAINER (main_window), button);
    gtk_widget_show (button);
    gtk_widget_show (main_window);

    gtk_main ();
    return 0;
}