diff -Nru xterm-223.orig/charproc.c xterm-223/charproc.c --- xterm-223.orig/charproc.c 2006-11-28 20:45:37.000000000 +0000 +++ xterm-223/charproc.c 2006-12-15 22:37:45.000000000 +0000 @@ -215,6 +215,7 @@ static char defaultTranslations[] = "\ + Alt Return: fullscreen()\n\ Shift Prior:scroll-back(1,halfpage) \n\ Shift Next:scroll-forw(1,halfpage) \n\ Shift Select:select-cursor-start() select-cursor-end(SELECT, CUT_BUFFER0) \n\ @@ -263,7 +264,9 @@ :ignore() \ "; /* PROCURA added "Meta :clear-saved-lines()" */ /* *INDENT-OFF* */ + static XtActionsRec actionsList[] = { + { "fullscreen", HandleFullscreen }, { "allow-send-events", HandleAllowSends }, { "bell", HandleBell }, { "clear-saved-lines", HandleClearSavedLines }, diff -Nru xterm-223.orig/menu.c xterm-223/menu.c --- xterm-223.orig/menu.c 2006-11-23 01:18:29.000000000 +0000 +++ xterm-223/menu.c 2006-12-15 22:38:48.000000000 +0000 @@ -148,6 +148,7 @@ static void do_visualbell PROTO_XT_CALLBACK_ARGS; static void do_poponbell PROTO_XT_CALLBACK_ARGS; static void do_vtfont PROTO_XT_CALLBACK_ARGS; +static void do_fullscreen PROTO_XT_CALLBACK_ARGS; #ifdef ALLOWLOGGING static void do_logging PROTO_XT_CALLBACK_ARGS; @@ -235,6 +236,7 @@ #if OPT_TOOLBAR { "toolbar", do_toolbar, NULL }, #endif + { "fullscreen", do_fullscreen, NULL }, { "securekbd", do_securekbd, NULL }, { "allowsends", do_allowsends, NULL }, { "redraw", do_redraw, NULL }, @@ -760,6 +762,215 @@ * action routines */ +/********************************************************************/ +/* BEGIN: Simmons Fullscreen Hack */ +/********************************************************************/ + +#include + +static void +set_resize_increments() +{ + int min_width = (2 * term->screen.border) + term->screen.fullVwin.sb_info.width; + int min_height = (2 * term->screen.border); + + XSizeHints sizehints; + memset(&sizehints, 0, sizeof(XSizeHints)); + sizehints.width_inc = FontWidth(&term->screen); + sizehints.height_inc = FontHeight(&term->screen); + sizehints.flags = PResizeInc; + XSetWMNormalHints(term->screen.display, XtWindow(XtParent(term)), &sizehints); + + XtVaSetValues(XtParent(term), + XtNbaseWidth, min_width, + XtNbaseHeight, min_height, + XtNminWidth, min_width + FontWidth(&term->screen), + XtNminHeight, min_height + FontHeight(&term->screen), + XtNwidthInc, FontWidth(&term->screen), + XtNheightInc, FontHeight(&term->screen), + (XtPointer) 0); + + XFlush(XtDisplay(term)); +} + +static void +unset_resize_increments() +{ + XSizeHints sizehints; + memset(&sizehints, 0, sizeof(XSizeHints)); + sizehints.width_inc = 1; + sizehints.height_inc = 1; + sizehints.flags = PResizeInc; + XSetWMNormalHints(term->screen.display, XtWindow(XtParent(term)), &sizehints); + + XtVaSetValues(XtParent(term), + XtNwidthInc, 1, + XtNheightInc, 1, + (XtPointer) 0, + (XtPointer) 0); + + XFlush(XtDisplay(term)); +} + +static void +netwm_fullscreen(int enable) +{ + XEvent e; + Display *display = term->screen.display; + Window window = XtWindow(XtParent(term)); + int operation = enable ? 1 : 0; + + Atom atom_fullscreen = XInternAtom(term->screen.display, + "_NET_WM_STATE_FULLSCREEN", False); + Atom atom_state = XInternAtom(term->screen.display, + "_NET_WM_STATE", False); + + memset(&e,0,sizeof(e)); + e.xclient.type = ClientMessage; + e.xclient.message_type = atom_state; + e.xclient.display = display; + e.xclient.window = window; + e.xclient.format = 32; + e.xclient.data.l[0] = operation; + e.xclient.data.l[1] = atom_fullscreen; + + XSendEvent(display, DefaultRootWindow(display), False, + SubstructureRedirectMask, &e); +} + +static int +probe_netwm_fullscreen_capability() +{ + Atom atom_fullscreen = XInternAtom(term->screen.display, + "_NET_WM_STATE_FULLSCREEN", False); + Atom atom_supported = XInternAtom(term->screen.display, + "_NET_SUPPORTED", False); + Atom type; + int format; + unsigned int i; + unsigned long nitems, bytesafter; + unsigned char *args; + unsigned long *ldata; + char *name; + int retval = -1; + int netwm_fullscreen_capability = 0; + + if (Success != XGetWindowProperty( + term->screen.display, /* display */ + DefaultRootWindow(term->screen.display), /* window */ + atom_supported, /* property */ + 0, /* long_offset */ + (65536 / sizeof(long)), /* long_length */ + False, /* delete */ + AnyPropertyType, /* req_type */ + &type, /* actual_type_return */ + &format, /* actual_format_return */ + &nitems, /* nitems_return */ + &bytesafter, /* bytes_after_return */ + &args)) { /* prop_return */ + netwm_fullscreen_capability = 0; + } else if (type != XA_ATOM) { + netwm_fullscreen_capability = 0; + } else { + ldata = (unsigned long*)args; + for (i = 0; i < nitems; i++) { + if (ldata[i] == atom_fullscreen) { + netwm_fullscreen_capability = 1; + } + } + XFree(ldata); + } + return netwm_fullscreen_capability; +} + +static void +do_fullscreen(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + register TScreen *screen = &term->screen; + Time now = CurrentTime; /* XXX - wrong */ + Dimension width; + Dimension height; + Dimension replyWidth; + Dimension replyHeight; + XtGeometryResult stat; + XtWidgetGeometry geometry; + + static int have_probed = 0; + static int netwm_fullscreen_capability = 0; + + if (have_probed == 0) { + have_probed = 1; + netwm_fullscreen_capability = probe_netwm_fullscreen_capability(); + } + + /* at this time, there is no support for lame window managers */ + if (! netwm_fullscreen_capability) { + Bell(XkbBI_MinorError, 100); + return; + } + + Screen *xscreen = DefaultScreenOfDisplay(term->screen.display); + if (! screen->fullscreen) { + /* ENABLE FULLSCREEN */ + if (netwm_fullscreen_capability) { + unset_resize_increments(); + netwm_fullscreen(1); + } else { + /* no support yet */ + } + +#if 0 + memset(&geometry, 0, sizeof(XtWidgetGeometry)); + + width = WidthOfScreen(xscreen); + height = HeightOfScreen(xscreen); + + stat = XtMakeResizeRequest((Widget) term, + width, + height, + &replyWidth, + &replyHeight); + + if (stat == XtGeometryYes || stat == XtGeometryDone) { + term->core.width = replyWidth; + term->core.height = replyHeight; + + XMoveWindow(XtDisplay(term), XtWindow(XtParent(term)), 0, 0); + ScreenResize(&term->screen, replyWidth, replyHeight, + &term->flags); + } +#endif + screen->fullscreen = TRUE; + + } else { + /* DISABLE FULLSCREEN */ + if (netwm_fullscreen_capability) { + set_resize_increments(); + netwm_fullscreen(0); + } else { + /* no support yet */ + } + screen->fullscreen = FALSE; + } +} + +/* ARGSUSED */ +void +HandleFullscreen(Widget w, + XEvent * event GCC_UNUSED, + String * params GCC_UNUSED, + Cardinal * param_count GCC_UNUSED) +{ + do_fullscreen(w, (XtPointer) 0, (XtPointer) 0); +} + +/********************************************************************/ +/* END: Simmons Fullscreen Hack */ +/********************************************************************/ + + static void do_securekbd(Widget gw GCC_UNUSED, XtPointer closure GCC_UNUSED, diff -Nru xterm-223.orig/menu.h xterm-223/menu.h --- xterm-223.orig/menu.h 2006-07-23 15:59:13.000000000 +0100 +++ xterm-223/menu.h 2006-12-15 22:37:45.000000000 +0000 @@ -68,6 +68,7 @@ extern MenuEntry tekMenuEntries[]; #endif +extern void HandleFullscreen PROTO_XT_ACTIONS_ARGS; extern void Handle8BitControl PROTO_XT_ACTIONS_ARGS; extern void HandleAllow132 PROTO_XT_ACTIONS_ARGS; extern void HandleAllowSends PROTO_XT_ACTIONS_ARGS; @@ -143,6 +144,7 @@ #if OPT_TOOLBAR mainMenu_toolbar, #endif + mainMenu_fullscreen, mainMenu_securekbd, mainMenu_allowsends, mainMenu_redraw, diff -Nru xterm-223.orig/ptyx.h xterm-223/ptyx.h --- xterm-223.orig/ptyx.h 2006-11-23 01:18:29.000000000 +0000 +++ xterm-223/ptyx.h 2006-12-15 22:37:45.000000000 +0000 @@ -1351,6 +1351,7 @@ Boolean allowWindowOp0; /* initial WindowOps mode */ Boolean awaitInput; /* select-timeout mode */ Boolean grabbedKbd; /* keyboard is grabbed */ + Boolean fullscreen; /* terminal is fullscreen */ #ifdef ALLOWLOGGING int logging; /* logging mode */ int logfd; /* file descriptor of log */ diff -Nru xterm-223.orig/XTerm.ad xterm-223/XTerm.ad --- xterm-223.orig/XTerm.ad 2006-06-24 15:34:45.000000000 +0100 +++ xterm-223/XTerm.ad 2006-12-15 22:37:45.000000000 +0000 @@ -12,6 +12,7 @@ *SimpleMenu*Cursor: left_ptr *mainMenu.Label: Main Options +*mainMenu*fullscreen*Label: Full Screen *mainMenu*toolbar*Label: Toolbar *mainMenu*securekbd*Label: Secure Keyboard *mainMenu*allowsends*Label: Allow SendEvents @@ -98,6 +99,9 @@ *VT100.utf8Fonts.font5: -misc-fixed-medium-r-normal--18-120-100-100-c-90-iso10646-1 *VT100.utf8Fonts.font6: -misc-fixed-medium-r-normal--20-200-75-75-c-100-iso10646-1 +*VT100.translations: #override \ +Alt Return: fullscreen() + *tekMenu.Label: Tek Options *tekMenu*tektextlarge*Label: Large Characters *tekMenu*tektext2*Label: #2 Size Characters