All pastes #922891 Raw Edit

Someone

public text v1 · immutable
#922891 ·published 2008-02-29 02:26 UTC
rendered paste body
--- Shell2.java	2008-02-28 21:22:18.000000000 -0500
+++ Shell.java	2008-02-28 21:21:45.000000000 -0500
@@ -114,12 +114,11 @@
  * @see SWT

  */

 public class Shell extends Decorations {

-	int /*long*/ shellHandle, tooltipsHandle, tooltipWindow;

-	boolean mapped, moved, resized, opened;

+	int /*long*/ shellHandle, tooltipsHandle, tooltipWindow, group, modalGroup;
+	boolean mapped, moved, resized, opened, fullScreen, showWithParent;
 	int oldX, oldY, oldWidth, oldHeight;

 	int minWidth, minHeight;

 	Control lastActive;

-	Region region;

 

 	static final int MAXIMUM_TRIM = 128;

 

@@ -355,6 +354,7 @@
 

 static int checkStyle (int style) {

 	style = Decorations.checkStyle (style);

+	style &= ~SWT.TRANSPARENT;
 	if ((style & SWT.ON_TOP) != 0) style &= ~SWT.SHELL_TRIM;

 	int mask = SWT.SYSTEM_MODAL | SWT.APPLICATION_MODAL | SWT.PRIMARY_MODAL;

 	int bits = style & ~mask;

@@ -609,11 +609,6 @@
 			OS.gtk_style_get_black (OS.gtk_widget_get_style (shellHandle), color);

 			OS.gtk_widget_modify_bg (shellHandle,  OS.GTK_STATE_NORMAL, color);

 		}

-		int bits = SWT.PRIMARY_MODAL | SWT.APPLICATION_MODAL | SWT.SYSTEM_MODAL;

-		boolean modal = (style & bits) != 0;

-		//TEMPORARY CODE

-		if ((style & SWT.ON_TOP) == 0) modal |= (parent != null && (parent.style & bits) != 0);

-		OS.gtk_window_set_modal (shellHandle, modal);

 	} else {

 		vboxHandle = OS.gtk_bin_get_child (shellHandle);

 		if (vboxHandle == 0) error (SWT.ERROR_NO_HANDLES);

@@ -626,6 +621,8 @@
 		handle = OS.gtk_bin_get_child (scrolledHandle);

 		if (handle == 0) error (SWT.ERROR_NO_HANDLES);

 	}

+	group = OS.gtk_window_group_new ();
+	if (group == 0) error (SWT.ERROR_NO_HANDLES);
 	/*

 	* Feature in GTK.  Realizing the shell triggers a size allocate event,

 	* which may be confused for a resize event from the window manager if

@@ -761,6 +758,14 @@
 	}

 }

 

+int /*long*/ fixedSizeAllocateProc(int /*long*/ widget, int /*long*/ allocationPtr) {
+	int clientWidth = 0;
+	if ((style & SWT.MIRRORED) != 0) clientWidth = getClientWidth ();
+	int /*long*/ result = super.fixedSizeAllocateProc (widget, allocationPtr);
+	if ((style & SWT.MIRRORED) != 0) moveChildren (clientWidth);
+	return result;
+}
+
 void fixStyle (int /*long*/ handle) {

 }

 

@@ -780,6 +785,21 @@
 	OS.gtk_widget_size_allocate (vboxHandle, allocation);

 }

 

+public int getAlpha () {
+	checkWidget ();
+	if (OS.GTK_VERSION >= OS.VERSION (2, 12, 0)) {
+		if (OS.gtk_widget_is_composited (shellHandle)) {
+			return (int) (OS.gtk_window_get_opacity (shellHandle) * 255);
+		}
+	}
+	return 255;  
+}
+
+public boolean getFullScreen () {
+	checkWidget();
+	return fullScreen;
+}
+
 public Point getLocation () {

 	checkWidget ();

 	int [] x = new int [1], y = new int [1];

@@ -787,6 +807,11 @@
 	return new Point (x [0], y [0]);

 }

 

