Hello,

A new version of the patch is ready.
  - focus issues fixed.
  - problem with cursors solved.

Please check.

-- 
Stanislav


On Sun, Aug 19, 2007 at 12:15:23PM +1000, Neil Hodgson wrote:
>    Hi Stanislav,
> 
> >   - cursorLast and the related code was removed because it did not work
> >     with dynamically destroyed/created windows. This removal should
> > not affect the win32 code.
> 
>    There are several other platforms (OS/X, wxWidgets, QT, ...) so
> published APIs like this should not change. It would also be better to
> get this code working on GTK+ to avoid unnecessary calls to
> gdk_window_set_cursor. This may now be optimized but I think there was
> flickering on old versions of GTK+.
> 
>    There are new focus issues when switching between horizontal and
> vertical layouts. The focus seems to go nowhere so typing has no
> effect.
diff -urN scite-1.74-orig/scintilla/gtk/PlatGTK.cxx scite-1.74/scintilla/gtk/PlatGTK.cxx
--- scite-1.74-orig/scintilla/gtk/PlatGTK.cxx	2007-06-15 15:24:38.000000000 +0400
+++ scite-1.74/scintilla/gtk/PlatGTK.cxx	2007-08-20 19:21:05.000000000 +0400
@@ -1841,6 +1841,8 @@
 	cursorLast = curs;
 	GdkCursor *gdkCurs;
 	switch (curs) {
+	case cursorInvalid:
+		return;
 	case cursorText:
 		gdkCurs = gdk_cursor_new(GDK_XTERM);
 		break;
diff -urN scite-1.74-orig/scintilla/gtk/ScintillaGTK.cxx scite-1.74/scintilla/gtk/ScintillaGTK.cxx
--- scite-1.74-orig/scintilla/gtk/ScintillaGTK.cxx	2007-06-12 07:55:11.000000000 +0400
+++ scite-1.74/scintilla/gtk/ScintillaGTK.cxx	2007-08-20 19:21:45.000000000 +0400
@@ -568,6 +568,9 @@
 	gtk_widget_unmap(PWidget(wText));
 	gtk_widget_unmap(PWidget(scrollbarh));
 	gtk_widget_unmap(PWidget(scrollbarv));
+	wText.SetCursor(Window::cursorInvalid);
+	scrollbarv.SetCursor(Window::cursorInvalid);
+	scrollbarh.SetCursor(Window::cursorInvalid);
 }
 
 void ScintillaGTK::UnMap(GtkWidget *widget) {
diff -urN scite-1.74-orig/scite/gtk/SciTEGTK.cxx scite-1.74/scite/gtk/SciTEGTK.cxx
--- scite-1.74-orig/scite/gtk/SciTEGTK.cxx	2007-06-13 18:09:09.000000000 +0400
+++ scite-1.74/scite/gtk/SciTEGTK.cxx	2007-08-20 17:55:32.000000000 +0400
@@ -307,11 +307,9 @@
 
 protected:
 
-	Window wDivider;
+	GtkWidget *splitPane;
 	Point ptOld;
 	GdkGC *xor_gc;
-	bool focusEditor;
-	bool focusOutput;
 
 	guint sbContextID;
 	Window wToolBarBox;
@@ -497,11 +495,6 @@
 	static gint MousePress(GtkWidget *widget, GdkEventButton *event, SciTEGTK *scitew);
 	gint Mouse(GdkEventButton *event);
 
-	void DividerXOR(Point pt);
-	static gint DividerExpose(GtkWidget *widget, GdkEventExpose *ose, SciTEGTK *scitew);
-	static gint DividerMotion(GtkWidget *widget, GdkEventMotion *event, SciTEGTK *scitew);
-	static gint DividerPress(GtkWidget *widget, GdkEventButton *event, SciTEGTK *scitew);
-	static gint DividerRelease(GtkWidget *widget, GdkEventButton *event, SciTEGTK *scitew);
 	static void DragDataReceived(GtkWidget *widget, GdkDragContext *context,
 	                             gint x, gint y, GtkSelectionData *selection_data, guint info, guint time, SciTEGTK *scitew);
 
@@ -538,6 +531,7 @@
 	                          int startID = 0, const char *radioStart = 0);
 	void CreateMenu();
 	void CreateUI();
