summaryrefslogtreecommitdiffstats
path: root/xsettings/client-simple.c
blob: 85dff051b08307ca14716bc787596dd5b4de060e (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
113
114
115
116
117
118
119
120
121
122
123
#include <stdio.h>
#include <stdlib.h>

#include <X11/Xlib.h>

#include "xsettings-client.h"

static void 
usage (void)
{
  fprintf (stderr, "Usage: xsettings-client [-display DISPLAY]\n");
  exit (1);
}

static void
dump_setting (XSettingsSetting *setting)
{
  switch (setting->type)
    {
    case XSETTINGS_TYPE_INT:
      printf ("    INT: %d\n", setting->data.v_int);
      break;
    case XSETTINGS_TYPE_STRING:
      printf ("    STRING: %s\n", setting->data.v_string);
      break;
    case XSETTINGS_TYPE_COLOR:
      printf ("    COLOR: (%#4x, %#4x, %#4x, %#4x)\n",
	      setting->data.v_color.red,
	      setting->data.v_color.green,
  	      setting->data.v_color.blue,
	      setting->data.v_color.alpha);
      break;
    }
}

static void
notify_cb (const char       *name,
	   XSettingsAction   action,
	   XSettingsSetting *setting,
	   void             *data)
{
  switch (action)
    {
    case XSETTINGS_ACTION_NEW:
      printf ("%s: new\n", name);
      dump_setting (setting);
      break;
    case XSETTINGS_ACTION_CHANGED:
      printf ("%s: new\n", name);
      dump_setting (setting);
      break;
    case XSETTINGS_ACTION_DELETED:
      printf ("%s: deleted\n", name);
      break;
    }
}

static void 
watch_cb (Window window,
	  Bool   is_start,
	  long   mask,
	  void  *cb_data)
{
  if (is_start)
    printf ("Starting watch on %#lx with mask %#lx\n", window, mask);
  else
    printf ("Stopping watch on %#lx \n", window);
}

int 
main (int argc, char **argv)
{
  Display *display;
  const char *display_str = NULL;
  XSettingsClient *client;
  int i;

  for (i = 1; i < argc; i++)
    {
      if (strcmp (argv[i], "-display") == 0)
	{
	  if (i + 1 == argc)
	    usage();
	  else
	    {
	      display_str = argv[i + 1];
	      i++;
	    }
	}
      else
	usage ();
    }

  display = XOpenDisplay (display_str);
  if (!display)
    {
      fprintf (stderr, "Cannot open display '%s'\n",
	       XDisplayName (display_str));
      exit (1);
    }

  client = xsettings_client_new (display, DefaultScreen (display),
				 notify_cb, watch_cb, NULL);
  if (!client)
    {
      fprintf (stderr, "Cannot create client\n");
      exit (1);
    }

  while (1)
    {
      XEvent xev;

      XNextEvent (display, &xev);

      xsettings_client_process_event (client, &xev);
    }

  xsettings_client_destroy (client);
  XCloseDisplay (display);
  
  return 0;
}