]> git.neil.brown.name Git - edlib.git/blob - edlib.c
TODO: clean out done items.
[edlib.git] / edlib.c
1 /*
2  * Copyright Neil Brown ©2015-2023 <neil@brown.name>
3  * May be distributed under terms of GPLv2 - see file:COPYING
4  *
5  * main loop for edlib.
6  */
7
8 #include <unistd.h>
9 #include <stdlib.h>
10 #include <locale.h>
11 #include <fcntl.h>
12 #include <wchar.h>
13 #include <dirent.h>
14 #include <string.h>
15 #include <stdio.h>
16
17 #include "core.h"
18 #include "misc.h"
19
20 static const char shortopt[] = "gtx";
21
22 int main(int argc, char *argv[])
23 {
24         struct pane *ed;
25         struct pane *first_window = NULL;
26         struct pane *p, *doc = NULL;
27         bool gtk = False, term = False, x11 = False;
28         int opt;
29         char *base = NULL;
30
31         if (argv[0]) {
32                 base = strrchr(argv[0], '/');
33                 if (base)
34                         base += 1;
35                 else
36                         base = argv[0];
37         }
38         ed = editor_new(base);
39
40         if (!ed)
41                 exit(1);
42
43         while ((opt = getopt(argc, argv, shortopt)) != EOF) {
44                 switch (opt) {
45                 case 'g': gtk = True;
46                         break;
47                 case 't': term = True;
48                         break;
49                 case 'x': x11 = True;
50                         break;
51                 default:
52                         fprintf(stderr, "Usage: edlib [-g] [-t] [file ...]\n");
53                         exit(2);
54                 }
55         }
56         if (!gtk && !term && !x11)
57                 term = 1;
58
59         setlocale(LC_ALL, "");
60         setlocale(LC_CTYPE, "enUS.UTF-8");
61
62         call("global-load-module", ed, 0, NULL, "lib-config");
63         call("config-load", ed, 0, NULL, "{COMM}.ini");
64
65         call("attach-doc-docs", ed);
66
67         while (optind < argc) {
68                 char *file = argv[optind++];
69                 int fd = open(file, O_RDONLY);
70                 if (fd < 0) {
71                         /* '4' says 'allow create' */
72                         doc = call_ret(pane, "doc:open", ed, -1, NULL, file, 4);
73                 } else {
74                         doc = call_ret(pane, "doc:open", ed, fd, NULL, file);
75                         close(fd);
76                 }
77         }
78
79         if (!doc) {
80                 char *welcome_file = call_ret(str, "xdg-find-edlib-file", ed,
81                                               0, NULL, "Welcome-{COMM}.txt",
82                                               0, NULL, "data");
83                 char *WelcomeText = NULL;
84                 if (welcome_file) {
85                         int fd = open(welcome_file, O_RDONLY);
86                         if (fd >= 0) {
87                                 int len = lseek(fd, 0, SEEK_END);
88                                 lseek(fd, 0, SEEK_SET);
89                                 if (len > 0 && len < 10000) {
90                                         WelcomeText = malloc(len+1);
91                                         read(fd, WelcomeText, len);
92                                         WelcomeText[len] = 0;
93                                 }
94                                 close(fd);
95                         }
96                         free(welcome_file);
97                 }
98
99                 if (!WelcomeText)
100                         WelcomeText = strdup("Welcome.\n");
101
102                 doc = call_ret(pane, "doc:from-text", ed, 0, NULL,
103                                "*Welcome*", 0, NULL, WelcomeText);
104                 free(WelcomeText);
105         }
106         if (!doc) {
107                 fprintf(stderr, "edlib: cannot create default document.\n");
108                 exit(1);
109         }
110
111         if (term) {
112                 char *TERM = getenv("TERM");
113
114                 p = call_ret(pane, "attach-display-ncurses", ed,
115                              0, NULL, "-", 0, NULL, TERM);
116                 if (p) {
117                         char *e;
118                         e = getenv("SSH_CONNECTION");
119                         if (e && *e)
120                                 call("Window:set:REMOTE_SESSION", p,
121                                      0, NULL, "yes");
122
123                         call("Window:set:DISPLAY", p,
124                              0, NULL, getenv("DISPLAY"));
125                         call("Window:set:XAUTHORITY", p,
126                              0, NULL, getenv("XAUTHORITY"));
127                         if (!first_window)
128                                 first_window = p;
129                         call("Window:set:no-close", p, 1, NULL,
130                              "Cannot close primary display");
131                         home_call(p, "Window:activate-display", doc);
132                 }
133         }
134
135         if (gtk) {
136                 p = call_ret(pane, "attach-display-gtk",
137                              ed, 0, NULL, getenv("DISPLAY"));
138                 home_call(p, "Window:activate-display", doc);
139                 if (!first_window)
140                         first_window = p;
141         }
142
143         if (x11) {
144                 p = call_ret(pane, "attach-display-x11",
145                              ed, 0, NULL, getenv("DISPLAY"),
146                              0, NULL, getenv("XAUTHORITY"));
147                 home_call(p, "Window:activate-display", doc);
148                 if (!first_window)
149                         first_window = p;
150         }
151
152         if (first_window) {
153                 call("global-multicall-startup-", first_window);
154                 while (call("event:run", ed) == 1)
155                         ;
156         } else
157                 fprintf(stderr, "edlib: cannot create a display\n");
158         pane_close(ed);
159         exit(0);
160 }