+	void LayoutUI();
 	void Run(int argc, char *argv[]);
 	void ProcessExecute();
 	virtual void Execute();
@@ -595,6 +589,8 @@
 	btnBuild = 0;
 	btnStop = 0;
 	itemFactory = 0;
+	splitPane = 0;
+	heightBar = 0;
 
 	fileSelectorWidth = 580;
 	fileSelectorHeight = 480;
@@ -835,6 +831,13 @@
 		SizeSubWindows();
 		CheckMenus();
 		break;
+	// override base class
+	case IDM_SPLITVERTICAL:
+		splitVertical = !splitVertical;
+		heightBar = 0;
+		LayoutUI();
+		CheckMenus();
+		break;
 
 	default:
 		SciTEBase::MenuCommand(cmdID, menuSource);
@@ -888,30 +891,45 @@
 }
 
 void SciTEGTK::SizeContentWindows() {
-	PRectangle rcClient = GetClientRectangle();
-#if GTK_MAJOR_VERSION < 2
-	int left = 0;
-	int top = 0;
-#else
-	int left = rcClient.left;
-	int top = rcClient.top;
-#endif
-	int w = rcClient.right - rcClient.left;
-	int h = rcClient.bottom - rcClient.top;
-	heightOutput = NormaliseSplit(heightOutput);
+//	printf("SizeContentWindows: heightOutput = %d, prevHeightOutput = %d, heightBar = %d\n",
+//			heightOutput, previousHeightOutput, heightBar);
+	// we come here when receiving resizing signals
+	int height, bar;
 	if (splitVertical) {
-		wEditor.SetPosition(PRectangle(left, top, w - heightOutput - heightBar + left, h + top));
-		wDivider.SetPosition(PRectangle(w - heightOutput - heightBar + left, top, w - heightOutput + left, h + top));
-		wOutput.SetPosition(PRectangle(w - heightOutput + left, top, w + left, h + top));
+		height = PWidget(wOutput)->allocation.width;
+		bar = splitPane->allocation.width - PWidget(wEditor)->allocation.width - height;
 	} else {
-		wEditor.SetPosition(PRectangle(left, top, w + left, h - heightOutput - heightBar + top));
-		wDivider.SetPosition(PRectangle(left, h - heightOutput - heightBar + top, w + left, h - heightOutput + top));
-		wOutput.SetPosition(PRectangle(left, h - heightOutput + top, w + left, h + top));
+		height = PWidget(wOutput)->allocation.height;
+		bar = splitPane->allocation.height - PWidget(wEditor)->allocation.height - height;
 	}
+	// minimum widget allocation size returned by GTK is 1, not 0, therefore
+	if (height > 1)
+		heightOutput = height;
+	else
+		heightOutput = 0;
+	// shall we update heightBar?
+	if (!heightBar)
+		// this is needed for correct geometry calculations when heightOutput = 0
+		if (heightOutput > 0)
+			heightBar = bar;
+		else
+			heightBar = height + bar;
+	// shall we touch previousHeightOutput?
+	if (heightOutput > 0)
+		previousHeightOutput = heightOutput;
+	// check the menu item (needed when gutter reaches the edge)
+	CheckAMenuItem(IDM_TOGGLEOUTPUT, heightOutput > 0);
+//	printf("\ton leave: a.w = %d, a.h = %d, heightOutput = %d, prevHeightOutput = %d, heightBar = %d\n",
+//			splitPane->allocation.width, splitPane->allocation.height, heightOutput, previousHeightOutput, heightBar);
 }
 
 void SciTEGTK::SizeSubWindows() {
-	SizeContentWindows();
+//	printf("SizeSubWindows: heightOutput = %d, prevHeightOutput = %d, heightBar = %d\n",
+//			heightOutput, previousHeightOutput, heightBar);
+	if (splitVertical)
+		gtk_paned_set_position(GTK_PANED(splitPane), splitPane->allocation.width - heightOutput - heightBar);
+	else
+		gtk_paned_set_position(GTK_PANED(splitPane), splitPane->allocation.height - heightOutput - heightBar);
 }
 
 void SciTEGTK::SetMenuItem(int, int, int itemID, const char *text, const char *mnemonic) {
@@ -2127,7 +2145,7 @@
 
 gint SciTEGTK::MoveResize(GtkWidget *, GtkAllocation * /*allocation*/, SciTEGTK *scitew) {
 	//Platform::DebugPrintf("SciTEGTK move resize %d %d\n", allocation->width, allocation->height);
-	scitew->SizeSubWindows();
+	scitew->SizeContentWindows();
 	return TRUE;
 }
 
@@ -2331,129 +2349,6 @@
 	return FALSE;
 }
 
