// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//
-// Copyright (c) 2005 Novell, Inc. (http://www.novell.com)
+// Copyright (c) 2005-2006 Novell, Inc. (http://www.novell.com)
//
// Authors:
// Peter Bartok (pbartok@novell.com)
internal bool allow_drop;
internal Hwnd parent;
internal bool visible;
+ internal bool mapped;
internal uint opacity;
internal bool enabled;
internal bool zero_sized;
- internal Rectangle invalid;
+ internal ArrayList invalid_list;
+ internal Rectangle nc_invalid;
internal bool expose_pending;
internal bool nc_expose_pending;
internal bool configure_pending;
internal bool reparented;
- internal Graphics client_dc;
+ internal Stack drawing_stack;
internal object user_data;
internal Rectangle client_rectangle;
internal ArrayList marshal_free_list;
internal int caption_height;
internal int tool_caption_height;
internal bool whacky_wm;
+ internal bool fixed_size;
+ internal bool zombie; /* X11 only flag. true if the X windows have been destroyed but we haven't been Disposed */
+ internal Region user_clip;
+ internal static Bitmap bmp = new Bitmap(1, 1, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
+ internal static Graphics bmp_g = Graphics.FromImage (bmp);
+ internal XEventQueue queue;
+ internal bool no_activate; // For Win32, popup windows will not steal focus
+ internal WindowExStyles initial_ex_style;
#endregion // Local Variables
+ // locks for some operations (used in XplatUIX11.cs)
+ internal object configure_lock = new object ();
+ internal object expose_lock = new object ();
+
#region Constructors and destructors
public Hwnd() {
x = 0;
whole_window = IntPtr.Zero;
handle = IntPtr.Zero;
parent = null;
- invalid = Rectangle.Empty;
+ invalid_list = new ArrayList();
expose_pending = false;
nc_expose_pending = false;
enabled = true;
client_rectangle = Rectangle.Empty;
marshal_free_list = new ArrayList(2);
opacity = 0xffffffff;
+ fixed_size = false;
+ drawing_stack = new Stack ();
}
public void Dispose() {
- windows.Remove(client_window);
- windows.Remove(whole_window);
+ expose_pending = false;
+ nc_expose_pending = false;
+ lock (windows) {
+ windows.Remove(client_window);
+ windows.Remove(whole_window);
+ }
+ client_window = IntPtr.Zero;
+ whole_window = IntPtr.Zero;
+ zombie = false;
for (int i = 0; i < marshal_free_list.Count; i++) {
Marshal.FreeHGlobal((IntPtr)marshal_free_list[i]);
}
#endregion
#region Static Methods
- public void SetObjectWindow(Hwnd obj, IntPtr window) {
- windows[window] = obj;
- }
-
public static Hwnd ObjectFromWindow(IntPtr window) {
- return (Hwnd)windows[window];
+ Hwnd rv;
+ lock (windows) {
+ rv = (Hwnd)windows[window];
+ }
+ return rv;
}
public static Hwnd ObjectFromHandle(IntPtr handle) {
//return (Hwnd)(((GCHandle)handle).Target);
- return (Hwnd)windows[handle];
+ Hwnd rv;
+ lock (windows) {
+ rv = (Hwnd)windows[handle];
+ }
+ return rv;
}
public static IntPtr HandleFromObject(Hwnd obj) {
}
public static Hwnd GetObjectFromWindow(IntPtr window) {
- return (Hwnd)windows[window];
+ Hwnd rv;
+ lock (windows) {
+ rv = (Hwnd)windows[window];
+ }
+ return rv;
}
public static IntPtr GetHandleFromWindow(IntPtr window) {
Hwnd hwnd;
- hwnd = (Hwnd)windows[window];
+ lock (windows) {
+ hwnd = (Hwnd)windows[window];
+ }
if (hwnd != null) {
return hwnd.handle;
} else {
if (menu != null) {
int menu_height = menu.Rect.Height;
- if (menu_height == 0) {
- menu_height = ThemeEngine.Current.MenuFont.Height;
- }
+ if (menu_height == 0)
+ menu_height = ThemeEngine.Current.CalcMenuBarSize(bmp_g, menu, client_rect.Width);
rect.Y -= menu_height;
rect.Height += menu_height;
rect.Y -= 1;
rect.Width += 2;
rect.Height += 2;
- } else if ((int) border_style == 0xFFFF) {
- rect.X -= 3;
- rect.Y -= 3;
- rect.Width += 6;
- rect.Height += 6;
- }
-
- if (title_style == TitleStyle.Normal) {
- rect.Y -= caption_height;
- rect.Height += caption_height;
- } else if (title_style == TitleStyle.Tool) {
- rect.Y -= tool_caption_height;
- rect.Height += tool_caption_height;
}
return rect;
rect.Y += menu_height;
rect.Height -= menu_height;
}
-
+
if (border_style == FormBorderStyle.Fixed3D) {
Size border_3D_size = ThemeEngine.Current.Border3DSize;
rect.Y += 1;
rect.Width -= 2;
rect.Height -= 2;
- } else if ((int) border_style == 0xFFFF) {
- rect.X += 3;
- rect.Y += 3;
- rect.Width -= 6;
- rect.Height -= 6;
- }
-
- if (title_style == TitleStyle.Normal) {
- rect.Y += caption_height;
- rect.Height -= caption_height;
- } else if (title_style == TitleStyle.Tool) {
- rect.Y += tool_caption_height;
- rect.Height -= tool_caption_height;
}
return rect;
}
}
- public Graphics ClientDC {
- get {
- return client_dc;
- }
-
- set {
- client_dc = value;
- }
- }
-
public Rectangle ClientRect {
get {
if (client_rectangle == Rectangle.Empty) {
client_window = value;
handle = value;
- if (windows[client_window] == null) {
- windows[client_window] = this;
+ zombie = false;
+
+ if (client_window != IntPtr.Zero) {
+ lock (windows) {
+ if (windows[client_window] == null) {
+ windows[client_window] = this;
+ }
+ }
}
}
}
+ public Region UserClip {
+ get {
+ return user_clip;
+ }
+
+ set {
+ user_clip = value;
+ }
+ }
+
public Rectangle DefaultClientRect {
get {
// We pass a Zero for the menu handle so the menu size is
get {
return expose_pending;
}
-
- set {
- expose_pending = value;
- }
}
public IntPtr Handle {
}
}
+ public XEventQueue Queue {
+ get {
+ return queue;
+ }
+
+ set {
+ queue = value;
+ }
+ }
+
public bool Enabled {
get {
if (!enabled) {
return pt;
}
}
+
public Rectangle Invalid {
get {
- return invalid;
- }
+ if (invalid_list.Count == 0)
+ return Rectangle.Empty;
- set {
- invalid = value;
+ Rectangle result = (Rectangle)invalid_list[0];
+ for (int i = 1; i < invalid_list.Count; i ++) {
+ result = Rectangle.Union (result, (Rectangle)invalid_list[i]);
+ }
+ return result;
}
}
+ public Rectangle[] ClipRectangles {
+ get {
+ return (Rectangle[]) invalid_list.ToArray (typeof (Rectangle));
+ }
+ }
+
+ public Rectangle NCInvalid {
+ get { return nc_invalid; }
+ set { nc_invalid = value; }
+
+ }
+
public bool NCExposePending {
get {
return nc_expose_pending;
}
-
- set {
- nc_expose_pending = value;
- }
}
public Hwnd Parent {
}
}
+ public bool Mapped {
+ get {
+ if (!mapped) {
+ return false;
+ }
+
+ if (parent != null) {
+ return parent.Mapped;
+ }
+
+ return true;
+ }
+
+ set {
+ mapped = value;
+ }
+ }
+
public int CaptionHeight {
get { return caption_height; }
set { caption_height = value; }
set {
whole_window = value;
- if (windows[whole_window] == null) {
- windows[whole_window] = this;
+ zombie = false;
+
+ if (whole_window != IntPtr.Zero) {
+ lock (windows) {
+ if (windows[whole_window] == null) {
+ windows[whole_window] = this;
+ }
+ }
}
}
}
y = value;
}
}
+
#endregion // Instance properties
#region Methods
public void AddInvalidArea(int x, int y, int width, int height) {
- if (invalid == Rectangle.Empty) {
- invalid = new Rectangle (x, y, width, height);
+ AddInvalidArea(new Rectangle(x, y, width, height));
+ }
+
+ public void AddInvalidArea(Rectangle rect) {
+ ArrayList tmp = new ArrayList ();
+ foreach (Rectangle r in invalid_list) {
+ if (!rect.Contains (r)) {
+ tmp.Add (r);
+ }
+ }
+ tmp.Add (rect);
+ invalid_list = tmp;
+ }
+
+ public void ClearInvalidArea() {
+ invalid_list.Clear();
+ expose_pending = false;
+ }
+
+ public void AddNcInvalidArea(int x, int y, int width, int height) {
+ if (nc_invalid == Rectangle.Empty) {
+ nc_invalid = new Rectangle (x, y, width, height);
return;
}
int right, bottom;
- right = Math.Max (invalid.Right, x + width);
- bottom = Math.Max (invalid.Bottom, y + height);
- invalid.X = Math.Min (invalid.X, x);
- invalid.Y = Math.Min (invalid.Y, y);
+ right = Math.Max (nc_invalid.Right, x + width);
+ bottom = Math.Max (nc_invalid.Bottom, y + height);
+ nc_invalid.X = Math.Min (nc_invalid.X, x);
+ nc_invalid.Y = Math.Min (nc_invalid.Y, y);
- invalid.Width = right - invalid.X;
- invalid.Height = bottom - invalid.Y;
+ nc_invalid.Width = right - nc_invalid.X;
+ nc_invalid.Height = bottom - nc_invalid.Y;
}
- public void AddInvalidArea(Rectangle rect) {
- if (invalid == Rectangle.Empty) {
- invalid = rect;
+ public void AddNcInvalidArea(Rectangle rect) {
+ if (nc_invalid == Rectangle.Empty) {
+ nc_invalid = rect;
return;
}
- invalid = Rectangle.Union (invalid, rect);
+ nc_invalid = Rectangle.Union (nc_invalid, rect);
}
- public void ClearInvalidArea() {
- invalid = Rectangle.Empty;
- expose_pending = false;
+ public void ClearNcInvalidArea() {
+ nc_invalid = Rectangle.Empty;
+ nc_expose_pending = false;
}
public override string ToString() {
- return String.Format("Hwnd, ClientWindow:0x{0:X}, WholeWindow:0x{1:X}, Handle:0x{2:X}", client_window.ToInt32(), whole_window.ToInt32(), handle.ToInt32());
+ return String.Format("Hwnd, Mapped:{3} ClientWindow:0x{0:X}, WholeWindow:0x{1:X}, Parent:[{2:X}]", client_window.ToInt32(), whole_window.ToInt32(), parent != null ? parent.ToString() : "<null>", Mapped);
}
#endregion // Methods