source: trunk/xdotool/xdotool.c @ 1082

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

xdotool: return an error if the command specified did not exist.

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  int triggered = 0;
94
95  if (argc < 2) {
96    fprintf(stderr, "usage: %s <cmd> <args>\n", argv[0]);
97    cmd_help(0, NULL);
98    exit(1);
99  }
100
101  cmd = *++argv; /* argv[1] */
102  argc -= 1; /* ignore arg0 (program name) */
103
104  xdo = xdo_new(getenv("DISPLAY"));
105  if (xdo == NULL) {
106    fprintf(stderr, "Failed creating new xdo instance\n");
107    return 1;
108  }
109
110  for (i = 0; dispatch[i].name != NULL; i++) {
111    if (!strcasecmp(dispatch[i].name, cmd)) {
112      dispatch[i].func(argc, argv);
113      triggered = 1;
114      break;
115    }
116  }
117
118  xdo_free(xdo);
119  if (!triggered) {
120    fprintf(stderr, "No such command '%s'\n", cmd);
121    return 1;
122  }
123  return 0;
124}
125
126void window_print(Window wid) {
127  /* Window is XID is 'unsigned long' or CARD32 */
128  printf("%ld\n", wid);
129}
130
131void cmd_help(int argc, char **args) {
132  int i;
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  int 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  int 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  int (*func)(xdo_t *, char *) = NULL;
241
242  if (!strcmp(cmd, "key")) {
243    func = xdo_keysequence;
244  } else if (!strcmp(cmd, "keyup")) {
245    func = xdo_keysequence_up;
246  } else if (!strcmp(cmd, "keydown")) {
247    func = xdo_keysequence_down;
248  } else {
249    fprintf(stderr, "Unknown command '%s'\n", cmd);
250    return;
251  }
252
253  for (i = 0; i < argc; i++) {
254    if (!func(xdo, args[i]))
255      fprintf(stderr, "xdo_keysequence reported an error for string '%s'\n", args[i]);
256  }
257}
258
259void cmd_windowmove(int argc, char **args) {
260  int x, y;
261  Window wid;
262  char *cmd = *args; argc--; args++;
263
264  if (argc != 3) {
265    printf("usage: %s wid x y\n", cmd);
266    return;
267  }
268
269  wid = (Window)strtol(args[0], NULL, 0);
270  x = (int)strtol(args[1], NULL, 0);
271  y = (int)strtol(args[2], NULL, 0);
272
273  if (!xdo_window_move(xdo, wid, x, y)) {
274    fprintf(stderr, "xdo_window_mvoe reported an error\n");
275  }
276}
277
278void cmd_windowactivate(int argc, char **args) {
279  Window wid;
280  char *cmd = *args; argc--; args++;
281
282  if (argc != 1) {
283    printf("usage: %s wid\n", cmd);
284    return;
285  }
286
287  wid = (Window)strtol(args[0], NULL, 0);
288  if (!xdo_window_activate(xdo, wid)) {
289    fprintf(stderr, "xdo_window_activate reported an error\n");
290    return;
291  }
292
293}
294
295void cmd_windowfocus(int argc, char **args) {
296  Window wid;
297  char *cmd = *args; argc--; args++;
298
299  if (argc != 1) {
300    printf("usage: %s wid\n", cmd);
301    return;
302  }
303
304  wid = (Window)strtol(args[0], NULL, 0);
305  if (!xdo_window_focus(xdo, wid)) {
306    fprintf(stderr, "xdo_window_focus reported an error\n");
307  }
308}
309
310void cmd_windowraise(int argc, char **args) {
311  Window wid;
312  char *cmd = *args; argc--; args++;
313
314  if (argc != 1) {
315    printf("usage: %s wid\n", cmd);
316    return;
317  }
318
319  wid = (Window)strtol(args[0], NULL, 0);
320  if (!xdo_window_raise(xdo, wid)) {
321    fprintf(stderr, "xdo_window_raise reported an error\n");
322  }
323}
324
325void cmd_windowsize(int argc, char **args) {
326  int width, height;
327  Window wid;
328  int c;
329
330  int use_hints = 0;
331  struct option longopts[] = {
332    { "usehints", 0, &use_hints, 1 },
333    { 0, 0, 0, 0 },
334  };
335
336  int size_flags = 0;
337  char *cmd = *args;
338
339  while (1) {
340    int option_index;
341
342    c = getopt_long_only(argc, args, "", longopts, &option_index);
343
344    if (c == -1)
345      break;
346  }
347
348  if (use_hints)
349    size_flags |= SIZE_USEHINTS;
350
351  args += optind;
352  argc -= optind;
353
354  if (argc != 3) {
355    printf("usage: %s wid width height\n", cmd);
356    return;
357  }
358
359  wid = (Window)strtol(args[0], NULL, 0);
360  width = (int)strtol(args[1], NULL, 0);
361  height = (int)strtol(args[2], NULL, 0);
362
363  if (!xdo_window_setsize(xdo, wid, width, height, size_flags)) {
364    fprintf(stderr, "xdo_window_setsize reported an error\n");
365  }
366}
367
368void cmd_search(int argc, char **args) {
369  Window *list;
370  int nwindows;
371  int i;
372  int c;
373
374  int only_visible = 0;
375  int search_title = 0;
376  int search_name = 0;
377  int search_class = 0;
378  struct option longopts[] = {
379    { "onlyvisible", 0, &only_visible, 1 },
380    { "title", 0, &search_title, 1 },
381    { "name", 0, &search_name, 1 },
382    { "class", 0, &search_class, 1 },
383    { 0, 0, 0, 0 },
384  };
385
386  int search_flags = 0;
387
388  char *cmd = *args;
389
390  while (1) {
391    int option_index;
392
393    c = getopt_long_only(argc, args, "", longopts, &option_index);
394
395    if (c == -1)
396      break;
397  }
398
399  if (only_visible)
400    search_flags |= SEARCH_VISIBLEONLY;
401  if (search_title)
402    search_flags |= SEARCH_TITLE;
403  if (search_name)
404    search_flags |= SEARCH_NAME;
405  if (search_class)
406    search_flags |= SEARCH_CLASS;
407
408  args += optind;
409  argc -= optind;
410
411  if (argc != 1) {
412    printf(
413    "Usage: xdotool %s "
414    "[--onlyvisible] [--title --class --name] regexp_pattern\n"
415    " --onlyvisible   matches only windows currently visible\n"
416    " --title         check regexp_pattern agains the window title\n"
417    " --class         check regexp_pattern agains the window class\n"
418    " --name          check regexp_pattern agains the window name\n"
419    "\n"
420    "* If none of --title, --class, and --name are specified,\n"
421    "the defaults are to match any of them.\n", 
422    cmd);
423    return;
424  }
425
426  xdo_window_list_by_regex(xdo, *args, search_flags, &list, &nwindows);
427  for (i = 0; i < nwindows; i++)
428    window_print(list[i]);
429
430  /* Free list as it's malloc'd by xdo_window_list_by_regex */
431  free(list);
432}
433
434/* Added 2007-07-28 - Lee Pumphret */
435void cmd_getwindowfocus(int argc, char **args) {
436  Window wid = 0;
437  char *cmd = *args; argc--; args++;
438
439  if (argc != 0) {
440    printf("usage: %s\n", cmd);
441    return;
442  }
443
444  if (!xdo_window_get_focus(xdo, &wid)) {
445    fprintf(stderr, "xdo_window_focus reported an error\n");
446  } else {
447    window_print(wid);
448  }
449}
450
451void cmd_windowmap(int argc, char **args) {
452  Window wid;
453  char *cmd = *args; argc--; args++;
454
455  if (argc != 1) {
456    printf("usage: %s wid\n", cmd);
457    return;
458  }
459
460  wid = (Window)strtol(args[0], NULL, 0);
461  if (!xdo_window_map(xdo, wid)) {
462    fprintf(stderr, "xdo_window_map reported an error\n");
463  }
464}
465
466void cmd_windowunmap(int argc, char **args) {
467  Window wid;
468  char *cmd = *args; argc--; args++;
469
470  if (argc != 1) {
471    printf("usage: %s wid\n", cmd);
472    return;
473  }
474
475  wid = (Window)strtol(args[0], NULL, 0);
476  if (!xdo_window_unmap(xdo, wid)) {
477    fprintf(stderr, "xdo_window_unmap reported an error\n");
478  }
479}
480
481void cmd_set_num_desktops(int argc, char **args) {
482  char *cmd = *args; argc--; args++;
483  long ndesktops;
484
485  if (argc != 1) {
486    printf("usage: %s num_desktops\n", cmd);
487    return;
488  }
489
490  ndesktops = strtol(args[0], NULL, 0);
491
492  xdo_set_number_of_desktops(xdo, ndesktops);
493}
494
495void cmd_get_num_desktops(int argc, char **args) {
496  char *cmd = *args; argc--; args++;
497  long ndesktops = 0;
498
499  if (argc != 0) {
500    printf("usage: %s\n", cmd);
501    return;
502  }
503
504  xdo_get_number_of_desktops(xdo, &ndesktops);
505
506  printf("%ld\n", ndesktops);
507}
508
509void cmd_set_desktop(int argc, char **args) {
510  char *cmd = *args; argc--; args++;
511  long desktop;
512
513  if (argc != 1) {
514    printf("usage: %s desktop\n", cmd);
515    return;
516  }
517
518  desktop = strtol(args[0], NULL, 0);
519
520  xdo_set_current_desktop(xdo, desktop);
521}
522
523void cmd_get_desktop(int argc, char **args) {
524  char *cmd = *args; argc--; args++;
525  long desktop = 0;
526
527  if (argc != 0) {
528    printf("usage: %s\n", cmd);
529    return;
530  }
531
532  xdo_get_current_desktop(xdo, &desktop);
533
534  printf("%ld\n", desktop);
535}
536
537void cmd_set_desktop_for_window(int argc, char **args) {
538  char *cmd = *args; argc--; args++;
539  long desktop = 0;
540  Window window = 0;
541
542  if (argc != 2) {
543    printf("usage: %s <window> <desktop>\n", cmd);
544    return;
545  }
546
547  window = (Window)strtol(args[0], NULL, 0);
548  desktop = strtol(args[1], NULL, 0);
549
550  xdo_set_desktop_for_window(xdo, window, desktop);
551}
552
553void cmd_get_desktop_for_window(int argc, char **args) {
554  char *cmd = *args; argc--; args++;
555  long desktop = 0;
556  Window window = 0;
557
558  if (argc != 1) {
559    printf("usage: %s <window>\n", cmd);
560    return;
561  }
562
563  window = (Window)strtol(args[0], NULL, 0);
564
565  xdo_get_desktop_for_window(xdo, window, &desktop);
566  printf("%ld\n", desktop);
567}
Note: See TracBrowser for help on using the repository browser.