SF.net SVN: geany:[2839] trunk

eht16 at users.sourceforge.net eht16 at xxxxx
Wed Jul 30 18:19:20 UTC 2008


Revision: 2839
          http://geany.svn.sourceforge.net/geany/?rev=2839&view=rev
Author:   eht16
Date:     2008-07-30 18:19:19 +0000 (Wed, 30 Jul 2008)

Log Message:
-----------
Fix signature of focus_sci().
Double clicking on free space in the tab bar opens a new file (#2003291).

Modified Paths:
--------------
    trunk/ChangeLog
    trunk/src/notebook.c

Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog	2008-07-30 15:26:49 UTC (rev 2838)
+++ trunk/ChangeLog	2008-07-30 18:19:19 UTC (rev 2839)
@@ -1,3 +1,11 @@
+2008-07-29  Enrico Tröger  <enrico(dot)troeger(at)uvena(dot)de>
+
+ * src/notebook.c:
+   Fix signature of focus_sci().
+   Double clicking on free space in the tab bar opens a new file
+   (#2003291).
+
+
 2008-07-27  Enrico Tröger  <enrico(dot)troeger(at)uvena(dot)de>
 
  * configure.in, wscript:

Modified: trunk/src/notebook.c
===================================================================
--- trunk/src/notebook.c	2008-07-30 15:26:49 UTC (rev 2838)
+++ trunk/src/notebook.c	2008-07-30 18:19:19 UTC (rev 2839)
@@ -78,19 +78,76 @@
 static void setup_tab_dnd(void);
 
 
-static void focus_sci(GtkWidget *widget, gpointer user_data)
+static gboolean focus_sci(GtkWidget *widget, GdkEventButton *event, gpointer user_data)
 {
 	GeanyDocument *doc = document_get_current();
 
-	if (doc == NULL)
-		return;
+	if (doc != NULL)
+		gtk_widget_grab_focus(GTK_WIDGET(doc->editor->sci));
 
-	gtk_widget_grab_focus(GTK_WIDGET(doc->editor->sci));
+	return FALSE;
 }
 
 
+static gboolean is_position_on_tab_bar(GtkNotebook *notebook, GdkEventButton *event)
+{
+	GtkWidget *page;
+	GtkWidget *tab;
+	GtkPositionType tab_pos;
+
+	page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(main_widgets.notebook), 0);
+	g_return_val_if_fail(page != NULL, FALSE);
+
+	tab = gtk_notebook_get_tab_label(GTK_NOTEBOOK(main_widgets.notebook), page);
+	g_return_val_if_fail(tab != NULL, FALSE);
+
+	tab_pos = gtk_notebook_get_tab_pos(GTK_NOTEBOOK(main_widgets.notebook));
+
+	switch (tab_pos)
+	{
+		case GTK_POS_TOP:
+		case GTK_POS_BOTTOM:
+		{
+			if (event->y >= 0 && event->y <= tab->allocation.height)
+				return TRUE;
+		}
+		case GTK_POS_LEFT:
+		case GTK_POS_RIGHT:
+		{
+			if (event->x >= 0 && event->x <= tab->allocation.width)
+				return TRUE;
+		}
+	}
+
+	return FALSE;
+}
+
+
+static gboolean notebook_tab_bar_click_cb(GtkWidget *widget, GdkEventButton *event,
+										  gpointer user_data)
+{
+	if (event->type == GDK_2BUTTON_PRESS)
+	{
+		/* accessing ::event_window is a little hacky but we need to make sure the click
+		 * was in the tab bar and not inside the child */
+		if (event->window != GTK_NOTEBOOK(main_widgets.notebook)->event_window)
+			return FALSE;
+
+		if (! is_position_on_tab_bar(GTK_NOTEBOOK(widget), event))
+			return FALSE;
+
+		document_new_file(NULL, NULL, NULL);
+		return TRUE;
+	}
+	return FALSE;
+}
+
+
 void notebook_init()
 {
+	g_signal_connect_after(main_widgets.notebook, "button-press-event",
+		G_CALLBACK(notebook_tab_bar_click_cb), NULL);
+
 	/* focus the current document after clicking on a tab */
 	g_signal_connect_after(main_widgets.notebook, "button-release-event",
 		G_CALLBACK(focus_sci), NULL);
@@ -261,17 +318,13 @@
 		}
 
 		/* subtract notebook pos to remove possible border padding */
-		max_x = tab->allocation.x + tab->allocation.width -
-			GTK_WIDGET(notebook)->allocation.x;
-		max_y = tab->allocation.y + tab->allocation.height -
-			GTK_WIDGET(notebook)->allocation.y;
+		max_x = tab->allocation.x + tab->allocation.width - GTK_WIDGET(notebook)->allocation.x;
+		max_y = tab->allocation.y + tab->allocation.height - GTK_WIDGET(notebook)->allocation.y;
 
-		if (((tab_pos == GTK_POS_TOP)
-			|| (tab_pos == GTK_POS_BOTTOM))
-			&&(x<=max_x)) return page_num;
-		else if (((tab_pos == GTK_POS_LEFT)
-			|| (tab_pos == GTK_POS_RIGHT))
-			&& (y<=max_y)) return page_num;
+		if (((tab_pos == GTK_POS_TOP) || (tab_pos == GTK_POS_BOTTOM)) && (x<=max_x))
+			return page_num;
+		else if (((tab_pos == GTK_POS_LEFT) || (tab_pos == GTK_POS_RIGHT)) && (y<=max_y))
+			return page_num;
 
 		page_num++;
 	}
@@ -301,15 +354,22 @@
 	}
 }
 
-gboolean notebook_tab_label_cb(GtkWidget *widget, GdkEventButton *event, gpointer user_data)
+
+static gboolean notebook_tab_label_cb(GtkWidget *widget, GdkEventButton *event, gpointer data)
 {
 	/* toggle additional widgets on double click */
 	if (event->type == GDK_2BUTTON_PRESS)
+	{
 		on_menu_toggle_all_additional_widgets1_activate(NULL, NULL);
+		return TRUE; /* stop other handlers like notebook_tab_bar_click_cb() */
+	}
 	/* close tab on middle click */
 	if (event->button == 2)
+	{
 		document_remove_page(gtk_notebook_page_num(GTK_NOTEBOOK(main_widgets.notebook),
 			GTK_WIDGET(user_data)));
+		return TRUE; /* stop other handlers like notebook_tab_bar_click_cb() */
+	}
 
 	return FALSE;
 }


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.



More information about the Commits mailing list