-void SciTEGTK::DividerXOR(Point pt) {
-	if (!xor_gc) {
-		GdkGCValues values;
-		values.foreground = PWidget(wSciTE)->style->white;
-		values.function = GDK_XOR;
-		values.subwindow_mode = GDK_INCLUDE_INFERIORS;
-		xor_gc = gdk_gc_new_with_values(PWidget(wSciTE)->window,
-		                                &values,
-		                                static_cast<GdkGCValuesMask>(
-		                                    GDK_GC_FOREGROUND | GDK_GC_FUNCTION | GDK_GC_SUBWINDOW));
-	}
-	if (splitVertical) {
-		gdk_draw_line(PWidget(wSciTE)->window, xor_gc,
-		              pt.x,
-		              PWidget(wDivider)->allocation.y,
-		              pt.x,
-		              PWidget(wDivider)->allocation.y + PWidget(wDivider)->allocation.height - 1);
-	} else {
-		gdk_draw_line(PWidget(wSciTE)->window, xor_gc,
-		              PWidget(wDivider)->allocation.x,
-		              pt.y,
-		              PWidget(wDivider)->allocation.x + PWidget(wDivider)->allocation.width - 1,
-		              pt.y);
-	}
-	ptOld = pt;
-}
-
-gint SciTEGTK::DividerExpose(GtkWidget *widget, GdkEventExpose *, SciTEGTK *sciThis) {
-	//GtkStyle style = gtk_widget_get_default_style();
-	GdkRectangle area;
-	area.x = 0;
-	area.y = 0;
-	area.width = widget->allocation.width;
-	area.height = widget->allocation.height;
-	gdk_window_clear_area(widget->window,
-	                      area.x, area.y, area.width, area.height);
-	if (widget->allocation.width > widget->allocation.height) {
-		// Horizontal divider
-		gtk_paint_hline(widget->style, widget->window, GTK_STATE_NORMAL,
-		                &area, widget, const_cast<char *>("vpaned"),
-		                0, widget->allocation.width - 1,
-		                area.height / 2 - 1);
-		gtk_paint_box (widget->style, widget->window,
-		               GTK_STATE_NORMAL,
-		               GTK_SHADOW_OUT,
-		               &area, widget, const_cast<char *>("paned"),
-		               area.width - sciThis->heightBar * 2, 1,
-		               sciThis->heightBar - 2, sciThis->heightBar - 2);
-	} else {
-		// Vertical divider
-		gtk_paint_vline(widget->style, widget->window, GTK_STATE_NORMAL,
-		                &area, widget, const_cast<char *>("hpaned"),
-		                0, widget->allocation.height - 1,
-		                area.width / 2 - 1);
-		gtk_paint_box (widget->style, widget->window,
-		               GTK_STATE_NORMAL,
-		               GTK_SHADOW_OUT,
-		               &area, widget, const_cast<char *>("paned"),
-		               1, area.height - sciThis->heightBar * 2,
-		               sciThis->heightBar - 2, sciThis->heightBar - 2);
-	}
-	return TRUE;
-}
-
-gint SciTEGTK::DividerMotion(GtkWidget *, GdkEventMotion *event, SciTEGTK *scitew) {
-	if (scitew->capturedMouse) {
-		int x = 0;
-		int y = 0;
-		GdkModifierType state;
-		if (event->is_hint) {
-			gdk_window_get_pointer(PWidget(scitew->wSciTE)->window, &x, &y, &state);
-			if (state & GDK_BUTTON1_MASK) {
-				scitew->DividerXOR(scitew->ptOld);
-				scitew->DividerXOR(Point(x, y));
-			}
-		}
-	}
-	return TRUE;
-}
-
-gint SciTEGTK::DividerPress(GtkWidget *, GdkEventButton *event, SciTEGTK *scitew) {
-	if (event->type == GDK_BUTTON_PRESS) {
-		int x = 0;
-		int y = 0;
-		GdkModifierType state;
-		gdk_window_get_pointer(PWidget(scitew->wSciTE)->window, &x, &y, &state);
-		scitew->ptStartDrag = Point(x, y);
-		scitew->capturedMouse = true;
-		scitew->heightOutputStartDrag = scitew->heightOutput;
-		scitew->focusEditor = scitew->SendEditor(SCI_GETFOCUS) != 0;
-		if (scitew->focusEditor) {
-			scitew->SendEditor(SCI_SETFOCUS, 0);
-		}
-		scitew->focusOutput = scitew->SendOutput(SCI_GETFOCUS) != 0;
-		if (scitew->focusOutput) {
-			scitew->SendOutput(SCI_SETFOCUS, 0);
-		}
-		gtk_widget_grab_focus(GTK_WIDGET(PWidget(scitew->wDivider)));
-		gtk_grab_add(GTK_WIDGET(PWidget(scitew->wDivider)));
-		gtk_widget_draw(PWidget(scitew->wDivider), NULL);
-		scitew->DividerXOR(scitew->ptStartDrag);
-	}
-	return TRUE;
-}
-
-gint SciTEGTK::DividerRelease(GtkWidget *, GdkEventButton *, SciTEGTK *scitew) {
-	if (scitew->capturedMouse) {
-		scitew->capturedMouse = false;
-		gtk_grab_remove(GTK_WIDGET(PWidget(scitew->wDivider)));
-		scitew->DividerXOR(scitew->ptOld);
-		int x = 0;
-		int y = 0;
-		GdkModifierType state;
-		gdk_window_get_pointer(PWidget(scitew->wSciTE)->window, &x, &y, &state);
-		scitew->MoveSplit(Point(x, y));
-		if (scitew->focusEditor)
-			scitew->SendEditor(SCI_SETFOCUS, 1);
-		if (scitew->focusOutput)
-			scitew->SendOutput(SCI_SETFOCUS, 1);
-	}
-	return TRUE;
-}
-
 void SciTEGTK::DragDataReceived(GtkWidget *, GdkDragContext *context,
                                 gint /*x*/, gint /*y*/, GtkSelectionData *seldata, guint /*info*/, guint time, SciTEGTK *scitew) {
 	scitew->OpenUriList(reinterpret_cast<const char *>(seldata->data));
@@ -2947,6 +2842,35 @@
 #endif
 }
 
