Annotation of freem/src/ssvn_display.c, revision 1.1
1.1 ! snw 1: /*
! 2: * *
! 3: * * *
! 4: * * *
! 5: * ***************
! 6: * * * * *
! 7: * * MUMPS *
! 8: * * * * *
! 9: * ***************
! 10: * * *
! 11: * * *
! 12: * *
! 13: *
! 14: * ssvn_display.c
! 15: * ^$DISPLAY ssv
! 16: *
! 17: *
! 18: * Author: Serena Willis <jpw@coherent-logic.com>
! 19: * Copyright (C) 1998 MUG Deutschland
! 20: * Copyright (C) 2020 Coherent Logic Development LLC
! 21: *
! 22: *
! 23: * This file is part of FreeM.
! 24: *
! 25: * FreeM is free software: you can redistribute it and/or modify
! 26: * it under the terms of the GNU Affero Public License as published by
! 27: * the Free Software Foundation, either version 3 of the License, or
! 28: * (at your option) any later version.
! 29: *
! 30: * FreeM is distributed in the hope that it will be useful,
! 31: * but WITHOUT ANY WARRANTY; without even the implied warranty of
! 32: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
! 33: * GNU Affero Public License for more details.
! 34: *
! 35: * You should have received a copy of the GNU Affero Public License
! 36: * along with FreeM. If not, see <https://www.gnu.org/licenses/>.
! 37: *
! 38: **/
! 39:
! 40: #include <stdio.h>
! 41: #include <stdlib.h>
! 42: #include <string.h>
! 43: #include <errno.h>
! 44: #include <ctype.h>
! 45: #include <unistd.h>
! 46:
! 47: #include "mpsdef.h"
! 48:
! 49: #if defined(HAVE_MWAPI_MOTIF)
! 50: #include <limits.h>
! 51: //#include <gtk/gtk.h>
! 52: #include <X11/Xlib.h>
! 53: //#include <glib.h>
! 54: //#include <pango/pangocairo.h>
! 55:
! 56: #include "mref.h"
! 57:
! 58: int ssvn_display_initialized = 0;
! 59: char clipboard_buffer[256];
! 60:
! 61: void ssvn_display_update(void)
! 62: {
! 63: int i;
! 64: int j;
! 65: int k;
! 66:
! 67: int count_screens;
! 68: char k_buf[512];
! 69: char d_buf[512];
! 70:
! 71: char display_name[50];
! 72:
! 73: Display *display;
! 74: Screen *screen;
! 75:
! 76: // PangoFontFamily **families;
! 77: // int n_families;
! 78: // PangoFontMap *font_map;
! 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);
! 105: // font_map = pango_cairo_font_map_get_default ();
! 106: // pango_font_map_list_families (font_map, &families, &n_families);
! 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) {
! 119: snprintf (clipboard_buffer, (ressize > 254 ? 254 : ressize), "%s", result);
! 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:
! 133: snprintf (display_name, 49, "%d", i);
! 134:
! 135: snprintf (k_buf, 512 - 1, "^$DISPLAY\202%s\202PLATFORM\201", display_name);
! 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: */
! 142: snprintf (k_buf, 512 - 1, "^$DISPLAY\202%s\202SIZE\201", display_name);
! 143: snprintf (d_buf, 512 - 1, "%d,%d\201", screen->width, screen->height);
! 144: symtab (set_sym, k_buf, d_buf);
! 145:
! 146: snprintf (k_buf, 512 - 1, "^$DISPLAY\202%s\202SPECTRUM\201", display_name);
! 147: snprintf (d_buf, 512 - 1, "%d\201", 16777216L);
! 148: symtab (set_sym, k_buf, d_buf);
! 149:
! 150: snprintf (k_buf, 512 - 1, "^$DISPLAY\202%s\202COLORTYPE\201", display_name);
! 151: snprintf (d_buf, 512 - 1, "COLOR\201");
! 152: symtab (set_sym, k_buf, d_buf);
! 153:
! 154: snprintf (k_buf, 512 - 1, "^$DISPLAY\202%s\202UNITS\201", display_name);
! 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:
! 161: // printf ("mwapi-gtk: enumerating system fonts... ");
! 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:
! 169: snprintf (k_buf, 512 - 1, "^$DISPLAY\202%s\202TYPEFACE\202%s\202%d\201", display_name, family_name, 0);
! 170: snprintf (d_buf, 512 - 1, "\201");
! 171: symtab (set_sym, k_buf, d_buf);
! 172:
! 173: /*
! 174: for (k = 8; k <= 72; k += 2) {
! 175: snprintf (k_buf, 512 - 1, "^$DISPLAY\202%s\202TYPEFACE\202%s\202%d\201", display_name, family_name, k);
! 176: snprintf (d_buf, 512 - 1, "\201");
! 177: symtab (set_sym, k_buf, d_buf);
! 178: }
! 179: */
! 180:
! 181: }
! 182: // printf ("%d font families discovered\r\n", n_families);
! 183:
! 184: }
! 185: #endif
! 186:
! 187:
! 188: }
! 189:
! 190: // g_free (families);
! 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>