+public boolean getMaximized () {
+	checkWidget();
+	return !fullScreen && super.getMaximized ();
+}
+
 /**

  * Returns a point describing the minimum receiver's size. The

  * x coordinate of the result is the minimum width of the receiver.

@@ -809,6 +834,34 @@
 	return new Point (width, height);

 }

 

+Shell getModalShell () {
+	Shell shell = null;
+	Shell [] modalShells = display.modalShells;
+	if (modalShells != null) {
+		int bits = SWT.APPLICATION_MODAL | SWT.SYSTEM_MODAL;
+		int index = modalShells.length;
+		while (--index >= 0) {
+			Shell modal = modalShells [index];
+			if (modal != null) {
+				if ((modal.style & bits) != 0) {
+					Control control = this;
+					while (control != null) {
+						if (control == modal) break;
+						control = control.parent;
+					}
+					if (control != modal) return modal;
+					break;
+				}
+				if ((modal.style & SWT.PRIMARY_MODAL) != 0) {
+					if (shell == null) shell = getShell ();
+					if (modal.parent == shell) return modal;
+				}
+			}
+		}
+	}
+	return null;
+}
+
 public Point getSize () {

 	checkWidget ();

 	int width = OS.GTK_WIDGET_WIDTH (vboxHandle);

@@ -840,6 +893,7 @@
  *

  */

 public Region getRegion () {

+	/* This method is needed for @since 3.0 Javadoc */
 	checkWidget ();

 	return region;

 }

@@ -967,7 +1021,6 @@
 

 int /*long*/ gtk_map_event (int /*long*/ widget, int /*long*/ event) {

 	minimized = false;

-	sendEvent (SWT.Deiconify);

 	return 0;

 }

 

@@ -1012,7 +1065,6 @@
 

 int /*long*/ gtk_unmap_event (int /*long*/ widget, int /*long*/ event) {

 	minimized = true;

-	sendEvent (SWT.Iconify);

 	return 0;

 }

 

@@ -1021,6 +1073,14 @@
 	OS.memmove (gdkEvent, event, GdkEventWindowState.sizeof);

 	minimized = (gdkEvent.new_window_state & OS.GDK_WINDOW_STATE_ICONIFIED) != 0;

 	maximized = (gdkEvent.new_window_state & OS.GDK_WINDOW_STATE_MAXIMIZED) != 0;

+	fullScreen = (gdkEvent.new_window_state & OS.GDK_WINDOW_STATE_FULLSCREEN) != 0;
+	if ((gdkEvent.changed_mask & OS.GDK_WINDOW_STATE_ICONIFIED) != 0) {
+		if (minimized) {
+			sendEvent (SWT.Iconify);
+		} else {
+			sendEvent (SWT.Deiconify);
+		}
+	}
 	return 0;

 }

 

@@ -1144,6 +1204,16 @@
 	}

 }

 