+void SciTEGTK::LayoutUI() {
+	bool focusEditor = false;
+	bool focusOutput = false;
+	if (splitPane) {
+		focusEditor = wEditor.HasFocus();
+		focusOutput = wOutput.HasFocus();
+		gtk_container_remove(GTK_CONTAINER(splitPane), PWidget(wEditor));
+		gtk_container_remove(GTK_CONTAINER(splitPane), PWidget(wOutput));
+		gtk_widget_destroy(GTK_WIDGET(splitPane));
+	}
+	if (splitVertical) {
+		splitPane = gtk_hpaned_new();
+		gtk_widget_set_size_request(PWidget(wOutput), heightOutput, -1);
+	} else {
+		splitPane = gtk_vpaned_new();
+		gtk_widget_set_size_request(PWidget(wOutput), -1, heightOutput);
+	}
+	gtk_container_add(GTK_CONTAINER(PWidget(wContent)), GTK_WIDGET(splitPane));
+	gtk_paned_pack1(GTK_PANED(splitPane), PWidget(wEditor), TRUE, TRUE);
+	gtk_paned_pack2(GTK_PANED(splitPane), PWidget(wOutput), FALSE, TRUE);
+	if (!heightOutput)
+		gtk_paned_set_position(GTK_PANED(splitPane), G_MAXINT32);
+	gtk_widget_show(GTK_WIDGET(splitPane));
+	if (focusEditor)
+		WindowSetFocus(wEditor);
+	if (focusOutput)
+		WindowSetFocus(wOutput);
+}
+
 void SciTEGTK::CreateUI() {
 	CreateBuffers();
 	wSciTE = gtk_window_new(GTK_WINDOW_TOPLEVEL);
@@ -3044,7 +2968,7 @@
 #endif
 	tabVisible = false;
 
-	wContent = gtk_fixed_new();
+	wContent = gtk_alignment_new(0, 0, 1, 1);
 	GTK_WIDGET_UNSET_FLAGS(PWidget(wContent), GTK_CAN_FOCUS);
 	gtk_box_pack_start(GTK_BOX(boxMain), PWidget(wContent), TRUE, TRUE, 0);
 
@@ -3052,52 +2976,38 @@
 	                   GTK_SIGNAL_FUNC(MoveResize), gthis);
 
 	wEditor = scintilla_new();
