public DrawingTopLevelWindow(Widget parent, String name, int x, int y, int width, int height) : base(parent, name, x, y, width, height) { this.toolkit = ((IToolkitWindow)(parent.Parent)).Toolkit; this.AutoMapChildren = false; }
// Constructor. internal Screen(Display dpy, int number, IntPtr screen) { // Copy parameters in from the create process. this.dpy = dpy; this.number = number; this.screen = screen; // Create the root window instance for this screen. rootWindow = new Xsharp.RootWindow (dpy, this, Xlib.XRootWindowOfScreen(screen)); // Get the default root visual for this screen. visual = Xlib.XDefaultVisualOfScreen(screen); // Create a "Colormap" object for the default colormap. defaultColormap = new Colormap (dpy, this, Xlib.XDefaultColormapOfScreen(screen)); // Create the GC cache. defaultGCs = new IntPtr [GCCacheSize]; bitmapGCs = new IntPtr [GCCacheSize]; // Initialize the standard colors. InitStandardColors(); // Create the placeholder window for parent-less widgets. placeholder = new PlaceholderWindow(rootWindow); // Create the grab window for managing popup window events. grabWindow = new GrabWindow(rootWindow); }
// Constructor. internal Widget(Display dpy, Screen screen, DrawableKind kind, Widget parent) : base(dpy, screen, kind) { // Set the initial widget properties. cursor = null; autoMapChildren = true; sensitive = true; // Insert this widget into the widget tree under its parent. this.parent = parent; this.topChild = null; this.nextAbove = null; if(parent != null) { ancestorSensitive = (parent.sensitive && parent.ancestorSensitive); nextBelow = parent.topChild; if(parent.topChild != null) { parent.topChild.nextAbove = this; } parent.topChild = this; } else { ancestorSensitive = true; nextBelow = null; } this.eventMask = 0; }
// Constructor. public PlaceholderWindow(Widget parent) : base(parent, 0, 0, 1, 1, new Color(StandardColor.Foreground), new Color(StandardColor.Background), true, true) { autoMapChildren = false; }
// Constructor. internal OverrideWindow(Widget parent, int x, int y, int width, int height) : base(parent, x, y, width, height, new Color(StandardColor.Foreground), new Color(StandardColor.Background), true, true) { // Nothing to do here. }
// Constructor. public DrawingMdiClient (IToolkit toolkit, Widget parent, int x, int y, int width, int height, IToolkitEventSink sink) : base(parent, x, y, width, height) { this.sink = sink; this.toolkit = toolkit; this.AutoMapChildren = false; }
// Constructor. public GrabWindow(Widget parent) : base(parent, -1, -1, 1, 1) { // Create the initial list of popup windows. list = new PopupWindow [0]; // The grab window is always mapped, but just off-screen // so that it isn't visible to the user. Map(); }
// Constructor. public DrawingToolkit() { // Create an Xsharp application instance. app = new Xsharp.Application(null, null); // Register the additional fonts that we required. RegisterFonts(); // Get the placeholder widget for the screen. placeholder = app.Display.DefaultScreenOfDisplay.Placeholder; // Track changes to RESOURCE_MANAGER on the root window. app.Display.DefaultScreenOfDisplay.RootWindow.ResourcesChanged += new EventHandler(ResourcesChanged); // And then load the initial state. LoadResources(); }
/// <summary> /// <para>Constructs a new <see cref="T:Xsharp.MdiClientWidget"/> /// instance underneath a specified parent widget.</para> /// </summary> /// /// <param name="parent"> /// <para>The parent of the new widget.</para> /// </param> /// /// <param name="x"> /// <para>The X co-ordinate of the top-left corner of /// the new widget.</para> /// </param> /// /// <param name="y"> /// <para>The Y co-ordinate of the top-left corner of /// the new widget.</para> /// </param> /// /// <param name="width"> /// <para>The width of the new widget.</para> /// </param> /// /// <param name="height"> /// <para>The height of the new widget.</para> /// </param> /// /// <exception cref="T:System.ArgumentNullException"> /// <para>Raised if <paramref name="parent"/> is <see langword="null"/>. /// </para> /// </exception> /// /// <exception cref="T:Xsharp.XException"> /// <para>Raised if <paramref name="x"/>, <paramref name="y"/>, /// <paramref name="width"/>, or <paramref name="height"/> are /// out of range.</para> /// </exception> /// /// <exception cref="T.Xsharp.XInvalidOperationException"> /// <para>Raised if <paramref name="parent"/> is disposed, the /// root window, or an input-only window.</para> /// </exception> public MdiClientWidget(Widget parent, int x, int y, int width, int height) : base(parent, x, y, width, height, new Color(StandardColor.Foreground), new Color(StandardColor.BottomShadow)) { AutoMapChildren = false; Focusable = false; TopLevel.mdiClient = this; cascadeOffset = 0; // Create the button widgets for displaying window controls // in the menu area of the top-level window. minimize = new CaptionButtonWidget (parent, 0, 0, 14, 14, this, CaptionWidget.CaptionFlags.HasMinimize); restore = new CaptionButtonWidget (parent, 0, 0, 14, 14, this, CaptionWidget.CaptionFlags.HasRestore); close = new CaptionButtonWidget (parent, 0, 0, 14, 14, this, CaptionWidget.CaptionFlags.HasClose); }
/// <summary> /// <para>Method that is called when the keyboard focus leaves /// this widget.</para> /// </summary> /// /// <param name="other"> /// <para>The new widget within the same top-level window that will receive /// the focus, or <see langword="null"/> if the focus is leaving the /// top-level window.</para> /// </param> protected virtual void OnFocusOut(Widget other) { // Nothing to do in this class. }
/// <summary> /// <para>Method that is called when the mouse pointer leaves /// this widget.</para> /// </summary> /// /// <param name="child"> /// <para>The child widget that contained the previous or final /// position, or <see langword="null"/> if no applicable child /// widget.</para> /// </param> /// /// <param name="x"> /// <para>The X co-ordinate of the pointer position.</para> /// </param> /// /// <param name="y"> /// <para>The Y co-ordinate of the pointer position.</para> /// </param> /// /// <param name="modifiers"> /// <para>Button and shift flags that were active.</para> /// </param> /// /// <param name="mode"> /// <para>The notification mode value from the event.</para> /// </param> /// /// <param name="detail"> /// <para>The notification detail value from the event.</para> /// </param> protected virtual void OnLeave(Widget child, int x, int y, ModifierMask modifiers, CrossingMode mode, CrossingDetail detail) { // Nothing to do in this class. }
// Get the screen associated with a parent widget. private static Screen GetScreen(Widget parent) { if(parent != null) { return parent.Screen; } else { return null; } }
// Get the display associated with a parent widget, and also // validate the widget. private static Display GetDisplay(Widget parent, bool rootAllowed) { if(parent == null) { throw new ArgumentNullException("parent"); } if(!rootAllowed && parent is RootWindow) { throw new XInvalidOperationException (S._("X_NonRootParent")); } return parent.Display; }
// Internal constructor that is used by the "InputOutputWidget" subclass. internal InputOnlyWidget(Widget parent, int x, int y, int width, int height, Color background, bool rootAllowed, bool overrideRedirect) : base(GetDisplay(parent, rootAllowed), GetScreen(parent), DrawableKind.Widget, parent) { bool ok = false; try { // Validate the position and size. if(x < -32768 || x > 32767 || y < -32768 || y > 32767) { throw new XException(S._("X_InvalidPosition")); } if(width < 1 || width > 32767 || height < 1 || height > 32767 || !ValidateSize(width, height)) { throw new XException(S._("X_InvalidSize")); } // Set the initial position and size of the widget. this.x = x; this.y = y; this.width = width; this.height = height; this.focusable = true; // Lock down the display and create the window handle. try { IntPtr display = dpy.Lock(); XWindow pwindow = parent.GetWidgetHandle(); XSetWindowAttributes attrs = new XSetWindowAttributes(); attrs.override_redirect = overrideRedirect; XWindow window = Xlib.XCreateWindow (display, pwindow, x, y, (uint)width, (uint)height, (uint)0, screen.DefaultDepth, 1 /* InputOutput */, screen.DefaultVisual, (uint)(CreateWindowMask.CWOverrideRedirect), ref attrs); SetWidgetHandle(window); if(background.Index == StandardColor.Inherit) { Xlib.XSetWindowBackgroundPixmap (display, window, XPixmap.ParentRelative); } else { Xlib.XSetWindowBackground(display, window, ToPixel(background)); } if(parent.AutoMapChildren) { Xlib.XMapWindow(display, window); mapped = true; } } finally { dpy.Unlock(); } // Push the widget down to the default layer. layer = 0x7FFFFFFF; Layer = 0; ok = true; // Select for mouse events. SelectInput(EventMask.ButtonPressMask | EventMask.ButtonReleaseMask | EventMask.EnterWindowMask | EventMask.LeaveWindowMask | EventMask.PointerMotionMask); } finally { if(!ok) { // Creation failed, so detach ourselves from // the parent's widget tree. Detach(false); } } }
// Constructor. public CaptionButtonWidget(Widget parent, int x, int y, int width, int height, MdiClientWidget mdi, CaptionWidget.CaptionFlags flags) : base(parent, x, y, width, height) { this.mdi = mdi; this.flags = flags; this.pressed = false; this.Layer = 10; }
/// <summary> /// <para>Constructs a new <see cref="T:Xsharp.InputOnlyWidget"/> /// instance underneath a specified parent widget.</para> /// </summary> /// /// <param name="parent"> /// <para>The parent of the new widget.</para> /// </param> /// /// <param name="x"> /// <para>The X co-ordinate of the top-left corner of /// the new widget.</para> /// </param> /// /// <param name="y"> /// <para>The Y co-ordinate of the top-left corner of /// the new widget.</para> /// </param> /// /// <param name="width"> /// <para>The width of the new widget.</para> /// </param> /// /// <param name="height"> /// <para>The height of the new widget.</para> /// </param> /// /// <exception cref="T:System.ArgumentNullException"> /// <para>Raised if <paramref name="parent"/> is <see langword="null"/>. /// </para> /// </exception> /// /// <exception cref="T:Xsharp.XException"> /// <para>Raised if <paramref name="x"/>, <paramref name="y"/>, /// <paramref name="width"/>, or <paramref name="height"/> are /// out of range.</para> /// </exception> /// /// <exception cref="T.Xsharp.XInvalidOperationException"> /// <para>Raised if <paramref name="parent"/> is disposed or the /// root window.</para> /// </exception> public InputOnlyWidget(Widget parent, int x, int y, int width, int height) : base(GetDisplay(parent, false), GetScreen(parent), DrawableKind.InputOnlyWidget, parent) { bool ok = false; try { // Validate the position and size. if(x < -32768 || x > 32767 || y < -32768 || y > 32767) { throw new XException(S._("X_InvalidPosition")); } if(width < 1 || width > 32767 || height < 1 || height > 32767 || !ValidateSize(width, height)) { throw new XException(S._("X_InvalidSize")); } // Set the initial position and size of the widget. this.x = x; this.y = y; this.width = width; this.height = height; this.focusable = true; // Lock down the display and create the window handle. try { IntPtr display = dpy.Lock(); XWindow pwindow = parent.GetWidgetHandle(); XWindow window = Xlib.XCreateWindow (display, pwindow, x, y, (uint)width, (uint)height, (uint)0, 0 /* depth */, 2 /* InputOnly */, screen.DefaultVisual, (uint)0, IntPtr.Zero); SetWidgetHandle(window); if(parent.AutoMapChildren) { Xlib.XMapWindow(display, window); mapped = true; } } finally { dpy.Unlock(); } // Push the widget down to the default layer. layer = 0x7FFFFFFF; Layer = 0; ok = true; // Select for mouse events. SelectInput(EventMask.ButtonPressMask | EventMask.ButtonReleaseMask | EventMask.EnterWindowMask | EventMask.LeaveWindowMask | EventMask.PointerMotionMask); } finally { if(!ok) { // Creation failed, so detach ourselves from // the parent's widget tree. Detach(false); } } }
/// <summary> /// <para>Constructs a new <see cref="T:Xsharp.EmbeddedApplication"/> /// instance.</para> /// </summary> /// /// <param name="parent"> /// <para>The parent of the new widget.</para> /// </param> /// /// <param name="x"> /// <para>The X co-ordinate of the top-left corner of /// the new widget.</para> /// </param> /// /// <param name="y"> /// <para>The Y co-ordinate of the top-left corner of /// the new widget.</para> /// </param> /// /// <param name="width"> /// <para>The width of the new window.</para> /// </param> /// /// <param name="height"> /// <para>The height of the new window.</para> /// </param> /// /// <param name="program"> /// <para>The name of the program to execute.</para> /// </param> /// /// <param name="args"> /// <para>The command-line arguments to pass to the program.</para> /// </param> /// /// <exception cref="T:System.ArgumentNullException"> /// <para>Raised if <paramref name="parent"/> is <see langword="null"/>. /// </para> /// </exception> /// /// <exception cref="T:Xsharp.XException"> /// <para>Raised if <paramref name="x"/>, <paramref name="y"/>, /// <paramref name="width"/>, or <paramref name="height"/> are /// out of range.</para> /// </exception> /// /// <exception cref="T.Xsharp.XInvalidOperationException"> /// <para>Raised if <paramref name="parent"/> is disposed, the /// root window, or an input-only window.</para> /// </exception> public EmbeddedApplication(Widget parent, int x, int y, int width, int height, String program, String args) : base(parent, x, y, width, height) { this.program = program; this.args = args; SelectInput(EventMask.SubstructureNotifyMask); }
// Internal constructor that is used by "TopLevelWindow" and // "OverrideWindow". internal InputOutputWidget(Widget parent, int x, int y, int width, int height, Color foreground, Color background, bool rootAllowed, bool overrideRedirect) : base(parent, x, y, width, height, background, rootAllowed, overrideRedirect) { this.foreground = foreground; this.background = background; SelectInput(EventMask.ExposureMask); }
/// <summary> /// <para>Reparenting is disabled for the root window.</para> /// </summary> public override void Reparent(Widget newParent, int x, int y) { throw new XInvalidOperationException (S._("X_NonRootOperation")); }
// Set this cursor on a widget. internal void SetCursor(Widget widget) { Display dpy = widget.dpy; try { IntPtr display = dpy.Lock(); XWindow window = widget.GetWidgetHandle(); if(source != null) { if(cursor == XCursor.Zero) { XColor foreground = new XColor(); foreground.red = (ushort)0; foreground.green = (ushort)0; foreground.blue = (ushort)0; foreground.flags = (XColor.DoRed | XColor.DoGreen | XColor.DoBlue); XColor background = new XColor(); background.red = (ushort)0xFFFF; background.green = (ushort)0xFFFF; background.blue = (ushort)0xFFFF; background.flags = (XColor.DoRed | XColor.DoGreen | XColor.DoBlue); if(reverse) { cursor = Xlib.XCreatePixmapCursor (display, source.GetPixmapHandle(), mask.GetPixmapHandle(), ref background, ref foreground, (uint)hotspotX, (uint)hotspotY); } else { cursor = Xlib.XCreatePixmapCursor (display, source.GetPixmapHandle(), mask.GetPixmapHandle(), ref foreground, ref background, (uint)hotspotX, (uint)hotspotY); } } Xlib.XDefineCursor(display, window, cursor); } else if(type == CursorType.XC_inherit_parent) { Xlib.XUndefineCursor(display, window); } else { Xlib.XDefineCursor (display, window, dpy.GetCursor(type)); } } finally { dpy.Unlock(); } }
// Place a minimized window rectangle. internal void PlaceMinimizedRectangle(ref Rectangle rect, Widget placed) { // Create a region that consists of all minimized areas. Region region = new Region(); Widget current = TopChild; while(current != null) { if(current is CaptionWidget && current.IsMapped && ((CaptionWidget)current).Child.IsIconic) { if(current != placed) { region.Union (current.x, current.y, current.width, current.height); } } current = current.NextBelow; } // Place the minimized rectangle. int yplace = height - rect.height; int xplace = 0; for(;;) { // Move up to the next line if we've overflowed this one. if((xplace + rect.width) > width && width >= rect.width) { yplace -= rect.height; xplace = 0; } // Determine if the rectangle overlaps the region. // If it doesn't, then we have found the best location. rect.x = xplace; rect.y = yplace; if(!region.Overlaps(rect)) { region.Dispose(); return; } // Move on to the next candidate. xplace += rect.width; } }
// Maximize all windows. internal void MaximizeAll(Widget dontNotify) { bool controls = HasControls(); maximized = true; Widget current = TopChild; while(current != null) { if(current is CaptionWidget) { ((CaptionWidget)current).MaximizeChild (current != dontNotify, controls); } current = current.NextBelow; } PositionControls(); }
// Dispatch a focus in event to this widget from the top-level window. internal void DispatchFocusIn(Widget oldWidget) { OnFocusIn(oldWidget); }
// Override the focus enter event from Xsharp. protected override void OnFocusIn(Widget other) { if(sink != null) { sink.ToolkitFocusEnter(); } }
// Dispatch a focus out event to this widget from the top-level window. internal void DispatchFocusOut(Widget newWidget) { OnFocusOut(newWidget); }
// Override the focus leave event from Xsharp. protected override void OnFocusOut(Widget other) { if(sink != null) { sink.ToolkitFocusLeave(); } }
/// <summary> /// <para>Constructs a new <see cref="T:Xsharp.InputOutputWidget"/> /// instance underneath a specified parent widget, with /// specified foreground and background colors.</para> /// </summary> /// /// <param name="parent"> /// <para>The parent of the new widget.</para> /// </param> /// /// <param name="x"> /// <para>The X co-ordinate of the top-left corner of /// the new widget.</para> /// </param> /// /// <param name="y"> /// <para>The Y co-ordinate of the top-left corner of /// the new widget.</para> /// </param> /// /// <param name="width"> /// <para>The width of the new widget.</para> /// </param> /// /// <param name="height"> /// <para>The height of the new widget.</para> /// </param> /// /// <param name="foreground"> /// <para>The foreground color for the widget.</para> /// </param> /// /// <param name="background"> /// <para>The background color for the widget.</para> /// </param> /// /// <exception cref="T:System.ArgumentNullException"> /// <para>Raised if <paramref name="parent"/> is <see langword="null"/>. /// </para> /// </exception> /// /// <exception cref="T:Xsharp.XException"> /// <para>Raised if <paramref name="x"/>, <paramref name="y"/>, /// <paramref name="width"/>, or <paramref name="height"/> are /// out of range.</para> /// </exception> /// /// <exception cref="T.Xsharp.XInvalidOperationException"> /// <para>Raised if <paramref name="parent"/> is disposed, the /// root window, or an input-only window.</para> /// </exception> public InputOutputWidget(Widget parent, int x, int y, int width, int height, Color foreground, Color background) : base(parent, x, y, width, height, background, false, false) { this.foreground = foreground; this.background = background; SelectInput(EventMask.ExposureMask); }
// Restore all windows from the maximized state. internal void RestoreAll(Widget dontNotify) { maximized = false; Widget current = TopChild; while(current != null) { if(current is CaptionWidget) { ((CaptionWidget)current).RestoreChild (current != dontNotify); } current = current.NextBelow; } PositionControls(); }
/// <summary> /// <para>Constructs a new <see cref="T:Xsharp.InputOutputWidget"/> /// instance underneath a specified parent widget.</para> /// </summary> /// /// <param name="parent"> /// <para>The parent of the new widget.</para> /// </param> /// /// <param name="x"> /// <para>The X co-ordinate of the top-left corner of /// the new widget.</para> /// </param> /// /// <param name="y"> /// <para>The Y co-ordinate of the top-left corner of /// the new widget.</para> /// </param> /// /// <param name="width"> /// <para>The width of the new widget.</para> /// </param> /// /// <param name="height"> /// <para>The height of the new widget.</para> /// </param> /// /// <exception cref="T:System.ArgumentNullException"> /// <para>Raised if <paramref name="parent"/> is <see langword="null"/>. /// </para> /// </exception> /// /// <exception cref="T:Xsharp.XException"> /// <para>Raised if <paramref name="x"/>, <paramref name="y"/>, /// <paramref name="width"/>, or <paramref name="height"/> are /// out of range.</para> /// </exception> /// /// <exception cref="T.Xsharp.XInvalidOperationException"> /// <para>Raised if <paramref name="parent"/> is disposed, the /// root window, or an input-only window.</para> /// </exception> public InputOutputWidget(Widget parent, int x, int y, int width, int height) : base(parent, x, y, width, height, new Color(StandardColor.Inherit), false, false) { foreground = new Color(StandardColor.Foreground); background = new Color(StandardColor.Inherit); SelectInput(EventMask.ExposureMask); }
// Override the mouse leave event from Xsharp. protected override void OnLeave(Widget child, int x, int y, ModifierMask modifiers, CrossingMode mode, CrossingDetail detail) { if(sink != null) { sink.ToolkitMouseLeave(); } }