source: branches/upstream/xdotool/current/xdotool.c @ 1077

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

[svn-upgrade] Integrating new upstream version, xdotool (20080601)

File size: 12.5 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  printf("Available commands:\n");
128  for (i = 0; dispatch[i].name != NULL; i++)
129    printf("  %s\n", dispatch[i].name);
130}
131
132void cmd_mousemove(int argc, char **args) {
133  int x, y;
134  char *cmd = *args; argc--; args++;
135
136  if (argc != 2) {
137    fprintf(stderr, "usage: %s <xcoord> <ycoord>\n", cmd);
138    fprintf(stderr, "You specified the wrong number of args.\n");
139    return;
140  }
141
142  x = atoi(args[0]);
143  y = atoi(args[1]);
144
145  if (!xdo_mousemove(xdo, x, y)) {
146    fprintf(stderr, "xdo_mousemove reported an error\n");
147  }
148}
149
150void cmd_mousemove_relative(int argc, char **args) {
151  int x, y;
152  char *cmd = *args; argc--; args++;
153
154  if (argc != 2) {
155    fprintf(stderr, "usage: %s <xcoord> <ycoord>\n", cmd);
156    fprintf(stderr, "You specified the wrong number of args.\n");
157    return;
158  }
159
160  x = atoi(args[0]);
161  y = atoi(args[1]);
162
163  if (!xdo_mousemove_relative(xdo, x, y)) {
164    fprintf(stderr, "xdo_mousemove_relative reported an error\n");
165  }
166}
167
168void cmd_mousedown(int argc, char **args) {
169  int button;
170  char *cmd = *args; argc--; args++;
171
172  if (argc != 1) {
173    fprintf(stderr, "usage: %s <button>\n", cmd);
174    fprintf(stderr, "You specified the wrong number of args.\n");
175    return;
176  }
177
178  button = atoi(args[0]);
179
180  if (!xdo_mousedown(xdo, button)) {
181    fprintf(stderr, "xdo_mousedown reported an error\n");
182  }
183}
184
185void cmd_mouseup(int argc, char **args) {
186  int button;
187  char *cmd = *args; argc--; args++;
188
189  if (argc != 1) {
190    fprintf(stderr, "usage: %s <button>\n", cmd);
191    fprintf(stderr, "You specified the wrong number of args.\n");
192    return;
193  }
194
195  button = atoi(args[0]);
196
197  if (!xdo_mouseup(xdo, button)) {
198    fprintf(stderr, "xdo_mouseup reported an error\n");
199  }
200}
201
202void cmd_click(int argc, char **args) {
203  cmd_mousedown(argc, args);
204  cmd_mouseup(argc, args);
205}
206
207void cmd_type(int argc, char **args) {
208  int i;
209  char *cmd = *args; argc--; args++;
210
211  if (argc == 0) {
212    fprintf(stderr, "usage: %s <things to type>\n", cmd);
213    fprintf(stderr, "You specified the wrong number of args.\n");
214    return;
215  }
216
217  for (i = 0; i < argc; i++) {
218    if (!xdo_type(xdo, args[i])) {
219      fprintf(stderr, "xdo_type reported an error\n");
220    }
221  }
222}
223
224void cmd_key(int argc, char **args) {
225  int i;
226  char *cmd = *args; argc--; args++;
227
228  if (argc == 0) {
229    fprintf(stderr, "usage: %s <keyseq1> [keyseq2 ... keyseqN]\n", cmd);
230    fprintf(stderr, "You specified the wrong number of args.\n");
231    return;
232  }
233
234  int (*func)(xdo_t *, char *) = NULL;
235
236  if (!strcmp(cmd, "key")) {
237    func = xdo_keysequence;
238  } else if (!strcmp(cmd, "keyup")) {
239    func = xdo_keysequence_up;
240  } else if (!strcmp(cmd, "keydown")) {
241    func = xdo_keysequence_down;
242  } else {
243    fprintf(stderr, "Unknown command '%s'\n", cmd);
244    return;
245  }
246
247  for (i = 0; i < argc; i++) {
248    if (!func(xdo, args[i]))
249      fprintf(stderr, "xdo_keysequence reported an error for string '%s'\n", args[i]);
250  }
251}
252
253void cmd_windowmove(int argc, char **args) {
254  int x, y;
255  Window wid;
256  char *cmd = *args; argc--; args++;
257
258  if (argc != 3) {
259    printf("usage: %s wid x y\n", cmd);
260    return;
261  }
262
263  wid = (Window)strtol(args[0], NULL, 0);
264  x = (int)strtol(args[1], NULL, 0);
265  y = (int)strtol(args[2], NULL, 0);
266
267  if (!xdo_window_move(xdo, wid, x, y)) {
268    fprintf(stderr, "xdo_window_mvoe reported an error\n");
269  }
270}
271
272void cmd_windowactivate(int argc, char **args) {
273  Window wid;
274  char *cmd = *args; argc--; args++;
275
276  if (argc != 1) {
277    printf("usage: %s wid\n", cmd);
278    return;
279  }
280
281  wid = (Window)strtol(args[0], NULL, 0);
282  if (!xdo_window_activate(xdo, wid)) {
283    fprintf(stderr, "xdo_window_activate reported an error\n");
284    return;
285  }
286
287}
288
289void cmd_windowfocus(int argc, char **args) {
290  Window wid;
291  char *cmd = *args; argc--; args++;
292
293  if (argc != 1) {
294    printf("usage: %s wid\n", cmd);
295    return;
296  }
297
298  wid = (Window)strtol(args[0], NULL, 0);
299  if (!xdo_window_focus(xdo, wid)) {
300    fprintf(stderr, "xdo_window_focus reported an error\n");
301  }
302}
303
304void cmd_windowraise(int argc, char **args) {
305  Window wid;
306  char *cmd = *args; argc--; args++;
307
308  if (argc != 1) {
309    printf("usage: %s wid\n", cmd);
310    return;
311  }
312
313  wid = (Window)strtol(args[0], NULL, 0);
314  if (!xdo_window_raise(xdo, wid)) {
315    fprintf(stderr, "xdo_window_raise reported an error\n");
316  }
317}
318
319void cmd_windowsize(int argc, char **args) {
320  int width, height;
321  Window wid;
322  int c;
323
324  int use_hints = 0;
325  struct option longopts[] = {
326    { "usehints", 0, &use_hints, 1 },
327    { 0, 0, 0, 0 },
328  };
329
330  int size_flags = 0;
331  char *cmd = *args;
332
333  while (1) {
334    int option_index;
335
336    c = getopt_long_only(argc, args, "", longopts, &option_index);
337
338    if (c == -1)
339      break;
340  }
341
342  if (use_hints)
343    size_flags |= SIZE_USEHINTS;
344
345  args += optind;
346  argc -= optind;
347
348  if (argc != 3) {
349    printf("usage: %s wid width height\n", cmd);
350    return;
351  }
352
353  wid = (Window)strtol(args[0], NULL, 0);
354  width = (int)strtol(args[1], NULL, 0);
355  height = (int)strtol(args[2], NULL, 0);
356
357  if (!xdo_window_setsize(xdo, wid, width, height, size_flags)) {
358    fprintf(stderr, "xdo_window_setsize reported an error\n");
359  }
360}
361
362void cmd_search(int argc, char **args) {
363  Window *list;
364  int nwindows;
365  int i;
366  int c;
367
368  int only_visible = 0;
369  int search_title = 0;
370  int search_name = 0;
371  int search_class = 0;
372  struct option longopts[] = {
373    { "onlyvisible", 0, &only_visible, 1 },
374    { "title", 0, &search_title, 1 },
375    { "name", 0, &search_name, 1 },
376    { "class", 0, &search_class, 1 },
377    { 0, 0, 0, 0 },
378  };
379
380  int search_flags = 0;
381
382  char *cmd = *args;
383
384  while (1) {
385    int option_index;
386
387    c = getopt_long_only(argc, args, "", longopts, &option_index);
388
389    if (c == -1)
390      break;
391  }
392
393  if (only_visible)
394    search_flags |= SEARCH_VISIBLEONLY;
395  if (search_title)
396    search_flags |= SEARCH_TITLE;
397  if (search_name)
398    search_flags |= SEARCH_NAME;
399  if (search_class)
400    search_flags |= SEARCH_CLASS;
401
402  args += optind;
403  argc -= optind;
404
405  if (argc != 1) {
406    printf(
407    "Usage: xdotool %s "
408    "[--onlyvisible] [--title --class --name] regexp_pattern\n"
409    " --onlyvisible   matches only windows currently visible\n"
410    " --title         check regexp_pattern agains the window title\n"
411    " --class         check regexp_pattern agains the window class\n"
412    " --name          check regexp_pattern agains the window name\n"
413    "\n"
414    "* If none of --title, --class, and --name are specified,\n"
415    "the defaults are to match any of them.\n", 
416    cmd);
417    return;
418  }
419
420  xdo_window_list_by_regex(xdo, *args, search_flags, &list, &nwindows);
421  for (i = 0; i < nwindows; i++)
422    window_print(list[i]);
423
424  /* Free list as it's malloc'd by xdo_window_list_by_regex */
425  free(list);
426}
427
428/* Added 2007-07-28 - Lee Pumphret */
429void cmd_getwindowfocus(int argc, char **args) {
430  Window wid = 0;
431  char *cmd = *args; argc--; args++;
432
433  if (argc != 0) {
434    printf("usage: %s\n", cmd);
435    return;
436  }
437
438  if (!xdo_window_get_focus(xdo, &wid)) {
439    fprintf(stderr, "xdo_window_focus reported an error\n");
440  } else {
441    window_print(wid);
442  }
443}
444
445void cmd_windowmap(int argc, char **args) {
446  Window wid;
447  char *cmd = *args; argc--; args++;
448
449  if (argc != 1) {
450    printf("usage: %s wid\n", cmd);
451    return;
452  }
453
454  wid = (Window)strtol(args[0], NULL, 0);
455  if (!xdo_window_map(xdo, wid)) {
456    fprintf(stderr, "xdo_window_map reported an error\n");
457  }
458}
459
460void cmd_windowunmap(int argc, char **args) {
461  Window wid;
462  char *cmd = *args; argc--; args++;
463
464  if (argc != 1) {
465    printf("usage: %s wid\n", cmd);
466    return;
467  }
468
469  wid = (Window)strtol(args[0], NULL, 0);
470  if (!xdo_window_unmap(xdo, wid)) {
471    fprintf(stderr, "xdo_window_unmap reported an error\n");
472  }
473}
474
475void cmd_set_num_desktops(int argc, char **args) {
476  char *cmd = *args; argc--; args++;
477  long ndesktops;
478
479  if (argc != 1) {
480    printf("usage: %s num_desktops\n", cmd);
481    return;
482  }
483
484  ndesktops = strtol(args[0], NULL, 0);
485
486  xdo_set_number_of_desktops(xdo, ndesktops);
487}
488
489void cmd_get_num_desktops(int argc, char **args) {
490  char *cmd = *args; argc--; args++;
491  long ndesktops = 0;
492
493  if (argc != 0) {
494    printf("usage: %s\n", cmd);
495    return;
496  }
497
498  xdo_get_number_of_desktops(xdo, &ndesktops);
499
500  printf("%ld\n", ndesktops);
501}
502
503void cmd_set_desktop(int argc, char **args) {
504  char *cmd = *args; argc--; args++;
505  long desktop;
506
507  if (argc != 1) {
508    printf("usage: %s desktop\n", cmd);
509    return;
510  }
511
512  desktop = strtol(args[0], NULL, 0);
513
514  xdo_set_current_desktop(xdo, desktop);
515}
516
517void cmd_get_desktop(int argc, char **args) {
518  char *cmd = *args; argc--; args++;
519  long desktop = 0;
520
521  if (argc != 0) {
522    printf("usage: %s\n", cmd);
523    return;
524  }
525
526  xdo_get_current_desktop(xdo, &desktop);
527
528  printf("%ld\n", desktop);
529}
530
531void cmd_set_desktop_for_window(int argc, char **args) {
532  char *cmd = *args; argc--; args++;
533  long desktop = 0;
534  Window window = 0;
535
536  if (argc != 2) {
537    printf("usage: %s <window> <desktop>\n", cmd);
538    return;
539  }
540
541  window = (Window)strtol(args[0], NULL, 0);
542  desktop = strtol(args[1], NULL, 0);
543
544  xdo_set_desktop_for_window(xdo, window, desktop);
545}
546
547void cmd_get_desktop_for_window(int argc, char **args) {
548  char *cmd = *args; argc--; args++;
549  long desktop = 0;
550  Window window = 0;
551
552  if (argc != 1) {
553    printf("usage: %s <window>\n", cmd);
554    return;
555  }
556
557  window = (Window)strtol(args[0], NULL, 0);
558
559  xdo_get_desktop_for_window(xdo, window, &desktop);
560  printf("%ld\n", desktop);
561}
Note: See TracBrowser for help on using the repository browser.