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>