+	gtk_widget_ref(PWidget(wEditor));
+
 	scintilla_set_id(SCINTILLA(PWidget(wEditor)), IDM_SRCWIN);
 	fnEditor = reinterpret_cast<SciFnDirect>(Platform::SendScintilla(
 	               PWidget(wEditor), SCI_GETDIRECTFUNCTION, 0, 0));
 	ptrEditor = Platform::SendScintilla(PWidget(wEditor),
 	                                    SCI_GETDIRECTPOINTER, 0, 0);
 	SendEditor(SCI_USEPOPUP, 0);
-	gtk_fixed_put(GTK_FIXED(PWidget(wContent)), PWidget(wEditor), 0, 0);
 
 	gtk_signal_connect(GTK_OBJECT(PWidget(wEditor)), "command",
 	                   GtkSignalFunc(CommandSignal), this);
 	gtk_signal_connect(GTK_OBJECT(PWidget(wEditor)), SCINTILLA_NOTIFY,
 	                   GtkSignalFunc(NotifySignal), this);
 
-	wDivider = gtk_drawing_area_new();
-	gtk_signal_connect(GTK_OBJECT(PWidget(wDivider)), "expose_event",
-	                   GtkSignalFunc(DividerExpose), this);
-	gtk_signal_connect(GTK_OBJECT(PWidget(wDivider)), "motion_notify_event",
-	                   GtkSignalFunc(DividerMotion), this);
-	gtk_signal_connect(GTK_OBJECT(PWidget(wDivider)), "button_press_event",
-	                   GtkSignalFunc(DividerPress), this);
-	gtk_signal_connect(GTK_OBJECT(PWidget(wDivider)), "button_release_event",
-	                   GtkSignalFunc(DividerRelease), this);
-	gtk_widget_set_events(PWidget(wDivider),
-	                      GDK_EXPOSURE_MASK
-	                      | GDK_LEAVE_NOTIFY_MASK
-	                      | GDK_BUTTON_PRESS_MASK
-	                      | GDK_BUTTON_RELEASE_MASK
-	                      | GDK_POINTER_MOTION_MASK
-	                      | GDK_POINTER_MOTION_HINT_MASK
-	                     );
-	gtk_drawing_area_size(GTK_DRAWING_AREA(PWidget(wDivider)), (width == useDefault) ? 100 : width, 10);
-	gtk_fixed_put(GTK_FIXED(PWidget(wContent)), PWidget(wDivider), 0, 600);
-
 	wOutput = scintilla_new();
+	gtk_widget_ref(PWidget(wOutput));
+	
 	scintilla_set_id(SCINTILLA(PWidget(wOutput)), IDM_RUNWIN);
 	fnOutput = reinterpret_cast<SciFnDirect>(Platform::SendScintilla(
 	               PWidget(wOutput), SCI_GETDIRECTFUNCTION, 0, 0));
 	ptrOutput = Platform::SendScintilla(PWidget(wOutput),
 	                                    SCI_GETDIRECTPOINTER, 0, 0);
 	SendOutput(SCI_USEPOPUP, 0);
-	gtk_fixed_put(GTK_FIXED(PWidget(wContent)), PWidget(wOutput), (width == useDefault) ? 100 : width, 0);
+
 	gtk_signal_connect(GTK_OBJECT(PWidget(wOutput)), "command",
 	                   GtkSignalFunc(CommandSignal), this);
 	gtk_signal_connect(GTK_OBJECT(PWidget(wOutput)), SCINTILLA_NOTIFY,
 	                   GtkSignalFunc(NotifySignal), this);
 
+	splitVertical = props.GetInt("split.vertical", 0);
+	LayoutUI();
+
 	Table table(1, 2);
 	wIncrementPanel = table.Widget();
 	table.PackInto(GTK_BOX(boxMain), false);
_______________________________________________
Scite-interest mailing list
Scite-interest@lyra.org
http://mailman.lyra.org/mailman/listinfo/scite-interest

Reply via email to