Annotation of freem/src/ssvn_display.c, revision 1.5
1.1 snw 1: /*
1.5 ! snw 2: * $Id: ssvn_display.c,v 1.4 2025/04/10 01:24:38 snw Exp $
1.3 snw 3: * ^$DISPLAY ssvn
1.1 snw 4: *
5: *
1.2 snw 6: * Author: Serena Willis <snw@coherent-logic.com>
1.1 snw 7: * Copyright (C) 1998 MUG Deutschland
1.3 snw 8: * Copyright (C) 2020, 2025 Coherent Logic Development LLC
1.1 snw 9: *
10: *
11: * This file is part of FreeM.
12: *
13: * FreeM is free software: you can redistribute it and/or modify
14: * it under the terms of the GNU Affero Public License as published by
15: * the Free Software Foundation, either version 3 of the License, or
16: * (at your option) any later version.
17: *
18: * FreeM is distributed in the hope that it will be useful,
19: * but WITHOUT ANY WARRANTY; without even the implied warranty of
20: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21: * GNU Affero Public License for more details.
22: *
23: * You should have received a copy of the GNU Affero Public License
24: * along with FreeM. If not, see <https://www.gnu.org/licenses/>.
25: *
1.4 snw 26: * $Log: ssvn_display.c,v $
1.5 ! snw 27: * Revision 1.4 2025/04/10 01:24:38 snw
! 28: * Remove C++ style comments
! 29: *
1.4 snw 30: * Revision 1.3 2025/03/09 19:50:47 snw
31: * Second phase of REUSE compliance and header reformat
32: *
1.3 snw 33: *
34: * SPDX-FileCopyrightText: (C) 2025 Coherent Logic Development LLC
35: * SPDX-License-Identifier: AGPL-3.0-or-later
1.1 snw 36: **/
37:
38: #include <stdio.h>
39: #include <stdlib.h>
40: #include <string.h>
41: #include <errno.h>
42: #include <ctype.h>
43: #include <unistd.h>
44:
45: #include "mpsdef.h"
46:
47: #if defined(HAVE_MWAPI_MOTIF)
48: #include <limits.h>
1.4 snw 49: /* #include <gtk/gtk.h> */
1.1 snw 50: #include <X11/Xlib.h>
1.4 snw 51: /* #include <glib.h> */
52: /* #include <pango/pangocairo.h> */
1.1 snw 53:
54: #include "mref.h"
55:
56: int ssvn_display_initialized = 0;
57: char clipboard_buffer[256];
58:
59: void ssvn_display_update(void)
60: {
61: int i;
62: int j;
63: int k;
64:
65: int count_screens;
66: char k_buf[512];
67: char d_buf[512];
68:
69: char display_name[50];
70:
71: Display *display;
72: Screen *screen;
73:
1.4 snw 74: /*
75: PangoFontFamily **families;
76: int n_families;
77: PangoFontMap *font_map;
78: */
1.1 snw 79:
80: char *result;
81: unsigned long ressize, restail;
82: int resbits;
83: Atom bufid;
84: Atom fmtid;
85: Atom propid;
86: Atom incrid;
87: XEvent event;
88: unsigned long color;
89: Window window;
90:
91: memset (clipboard_buffer, 0, sizeof (clipboard_buffer));
92:
93: display = XOpenDisplay (NULL);
94:
95: if (display == NULL) return;
96:
97: count_screens = ScreenCount (display);
98:
99: color = BlackPixel (display, DefaultScreen(display));
100: window = XCreateSimpleWindow (display, DefaultRootWindow(display), 0,0, 1,1, 0, color, color);
101: bufid = XInternAtom (display, "CLIPBOARD", False);
102: fmtid = XInternAtom (display, "STRING", False);
103: propid = XInternAtom (display, "XSEL_DATA", False);
104: incrid = XInternAtom (display, "INCR", False);
1.4 snw 105: /*font_map = pango_cairo_font_map_get_default ();
106: pango_font_map_list_families (font_map, &families, &n_families);*/
1.1 snw 107:
108: XConvertSelection (display, bufid, fmtid, propid, window, CurrentTime);
109:
110: do {
111: XNextEvent (display, &event);
112: } while (event.type != SelectionNotify || event.xselection.selection != bufid);
113:
114: if (event.xselection.property) {
115: XGetWindowProperty (display, window, propid, 0, LONG_MAX/4, False, AnyPropertyType,
116: &fmtid, &resbits, &ressize, &restail, (unsigned char**)&result);
117:
118: if (fmtid != incrid) {
1.5 ! snw 119: snprintf (clipboard_buffer, (ressize > (STRLEN - 1) ? (STRLEN - 1) : ressize), "%s", result);
1.1 snw 120: stcnv_c2m (clipboard_buffer);
121: clipboard_buffer[255] = '\201';
122: }
123: else {
124: clipboard_buffer[0] = '\201';
125: }
126:
127: XFree (result);
128: }
129:
130: for (int i = 0; i < count_screens; ++i) {
131: screen = ScreenOfDisplay (display, i);
132:
1.5 ! snw 133: snprintf (display_name, sizeof (display_name) - 1, "%d", i);
1.1 snw 134:
1.5 ! snw 135: snprintf (k_buf, sizeof (k_buf) - 1, "^$DISPLAY\202%s\202PLATFORM\201", display_name);
1.1 snw 136: symtab (set_sym, k_buf, "X/MOTIF,3\201");
137:
138: /*
139: snprintf (k_buf, 512 - 1, "^$DISPLAY\202%s\202CLIPBOARD\201", display_name);
140: symtab (set_sym, k_buf, clipboard_buffer);
141: */
1.5 ! snw 142: snprintf (k_buf, sizeof (k_buf) - 1, "^$DISPLAY\202%s\202SIZE\201", display_name);
! 143: snprintf (d_buf, sizeof (k_buf) - 1, "%d,%d\201", screen->width, screen->height);
1.1 snw 144: symtab (set_sym, k_buf, d_buf);
145:
1.5 ! snw 146: snprintf (k_buf, sizeof (k_buf) - 1, "^$DISPLAY\202%s\202SPECTRUM\201", display_name);
1.1 snw 147: snprintf (d_buf, 512 - 1, "%d\201", 16777216L);
148: symtab (set_sym, k_buf, d_buf);
149:
1.5 ! snw 150: snprintf (k_buf, sizeof (k_buf) - 1, "^$DISPLAY\202%s\202COLORTYPE\201", display_name);
1.1 snw 151: snprintf (d_buf, 512 - 1, "COLOR\201");
152: symtab (set_sym, k_buf, d_buf);
153:
1.5 ! snw 154: snprintf (k_buf, sizeof (k_buf) - 1, "^$DISPLAY\202%s\202UNITS\201", display_name);
1.1 snw 155: snprintf (d_buf, 512 - 1, "PIXEL\201");
156: symtab (set_sym, k_buf, d_buf);
157:
158: #if 0
159: if (!ssvn_display_initialized) {
160:
1.4 snw 161: /* printf ("mwapi-gtk: enumerating system fonts... "); */
1.1 snw 162: for (j = 0; j < n_families; j++) {
163: PangoFontFamily *family = families[j];
164: const char *family_name;
165:
166: family_name = pango_font_family_get_name (family);
167:
168:
1.5 ! snw 169: snprintf (k_buf, sizeof (k_buf) - 1, "^$DISPLAY\202%s\202TYPEFACE\202%s\202%d\201", display_name, family_name, 0);
! 170: snprintf (dbuf, sizeof (dbuf) - 1, "\201");
1.1 snw 171: symtab (set_sym, k_buf, d_buf);
172:
173: /*
174: for (k = 8; k <= 72; k += 2) {
1.5 ! snw 175: snprintf (k_buf, sizeof (k_buf) - 1, "^$DISPLAY\202%s\202TYPEFACE\202%s\202%d\201", display_name, family_name, k);
! 176: snprintf (dbuf, sizeof (dbuf) - 1, "\201");
1.1 snw 177: symtab (set_sym, k_buf, d_buf);
178: }
179: */
180:
181: }
1.4 snw 182: /* printf ("%d font families discovered\r\n", n_families); */
1.1 snw 183:
184: }
185: #endif
186:
187:
188: }
189:
1.4 snw 190: /* g_free (families); */
1.1 snw 191:
192: if (!ssvn_display_initialized) {
193: ssvn_display_initialized = 1;
194: }
195:
196: XCloseDisplay (display);
197:
198: return;
199: }
200:
201: void ssvn_display(short action, char *key, char *data)
202: {
203: int i;
204:
205: freem_ref_t *r = (freem_ref_t *) malloc (sizeof (freem_ref_t));
206: NULLPTRCHK(r,"ssvn_display");
207:
208: char *dbuf = (char *) malloc (255 * sizeof (char));
209: NULLPTRCHK(dbuf,"ssvn_display");
210:
211: mref_init (r, MREF_RT_SSV, "^$DISPLAY");
212: internal_to_mref (r, key);
213:
214: if (r->subscript_count < 2) {
215: merr_raise (INVREF);
216: goto done;
217: }
218:
219: for (i = 0; i < strlen (r->subscripts[1]); i++) r->subscripts[1][i] = toupper (r->subscripts[1][i]);
220:
221: switch (action) {
222:
223: case fra_query:
224: case bigquery:
225: case dat:
226: case fra_order:
227:
228: if (strcmp (mref_get_subscript (r, 1), "CLIPBOARD") == 0) {
229: merr_raise (INVREF);
230: goto done;
231: }
232:
233: symtab (action, key, data);
234: break;
235:
236: case get_sym:
237:
238: if (strcmp (mref_get_subscript (r, 1), "CLIPBOARD") == 0) {
239:
240: }
241:
242: ssvn_display_update ();
243: symtab (action, key, data);
244:
245: break;
246:
247:
248: default:
249: merr_raise (INVREF);
250: break;
251:
252: }
253:
254: done:
255:
256: free (r);
257: free (dbuf);
258:
259: return;
260:
261: }
262: #else
263: void ssvn_display_update(void)
264: {
265: return;
266: }
267:
268: void ssvn_display(short action, char *key, char *data)
269: {
270: merr_raise (M38);
271: *data = EOL;
272: return;
273: }
274: #endif
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>