+public void setAlpha (int alpha) {
+	checkWidget ();
+	if (OS.GTK_VERSION >= OS.VERSION (2, 12, 0)) {
+		if (OS.gtk_widget_is_composited (shellHandle)) {
+			alpha &= 0xFF;
+			OS.gtk_window_set_opacity (shellHandle, alpha / 255f);
+		}
+	}
+}
+
 void resizeBounds (int width, int height, boolean notify) {

 	if (redrawWindow != 0) {

 		OS.gdk_window_resize (redrawWindow, width, height);

@@ -1168,6 +1238,7 @@
 }

 

 int setBounds (int x, int y, int width, int height, boolean move, boolean resize) {

+	if (fullScreen) setFullScreen (false);
 	/*

 	* Bug in GTK.  When either of the location or size of

 	* a shell is changed while the shell is maximized, the

@@ -1281,6 +1352,19 @@
 	}

 }

 

+public void setFullScreen (boolean fullScreen) {
+	checkWidget();
+	if (fullScreen) {
+		OS.gtk_window_fullscreen (shellHandle);
+	} else {
+		OS.gtk_window_unfullscreen (shellHandle);
+		if (maximized) {
+			setMaximized (true);
+		}
+	}
+	this.fullScreen = fullScreen;
+}
+
 /**

  * Sets the input method editor mode to the argument which 

  * should be the result of bitwise OR'ing together one or more

@@ -1429,11 +1513,7 @@
 public void setRegion (Region region) {

 	checkWidget ();

 	if ((style & SWT.NO_TRIM) == 0) return;

-	if (region != null && region.isDisposed()) error (SWT.ERROR_INVALID_ARGUMENT);

-	int /*long*/ window = OS.GTK_WIDGET_WINDOW (shellHandle);

-	int /*long*/ shape_region = (region == null) ? 0 : region.handle;

-	OS.gdk_window_shape_combine_region (window, shape_region, 0, 0);

-	this.region = region;

+	super.setRegion (region);
 }

 

 /*

@@ -1463,6 +1543,18 @@
 public void setVisible (boolean visible) {

 	checkWidget();

 	if ((OS.GTK_WIDGET_MAPPED (shellHandle) == visible)) return;

+	int mask = SWT.PRIMARY_MODAL | SWT.APPLICATION_MODAL | SWT.SYSTEM_MODAL;
+	if ((style & mask) != 0) {
+		if (visible) {
+			display.setModalShell (this);
+			OS.gtk_window_set_modal (shellHandle, true);
+		} else {
+			display.clearModal (this);
+			OS.gtk_window_set_modal (shellHandle, false);
+		}
+	} else {
+		updateModal ();
+	}
 	if (visible) {

 		sendEvent (SWT.Show);

 		if (isDisposed ()) return;

@@ -1479,6 +1571,7 @@
 		* unminimized or shown on the desktop.

 		*/

 		OS.gtk_widget_show (shellHandle);

+		if (enableWindow != 0) OS.gdk_window_raise (enableWindow);
 		if (!OS.GTK_IS_PLUG (shellHandle)) {

 			mapped = false;

 			if (isDisposed ()) return;

@@ -1509,7 +1602,6 @@
 		}

 		mapped = true;

 

-		int mask = SWT.PRIMARY_MODAL | SWT.APPLICATION_MODAL | SWT.SYSTEM_MODAL;

 		if ((style & mask) != 0) {

 			OS.gdk_pointer_ungrab (OS.GDK_CURRENT_TIME);

 		}

@@ -1603,6 +1695,7 @@
 }

 int trimHeight () {

 	if ((style & SWT.NO_TRIM) != 0) return 0;

+	if (fullScreen) return 0;
 	boolean hasTitle = false, hasResize = false, hasBorder = false;

 	hasTitle = (style & (SWT.MIN | SWT.MAX | SWT.TITLE | SWT.MENU)) != 0;

 	hasResize = (style & SWT.RESIZE) != 0;

@@ -1619,6 +1712,7 @@
 

 int trimWidth () {

 	if ((style & SWT.NO_TRIM) != 0) return 0;

+	if (fullScreen) return 0;
 	boolean hasTitle = false, hasResize = false, hasBorder = false;

 	hasTitle = (style & (SWT.MIN | SWT.MAX | SWT.TITLE | SWT.MENU)) != 0;

 	hasResize = (style & SWT.RESIZE) != 0;

@@ -1633,6 +1727,71 @@
 	return 0;

 }

 

+void updateModal () {
+	int /*long*/ group = 0;
+	if (display.getModalDialog () == null) {
+		Shell modal = getModalShell ();
+		int mask = SWT.PRIMARY_MODAL | SWT.APPLICATION_MODAL | SWT.SYSTEM_MODAL;
+		Composite shell = null;
+		if (modal == null) {
+			if ((style & mask) != 0) shell = this;
+		} else {
+			shell = modal;
+		}
+		while (shell != null) {
+			if ((shell.style & mask) == 0) {
+				group = shell.getShell ().group;
+				break;
+			}
+			shell = shell.parent;
+		}
+	}
+	if (OS.GTK_VERSION >= OS.VERSION (2, 10, 0) && group == 0) { 
+		/*
+		* Feature in GTK. Starting with GTK version 2.10, GTK
+		* doesn't assign windows to a default group. The fix is to
+		* get the handle of the default group and add windows to the
+		* group.
+		*/
+		group = OS.gtk_window_get_group(0);
+	}
+	if (group != 0) {
+		OS.gtk_window_group_add_window (group, shellHandle);
+	} else {
+		if (modalGroup != 0) {
+			OS.gtk_window_group_remove_window (modalGroup, shellHandle);
+		}
+	}
+	if (OS.GTK_VERSION < OS.VERSION (2, 4, 0)) {
+		fixModal (group, modalGroup);
+	}
+	modalGroup = group;
+}
+
+void updateShells () {
+	Shell [] shells = getShells ();
+	for (int i=0; i<shells.length; i++) {
+		boolean update = false;
+		Shell shell = shells [i];
+		if (shell.isUndecorated ()) {
+			update = true;
+		} else {
+			do {
+				shell = (Shell) shell.getParent ();
+			} while (shell != null && shell != this && !shell.isUndecorated ());
+			if (shell != null && shell != this) update = true;
+		}
+		if (update) {
+			if (minimized) {
+				OS.gtk_widget_hide (shells [i].shellHandle);
+			} else if (showWithParent) {
+				OS.gtk_widget_show (shells [i].shellHandle);
+			}
+		}
+	}
+	showWithParent = minimized;
+}
+
 void deregister () {

 	super.deregister ();

 	display.removeWidget (shellHandle);

@@ -1707,19 +1866,32 @@
 void releaseWidget () {

 	super.releaseWidget ();

 	destroyAccelGroup ();

+	display.clearModal (this);
 	if (display.activeShell == this) display.activeShell = null;

 	if (tooltipsHandle != 0) OS.g_object_unref (tooltipsHandle);

 	tooltipsHandle = 0;

+	if (group != 0) OS.g_object_unref (group);
+	group = modalGroup = 0;
 	int /*long*/ window = OS.GTK_WIDGET_WINDOW (shellHandle);

 	OS.gdk_window_remove_filter(window, display.filterProc, shellHandle);

-	region = null;

 	lastActive = null;

 }

 

 void setToolTipText (int /*long*/ widget, String string) {

+	if (OS.GTK_VERSION >= OS.VERSION (2, 12, 0)) {
+		byte [] buffer = null;
+		if (string != null && string.length () > 0) {
+			char [] chars = fixMnemonic (string, false);
+			buffer = Converter.wcsToMbcs (null, chars, true);
+		}
+		OS.gtk_widget_set_tooltip_text (widget, null);
+		OS.gtk_tooltip_trigger_tooltip_query (OS.gdk_display_get_default ());
+		OS.gtk_widget_set_tooltip_text (widget, buffer);	
+	} else {
 	byte [] buffer = null;

 	if (string != null && string.length () > 0) {

-		buffer = Converter.wcsToMbcs (null, string, true);

+			char [] chars = fixMnemonic (string, false);
+			buffer = Converter.wcsToMbcs (null, chars, true);
 	}

 	if (tooltipsHandle == 0) {

 		tooltipsHandle = OS.gtk_tooltips_new ();

@@ -1781,5 +1953,7 @@
 		}

 	}

 	if (set) OS.gtk_tooltips_set_tip (tooltipsHandle, widget, buffer, null);

+	}
+		
 }

 }