source: trunk/xdotool/xdotool.c @ 1079

Last change on this file since 1079 was 1079, checked in by dkg, 5 years ago

xdotool: committing local changes after upstream update to 20080601

File size: 12.7 KB
Line 
1/* xdotool
2 *
3 * command line interface to the xdo library
4 *
5 * $Id: xdotool.c 1880 2008-06-01 07:23:14Z jordansissel $
6 *
7 * getwindowfocus contributed by Lee Pumphret
8 * keyup/down contributed by Lee Pumphret
9 *
10 * XXX: Need to use 'Window' instead of 'int' where appropriate.
11 */
12
13#include <stdio.h>
14#include <stdlib.h>
15#include <getopt.h>
16#include <string.h>
17#include <strings.h>
18
19
20#include "xdo.h"
21
22void cmd_click(int argc, char **args);
23void cmd_getwindowfocus(int argc, char **args);
24void cmd_help(int argc, char **args);
25void cmd_key(int argc, char **args);
26void cmd_mousedown(int argc, char **args);
27void cmd_mousemove(int argc, char **args);
28void cmd_mousemove_relative(int argc, char **args);
29void cmd_mouseup(int argc, char **args);
30void cmd_search(int argc, char **args);
31void cmd_type(int argc, char **args);
32void cmd_windowactivate(int argc, char **args);
33void cmd_windowfocus(int argc, char **args);
34void cmd_windowmap(int argc, char **args);
35void cmd_windowmove(int argc, char **args);
36void cmd_windowraise(int argc, char **args);
37void cmd_windowsize(int argc, char **args);
38void cmd_windowunmap(int argc, char **args);
39
40/* pager-like commands */
41void cmd_set_num_desktops(int argc, char **args);
42void cmd_get_num_desktops(int argc, char **args);
43void cmd_set_desktop(int argc, char **args);
44void cmd_get_desktop(int argc, char **args);
45void cmd_set_desktop_for_window(int argc, char **args);
46void cmd_get_desktop_for_window(int argc, char **args);
47
48xdo_t *xdo;
49void window_print(Window wid);
50
51struct dispatch {
52  const char *name;
53  void (*func)(int argc, char **args);
54} dispatch[] = {
55  /* Query functions */
56  { "getwindowfocus", cmd_getwindowfocus, },
57  { "search", cmd_search, },
58
59  /* Help me! */
60  { "help", cmd_help, },
61  { "-h", cmd_help, },
62
63  /* Action functions */
64  { "click", cmd_click, },
65  { "key", cmd_key, },
66  { "keydown", cmd_key, },
67  { "keyup", cmd_key, },
68  { "mousedown", cmd_mousedown, },
69  { "mousemove", cmd_mousemove, },
70  { "mousemove_relative", cmd_mousemove_relative, },
71  { "mouseup", cmd_mouseup, },
72  { "type", cmd_type, },
73  { "windowactivate", cmd_windowactivate, },
74  { "windowfocus", cmd_windowfocus, },
75  { "windowmap", cmd_windowmap, },
76  { "windowmove", cmd_windowmove, },
77  { "windowraise", cmd_windowraise, },
78  { "windowsize", cmd_windowsize, },
79  { "windowunmap", cmd_windowunmap, },
80
81  { "set_num_desktops", cmd_set_num_desktops, },
82  { "get_num_desktops", cmd_get_num_desktops, },
83  { "set_desktop", cmd_set_desktop, },
84  { "get_desktop", cmd_get_desktop, },
85  { "set_desktop_for_window", cmd_set_desktop_for_window, },
86  { "get_desktop_for_window", cmd_get_desktop_for_window, },
87  { NULL, NULL, },
88};
89
90int main(int argc, char **argv) {
91  char *cmd;
92  int i;
93
94  if (argc < 2) {
95    fprintf(stderr, "usage: %s <cmd> <args>\n", argv[0]);
96    cmd_help(0, NULL);
97    exit(1);
98  }
99
100  cmd = *++argv; /* argv[1] */
101  argc -= 1; /* ignore arg0 (program name) */
102
103  xdo = xdo_new(getenv("DISPLAY"));
104  if (xdo == NULL) {
105    fprintf(stderr, "Failed creating new xdo instance\n");
106    return 1;
107  }
108
109  for (i = 0; dispatch[i].name != NULL; i++) {
110    if (!strcasecmp(dispatch[i].name, cmd)) {
111      dispatch[i].func(argc, argv);
112      break;
113    }
114  }
115
116  xdo_free(xdo);
117  return 0;
118}
119
120void window_print(Window wid) {
121  /* Window is XID is 'unsigned long' or CARD32 */
122  printf("%ld\n", wid);
123}
124
125void cmd_help(int argc, char **args) {
126  int i;
127
128  /* touch to clean up warnings (we want the parameters to stick
129     around because of the use of function pointers) */
130  argc = 0;
131  args = NULL;
132 
133  printf("Available commands:\n");
134  for (i = 0; dispatch[i].name != NULL; i++)
135    printf("  %s\n", dispatch[i].name);
136}
137
138void cmd_mousemove(int argc, char **args) {
139  int x, y;
140  char *cmd = *args; argc--; args++;
141
142  if (argc != 2) {
143    fprintf(stderr, "usage: %s <xcoord> <ycoord>\n", cmd);
144    fprintf(stderr, "You specified the wrong number of args.\n");
145    return;
146  }
147
148  x = atoi(args[0]);
149  y = atoi(args[1]);
150
151  if (!xdo_mousemove(xdo, x, y)) {
152    fprintf(stderr, "xdo_mousemove reported an error\n");
153  }
154}
155
156void cmd_mousemove_relative(int argc, char **args) {
157  int x, y;
158  char *cmd = *args; argc--; args++;
159
160  if (argc != 2) {
161    fprintf(stderr, "usage: %s <xcoord> <ycoord>\n", cmd);
162    fprintf(stderr, "You specified the wrong number of args.\n");
163    return;
164  }
165
166  x = atoi(args[0]);
167  y = atoi(args[1]);
168
169  if (!xdo_mousemove_relative(xdo, x, y)) {
170    fprintf(stderr, "xdo_mousemove_relative reported an error\n");
171  }
172}
173
174void cmd_mousedown(int argc, char **args) {
175  uint button;
176  char *cmd = *args; argc--; args++;
177
178  if (argc != 1) {
179    fprintf(stderr, "usage: %s <button>\n", cmd);
180    fprintf(stderr, "You specified the wrong number of args.\n");
181    return;
182  }
183
184  button = atoi(args[0]);
185
186  if (!xdo_mousedown(xdo, button)) {
187    fprintf(stderr, "xdo_mousedown reported an error\n");
188  }
189}
190
191void cmd_mouseup(int argc, char **args) {
192  uint button;
193  char *cmd = *args; argc--; args++;
194
195  if (argc != 1) {
196    fprintf(stderr, "usage: %s <button>\n", cmd);
197    fprintf(stderr, "You specified the wrong number of args.\n");
198    return;
199  }
200
201  button = atoi(args[0]);
202
203  if (!xdo_mouseup(xdo, button)) {
204    fprintf(stderr, "xdo_mouseup reported an error\n");
205  }
206}
207
208void cmd_click(int argc, char **args) {
209  cmd_mousedown(argc, args);
210  cmd_mouseup(argc, args);
211}
212
213void cmd_type(int argc, char **args) {
214  int i;
215  char *cmd = *args; argc--; args++;
216
217  if (argc == 0) {
218    fprintf(stderr, "usage: %s <things to type>\n", cmd);
219    fprintf(stderr, "You specified the wrong number of args.\n");
220    return;
221  }
222
223  for (i = 0; i < argc; i++) {
224    if (!xdo_type(xdo, args[i])) {
225      fprintf(stderr, "xdo_type reported an error\n");
226    }
227  }
228}
229
230void cmd_key(int argc, char **args) {
231  int i;
232  char *cmd = *args; argc--; args++;
233
234  if (argc == 0) {
235    fprintf(stderr, "usage: %s <keyseq1> [keyseq2 ... keyseqN]\n", cmd);
236    fprintf(stderr, "You specified the wrong number of args.\n");
237    return;
238  }
239
240  if (!strcmp(cmd, "key")) {
241    func = xdo_keysequence;
242  } else if (!strcmp(cmd, "keyup")) {
243    func = xdo_keysequence_up;
244  } else if (!strcmp(cmd, "keydown")) {
245    func = xdo_keysequence_down;
246  } else {
247    fprintf(stderr, "Unknown command '%s'\n", cmd);
248    return;
249  }
250
251  for (i = 0; i < argc; i++) {
252    if (!func(xdo, args[i]))
253      fprintf(stderr, "xdo_keysequence reported an error for string '%s'\n", args[i]);
254  }
255}
256
257void cmd_windowmove(int argc, char **args) {
258  int x, y;
259  Window wid;
260  char *cmd = *args; argc--; args++;
261
262  if (argc != 3) {
263    printf("usage: %s wid x y\n", cmd);
264    return;
265  }
266
267  wid = (Window)strtol(args[0], NULL, 0);
268  x = (int)strtol(args[1], NULL, 0);
269  y = (int)strtol(args[2], NULL, 0);
270
271  if (!xdo_window_move(xdo, wid, x, y)) {
272    fprintf(stderr, "xdo_window_mvoe reported an error\n");
273  }
274}
275
276void cmd_windowactivate(int argc, char **args) {
277  Window wid;
278  char *cmd = *args; argc--; args++;
279
280  if (argc != 1) {
281    printf("usage: %s wid\n", cmd);
282    return;
283  }
284
285  wid = (Window)strtol(args[0], NULL, 0);
286  if (!xdo_window_activate(xdo, wid)) {
287    fprintf(stderr, "xdo_window_activate reported an error\n");
288    return;
289  }
290
291}
292
293void cmd_windowfocus(int argc, char **args) {
294  Window wid;
295  char *cmd = *args; argc--; args++;
296
297  if (argc != 1) {
298    printf("usage: %s wid\n", cmd);
299    return;
300  }
301
302  wid = (Window)strtol(args[0], NULL, 0);
303  if (!xdo_window_focus(xdo, wid)) {
304    fprintf(stderr, "xdo_window_focus reported an error\n");
305  }
306}
307
308void cmd_windowraise(int argc, char **args) {
309  Window wid;
310  char *cmd = *args; argc--; args++;
311
312  if (argc != 1) {
313    printf("usage: %s wid\n", cmd);
314    return;
315  }
316
317  wid = (Window)strtol(args[0], NULL, 0);
318  if (!xdo_window_raise(xdo, wid)) {
319    fprintf(stderr, "xdo_window_raise reported an error\n");
320  }
321}
322
323void cmd_windowsize(int argc, char **args) {
324  int width, height;
325  Window wid;
326  int c;
327
328  int use_hints = 0;
329  struct option longopts[] = {
330    { "usehints", 0, &use_hints, 1 },
331    { 0, 0, 0, 0 },
332  };
333
334  int size_flags = 0;
335  char *cmd = *args;
336
337  while (1) {
338    int option_index;
339
340    c = getopt_long_only(argc, args, "", longopts, &option_index);
341
342    if (c == -1)
343      break;
344  }
345
346  if (use_hints)
347    size_flags |= SIZE_USEHINTS;
348
349  args += optind;
350  argc -= optind;
351
352  if (argc != 3) {
353    printf("usage: %s wid width height\n", cmd);
354    return;
355  }
356
357  wid = (Window)strtol(args[0], NULL, 0);
358  width = (int)strtol(args[1], NULL, 0);
359  height = (int)strtol(args[2], NULL, 0);
360
361  if (!xdo_window_setsize(xdo, wid, width, height, size_flags)) {
362    fprintf(stderr, "xdo_window_setsize reported an error\n");
363  }
364}
365
366void cmd_search(int argc, char **args) {
367  Window *list;
368  int nwindows;
369  int i;
370  int c;
371
372  int only_visible = 0;
373  int search_title = 0;
374  int search_name = 0;
375  int search_class = 0;
376  struct option longopts[] = {
377    { "onlyvisible", 0, &only_visible, 1 },
378    { "title", 0, &search_title, 1 },
379    { "name", 0, &search_name, 1 },
380    { "class", 0, &search_class, 1 },
381    { 0, 0, 0, 0 },
382  };
383
384  int search_flags = 0;
385
386  char *cmd = *args;
387
388  while (1) {
389    int option_index;
390
391    c = getopt_long_only(argc, args, "", longopts, &option_index);
392
393    if (c == -1)
394      break;
395  }
396
397  if (only_visible)
398    search_flags |= SEARCH_VISIBLEONLY;
399  if (search_title)
400    search_flags |= SEARCH_TITLE;
401  if (search_name)
402    search_flags |= SEARCH_NAME;
403  if (search_class)
404    search_flags |= SEARCH_CLASS;
405
406  args += optind;
407  argc -= optind;
408
409  if (argc != 1) {
410    printf(
411    "Usage: xdotool %s "
412    "[--onlyvisible] [--title --class --name] regexp_pattern\n"
413    " --onlyvisible   matches only windows currently visible\n"
414    " --title         check regexp_pattern agains the window title\n"
415    " --class         check regexp_pattern agains the window class\n"
416    " --name          check regexp_pattern agains the window name\n"
417    "\n"
418    "* If none of --title, --class, and --name are specified,\n"
419    "the defaults are to match any of them.\n", 
420    cmd);
421    return;
422  }
423
424  xdo_window_list_by_regex(xdo, *args, search_flags, &list, &nwindows);
425  for (i = 0; i < nwindows; i++)
426    window_print(list[i]);
427
428  /* Free list as it's malloc'd by xdo_window_list_by_regex */
429  free(list);
430}
431
432/* Added 2007-07-28 - Lee Pumphret */
433void cmd_getwindowfocus(int argc, char **args) {
434  Window wid = 0;
435  char *cmd = *args; argc--; args++;
436
437  if (argc != 0) {
438    printf("usage: %s\n", cmd);
439    return;
440  }
441
442  if (!xdo_window_get_focus(xdo, &wid)) {
443    fprintf(stderr, "xdo_window_focus reported an error\n");
444  } else {
445    window_print(wid);
446  }
447}
448
449void cmd_windowmap(int argc, char **args) {
450  Window wid;
451  char *cmd = *args; argc--; args++;
452
453  if (argc != 1) {
454    printf("usage: %s wid\n", cmd);
455    return;
456  }
457
458  wid = (Window)strtol(args[0], NULL, 0);
459  if (!xdo_window_map(xdo, wid)) {
460    fprintf(stderr, "xdo_window_map reported an error\n");
461  }
462}
463
464void cmd_windowunmap(int argc, char **args) {
465  Window wid;
466  char *cmd = *args; argc--; args++;
467
468  if (argc != 1) {
469    printf("usage: %s wid\n", cmd);
470    return;
471  }
472
473  wid = (Window)strtol(args[0], NULL, 0);
474  if (!xdo_window_unmap(xdo, wid)) {
475    fprintf(stderr, "xdo_window_unmap reported an error\n");
476  }
477}
478
479void cmd_set_num_desktops(int argc, char **args) {
480  char *cmd = *args; argc--; args++;
481  long ndesktops;
482
483  if (argc != 1) {
484    printf("usage: %s num_desktops\n", cmd);
485    return;
486  }
487
488  ndesktops = strtol(args[0], NULL, 0);
489
490  xdo_set_number_of_desktops(xdo, ndesktops);
491}
492
493void cmd_get_num_desktops(int argc, char **args) {
494  char *cmd = *args; argc--; args++;
495  long ndesktops = 0;
496
497  if (argc != 0) {
498    printf("usage: %s\n", cmd);
499    return;
500  }
501
502  xdo_get_number_of_desktops(xdo, &ndesktops);
503
504  printf("%ld\n", ndesktops);
505}
506
507void cmd_set_desktop(int argc, char **args) {
508  char *cmd = *args; argc--; args++;
509  long desktop;
510
511  if (argc != 1) {
512    printf("usage: %s desktop\n", cmd);
513    return;
514  }
515
516  desktop = strtol(args[0], NULL, 0);
517
518  xdo_set_current_desktop(xdo, desktop);
519}
520
521void cmd_get_desktop(int argc, char **args) {
522  char *cmd = *args; argc--; args++;
523  long desktop = 0;
524
525  if (argc != 0) {
526    printf("usage: %s\n", cmd);
527    return;
528  }
529
530  xdo_get_current_desktop(xdo, &desktop);
531
532  printf("%ld\n", desktop);
533}
534
535void cmd_set_desktop_for_window(int argc, char **args) {
536  char *cmd = *args; argc--; args++;
537  long desktop = 0;
538  Window window = 0;
539
540  if (argc != 2) {
541    printf("usage: %s <window> <desktop>\n", cmd);
542    return;
543  }
544
545  window = (Window)strtol(args[0], NULL, 0);
546  desktop = strtol(args[1], NULL, 0);
547
548  xdo_set_desktop_for_window(xdo, window, desktop);
549}
550
551void cmd_get_desktop_for_window(int argc, char **args) {
552  char *cmd = *args; argc--; args++;
553  long desktop = 0;
554  Window window = 0;
555
556  if (argc != 1) {
557    printf("usage: %s <window>\n", cmd);
558    return;
559  }
560
561  window = (Window)strtol(args[0], NULL, 0);
562
563  xdo_get_desktop_for_window(xdo, window, &desktop);
564  printf("%ld\n", desktop);
565}
Note: See TracBrowser for help on using the repository browser.