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