From 4c8524a2098ee90220827799e529d923e3ab6eab Mon Sep 17 00:00:00 2001 From: Gregory Casamento Date: Tue, 1 Aug 2023 11:58:11 -0400 Subject: [PATCH] Add headless backend --- Headers/headlesslib/HeadlessContext.h | 38 + Headers/headlesslib/HeadlessFaceInfo.h | 44 + Headers/headlesslib/HeadlessFontEnumerator.h | 42 + Headers/headlesslib/HeadlessFontInfo.h | 47 ++ Headers/headlesslib/HeadlessGState.h | 46 ++ Headers/headlesslib/HeadlessModernSurface.h | 38 + Headers/headlesslib/HeadlessSurface.h | 53 ++ Headers/xheadless/XGGeneric.h | 158 ++++ Headers/xheadless/XGInputServer.h | 79 ++ Headers/xheadless/XGOpenGL.h | 79 ++ Headers/xheadless/XGServer.h | 113 +++ Headers/xheadless/XGServerWindow.h | 145 ++++ Headers/xheadless/XHeadless.h | 38 + Headers/xheadless/XWindowBuffer.h | 150 ++++ Source/headlesslib/GNUmakefile | 53 ++ Source/headlesslib/GNUmakefile.preamble | 52 ++ Source/headlesslib/HeadlessContext.m | 190 +++++ Source/headlesslib/HeadlessFaceInfo.m | 45 + Source/headlesslib/HeadlessFontEnumerator.m | 51 ++ Source/headlesslib/HeadlessFontInfo.m | 111 +++ Source/headlesslib/HeadlessGState.m | 340 ++++++++ Source/headlesslib/HeadlessModernSurface.m | 54 ++ Source/headlesslib/HeadlessSurface.m | 72 ++ Source/xheadless/GNUmakefile | 46 ++ Source/xheadless/GNUmakefile.preamble | 53 ++ Source/xheadless/XGServer.m | 384 +++++++++ Source/xheadless/XGServerEvent.m | 369 +++++++++ Source/xheadless/XGServerWindow.m | 822 +++++++++++++++++++ 28 files changed, 3712 insertions(+) create mode 100644 Headers/headlesslib/HeadlessContext.h create mode 100644 Headers/headlesslib/HeadlessFaceInfo.h create mode 100644 Headers/headlesslib/HeadlessFontEnumerator.h create mode 100644 Headers/headlesslib/HeadlessFontInfo.h create mode 100644 Headers/headlesslib/HeadlessGState.h create mode 100644 Headers/headlesslib/HeadlessModernSurface.h create mode 100644 Headers/headlesslib/HeadlessSurface.h create mode 100644 Headers/xheadless/XGGeneric.h create mode 100644 Headers/xheadless/XGInputServer.h create mode 100644 Headers/xheadless/XGOpenGL.h create mode 100644 Headers/xheadless/XGServer.h create mode 100644 Headers/xheadless/XGServerWindow.h create mode 100644 Headers/xheadless/XHeadless.h create mode 100644 Headers/xheadless/XWindowBuffer.h create mode 100644 Source/headlesslib/GNUmakefile create mode 100644 Source/headlesslib/GNUmakefile.preamble create mode 100644 Source/headlesslib/HeadlessContext.m create mode 100644 Source/headlesslib/HeadlessFaceInfo.m create mode 100644 Source/headlesslib/HeadlessFontEnumerator.m create mode 100644 Source/headlesslib/HeadlessFontInfo.m create mode 100644 Source/headlesslib/HeadlessGState.m create mode 100644 Source/headlesslib/HeadlessModernSurface.m create mode 100644 Source/headlesslib/HeadlessSurface.m create mode 100644 Source/xheadless/GNUmakefile create mode 100644 Source/xheadless/GNUmakefile.preamble create mode 100644 Source/xheadless/XGServer.m create mode 100644 Source/xheadless/XGServerEvent.m create mode 100644 Source/xheadless/XGServerWindow.m diff --git a/Headers/headlesslib/HeadlessContext.h b/Headers/headlesslib/HeadlessContext.h new file mode 100644 index 0000000..d31a474 --- /dev/null +++ b/Headers/headlesslib/HeadlessContext.h @@ -0,0 +1,38 @@ +/* + HeadlessContext.h + + Copyright (C) 2003 Free Software Foundation, Inc. + + August 31, 2003 + Written by Banlu Kemiyatorn + + This file is part of GNUstep. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; see the file COPYING.LIB. + If not, see or write to the + Free Software Foundation, 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifndef HeadlessContext_h +#define HeadlessContext_h + +#include "gsc/GSContext.h" + +@interface HeadlessContext : GSContext +{ +} +@end + +#endif diff --git a/Headers/headlesslib/HeadlessFaceInfo.h b/Headers/headlesslib/HeadlessFaceInfo.h new file mode 100644 index 0000000..a4d24c4 --- /dev/null +++ b/Headers/headlesslib/HeadlessFaceInfo.h @@ -0,0 +1,44 @@ +/* + CairoFaceInfo.h + + Copyright (C) 2003 Free Software Foundation, Inc. + + August 31, 2003 + Written by Banlu Kemiyatorn + Base on code by Alexander Malmberg + Rewrite: Fred Kiefer + Date: Jan 2006 + + This file is part of GNUstep. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; see the file COPYING.LIB. + If not, see or write to the + Free Software Foundation, 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifndef HEADLESSFACEINFO_H +#define HEADLESSFACEINFO_H + +#include + +@interface HeadlessFaceInfo : NSObject +{ + void *_fontFace; +} + +- (void *)fontFace; + +@end +#endif diff --git a/Headers/headlesslib/HeadlessFontEnumerator.h b/Headers/headlesslib/HeadlessFontEnumerator.h new file mode 100644 index 0000000..5848abd --- /dev/null +++ b/Headers/headlesslib/HeadlessFontEnumerator.h @@ -0,0 +1,42 @@ +/* + CairoFontEnumerator.h + + Copyright (C) 2003 Free Software Foundation, Inc. + August 31, 2003 + Written by Banlu Kemiyatorn + + This file is part of GNUstep. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; see the file COPYING.LIB. + If not, see or write to the + Free Software Foundation, 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + + +#ifndef CairoFontEnumerator_h +#define CairoFontEnumerator_h + +#include + +@class HeadlessFaceInfo; + +@interface HeadlessFontEnumerator : GSFontEnumerator +{ +} ++ (Class) faceInfoClass; ++ (HeadlessFaceInfo *) fontWithName: (NSString *)name; +@end + +#endif diff --git a/Headers/headlesslib/HeadlessFontInfo.h b/Headers/headlesslib/HeadlessFontInfo.h new file mode 100644 index 0000000..a85860f --- /dev/null +++ b/Headers/headlesslib/HeadlessFontInfo.h @@ -0,0 +1,47 @@ +/* + CairoFontInfo.h + + Copyright (C) 2003 Free Software Foundation, Inc. + + August 31, 2003 + Written by Banlu Kemiyatorn + + This file is part of GNUstep. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; see the file COPYING.LIB. + If not, see or write to the + Free Software Foundation, 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifndef HeadlessFontInfo_h +#define HeadlessFontInfo_h + +#include +#include "headlesslib/HeadlessFaceInfo.h" + +typedef void *cairo_t; + +@interface HeadlessFontInfo : GSFontInfo +{ +@public + void *_scaled; +} + +- (void) drawGlyphs: (const NSGlyph*)glyphs + length: (int)length + on: (cairo_t*)ct; +@end + +#endif diff --git a/Headers/headlesslib/HeadlessGState.h b/Headers/headlesslib/HeadlessGState.h new file mode 100644 index 0000000..b083e9e --- /dev/null +++ b/Headers/headlesslib/HeadlessGState.h @@ -0,0 +1,46 @@ +/* + Copyright (C) 2004 Free Software Foundation, Inc. + + Author: Banlu Kemiyatorn + + This file is part of GNUstep. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; see the file COPYING.LIB. + If not, see or write to the + Free Software Foundation, 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifndef HeadlessGState_h +#define HeadlessGState_h + +#include "gsc/GSGState.h" + + +@class HeadlessSurface; + +@interface HeadlessGState : GSGState +{ + @public + void *_ct; + HeadlessSurface *_surface; +} + +- (void) GSCurrentSurface: (HeadlessSurface **)surface : (int *)x : (int *)y; +- (void) GSSetSurface: (HeadlessSurface *)surface : (int)x : (int)y; + +- (void) showPage; +@end + +#endif diff --git a/Headers/headlesslib/HeadlessModernSurface.h b/Headers/headlesslib/HeadlessModernSurface.h new file mode 100644 index 0000000..174480f --- /dev/null +++ b/Headers/headlesslib/HeadlessModernSurface.h @@ -0,0 +1,38 @@ +/* + Copyright (C) 2011 Free Software Foundation, Inc. + + Author: Eric Wasylishen + + This file is part of GNUstep. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; see the file COPYING.LIB. + If not, see or write to the + Free Software Foundation, 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifndef HeadlessModernSurface_h +#define HeadlessModernSurface_h + +#include "headlesslib/HeadlessSurface.h" + +@interface HeadlessModernSurface : HeadlessSurface +{ + @private + void *_windowSurface; +} +@end + +#endif + diff --git a/Headers/headlesslib/HeadlessSurface.h b/Headers/headlesslib/HeadlessSurface.h new file mode 100644 index 0000000..def3e1d --- /dev/null +++ b/Headers/headlesslib/HeadlessSurface.h @@ -0,0 +1,53 @@ +/* + Copyright (C) 2002 Free Software Foundation, Inc. + + Author: Banlu Kemiyatorn + + This file is part of GNUstep. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; see the file COPYING.LIB. + If not, see or write to the + Free Software Foundation, 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifndef HeadlessSurface_h +#define HeadlessSurface_h + +#include + +typedef void *cairo_surface_t; + +@interface HeadlessSurface : NSObject +{ +@public + void *gsDevice; + void *_surface; +} + +- (id) initWithDevice: (void *)device; + +- (NSSize) size; +- (void) setSize: (NSSize)newSize; + +- (void *) surface; + +- (void) handleExposeRect: (NSRect)rect; + +- (BOOL) isDrawingToScreen; + +@end + +#endif + diff --git a/Headers/xheadless/XGGeneric.h b/Headers/xheadless/XGGeneric.h new file mode 100644 index 0000000..1f9564d --- /dev/null +++ b/Headers/xheadless/XGGeneric.h @@ -0,0 +1,158 @@ +/* Generic header info common to X backends for GNUstep + + Copyright (C) 2000 Free Software Foundation, Inc. + + Written by: Richard Frith-Macdonald + Date: Mar 2000 + + This file is part of the GNUstep project + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; see the file COPYING.LIB. + If not, see or write to the + Free Software Foundation, 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifndef INCLUDED_XGGENERIC_H +#define INCLUDED_XGGENERIC_H + +#include "XHeadless.h" +/* + * Flags to indicate which protocols the WindowManager follows + */ +typedef enum { + XGWM_UNKNOWN = 0, + XGWM_WINDOWMAKER = 1, + XGWM_GNOME = 2, + XGWM_KDE = 4, + XGWM_EWMH = 8 +} XGWMProtocols; + +typedef struct { + Atom win_type_atom; + Atom win_desktop_atom; + Atom win_normal_atom; + Atom win_floating_atom; + Atom win_menu_atom; + Atom win_dock_atom; + Atom win_modal_atom; + Atom win_utility_atom; + Atom win_splash_atom; + Atom win_override_atom; + Atom win_topmenu_atom; + Atom win_popup_menu_atom; + Atom win_dropdown_menu_atom; + Atom win_tooltip_atom; + Atom win_notification_atom; + Atom win_combo_atom; + Atom win_dnd_atom; +} XGWMWinTypes; + +typedef struct { + Atom net_wm_state_atom; + Atom net_wm_state_modal_atom; + Atom net_wm_state_sticky_atom; + Atom net_wm_state_maximized_vert_atom; + Atom net_wm_state_maximized_horz_atom; + Atom net_wm_state_shaded_atom; + Atom net_wm_state_skip_taskbar_atom; + Atom net_wm_state_skip_pager_atom; + Atom net_wm_state_hidden_atom; + Atom net_wm_state_fullscreen_atom; + Atom net_wm_state_above_atom; + Atom net_wm_state_below_atom; + Atom net_wm_state_demands_attention_atom; +} XGWMNetStates; + +/* + * Frame offsets for window inside parent decoration window. + */ +typedef struct { + short l; // offset from left + short r; // offset from right + short t; // offset from top + short b; // offset from bottom + BOOL known; // obtained from Reparent event or just guessed? +} Offsets; + +/* + * Structure containing ivars that are common to all X backend contexts. + */ +struct XGGeneric { + int wm; + struct { + unsigned useWindowMakerIcons:1; + unsigned appOwnsMiniwindow:1; + unsigned doubleParentWindow:1; + } flags; + // Time of last X event + Time lastTime; + // Approximate local time for last X event, used to decide + // if the last X event time is still valid. + NSTimeInterval lastTimeStamp; + // last reference time on X server, used to prevent time drift between + // local machine and X server. + Time baseXServerTime; + Time lastClick; + Window lastClickWindow; + int lastClickX; + int lastClickY; + Time lastMotion; + Atom protocols_atom; + Atom delete_win_atom; + Atom take_focus_atom; + Atom wm_state_atom; + Atom net_wm_ping_atom; + Atom net_wm_sync_request_atom; + Atom net_wm_sync_request_counter_atom; + Atom miniaturize_atom; + Atom win_decor_atom; + Atom titlebar_state_atom; + char *rootName; + long currentFocusWindow; + long desiredFocusWindow; + unsigned long focusRequestNumber; + unsigned char lMouse; + unsigned char mMouse; + unsigned char rMouse; + unsigned char upMouse; + unsigned char downMouse; + unsigned char scrollLeftMouse; + unsigned char scrollRightMouse; + int lMouseMask; + int mMouseMask; + int rMouseMask; + Window appRootWindow; + void *cachedWindow; // last gswindow_device_t used. + Offsets offsets[16]; + XGWMWinTypes wintypes; + XGWMNetStates netstates; +}; + +/* GNOME Window layers */ +#define WIN_LAYER_DESKTOP 0 +#define WIN_LAYER_BELOW 2 +#define WIN_LAYER_NORMAL 4 +#define WIN_LAYER_ONTOP 6 +#define WIN_LAYER_DOCK 8 +#define WIN_LAYER_ABOVE_DOCK 10 +#define WIN_LAYER_MENU 12 + +/* NET WM State */ +#define _NET_WM_STATE_REMOVE 0 /* remove/unset property */ +#define _NET_WM_STATE_ADD 1 /* add/set property */ +#define _NET_WM_STATE_TOGGLE 2 /* toggle property */ + +#endif + diff --git a/Headers/xheadless/XGInputServer.h b/Headers/xheadless/XGInputServer.h new file mode 100644 index 0000000..7bc3b94 --- /dev/null +++ b/Headers/xheadless/XGInputServer.h @@ -0,0 +1,79 @@ +/* XGInputServer - Keyboard input handling + + Copyright (C) 2002 Free Software Foundation, Inc. + + Author: Adam Fedor + Date: January 2002 + + This file is part of the GNUstep GUI Library. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; see the file COPYING.LIB. + If not, see or write to the + Free Software Foundation, 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifndef _GNUstep_H_XGInputServer +#define _GNUstep_H_XGInputServer + +#include +#include + +@protocol XInputFiltering +- (BOOL) filterEvent: (XEvent *)event; +- (NSString *) lookupStringForEvent: (XKeyEvent *)event + window: (gswindow_device_t *)window + keysym: (KeySym *)keysymptr; +@end + + +@interface XIMInputServer: NSInputServer +{ + id delegate; + NSString *server_name; + XIM xim; + XIMStyle xim_style; + + /* Track the XIC:s and destroy them explicitly to work around an XFree86 + bug: + http://www.xfree86.org/pipermail/xpert/2002-June/018370.html + */ + XIC *xics; + int num_xics; +} + +- (id) initWithDelegate: (id)aDelegate + display: (Display *)dpy + name: (NSString *)name; +- (void) ximFocusICWindow: (gswindow_device_t *)windev; +- (void) ximCloseIC: (XIC)xic; + +@end + +// Public interface for the input methods +@interface XIMInputServer (InputMethod) +- (NSString *) inputMethodStyle; +- (NSString *) fontSize: (int *)size; +- (BOOL) clientWindowRect: (NSRect *)rect; + +- (BOOL) statusArea: (NSRect *)rect; +- (BOOL) preeditArea: (NSRect *)rect; +- (BOOL) preeditSpot: (NSPoint *)p; + +- (BOOL) setStatusArea: (NSRect *)rect; +- (BOOL) setPreeditArea: (NSRect *)rect; +- (BOOL) setPreeditSpot: (NSPoint *)p; +@end // XIMInputServer (InputMethod) + +#endif diff --git a/Headers/xheadless/XGOpenGL.h b/Headers/xheadless/XGOpenGL.h new file mode 100644 index 0000000..3ec933e --- /dev/null +++ b/Headers/xheadless/XGOpenGL.h @@ -0,0 +1,79 @@ +/* -*-ObjC-*- */ +/* XGOpenGL - openGL management using glX + + Copyright (C) 2002 Free Software Foundation, Inc. + + Author: Frederic De Jaeger + Date: Nov 2002 + + This file is part of the GNUstep GUI Library. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; see the file COPYING.LIB. + If not, see or write to the + Free Software Foundation, 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifndef _GNUstep_H_XGOpenGL_ +#define _GNUstep_H_XGOpenGL_ + +#include + +#define id _gs_avoid_id_collision +#define BOOL XWINDOWSBOOL +#include +#undef id +#undef BOOL + +@class NSView; +@class XGXSubWindow; +@class XGGLPixelFormat; + +@interface XGGLContext : NSOpenGLContext +{ + int glxminorversion; + GLXContext glx_context; + GLXWindow glx_drawable; + XGXSubWindow *xSubWindow; + XGGLPixelFormat *pixelFormat; + BOOL saved_ignores_backing; +} + +- (GLXContext)glxcontext; + +@end + +@interface XGGLPixelFormat : NSOpenGLPixelFormat +{ + Display * display; + int glxminorversion; + + GLXFBConfig *fbconfig; + int pickedFBConfig; + int configurationCount; + BOOL shouldRequestARGBVisual; + + XVisualInfo *visualinfo; + +} + ++ (int) glxMinorVersion; +- (Display *) display; +- (XVisualInfo *) visualinfo; +- (GLXContext) createGLXContext: (XGGLContext *)share; +- (GLXWindow) drawableForWindow: (Window)xwindowid; + +@end + +#endif diff --git a/Headers/xheadless/XGServer.h b/Headers/xheadless/XGServer.h new file mode 100644 index 0000000..96bd06e --- /dev/null +++ b/Headers/xheadless/XGServer.h @@ -0,0 +1,113 @@ +/* XGServer + + Backend server using the X11. + + Copyright (C) 2002-2015 Free Software Foundation, Inc. + + Author: Adam Fedor + Date: Mar 2002 + + This file is part of the GNUstep Backend. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; see the file COPYING.LIB. + If not, see or write to the + Free Software Foundation, 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifndef _XGServer_h_INCLUDE +#define _XGServer_h_INCLUDE + +#include "config.h" + +#include +#include "XHeadless.h" +#include "XGGeneric.h" + +/* + * Enumerated type to say how we should draw pixels to the X display - used + * to select different drawing mechanisms to try to optimise. + */ +typedef enum { + XGDM_FAST15, + XGDM_FAST16, + XGDM_FAST32, + XGDM_FAST32_BGR, + XGDM_FAST8, + XGDM_PORTABLE +} XGDrawMechanism; + +@interface XGServer : GSDisplayServer +{ + Display *dpy; + int defScreen; + NSMapTable *screenList; + Window grabWindow; + struct XGGeneric generic; + id inputServer; +} + ++ (Display*) currentXDisplay; +- (Display*) xDisplay; +- (Window) xAppRootWindow; + +- (void *) xrContextForScreen: (int)screen_number; +- (Visual *) visualForScreen: (int)screen_number; +- (int) depthForScreen: (int)screen_number; + +- (XGDrawMechanism) drawMechanismForScreen: (int)screen_number; +- (void) getForScreen: (int)screen_number pixelFormat: (int *)bpp_number + masks: (int *)red_mask : (int *)green_mask : (int *)blue_mask; +- (Window) xDisplayRootWindowForScreen: (int)screen_number; +- (XColor) xColorFromColor: (XColor)color forScreen: (int)screen_number; + ++ (void) waitAllContexts; +@end + +/* + * Synchronize with X event queue - soak up events. + * Waits for up to 1 second for event. + */ +@interface XGServer (XSync) +- (BOOL) xSyncMap: (void*)window; +@end + +@interface XGServer (XGGeneric) +- (NSRect) _OSFrameToXFrame: (NSRect)o for: (void*)window; +- (NSRect) _OSFrameToXHints: (NSRect)o for: (void*)window; +- (NSRect) _XFrameToOSFrame: (NSRect)x for: (void*)window; +- (NSRect) _XFrameToXHints: (NSRect)o for: (void*)window; +@end + +// Public interface for the input methods. +@interface XGServer (InputMethod) +- (NSString *) inputMethodStyle; +- (NSString *) fontSize: (int *)size; +- (BOOL) clientWindowRect: (NSRect *)rect; + +- (BOOL) statusArea: (NSRect *)rect; +- (BOOL) preeditArea: (NSRect *)rect; +- (BOOL) preeditSpot: (NSPoint *)p; + +- (BOOL) setStatusArea: (NSRect *)rect; +- (BOOL) setPreeditArea: (NSRect *)rect; +- (BOOL) setPreeditSpot: (NSPoint *)p; +@end + +@interface XGServer (TimeKeeping) +- (void) setLastTime: (Time)last; +- (Time) lastTime; +@end + +#endif /* _XGServer_h_INCLUDE */ diff --git a/Headers/xheadless/XGServerWindow.h b/Headers/xheadless/XGServerWindow.h new file mode 100644 index 0000000..24440fa --- /dev/null +++ b/Headers/xheadless/XGServerWindow.h @@ -0,0 +1,145 @@ +/* Window ops for X11 server + + Copyright (C) 1999-2015 Free Software Foundation, Inc. + + Written by: Adam Fedor + Date: Nov 1999 + + This file is part of the GNU Objective C User Interface library. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; see the file COPYING.LIB. + If not, see or write to the + Free Software Foundation, 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifndef _XGServerWindow_h_INCLUDE +#define _XGServerWindow_h_INCLUDE + +#include + +/* + * WindowMaker window manager interaction + * + * NB. Despite the fact that all the fields in this table are notionally + * 32bit values (WindowMaker defines them as CARD32 and Pixmap types and + * the X protocol spec says Pixmap is 32bits) they actually all have to be + * long values (64bits on a 64bit processor). This is because of a bug in + * X-windows property functions, such that they assume that where property + * data is specified as 32bit it is actually a long. + * The X headers automatically adjust the size of a Pixmap to be that of + * a long, so we can declare Pixmap fields to be that size, but we must + * explicitly use 'unsigned long' rather than CARD32 foir the others. + */ +typedef struct { + unsigned long flags; + unsigned long window_style; + unsigned long window_level; + unsigned long reserved; + Pixmap miniaturize_pixmap; // pixmap for miniaturize button + Pixmap close_pixmap; // pixmap for close button + Pixmap miniaturize_mask; // miniaturize pixmap mask + Pixmap close_mask; // close pixmap mask + unsigned long extra_flags; +} GNUstepWMAttributes; + +#define GSWindowStyleAttr (1<<0) +#define GSWindowLevelAttr (1<<1) +#define GSMiniaturizePixmapAttr (1<<3) +#define GSClosePixmapAttr (1<<4) +#define GSMiniaturizeMaskAttr (1<<5) +#define GSCloseMaskAttr (1<<6) +#define GSExtraFlagsAttr (1<<7) + +#define GSDocumentEditedFlag (1<<0) +#define GSWindowWillResizeNotificationsFlag (1<<1) +#define GSWindowWillMoveNotificationsFlag (1<<2) +#define GSNoApplicationIconFlag (1<<5) +#define WMFHideOtherApplications 10 +#define WMFHideApplication 12 + +#define GSMaxWMProtocols 5 + +/* Graphics Driver protocol. Setup in [NSGraphicsContext-contextDevice:] */ +enum { + GDriverHandlesBacking = 1, + GDriverHandlesExpose = 2 +}; + +typedef struct _gswindow_device_t { + Display *display; /* Display this window is on */ + Window ident; /* Window handle */ + Window root; /* Handle of root window */ + Window parent; /* Handle of parent window */ + int screen; /* Screeen this window is on */ + GC gc; /* GC for drawing */ + long number; /* Globally unique identifier */ + unsigned int depth; /* Window depth */ + unsigned int border; /* Border size */ + int map_state; /* X map state */ + int visibility; /* X visibility */ + int wm_state; /* X WM state */ + NSBackingStoreType type; /* Backing type */ + NSRect xframe; /* Window frame */ + + unsigned int buffer_width; /* Size in pixels of the current buffers. */ + unsigned int buffer_height; + Drawable buffer; /* Backing store pixmap */ + Drawable alpha_buffer; /* Alpha buffer. Managed by gdriver + will be freed if HandlesBacking=0 */ + BOOL is_exposed; + NSMutableArray *exposedRects; /* List of exposure event rects */ + Region region; /* Used between several expose events */ + XWMHints gen_hints; + XSizeHints siz_hints; + GNUstepWMAttributes win_attrs; + XSetWindowAttributes xwn_attrs; + int xoff; + int yoff; + int boff; + Atom protocols[GSMaxWMProtocols]; + int numProtocols; + XIC ic; + void *gdriver; /* gdriver ident. Managed by gdriver */ + int gdriverProtocol; /* Managed by gdriver */ + BOOL ignore_take_focus; +#ifdef HAVE_X11_EXTENSIONS_SYNC_H + uint32_t net_wm_sync_request_counter_value_low; + uint32_t net_wm_sync_request_counter_value_high; + XSyncCounter net_wm_sync_request_counter; +#endif +} gswindow_device_t; + +#define GET_XDRAWABLE(win) ((win)->buffer ? (win)->buffer: (win)->ident) + +@interface XGServer (DPSWindow) ++ (gswindow_device_t *) _windowForXWindow: (Window)xWindow; ++ (gswindow_device_t *) _windowForXParent: (Window)xWindow; ++ (gswindow_device_t *) _windowWithTag: (NSInteger)windowNumber; +- (void) _addExposedRectangle: (XRectangle)rectangle : (NSInteger)win : (BOOL) ignoreBacking; +- (void) _processExposedRectangles: (NSInteger)win; +- (void) _initializeCursorForXWindow: (Window) win; +- (void) _destroyServerWindows; + +/* This needs to go in GSDisplayServer */ +- (void) _DPSsetcursor: (Cursor)c : (BOOL)set; + +- (int) _wm_state: (Window) win; +- (BOOL) _ewmh_isHidden: (Window) win; +@end + +extern Pixmap +xgps_cursor_mask(Display *xdpy, Drawable draw, const unsigned char *data, + int w, int h, int colors); +#endif diff --git a/Headers/xheadless/XHeadless.h b/Headers/xheadless/XHeadless.h new file mode 100644 index 0000000..b6d6ef3 --- /dev/null +++ b/Headers/xheadless/XHeadless.h @@ -0,0 +1,38 @@ +#ifndef XHeadless_H +#define XHeadless_H + + +typedef unsigned long long Display; +typedef unsigned long long Pixmap; +typedef unsigned long long Window; +typedef unsigned long long Visual; +typedef unsigned long long XColor; +typedef unsigned long long Time; +typedef unsigned long long GC; +typedef unsigned long long Drawable; +typedef unsigned long long XWMHints; +typedef unsigned long long XSizeHints; +typedef unsigned long long XSetWindowAttributes; +typedef unsigned long long Atom; +typedef void *XIC; +typedef unsigned long long XIM; +typedef unsigned long long XKeySim; +typedef unsigned long long RContext; +typedef unsigned long long RContextAttributes; +typedef unsigned long long Region; +typedef unsigned long long XRectangle; +typedef unsigned long long Cursor; +typedef unsigned long long XEvent; +typedef unsigned long long XKeyEvent; +typedef unsigned long long XErrorEvent; +typedef unsigned long long KeySym; +typedef unsigned long long XIMStyle; + +#define None 0 +#define NormalState 0 +#define WithdrawnState 0 +#define IsViewable 0 +#define False 0 + +#endif + diff --git a/Headers/xheadless/XWindowBuffer.h b/Headers/xheadless/XWindowBuffer.h new file mode 100644 index 0000000..0ce512b --- /dev/null +++ b/Headers/xheadless/XWindowBuffer.h @@ -0,0 +1,150 @@ +/* + Copyright (C) 2002, 2005 Free Software Foundation, Inc. + + Author: Alexander Malmberg + + This file is part of GNUstep. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; see the file COPYING.LIB. + If not, see or write to the + Free Software Foundation, 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifndef XWindowBuffer_h +#define XWindowBuffer_h + +#include + +#define XShmSegmentInfo int + +typedef unsigned long long XImage; +typedef unsigned char Bool; + +struct XWindowBuffer_depth_info_s +{ + /* The drawing depth according to X. Usually the number of bits of color + data in each pixel. */ + int drawing_depth; + + /* The number of bytes used by a pixel. There is generally no + relationship between this and drawing_depth, except that + bytes_per_pixel*8>=drawing_depth. (Eg. 32-bit modes usually have a + drawing depth of 24.) */ + int bytes_per_pixel; + + /* If alpha is to be stored inside the normal data, this should be YES. + Otherwise, a separate buffer will be allocated for the alpha data (which + never does any harm, but it wastes memory if there's enough space in a + pixel, as in 32-bit modes. There needs to be 8 bits available for alpha + data at a byte boundary for this to work, though. (This could be fixed, + but in the mean time, just setting inline_alpha to NO is easier.) + inline_alpha_ofs should be the offset to the byte in each pixel that + holds the alpha value. */ + BOOL inline_alpha; + int inline_alpha_ofs; + + /* The byte order used for the buffer. This must be either MSBFirst or + LSBFirst. */ + int byte_order; +}; + +/* +XWindowBuffer maintains an XImage for a window. Each ARTGState that +renders to that window uses the same XWindowBuffer (and thus the same +buffer, etc.). + +Many states might render to the same window, so we need to make sure +that there's only one XWindowBuffer for each window. */ +@interface XWindowBuffer : NSObject +{ +@public + gswindow_device_t *window; + +@private + GC gc; + Drawable drawable; + XImage *ximage; + Display *display; + Pixmap pixmap; + + int use_shm; + XShmSegmentInfo shminfo; + + + struct XWindowBuffer_depth_info_s DI; + + + /* While a XShmPutImage is in progress we don't try to call it + again. The pending updates are stored here, and when we get the + ShmCompletion event, we handle them. */ + int pending_put; /* There are pending updates */ + struct + { + int x, y, w, h; + } pending_rect; /* in this rectangle. */ + + int pending_event; /* We're waiting for the ShmCompletion event. */ + + + /* This is for the ugly shape-hack */ + unsigned char *old_shape; + int old_shape_size; + +@public + unsigned char *data; + int sx, sy; + int bytes_per_line, bits_per_pixel, bytes_per_pixel; + + /* If has_alpha is 1 and alpha is NULL, the alpha is stored in data + somehow. The drawing mechanism code should know how to deal with + it. A separate alpha buffer will always be exactly the right size, + so each row is sx bytes long. + + If has_alpha is 0, the window is assumed to be completely opaque. + */ + unsigned char *alpha; + int has_alpha; +} + +/* +Returns a _retained_ XWindowBuffer for the specified gswindow_device_t. + +The depth info is only used if a new XWindowBuffer needs to be allocated. +*/ ++ windowBufferForWindow: (gswindow_device_t *)awindow + depthInfo: (struct XWindowBuffer_depth_info_s *)aDI; + +/* +Note that alpha is _not_ guaranteed to exist after this has been called; +you still need to check has_alpha. If the call fails, a message will be +logged. + +(In ARTGState, I handle failures by simply ignoring the operation that +required alpha.) + +The alpha channel is initialized to being completely opaque when first +created. +*/ +-(void) needsAlpha; + +-(void) _gotShmCompletion; +-(void) _exposeRect: (NSRect)r; ++(void) _gotShmCompletion: (Drawable)d; + +@end + + +#endif + diff --git a/Source/headlesslib/GNUmakefile b/Source/headlesslib/GNUmakefile new file mode 100644 index 0000000..3b88411 --- /dev/null +++ b/Source/headlesslib/GNUmakefile @@ -0,0 +1,53 @@ +# Copyright (C) 2004 Free Software Foundation, Inc. +# +# Author: Banlu Kemiyatorn +# +# This file is part of the GNUstep Backend. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; see the file COPYING.LIB. +# If not, see or write to the +# Free Software Foundation, 51 Franklin Street, Fifth Floor, +# Boston, MA 02110-1301, USA. + +PACKAGE_NAME = gnustep-back +GNUSTEP_LOCAL_ADDITIONAL_MAKEFILES=../../back.make +include $(GNUSTEP_MAKEFILES)/common.make + +include ../../config.make + +SUBPROJECT_NAME=headlesslib + +# The Objective-C source files to be compiled +headlesslib_OBJC_FILES = \ + HeadlessSurface.m \ + HeadlessFontInfo.m \ + HeadlessGState.m \ + HeadlessContext.m \ + HeadlessFontEnumerator.m \ + HeadlessFaceInfo.m \ + + + +ifeq ($(BUILD_SERVER),xheadless) + headlesslib_OBJC_FILES += HeadlessModernSurface.m +endif + +headlesslib_OBJC_FILES += + +-include GNUmakefile.preamble + +include $(GNUSTEP_MAKEFILES)/subproject.make + +-include GNUmakefile.postamble + diff --git a/Source/headlesslib/GNUmakefile.preamble b/Source/headlesslib/GNUmakefile.preamble new file mode 100644 index 0000000..01b1131 --- /dev/null +++ b/Source/headlesslib/GNUmakefile.preamble @@ -0,0 +1,52 @@ +# +# GNUmakefile.preamble +# +# Copyright (C) 2002 Free Software Foundation, Inc. +# +# Author: Adam Fedor +# +# This file is part of the GNUstep Backend. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; see the file COPYING.LIB. +# If not, see or write to the +# Free Software Foundation, 51 Franklin Street, Fifth Floor, +# Boston, MA 02110-1301, USA. + +# +# Flags dealing with compiling and linking +# + +# Additional flags to pass to the preprocessor +ADDITIONAL_CPPFLAGS += -Wall $(CONFIG_SYSTEM_DEFS) + +# Additional flags to pass to the Objective-C compiler +#ADDITIONAL_OBJCFLAGS = + +# Additional flags to pass to the C compiler +#ADDITIONAL_CFLAGS = + +# Additional include directories the compiler should search +ADDITIONAL_INCLUDE_DIRS = -I../../Headers \ + -I../$(GNUSTEP_TARGET_DIR) $(GRAPHIC_CFLAGS) \ + +# Additional LDFLAGS to pass to the linker +#ADDITIONAL_LDFLAGS = + +# Additional library directories the linker should search +#ADDITIONAL_LIB_DIRS = + +# +# Flags dealing with installing and uninstalling +# + diff --git a/Source/headlesslib/HeadlessContext.m b/Source/headlesslib/HeadlessContext.m new file mode 100644 index 0000000..4cc72de --- /dev/null +++ b/Source/headlesslib/HeadlessContext.m @@ -0,0 +1,190 @@ +/* + HeadlessContext.m + + Copyright (C) 2003 Free Software Foundation, Inc. + + August 31, 2003 + Written by Banlu Kemiyatorn + + This file is part of GNUstep. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; see the file COPYING.LIB. + If not, see or write to the + Free Software Foundation, 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#include +#include +#include +#include + +#include "headlesslib/HeadlessGState.h" +#include "headlesslib/HeadlessContext.h" +#include "headlesslib/HeadlessSurface.h" +#include "headlesslib/HeadlessFontInfo.h" +#include "headlesslib/HeadlessFontEnumerator.h" +#include "config.h" + +#define CGSTATE ((HeadlessGState *)gstate) + + +#define _CAIRO_GSTATE_CLASSNAME HeadlessGState +#define _CAIRO_SURFACE_CLASSNAME HeadlessModernSurface +#include "headlesslib/HeadlessModernSurface.h" + +@implementation HeadlessContext + ++ (void) initializeBackend +{ + [NSGraphicsContext setDefaultContextClass: self]; + + [GSFontEnumerator setDefaultClass: [HeadlessFontEnumerator class]]; + [GSFontInfo setDefaultClass: [HeadlessFontInfo class]]; +} + ++ (Class) GStateClass +{ + return [_CAIRO_GSTATE_CLASSNAME class]; +} + ++ (BOOL) handlesPS +{ + return YES; +} + +- (BOOL) supportsDrawGState +{ + return YES; +} + +- (id) initWithContextInfo: (NSDictionary *)info +{ + self = [super initWithContextInfo:info]; + if (self) + { + [self setImageInterpolation:NSImageInterpolationDefault]; + } + return(self); +} + +- (BOOL) isDrawingToScreen +{ + HeadlessSurface *surface = nil; + [CGSTATE GSCurrentSurface: &surface : NULL : NULL]; + return [surface isDrawingToScreen]; +} + +- (void) flushGraphics +{ +} + + +/* Private backend methods */ ++ (void) handleExposeRect: (NSRect)rect forDriver: (void *)driver +{ +} + +#if BUILD_SERVER == SERVER_x11 + +#ifdef XSHM + ++ (void) _gotShmCompletion: (Drawable)d +{ +} + +- (void) gotShmCompletion: (Drawable)d +{ +} + +#endif // XSHM + +#endif // BUILD_SERVER = SERVER_x11 + +@end + +@implementation HeadlessContext (Ops) + +- (BOOL) isCompatibleBitmap: (NSBitmapImageRep*)bitmap +{ + NSString *colorSpaceName; + + if ([bitmap bitmapFormat] != 0) + { + return NO; + } + + if ([bitmap isPlanar]) + { + return NO; + } + + if ([bitmap bitsPerSample] != 8) + { + return NO; + } + + colorSpaceName = [bitmap colorSpaceName]; + if (![colorSpaceName isEqualToString: NSDeviceRGBColorSpace] && + ![colorSpaceName isEqualToString: NSCalibratedRGBColorSpace]) + { + return NO; + } + else + { + return YES; + } +} + +- (void) GSCurrentDevice: (void **)device : (int *)x : (int *)y +{ + HeadlessSurface *surface; + + [CGSTATE GSCurrentSurface: &surface : x : y]; + if (device) + { + *device = surface->gsDevice; + } +} + +- (void) GSSetDevice: (void *)device : (int)x : (int)y +{ + HeadlessSurface *surface; + + surface = [[_CAIRO_SURFACE_CLASSNAME alloc] initWithDevice: device]; + + [CGSTATE GSSetSurface: surface : x : y]; + [surface release]; +} + +- (void) beginPrologueBBox: (NSRect)boundingBox + creationDate: (NSString*)dateCreated + createdBy: (NSString*)anApplication + fonts: (NSString*)fontNames + forWhom: (NSString*)user + pages: (int)numPages + title: (NSString*)aTitle +{ +} + +- (void) showPage +{ + [CGSTATE showPage]; +} + +@end + +#undef _CAIRO_SURFACE_CLASSNAME +#undef _CAIRO_GSTATE_CLASSNAME + diff --git a/Source/headlesslib/HeadlessFaceInfo.m b/Source/headlesslib/HeadlessFaceInfo.m new file mode 100644 index 0000000..211ee5d --- /dev/null +++ b/Source/headlesslib/HeadlessFaceInfo.m @@ -0,0 +1,45 @@ +/* + CairoFaceInfo.m + + Copyright (C) 2003 Free Software Foundation, Inc. + + August 31, 2003 + Written by Banlu Kemiyatorn + Base on original code of Alex Malmberg + Rewrite: Fred Kiefer + Date: Jan 2006 + + This file is part of GNUstep. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; see the file COPYING.LIB. + If not, see or write to the + Free Software Foundation, 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#include "headlesslib/HeadlessFaceInfo.h" + +@implementation HeadlessFaceInfo + +- (void) dealloc +{ + [super dealloc]; +} + +- (void *)fontFace +{ + return _fontFace; +} + +@end diff --git a/Source/headlesslib/HeadlessFontEnumerator.m b/Source/headlesslib/HeadlessFontEnumerator.m new file mode 100644 index 0000000..176847d --- /dev/null +++ b/Source/headlesslib/HeadlessFontEnumerator.m @@ -0,0 +1,51 @@ +/* + HeadlessFontEnumerator.m + + Copyright (C) 2003 Free Software Foundation, Inc. + + August 31, 2003 + Written by Banlu Kemiyatorn + Base on original code of Alex Malmberg + Rewrite: Fred Kiefer + Date: Jan 2006 + + This file is part of GNUstep. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; see the file COPYING.LIB. + If not, see or write to the + Free Software Foundation, 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#include "headlesslib/HeadlessFontEnumerator.h" +#include "headlesslib/HeadlessFontInfo.h" + +@implementation HeadlessFontEnumerator + ++ (Class) faceInfoClass +{ + return [HeadlessFaceInfo class]; +} + ++ (HeadlessFaceInfo *) fontWithName: (NSString *) name +{ + return (HeadlessFaceInfo *) [super fontWithName: name]; +} + +- (void)enumerateFontsAndFamilies +{ +} + +@end + diff --git a/Source/headlesslib/HeadlessFontInfo.m b/Source/headlesslib/HeadlessFontInfo.m new file mode 100644 index 0000000..112feb3 --- /dev/null +++ b/Source/headlesslib/HeadlessFontInfo.m @@ -0,0 +1,111 @@ +/* + HeadlessFontInfo.m + + Copyright (C) 2003 Free Software Foundation, Inc. + + August 31, 2003 + Written by Banlu Kemiyatorn + Base on original code of Alex Malmberg + + This file is part of GNUstep. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; see the file COPYING.LIB. + If not, see or write to the + Free Software Foundation, 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#include "GNUstepBase/Unicode.h" +#include +#include +#include "headlesslib/HeadlessFontInfo.h" +#include "headlesslib/HeadlessFontEnumerator.h" + +#include + +typedef void *cairo_t; + +@implementation HeadlessFontInfo + +- (BOOL) setupAttributes +{ + return YES; +} + +- (id) initWithFontName: (NSString *)name + matrix: (const CGFloat *)fmatrix + screenFont: (BOOL)p_screenFont +{ + self = [super init]; + if (!self) + return nil; + + fontName = [name copy]; + memcpy(matrix, fmatrix, sizeof(matrix)); + + if (![self setupAttributes]) + { + RELEASE(self); + return nil; + } + + return self; +} + +- (void) dealloc +{ + [super dealloc]; +} + +- (BOOL) glyphIsEncoded: (NSGlyph)glyph +{ + /* FIXME: There is no proper way to determine with the toy font API, + whether a glyph is supported or not. We will just ignore ligatures + and report all other glyph as existing. + return !NSEqualSizes([self advancementForGlyph: glyph], NSZeroSize); + */ + if ((glyph >= 0xFB00) && (glyph <= 0xFB05)) + return NO; + else + return YES; +} + +- (NSSize) advancementForGlyph: (NSGlyph)glyph +{ + return NSZeroSize; +} + +- (NSRect) boundingRectForGlyph: (NSGlyph)glyph +{ + return NSZeroRect; +} + +- (CGFloat) widthOfString: (NSString *)string +{ + return 0.0; +} + +- (void) appendBezierPathWithGlyphs: (NSGlyph *)glyphs + count: (int)length + toBezierPath: (NSBezierPath *)path +{ +} + +- (void) drawGlyphs: (const NSGlyph*)glyphs + length: (int)length + on: (cairo_t*)ct +{ +} + +@end diff --git a/Source/headlesslib/HeadlessGState.m b/Source/headlesslib/HeadlessGState.m new file mode 100644 index 0000000..c808df8 --- /dev/null +++ b/Source/headlesslib/HeadlessGState.m @@ -0,0 +1,340 @@ + +/* + HeadlessGState.m + + Copyright (C) 2003 Free Software Foundation, Inc. + + August 31, 2003 + Written by Banlu Kemiyatorn + Rewrite: Fred Kiefer + Date: Jan 2006 + + This file is part of GNUstep. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; see the file COPYING.LIB. + If not, see or write to the + Free Software Foundation, 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#include +#include +#include +#include +#include +#include "headlesslib/HeadlessGState.h" +#include "headlesslib/HeadlessFontInfo.h" +#include "headlesslib/HeadlessSurface.h" +#include "headlesslib/HeadlessContext.h" +#include + + +// Macro stolen from base/Header/Additions/GNUstepBase/GSObjRuntime.h +#ifndef GS_MAX_OBJECTS_FROM_STACK +/** + * The number of objects to try to get from varargs into an array on + * the stack ... if there are more than this, use the heap. + * NB. This MUST be a multiple of 2 + */ +#define GS_MAX_OBJECTS_FROM_STACK 128 +#endif + +// Macros stolen from base/Source/GSPrivate.h +/** + * Macro to manage memory for chunks of code that need to work with + * arrays of items. Use this to start the block of code using + * the array and GS_ENDITEMBUF() to end it. The idea is to ensure that small + * arrays are allocated on the stack (for speed), but large arrays are + * allocated from the heap (to avoid stack overflow). + */ +#define GS_BEGINITEMBUF(P, S, T) { \ + T _ibuf[(S) <= GS_MAX_OBJECTS_FROM_STACK ? (S) : 0]; \ + T *_base = ((S) <= GS_MAX_OBJECTS_FROM_STACK) ? _ibuf \ + : (T*)NSZoneMalloc(NSDefaultMallocZone(), (S) * sizeof(T)); \ + T *(P) = _base; + +/** + * Macro to manage memory for chunks of code that need to work with + * arrays of items. Use GS_BEGINITEMBUF() to start the block of code using + * the array and this macro to end it. + */ +#define GS_ENDITEMBUF() \ + if (_base != _ibuf) \ + NSZoneFree(NSDefaultMallocZone(), _base); \ + } + +@implementation HeadlessGState + ++ (void) initialize +{ + if (self == [HeadlessGState class]) + { + } +} + +- (void) dealloc +{ + RELEASE(_surface); + + [super dealloc]; +} + +- (NSString*) description +{ + NSMutableString *description = [[[super description] mutableCopy] autorelease]; + [description appendFormat: @" surface: %@",_surface]; + [description appendFormat: @" context: %p",_ct]; + return [[description copy] autorelease]; +} + +- (id) copyWithZone: (NSZone *)zone +{ + HeadlessGState *copy = (HeadlessGState *)[super copyWithZone: zone]; + return copy; +} + +- (void) GSCurrentSurface: (HeadlessSurface **)surface : (int *)x : (int *)y +{ + if (x) + *x = offset.x; + if (y) + *y = offset.y; + if (surface) + { + *surface = _surface; + } +} + +- (void) GSSetSurface: (HeadlessSurface *)surface : (int)x : (int)y +{ + ASSIGN(_surface, surface); + [self setOffset: NSMakePoint(x, y)]; + [self DPSinitgraphics]; +} + +- (void) setOffset: (NSPoint)theOffset +{ + [super setOffset: theOffset]; +} + +- (void) showPage +{ +} + +/* + * Color operations + */ +- (void) GSSetPatterColor: (NSImage*)image +{ + // FIXME: Create a cairo surface from the image and set it as source. + [super GSSetPatterColor: image]; +} + +/* + * Text operations + */ + +- (void) _setPoint +{ +} + +- (void) DPScharpath: (const char *)s : (int)b +{ +} + +- (void) DPSshow: (const char *)s +{ +} + +- (void) GSSetFont: (GSFontInfo *)fontref +{ + [super GSSetFont: fontref]; +} + +- (void) GSSetFontSize: (CGFloat)size +{ +} + +- (void) GSShowText: (const char *)string : (size_t)length +{ +} + +- (void) GSShowGlyphsWithAdvances: (const NSGlyph *)glyphs : (const NSSize *)advances : (size_t) length +{ +} + +/* + * GState operations + */ + +- (void) DPSinitgraphics +{ + [super DPSinitgraphics]; +} + +- (void) DPScurrentflat: (CGFloat *)flatness +{ +} + +- (void) DPScurrentlinecap: (int *)linecap +{ +} + +- (void) DPScurrentlinejoin: (int *)linejoin +{ +} + +- (void) DPScurrentlinewidth: (CGFloat *)width +{ +} + +- (void) DPScurrentmiterlimit: (CGFloat *)limit +{ +} + +- (void) DPScurrentstrokeadjust: (int *)b +{ +} + +- (void) DPSsetdash: (const CGFloat *)pat : (NSInteger)size : (CGFloat)foffset +{ +} + +- (void) DPSsetflat: (CGFloat)flatness +{ + [super DPSsetflat: flatness]; +} + +- (void) DPSsetlinecap: (int)linecap +{ +} + +- (void) DPSsetlinejoin: (int)linejoin +{ +} + +- (void) DPSsetlinewidth: (CGFloat)width +{ +} + +- (void) DPSsetmiterlimit: (CGFloat)limit +{ +} + +- (void) DPSsetstrokeadjust: (int)b +{ +} + +/* + * Path operations + */ + +- (void) _setPath +{ +} + +- (void) DPSclip +{ +} + +- (void) DPSeoclip +{ +} + +- (void) DPSeofill +{ +} + +- (void) DPSfill +{ +} + +- (void) DPSinitclip +{ +} + +- (void) DPSstroke +{ +} + +- (NSDictionary *) GSReadRect: (NSRect)r +{ + return [NSDictionary dictionary]; +} + +- (void) DPSimage: (NSAffineTransform *)matrix : (NSInteger)pixelsWide + : (NSInteger)pixelsHigh : (NSInteger)bitsPerSample + : (NSInteger)samplesPerPixel : (NSInteger)bitsPerPixel + : (NSInteger)bytesPerRow : (BOOL)isPlanar + : (BOOL)hasAlpha : (NSString *)colorSpaceName + : (const unsigned char *const[5])data +{ +} + +- (void) compositerect: (NSRect)aRect op: (NSCompositingOperation)op +{ +} + +- (void) compositeGState: (HeadlessGState *)source + fromRect: (NSRect)srcRect + toPoint: (NSPoint)destPoint + op: (NSCompositingOperation)op + fraction: (CGFloat)delta +{ +} + +/** Unlike -compositeGState, -drawGSstate fully respects the AppKit CTM but +doesn't support to use the receiver cairo target as the source. */ +- (void) drawGState: (HeadlessGState *)source + fromRect: (NSRect)aRect + toPoint: (NSPoint)aPoint + op: (NSCompositingOperation)op + fraction: (CGFloat)delta +{ +} + +@end + +@implementation HeadlessGState (PatternColor) + +- (void *) saveClip +{ + return NULL; +} + +- (void) restoreClip: (void *)savedClip +{ +} + +@end + +@implementation HeadlessGState (NSGradient) + +- (void) drawGradient: (NSGradient*)gradient + fromCenter: (NSPoint)startCenter + radius: (CGFloat)startRadius + toCenter: (NSPoint)endCenter + radius: (CGFloat)endRadius + options: (NSUInteger)options +{ +} + +- (void) drawGradient: (NSGradient*)gradient + fromPoint: (NSPoint)startPoint + toPoint: (NSPoint)endPoint + options: (NSUInteger)options +{ +} + +@end diff --git a/Source/headlesslib/HeadlessModernSurface.m b/Source/headlesslib/HeadlessModernSurface.m new file mode 100644 index 0000000..a9968be --- /dev/null +++ b/Source/headlesslib/HeadlessModernSurface.m @@ -0,0 +1,54 @@ +/* + Copyright (C) 2011 Free Software Foundation, Inc. + + Author: Eric Wasylishen + + This file is part of GNUstep. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; see the file COPYING.LIB. + If not, see or write to the + Free Software Foundation, 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#include "config.h" +#include "xheadless/XGServer.h" +#include "xheadless/XGServerWindow.h" +#include "headlesslib/HeadlessModernSurface.h" + +#define GSWINDEVICE ((gswindow_device_t *)gsDevice) + +@implementation HeadlessModernSurface + +- (id) initWithDevice: (void *)device +{ + return self; +} + +- (void) dealloc +{ + [super dealloc]; +} + +- (NSSize) size +{ + return GSWINDEVICE->xframe.size; +} + +- (void) handleExposeRect: (NSRect)rect +{ +} + +@end + diff --git a/Source/headlesslib/HeadlessSurface.m b/Source/headlesslib/HeadlessSurface.m new file mode 100644 index 0000000..b351991 --- /dev/null +++ b/Source/headlesslib/HeadlessSurface.m @@ -0,0 +1,72 @@ +/* + Copyright (C) 2004 Free Software Foundation, Inc. + + Author: Banlu Kemiyatorn + + This file is part of GNUstep. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; see the file COPYING.LIB. + If not, see or write to the + Free Software Foundation, 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#include "headlesslib/HeadlessSurface.h" + +@implementation HeadlessSurface + +- (id) initWithDevice: (void *) device +{ + /* TODO FIXME make a more abstract struct for the device */ + [self subclassResponsibility:_cmd]; + + return self; +} + +- (void) dealloc +{ + [super dealloc]; +} + +- (NSString *) description +{ + return [NSString stringWithFormat:@"<%@ %p xr:%p>", [self class], self, _surface]; +} + +-(NSSize) size +{ + [self subclassResponsibility:_cmd]; + return NSMakeSize(0, 0); +} + +- (void) setSize: (NSSize)newSize +{ + [self subclassResponsibility:_cmd]; +} + +- (cairo_surface_t *) surface +{ + return _surface; +} + +- (void) handleExposeRect: (NSRect)rect +{ +} + +- (BOOL) isDrawingToScreen +{ + return YES; +} + +@end diff --git a/Source/xheadless/GNUmakefile b/Source/xheadless/GNUmakefile new file mode 100644 index 0000000..ac33f37 --- /dev/null +++ b/Source/xheadless/GNUmakefile @@ -0,0 +1,46 @@ +# +# Main makefile for GNUstep Backend x11 +# +# Copyright (C) 2002 Free Software Foundation, Inc. +# +# Author: Adam Fedor +# +# This file is part of the GNUstep Backend. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; see the file COPYING.LIB. +# If not, see or write to the +# Free Software Foundation, 51 Franklin Street, Fifth Floor, + +PACKAGE_NAME = gnustep-back +GNUSTEP_LOCAL_ADDITIONAL_MAKEFILES=../../back.make + +include $(GNUSTEP_MAKEFILES)/common.make + +include ../../config.make + +# The library to be compiled, as a library or as a bundle +SUBPROJECT_NAME=xheadless + +# The Objective-C source files to be compiled +xheadless_OBJC_FILES = \ +XGServer.m \ +XGServerEvent.m \ +XGServerWindow.m \ + +-include GNUmakefile.preamble + +include $(GNUSTEP_MAKEFILES)/subproject.make + +-include GNUmakefile.postamble + diff --git a/Source/xheadless/GNUmakefile.preamble b/Source/xheadless/GNUmakefile.preamble new file mode 100644 index 0000000..175547b --- /dev/null +++ b/Source/xheadless/GNUmakefile.preamble @@ -0,0 +1,53 @@ +# +# GNUmakefile.preamble +# +# Copyright (C) 2002 Free Software Foundation, Inc. +# +# Author: Adam Fedor +# +# This file is part of the GNUstep Backend. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; see the file COPYING.LIB. +# If not, see or write to the +# Free Software Foundation, 51 Franklin Street, Fifth Floor, +# Boston, MA 02110-1301, USA. + +# +# Flags dealing with compiling and linking +# + +# Additional flags to pass to the preprocessor +ADDITIONAL_CPPFLAGS += -Wall $(CONFIG_SYSTEM_DEFS) + +# Additional flags to pass to the Objective-C compiler +ADDITIONAL_OBJCFLAGS = + +# Additional flags to pass to the C compiler +ADDITIONAL_CFLAGS = + +# Additional include directories the compiler should search +ADDITIONAL_INCLUDE_DIRS += -I../../Headers \ + -I../$(GNUSTEP_TARGET_DIR) $(GRAPHIC_CFLAGS) + +# Additional LDFLAGS to pass to the linker +ADDITIONAL_LDFLAGS = + +# Additional library directories the linker should search +ADDITIONAL_LIB_DIRS = + +# +# Flags dealing with installing and uninstalling +# + + diff --git a/Source/xheadless/XGServer.m b/Source/xheadless/XGServer.m new file mode 100644 index 0000000..d3bf047 --- /dev/null +++ b/Source/xheadless/XGServer.m @@ -0,0 +1,384 @@ +/* -*- mode:ObjC -*- + XGServer - X11 Server Class + + Copyright (C) 1998,2002 Free Software Foundation, Inc. + + Written by: Adam Fedor + Date: Mar 2002 + + This file is part of the GNU Objective C User Interface Library. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; see the file COPYING.LIB. + If not, see or write to the + Free Software Foundation, 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#include "config.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +/* Terminate cleanly if we get a signal to do so */ +static void +terminate(int sig) +{ + if (nil != NSApp) + { + [NSApp terminate: NSApp]; + } + else + { + exit(1); + } +} + +#include "xheadless/XGServer.h" +#include "xheadless/XGInputServer.h" + +extern int XGErrorHandler(Display *display, XErrorEvent *err); + +@interface XGServer (Window) +- (void) _setupRootWindow; +@end + +@interface XGServer (Private) +- (void) setupRunLoopInputSourcesForMode: (NSString*)mode; +@end + +@interface XGScreenContext : NSObject +{ + RContext *rcontext; + XGDrawMechanism drawMechanism; +} + +- initForDisplay: (Display *)dpy screen: (int)screen_number; +- (XGDrawMechanism) drawMechanism; +- (RContext *) context; +@end + +@implementation XGScreenContext + +- (RContextAttributes *) _getXDefaults +{ + return NULL; +} + +- initForDisplay: (Display *)dpy screen: (int)screen_number +{ + return self; +} + +- (void) dealloc +{ + [super dealloc]; +} + +- (XGDrawMechanism) drawMechanism +{ + return drawMechanism; +} + +- (RContext *) context +{ + return rcontext; +} + +@end + + +/** + + XGServer + +

XGServer is a concrete subclass of GSDisplayServer that handles + X-Window client communications. The class is broken into four sections. + The main class handles setting up and closing down the display, as well + as providing wrapper methods to access display and screen pointers. The + WindowOps category handles window creating, display, movement, and + other functions detailed in the GSDisplayServer(WindowOps) category. + The EventOps category handles events received from X-Windows and the + window manager. It implements the methods defined in the + GSDisplayServer(EventOps) category. The last section + +*/ +@implementation XGServer + +/* Initialize AppKit backend */ ++ (void) initializeBackend +{ + NSDebugLog(@"Initializing GNUstep x11 backend.\n"); + [GSDisplayServer setDefaultServerClass: [XGServer class]]; + signal(SIGTERM, terminate); + signal(SIGINT, terminate); +} + +/** + Returns a pointer to the current X-Windows display variable for + the current context. +*/ ++ (Display*) currentXDisplay +{ + return [(XGServer*)GSCurrentServer() xDisplay]; +} + +- (id) _initXContext +{ + int screen_number = 0, display_number = 0; + NSString *display_name; + + display_name = [server_info objectForKey: GSDisplayName]; + if (display_name == nil) + { + NSString *host = [[NSUserDefaults standardUserDefaults] + stringForKey: @"NSHost"]; + NSString *dn = [server_info objectForKey: GSDisplayNumber]; + NSString *sn = [server_info objectForKey: GSScreenNumber]; + + if (dn || sn) + { + if (dn == NULL) + dn = @"0"; + if (sn == NULL) + sn = @"0"; + if (host == nil) + host = @""; + display_name = [NSString stringWithFormat: @"%@:%@.%@", host, dn,sn]; + } + else if ((host != nil) && ([host isEqual: @""] == NO)) + { + /** + * If the NSHost default told us to display somewhere, we need + * to generate a display name for X from the host name and the + * default display and screen numbers (zero). + */ + display_name = [NSString stringWithFormat: @"%@:0.0", host]; + } + } + + dpy = malloc(sizeof(Display)); //XOpenDisplay(NULL); + + [server_info setObject: display_name forKey: GSDisplayName]; + [server_info setObject: [NSNumber numberWithInt: display_number] + forKey: GSDisplayNumber]; + [server_info setObject: [NSNumber numberWithInt: screen_number] + forKey: GSScreenNumber]; + + /* Setup screen*/ + if (screenList == NULL) + screenList = NSCreateMapTable(NSIntMapKeyCallBacks, + NSObjectMapValueCallBacks, 20); + + defScreen = screen_number; + + [self _setupRootWindow]; + inputServer = nil; + return self; +} + +/** + Opens the X display (using a helper method) and sets up basic + display mechanisms, such as visuals and colormaps. +*/ +- (id) initWithAttributes: (NSDictionary *)info +{ + [super initWithAttributes: info]; + [self _initXContext]; + + [self setupRunLoopInputSourcesForMode: NSDefaultRunLoopMode]; + [self setupRunLoopInputSourcesForMode: NSConnectionReplyMode]; + [self setupRunLoopInputSourcesForMode: NSModalPanelRunLoopMode]; + [self setupRunLoopInputSourcesForMode: NSEventTrackingRunLoopMode]; + return self; +} + +/** + Closes all X resources, the X display and dealloc other ivars. +*/ +- (void) dealloc +{ + NSDebugLog(@"Destroying X11 Server"); + DESTROY(inputServer); + [self _destroyServerWindows]; + NSFreeMapTable(screenList); + //XCloseDisplay(dpy); + free(dpy); + [super dealloc]; +} + +/** + Returns a pointer to the X windows display variable +*/ +- (Display *) xDisplay +{ + return dpy; +} + +- (XGScreenContext *) _screenContextForScreen: (int)screen_number +{ + return nil; +} + +/** + Returns a pointer to a structure which describes aspects of the + X windows display +*/ +- (void *) xrContextForScreen: (int)screen_number +{ + return [[self _screenContextForScreen: screen_number] context]; +} + +- (Visual *) visualForScreen: (int)screen_number +{ + return NULL; +} + +- (int) depthForScreen: (int)screen_number +{ + return 0; +} + +/** + Returns the XGDrawMechanism, which roughly describes the depth of + the screen and how pixels should be drawn to the screen for maximum + speed. +*/ +- (XGDrawMechanism) drawMechanismForScreen: (int)screen_number +{ + return [[self _screenContextForScreen: screen_number] drawMechanism]; +} + +/** + * Used by the art backend to determine the drawing mechanism. + */ +- (void) getForScreen: (int)screen_number pixelFormat: (int *)bpp_number + masks: (int *)red_mask : (int *)green_mask : (int *)blue_mask +{ +} + +/** + Returns the root window of the display +*/ +- (Window) xDisplayRootWindowForScreen: (int)screen_number; +{ + return 0; +} + +/** + Returns the closest color in the current colormap to the indicated + X color +*/ +- (XColor) xColorFromColor: (XColor)color forScreen: (int)screen_number +{ + return color; +} + +/** + Returns the application root window, which is used for many things + such as window hints +*/ +- (Window) xAppRootWindow +{ + return 0; +} + + +/** + Wait for all contexts to finish processing. Only used with XDPS graphics. +*/ ++ (void) waitAllContexts +{ + if ([[GSCurrentContext() class] + respondsToSelector: @selector(waitAllContexts)]) + [[GSCurrentContext() class] waitAllContexts]; +} + +- (void) beep +{ +} + +- glContextClass +{ + return nil; +} + +- glPixelFormatClass +{ + return nil; +} + + +@end + +@implementation XGServer (InputMethod) +- (NSString *) inputMethodStyle +{ + return nil; +} + +- (NSString *) fontSize: (int *)size +{ + return nil; +} + +- (BOOL) clientWindowRect: (NSRect *)rect +{ + return NO; +} + +- (BOOL) statusArea: (NSRect *)rect +{ + return NO; +} + +- (BOOL) preeditArea: (NSRect *)rect +{ + return NO; +} + +- (BOOL) preeditSpot: (NSPoint *)p +{ + return NO; +} + +- (BOOL) setStatusArea: (NSRect *)rect +{ + return NO; +} + +- (BOOL) setPreeditArea: (NSRect *)rect +{ + return NO; +} + +- (BOOL) setPreeditSpot: (NSPoint *)p +{ + return NO; +} + +@end // XGServer (InputMethod) + +//==== End: Additional Code for NSTextView ==================================== diff --git a/Source/xheadless/XGServerEvent.m b/Source/xheadless/XGServerEvent.m new file mode 100644 index 0000000..043272d --- /dev/null +++ b/Source/xheadless/XGServerEvent.m @@ -0,0 +1,369 @@ +/* + XGServerEvent - Window/Event code for X11 backends. + + Copyright (C) 1998,1999 Free Software Foundation, Inc. + + Written by: Adam Fedor + Date: Nov 1998 + + This file is part of the GNU Objective C User Interface Library. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; see the file COPYING.LIB. + If not, see or write to the + Free Software Foundation, 51 Franklin Street, Fifth Floor, +*/ + +#include "config.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "xheadless/XHeadless.h" +#include "xheadless/XGServerWindow.h" +#include "xheadless/XGInputServer.h" +#include "xheadless/XGGeneric.h" + +#include "math.h" + +#if LIB_FOUNDATION_LIBRARY +# include +#elif defined(NeXT_PDO) +# include +# include +#endif + +#define cWin ((gswindow_device_t*)generic.cachedWindow) + +#if 0 +// NumLock's mask (it depends on the keyboard mapping) +static unsigned int _num_lock_mask; + +// Modifier state +static char _shift_pressed = 0; +static char _control_pressed = 0; +static char _command_pressed = 0; +static char _alt_pressed = 0; +static char _help_pressed = 0; + +/* +Keys used for the modifiers (you may set them with user preferences). +Note that the first and second key sym for a modifier must be different. +Otherwise, the _*_pressed tracking will be confused. +*/ +static KeySym _control_keysyms[2]; +static KeySym _command_keysyms[2]; +static KeySym _alt_keysyms[2]; +static KeySym _help_keysyms[2]; + +static BOOL _is_keyboard_initialized = NO; +static BOOL _mod_ignore_shift = NO; + +static BOOL next_event_is_a_keyrepeat; +#endif + +void __objc_xgcontextevent_linking (void) +{ +} + + +#ifdef XSHM +@interface NSGraphicsContext (SharedMemory) +-(void) gotShmCompletion: (Drawable)d; +@end +#endif + +@interface XGServer (Private) +- (void) receivedEvent: (void*)data + type: (RunLoopEventType)type + extra: (void*)extra + forMode: (NSString*)mode; +- (void) setupRunLoopInputSourcesForMode: (NSString*)mode; +- (NSDate*) timedOutEvent: (void*)data + type: (RunLoopEventType)type + forMode: (NSString*)mode; +- (int) XGErrorHandler: (Display*)display : (XErrorEvent*)err; +- (void) processEvent: (XEvent *) event; +- (NSEvent *)_handleTakeFocusAtom: (XEvent)xEvent + forContext: (NSGraphicsContext *)gcontext; +@end + + +int +XGErrorHandler(Display *display, XErrorEvent *err) +{ + XGServer *ctxt = (XGServer*)GSCurrentServer(); + + return [ctxt XGErrorHandler: display : err]; +} + +#if 0 +static NSEvent*process_key_event (XEvent* xEvent, XGServer* ctxt, + NSEventType eventType, NSMutableArray *event_queue); + +static unichar process_char (KeySym keysym, unsigned *eventModifierFlags); + +static unsigned process_modifier_flags(unsigned int state); + +static void initialize_keyboard (void); + +static void set_up_num_lock (void); + +// checks whether a GNUstep modifier (key_sym) is pressed when we're only able +// to check whether X keycodes are pressed in xEvent->xkeymap; +static int check_modifier (XEvent *xEvent, KeySym key_sym) +{ + char *key_vector; + int by,bi; + int key_code = XKeysymToKeycode(xEvent->xkeymap.display, key_sym); + + if (key_code != NoSymbol) + { + by = key_code / 8; + bi = key_code % 8; + key_vector = xEvent->xkeymap.key_vector; + return (key_vector[by] & (1 << bi)); + } + return 0; +} +#endif + +@interface XGServer (WindowOps) +- (void) styleoffsets: (float *) l : (float *) r : (float *) t : (float *) b + : (unsigned int) style : (Window) win; +- (NSRect) _XWinRectToOSWinRect: (NSRect)r for: (void*)windowNumber; +@end + +@implementation XGServer (EventOps) + +- (int) XGErrorHandler: (Display*)display : (XErrorEvent*)err +{ + return 0; +} + +- (void) setupRunLoopInputSourcesForMode: (NSString*)mode +{ +} + +#if LIB_FOUNDATION_LIBRARY +- (void) activity: (NSPosixFileActivities)activity +posixFileDescriptor: (NSPosixFileDescriptor*)fileDescriptor +{ + [self receivedEvent: 0 type: 0 extra: 0 forMode: nil]; +} +#elif defined(NeXT_PDO) +- (void) activityOnFileHandle: (NSNotification*)notification +{ + id fileDescriptor = [notification object]; + id runLoopMode = [[NSRunLoop currentRunLoop] currentMode]; + + [fileDescriptor waitForDataInBackgroundAndNotifyForModes: + [NSArray arrayWithObject: runLoopMode]]; + [self receivedEvent: 0 type: 0 extra: 0 forMode: nil]; +} +#endif + +- (BOOL) runLoopShouldBlock: (BOOL*)trigger +{ + *trigger = YES; // Should trigger this event + return YES; +} + +- (void) receivedEvent: (void*)data + type: (RunLoopEventType)type + extra: (void*)extra + forMode: (NSString*)mode +{ +} + +/* + */ +- (NSPoint) _XPointToOSPoint: (NSPoint)x for: (void*)window +{ + return NSMakePoint(0, 0); +} + + +- (void) processEvent: (XEvent *) event +{ + return; +} + +/* + * WM is asking us to take the keyboard focus + */ +- (NSEvent *)_handleTakeFocusAtom: (XEvent)xEvent + forContext: (NSGraphicsContext *)gcontext +{ + return nil; +} + +#if 0 +// Return the key_sym corresponding to the user defaults string given, +// or fallback if no default is registered. +static KeySym key_sym_from_defaults (Display *display, NSUserDefaults *defaults, + NSString *keyDefaultKey, KeySym fallback) +{ + return fallback; +} + +// This function should be called before any keyboard event is dealed with. +static void initialize_keyboard (void) +{ + _is_keyboard_initialized = YES; +} + + +static void set_up_num_lock (void) +{ + return; +} + +static BOOL keysym_is_X_modifier (KeySym keysym) +{ + return NO; +} + +static NSEvent* process_key_event (XEvent* xEvent, XGServer* context, NSEventType eventType, NSMutableArray *event_queue) +{ + return nil; +} + +static unichar process_char (KeySym keysym, unsigned *eventModifierFlags) +{ + return 0; +} + +// process_modifier_flags() determines which modifier keys (Command, Control, +// Shift, and so forth) were held down while the event occured. +static unsigned int process_modifier_flags(unsigned int state) +{ + return 0; +} +#endif + +- (NSDate*) timedOutEvent: (void*)data + type: (RunLoopEventType)type + forMode: (NSString*)mode +{ + return nil; +} + +/* Drag and Drop */ +- (id )dragInfo +{ + return nil; +} + +@end + +@implementation XGServer (XSync) +- (BOOL) xSyncMap: (void*)windowHandle +{ + return NO; +} +@end + +@implementation XGServer (X11Ops) + +/* + * Return mouse location in base coords ignoring the event loop + */ +- (NSPoint) mouselocation +{ + return [self mouseLocationOnScreen: defScreen window: NULL]; +} + +- (NSPoint) mouseLocationOnScreen: (int)screen window: (NSInteger *)win +{ + return NSMakePoint(0, 0); +} + +- (NSEvent*) getEventMatchingMask: (unsigned)mask + beforeDate: (NSDate*)limit + inMode: (NSString*)mode + dequeue: (BOOL)flag +{ + [self receivedEvent: 0 type: 0 extra: 0 forMode: nil]; + return [super getEventMatchingMask: mask + beforeDate: limit + inMode: mode + dequeue: flag]; +} + +- (void) discardEventsMatchingMask: (unsigned)mask + beforeEvent: (NSEvent*)limit +{ + [self receivedEvent: 0 type: 0 extra: 0 forMode: nil]; + [super discardEventsMatchingMask: mask + beforeEvent: limit]; +} + +@end + +@implementation XGServer (TimeKeeping) +// Sync time with X server every 10 seconds +#define MAX_TIME_DIFF 10 +// Regard an X time stamp as valid for half a second +#define OUT_DATE_TIME_DIFF 0.5 + +- (void) setLastTime: (Time)last +{ + if (generic.lastTimeStamp == 0 + || generic.baseXServerTime + MAX_TIME_DIFF * 1000 < last) + { + // We have not sync'ed with the clock for at least + // MAX_TIME_DIFF seconds ... so we do it now. + generic.lastTimeStamp = [NSDate timeIntervalSinceReferenceDate]; + generic.baseXServerTime = last; + } + else + { + // Optimisation to compute the new time stamp instead. + generic.lastTimeStamp += (last - generic.lastTime) / 1000.0; + } + + generic.lastTime = last; +} + +- (Time) lastTime +{ + // In the case of activation via DO the lastTime is outdated and cannot be used. + if (generic.lastTimeStamp == 0 + || ((generic.lastTimeStamp + OUT_DATE_TIME_DIFF) + < [NSDate timeIntervalSinceReferenceDate])) + { + return [[NSDate date] timeIntervalSince1970]; + } + else + { + return generic.lastTime; + } +} + +@end + diff --git a/Source/xheadless/XGServerWindow.m b/Source/xheadless/XGServerWindow.m new file mode 100644 index 0000000..1f811b8 --- /dev/null +++ b/Source/xheadless/XGServerWindow.m @@ -0,0 +1,822 @@ +/* XGServerWindows - methods for window/screen handling + + Copyright (C) 1999 Free Software Foundation, Inc. + + Written by: Adam Fedor + Date: Nov 1999 + + This file is part of GNUstep + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; see the file COPYING.LIB. + If not, see or write to the + Free Software Foundation, 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#include "config.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef HAVE_UNISTD_H +#include +#endif + +#include +#include +#include +#include + +#define ROOT generic.appRootWindow + +static BOOL handlesWindowDecorations = YES; + +#define WINDOW_WITH_TAG(windowNumber) (gswindow_device_t *)NSMapGet(windowtags, (void *)(uintptr_t)windowNumber) + +/* Keep track of windows */ +static NSMapTable *windowmaps = NULL; +static NSMapTable *windowtags = NULL; + +/* Track used window numbers */ +static int last_win_num = 0; + + +@interface NSCursor (BackendPrivate) +- (void *)_cid; +@end + +@interface NSBitmapImageRep (GSPrivate) +- (NSBitmapImageRep *) _convertToFormatBitsPerSample: (NSInteger)bps + samplesPerPixel: (NSInteger)spp + hasAlpha: (BOOL)alpha + isPlanar: (BOOL)isPlanar + colorSpaceName: (NSString*)colorSpaceName + bitmapFormat: (NSBitmapFormat)bitmapFormat + bytesPerRow: (NSInteger)rowBytes + bitsPerPixel: (NSInteger)pixelBits; +@end + +void __objc_xgcontextwindow_linking (void) +{ +} + +/* + * The next two functions derived from WindowMaker by Alfredo K. Kojima + */ +static unsigned char*PropGetCheckProperty(Display *dpy, Window window, Atom hint, Atom type, + int format, int count, int *retCount) +{ + return NULL; +} + +/* + * Setting Motif Hints for Window Managers (Nicola Pero, July 2000) + */ + +/* + * Motif window hints to communicate to a window manager + * that we want a window to have a titlebar/resize button/etc. + */ + +/* Motif window hints struct */ +typedef struct { + unsigned long flags; + unsigned long functions; + unsigned long decorations; + unsigned long input_mode; + unsigned long status; +} MwmHints; + +/* Number of entries in the struct */ +#define PROP_MWM_HINTS_ELEMENTS 5 + +/* Now for each field in the struct, meaningful stuff to put in: */ + +/* flags */ +#define MWM_HINTS_FUNCTIONS (1L << 0) +#define MWM_HINTS_DECORATIONS (1L << 1) +#define MWM_HINTS_INPUT_MODE (1L << 2) +#define MWM_HINTS_STATUS (1L << 3) + +/* functions */ +#define MWM_FUNC_ALL (1L << 0) +#define MWM_FUNC_RESIZE (1L << 1) +#define MWM_FUNC_MOVE (1L << 2) +#define MWM_FUNC_MINIMIZE (1L << 3) +#define MWM_FUNC_MAXIMIZE (1L << 4) +#define MWM_FUNC_CLOSE (1L << 5) + +/* decorations */ +#define MWM_DECOR_ALL (1L << 0) +#define MWM_DECOR_BORDER (1L << 1) +#define MWM_DECOR_RESIZEH (1L << 2) +#define MWM_DECOR_TITLE (1L << 3) +#define MWM_DECOR_MENU (1L << 4) +#define MWM_DECOR_MINIMIZE (1L << 5) +#define MWM_DECOR_MAXIMIZE (1L << 6) + +/* We don't use the input_mode and status fields */ + +/* The atom */ +#define _XA_MOTIF_WM_HINTS "_MOTIF_WM_HINTS" + + +/* Now the code */ + +/* + * End of motif hints for window manager code + */ + + +@interface NSEvent (WindowHack) +- (void) _patchLocation: (NSPoint)loc; +@end + +@implementation NSEvent (WindowHack) +- (void) _patchLocation: (NSPoint)loc +{ + location_point = loc; +} +@end + +@interface XGServer (WindowOps) +- (gswindow_device_t *) _rootWindowForScreen: (int)screen; +- (void) styleoffsets: (float *) l : (float *) r : (float *) t : (float *) b + : (unsigned int) style : (Window) win; +- (void) _setSupportedWMProtocols: (gswindow_device_t *) window; +@end + +@implementation XGServer (WindowOps) + +- (BOOL) handlesWindowDecorations +{ + return handlesWindowDecorations; +} + + +/* + * Where a window has been reparented by the wm, we use this method to + * locate the window given knowledge of its border window. + */ ++ (gswindow_device_t *) _windowForXParent: (Window)xWindow +{ + NSMapEnumerator enumerator; + void *key; + gswindow_device_t *d; + + enumerator = NSEnumerateMapTable(windowmaps); + while (NSNextMapEnumeratorPair(&enumerator, &key, (void**)&d) == YES) + { + if (d->root != d->parent && d->parent == xWindow) + { + return d; + } + } + return 0; +} + ++ (gswindow_device_t *) _windowForXWindow: (Window)xWindow +{ + return NSMapGet(windowmaps, (void *)xWindow); +} + ++ (gswindow_device_t *) _windowWithTag: (NSInteger)windowNumber +{ + return WINDOW_WITH_TAG(windowNumber); +} + +/* + * Convert a window frame in OpenStep absolute screen coordinates to + * a frame in X absolute screen coordinates by flipping an applying + * offsets to allow for the X window decorations. + * The result is the rectangle of the window we can actually draw + * to (in the X coordinate system). + */ +- (NSRect) _OSFrameToXFrame: (NSRect)o for: (void*)window +{ + return NSMakeRect(0, 0, 0, 0); +} + +/* + * Convert a window frame in OpenStep absolute screen coordinates to + * a frame suitable for setting X hints for a window manager. + * NB. Hints use the coordinates of the parent decoration window, + * but the size of the actual window. + */ +- (NSRect) _OSFrameToXHints: (NSRect)o for: (void*)window +{ + return NSMakeRect(0, 0, 0, 0); +} + +/* + * Convert a rectangle in X coordinates relative to the X-window + * to a rectangle in OpenStep coordinates (base coordinates of the NSWindow). + */ +- (NSRect) _XWinRectToOSWinRect: (NSRect)x for: (void*)window +{ + return NSMakeRect(0, 0, 0, 0); +} + +/* + * Convert a window frame in X absolute screen coordinates to a frame + * in OpenStep absolute screen coordinates by flipping an applying + * offsets to allow for the X window decorations. + */ +- (NSRect) _XFrameToOSFrame: (NSRect)x for: (void*)window +{ + return NSMakeRect(0, 0, 0, 0); +} + +/* + * Convert a window frame in X absolute screen coordinates to + * a frame suitable for setting X hints for a window manager. + */ +- (NSRect) _XFrameToXHints: (NSRect)o for: (void*)window +{ + return NSMakeRect(0, 0, 0, 0); +} + +- (void)_sendRoot: (Window)root + type: (Atom)type + window: (Window)window + data0: (long)data0 + data1: (long)data1 + data2: (long)data2 + data3: (long)data3 +{ +} + +/* + * Check if the window manager supports a feature. + */ +- (BOOL) _checkWMSupports: (Atom)feature +{ + return NO; +} + +Bool _get_next_prop_new_event(Display *display, XEvent *event, char *arg) +{ + return False; +} + +- (BOOL) _tryRequestFrameExtents: (gswindow_device_t *)window +{ + return NO; +} + +- (BOOL) _checkStyle: (unsigned)style +{ + NSDebugLLog(@"Offset", @"Checking offsets for style %d\n", style); + return NO; +} + +- (XGWMProtocols) _checkWindowManager +{ + return XGWM_UNKNOWN; +} + +- (gswindow_device_t *) _rootWindowForScreen: (int)screen +{ + gswindow_device_t *window; + + /* Screen number is negative to avoid conflict with windows */ + window = WINDOW_WITH_TAG(-screen); + if (window) + return window; + + window = NSAllocateCollectable(sizeof(gswindow_device_t), NSScannedOption); + memset(window, '\0', sizeof(gswindow_device_t)); + + window->display = dpy; + window->screen = screen; + window->ident = 0; //RootWindow(dpy, screen); + window->root = window->ident; + window->type = NSBackingStoreNonretained; + window->number = -screen; + window->map_state = IsViewable; + window->visibility = -1; + window->wm_state = NormalState; + window->xframe = NSMakeRect(0, 0, 0, 0); + NSMapInsert (windowtags, (void*)(uintptr_t)window->number, window); + NSMapInsert (windowmaps, (void*)(uintptr_t)window->ident, window); + return window; +} + +/* Create the window and screen list if necessary, add the root window to + the window list as window 0 */ +- (void) _checkWindowlist +{ + if (windowmaps) + return; + + windowmaps = NSCreateMapTable(NSNonOwnedPointerMapKeyCallBacks, + NSNonOwnedPointerMapValueCallBacks, 20); + windowtags = NSCreateMapTable(NSIntMapKeyCallBacks, + NSNonOwnedPointerMapValueCallBacks, 20); +} + +- (void) _setupMouse +{ +} + +- (void) _setSupportedWMProtocols: (gswindow_device_t *) window +{ +} + +- (void) _setupRootWindow +{ + /* + * Initialize time of last events to be the start of time - not + * the current time! + */ + generic.lastClick = 1; + generic.lastMotion = 1; + generic.lastTime = 1; + + /* + * Set up standard atoms. + */ + + [self _checkWindowlist]; + handlesWindowDecorations = NO; + return; +} + +/* Destroys all the windows and other window resources that belong to + this context */ +- (void) _destroyServerWindows +{ + void *key; + gswindow_device_t *d; + NSMapEnumerator enumerator; + NSMapTable *mapcopy; + + /* Have to get a copy, since termwindow will remove them from + the map table */ + mapcopy = NSCopyMapTableWithZone(windowtags, [self zone]); + enumerator = NSEnumerateMapTable(mapcopy); + while (NSNextMapEnumeratorPair(&enumerator, &key, (void**)&d) == YES) + { + if (d->display == dpy && d->ident != d->root) + [self termwindow: (NSInteger)(intptr_t)key]; + } + NSFreeMapTable(mapcopy); +} + +/* Sets up a backing pixmap when a window is created or resized. This is + only done if the Window is buffered or retained. */ +- (void) _createBuffer: (gswindow_device_t *)window +{ +} + +/* + * Code to build up a NET WM icon from our application icon + */ + +-(BOOL) _createNetIcon: (NSImage*)image + result: (long**)pixeldata + size: (int*)size +{ + return NO; +} + +- (void) _setNetWMIconFor: (Window) window +{ +} + +- (NSInteger) window: (NSRect)frame : (NSBackingStoreType)type : (unsigned int)style : (int)screen +{ + gswindow_device_t *window; + + NSDebugLLog(@"XGTrace", @"DPSwindow: %@ %d", NSStringFromRect(frame), (int)type); + + /* Create the window structure and set the style early so we can use it to + convert frames. */ + window = NSAllocateCollectable(sizeof(gswindow_device_t), NSScannedOption); + memset(window, '\0', sizeof(gswindow_device_t)); + + /* + * FIXME - should this be protected by a lock for thread safety? + * generate a unique tag for this new window. + */ + do + { + last_win_num++; + } + while (last_win_num == 0 || WINDOW_WITH_TAG(last_win_num) != 0); + window->number = last_win_num; + + // Insert window into the mapping + NSMapInsert(windowmaps, (void*)(uintptr_t)window->ident, window); + NSMapInsert(windowtags, (void*)(uintptr_t)window->number, window); + [self _setWindowOwnedByServer: window->number]; + + return window->number; +} + +- (NSInteger) nativeWindow: (void *)winref : (NSRect*)frame : (NSBackingStoreType*)type + : (unsigned int*)style : (int*)screen +{ + return 0; +} + +- (void) termwindow: (NSInteger)win +{ +} + +/* + * Return the offsets between the window content-view and it's frame + * depending on the window style. + */ +- (void) styleoffsets: (float *) l : (float *) r : (float *) t : (float *) b + : (unsigned int) style +{ + [self styleoffsets: l : r : t : b : style : (Window) 0]; +} + +- (void) styleoffsets: (float *) l : (float *) r : (float *) t : (float *) b + : (unsigned int) style : (Window) win +{ +} + +- (void) stylewindow: (unsigned int)style : (NSInteger) win +{ +} + +- (void) setbackgroundcolor: (NSColor *)color : (NSInteger)win +{ +} + +- (void) windowbacking: (NSBackingStoreType)type : (NSInteger) win +{ +} + +- (void) titlewindow: (NSString *)window_title : (NSInteger) win +{ +} + +- (void) docedited: (int)edited : (NSInteger) win +{ +} + +- (BOOL) appOwnsMiniwindow +{ + return generic.flags.appOwnsMiniwindow; +} + +- (void) miniwindow: (NSInteger) win +{ +} + +/** + Make sure we have the most up-to-date window information and then + make sure the context has our new information +*/ +- (void) setWindowdevice: (NSInteger)win forContext: (NSGraphicsContext *)ctxt +{ +} + +-(int) _createAppIconPixmaps +{ + return 1; +} + +- (void) orderwindow: (int)op : (NSInteger)otherWin : (NSInteger)winNum +{ +} + +#define ALPHA_THRESHOLD 158 + +/* Restrict the displayed part of the window to the given image. + This only yields usefull results if the window is borderless and + displays the image itself */ +- (void) restrictWindow: (NSInteger)win toImage: (NSImage*)image +{ +} + +/* This method is a fast implementation of move that only works + correctly for borderless windows. Use with caution. */ +- (void) movewindow: (NSPoint)loc : (NSInteger)win +{ +} + +- (void) placewindow: (NSRect)rect : (NSInteger)win +{ +} + +- (BOOL) findwindow: (NSPoint)loc : (int) op : (NSInteger) otherWin : (NSPoint *)floc +: (int*) winFound +{ + return NO; +} + +- (NSRect) windowbounds: (NSInteger)win +{ + + return NSMakeRect(0, 0, 0, 0); +} + +- (void) setwindowlevel: (int)level : (NSInteger)win +{ +} + +- (int) windowlevel: (NSInteger)win +{ + return 0; +} + +- (NSArray *) windowlist +{ + return [NSMutableArray array]; +} + +- (int) windowdepth: (NSInteger)win +{ + return 0; +} + +- (void) setmaxsize: (NSSize)size : (NSInteger)win +{ +} + +- (void) setminsize: (NSSize)size : (NSInteger)win +{ +} + +- (void) setresizeincrements: (NSSize)size : (NSInteger)win +{ +} + +// process expose event +- (void) _addExposedRectangle: (XRectangle)rectangle : (NSInteger)win : (BOOL) ignoreBacking +{ +} + +- (void) flushwindowrect: (NSRect)rect : (NSInteger)win +{ +} + +// handle X expose events +- (void) _processExposedRectangles: (NSInteger)win +{ +} + +- (BOOL) capturemouse: (NSInteger)win +{ + return NO; +} + +- (void) setMouseLocation: (NSPoint)mouseLocation onScreen: (int)aScreen +{ +} + +- (void) setinputfocus: (NSInteger)win +{ +} + +/* + * Instruct window manager that the specified window is 'key', 'main', or + * just a normal window. + */ +- (void) setinputstate: (int)st : (NSInteger)win +{ +} + +/** Sets the transparancy value for the whole window */ +- (void) setalpha: (float)alpha : (NSInteger) win +{ +} + +- (float) getAlpha: (NSInteger)win +{ + return 1; +} + +- (void *) serverDevice +{ + return dpy; +} + +- (void *) windowDevice: (NSInteger)win +{ + return (void *)NULL; +} + +/* Cursor Ops */ +static BOOL cursor_hidden = NO; + +- (Cursor) _blankCursor +{ + return None; +} + +/* + set the cursor for a newly created window. +*/ + +- (void) _initializeCursorForXWindow: (Window) win +{ +} + + +/* + set cursor on all XWindows we own. if `set' is NO + the cursor is unset on all windows. + Normally the cursor `c' correspond to the [NSCursor currentCursor] + The only exception should be when the cursor is hidden. + In that case `c' will be a blank cursor. +*/ + +- (void) _DPSsetcursor: (Cursor)c : (BOOL)set +{ +} + +#define ALPHA_THRESHOLD 158 + +Pixmap +xgps_cursor_mask(Display *xdpy, Drawable draw, const unsigned char *data, + int w, int h, int colors) +{ + return 0; +} + +Pixmap +xgps_cursor_image(Display *xdpy, Drawable draw, const unsigned char *data, + int w, int h, int colors, XColor *fg, XColor *bg) +{ + return None; +} + +- (void) hidecursor +{ + cursor_hidden = YES; +} + +- (void) showcursor +{ + cursor_hidden = NO; +} + +- (void) standardcursor: (int)style : (void **)cid +{ +} + +- (void) imagecursor: (NSPoint)hotp : (NSImage *)image : (void **)cid +{ +} + +- (void) recolorcursor: (NSColor *)fg : (NSColor *)bg : (void*) cid +{ + +} + +- (void) setcursor: (void*) cid +{ +} + +- (void) freecursor: (void*) cid +{ +} + +- (NSArray *)screenList +{ + NSMutableArray *screens = [NSMutableArray arrayWithCapacity: 1]; + [screens addObject: [NSNumber numberWithInt: defScreen]]; + + return screens; +} + +- (NSWindowDepth) windowDepthForScreen: (int) screen_num +{ + return 0; +} + +- (const NSWindowDepth *) availableDepthsForScreen: (int) screen_num +{ + return NULL; +} + +- (NSSize) resolutionForScreen: (int)screen_num +{ + // NOTE: + // -gui now trusts the return value of resolutionForScreen:, + // so if it is not {72, 72} then the entire UI will be scaled. + // + // I commented out the implementation below because it may not + // be safe to use the DPI value we get from the X server. + // (i.e. I don't know if it will be a "fake" DPI like 72 or 96, + // or a real measurement reported from the monitor's firmware + // (possibly incorrect?)) + // More research needs to be done. + + return NSMakeSize(72, 72); +} + +- (NSRect) boundsForScreen: (int)screen +{ + return NSMakeRect(0, 0, 400, 400); +} + +- (NSImage *) iconTileImage +{ + return nil; +} + +- (NSSize) iconSize +{ + return [super iconSize]; +} + +- (unsigned int) numberOfDesktops: (int)screen +{ + return 1; +} + +- (NSArray *) namesOfDesktops: (int)screen +{ + return nil; +} + +- (unsigned int) desktopNumberForScreen: (int)screen +{ + return 0; +} + +- (void) setDesktopNumber: (unsigned int)workspace forScreen: (int)screen +{ +} + +- (unsigned int) desktopNumberForWindow: (int)win +{ + return 0; +} + +- (void) setDesktopNumber: (unsigned int)workspace forWindow: (int)win +{ +} + +- (void) setShadow: (BOOL)hasShadow : (int)win +{ +} + +- (BOOL) hasShadow: (int)win +{ + return NO; +} + +/* + * Check whether the window is miniaturized according to the ICCCM window + * state property. + */ +- (int) _wm_state: (Window)win +{ + return WithdrawnState; +} + +/* + * Check whether the EWMH window state includes the _NET_WM_STATE_HIDDEN + * state. On EWMH, a window is iconified if it is iconic state and the + * _NET_WM_STATE_HIDDEN is present. + */ +- (BOOL) _ewmh_isHidden: (Window)win +{ + return NO; +} + +- (void) setParentWindow: (NSInteger)parentWin + forChildWindow: (NSInteger)childWin +{ +} + +- (void) setIgnoreMouse: (BOOL)ignoreMouse : (int)win +{ +} + +@end