[PATCH] Add new "Open new Tab"-Tab to the tab bar
TK Soh
teekaysoh at gmail.com
Mon Oct 26 01:25:16 CET 2009
OT: where do you host your nedit repo? I'm trying to refresh my local
clone. Thanks.
TK
On Sun, Oct 25, 2009 at 2:24 PM, Bert Wesarg <bert.wesarg at googlemail.com> wrote:
> On Fri, Oct 23, 2009 at 07:26, Greg Edwards <gedwards2 at gmail.com> wrote:
>> With the advent of tabbed web browsers, some of which have a "+" button on
>> the far right of the tab area to create a new tab (certainly my Safari 4
>> anyway), I now find myself hitting the Nedit "x" button to open a new tab,
>> but of course closing the current Nedit tab instead, quite the opposite of
>> what I wanted.
>> How much chance would there be to make the "x" act as a "+", and put an "x"
>> on the Motif tabs ? (I know the answer to part B sadly - a Motif tab is just
>> some sort of XmLabel subclass with a tabby shape, no chance of "x" there).
> I personally like the 'floating' "+" from firefox 3.5 more, that is, a 'tab'
> right of all other tabs, and if you click it, you get a new Untitled, and only
> one close button, like it is today in NEdit. Here is a rough patch that
> implements this.
>
> BTW, you can put any widget inside the tabs, NEdit puts a BubbleButton in to
> get a tooltip.
>
> Regards,
> Bert
>
> ---
> Microline/XmL/Folder.c | 2 +-
> source/window.c | 56 ++++++++++++++++++++++++++++++++++++------------
> 2 files changed, 43 insertions(+), 15 deletions(-)
>
> diff --git a/Microline/XmL/Folder.c b/Microline/XmL/Folder.c
> index 270cf96..2610199 100644
> --- a/Microline/XmL/Folder.c
> +++ b/Microline/XmL/Folder.c
> @@ -1658,7 +1658,7 @@ ConstraintInitialize(Widget req,
> /* add child to tabs list */
> if (f->folder.tabAllocCount < f->folder.tabCount + 1)
> {
> - f->folder.tabAllocCount *= 2;
> + f->folder.tabAllocCount += 32;
> f->folder.tabs = (Widget *)realloc((char *)f->folder.tabs,
> sizeof(Widget) * f->folder.tabAllocCount);
> }
> diff --git a/source/window.c b/source/window.c
> index 89473a8..995eea2 100644
> --- a/source/window.c
> +++ b/source/window.c
> @@ -152,7 +152,7 @@ static Pixmap createBitmapWithDepth(Widget w, char *data, unsigned int width,
> unsigned int height);
> static WindowInfo *getNextTabWindow(WindowInfo *window, int direction,
> int crossWin, int wrap);
> -static Widget addTab(Widget folder, const char *string);
> +static Widget addTab(Widget folder, const char *string, int isNewTabTab);
> static int compareWindowNames(const void *windowA, const void *windowB);
> static int getTabPosition(Widget tab);
> static Widget manageToolBars(Widget toolBarsForm);
> @@ -614,7 +614,8 @@ WindowInfo *CreateWindow(const char *name, char *geometry, int iconic)
> XtAddCallback(window->tabBar, XmNactivateCallback,
> raiseTabCB, NULL);
>
> - window->tab = addTab(window->tabBar, name);
> + addTab(window->tabBar, " + ", True);
> + window->tab = addTab(window->tabBar, name, False);
>
> /* A form to hold the stats line text and line/col widgets */
> window->statsLineForm = XtVaCreateWidget("statsLineForm",
> @@ -821,19 +822,23 @@ static void tabClickEH(Widget w, XtPointer clientData, XEvent *event)
> /*
> ** add a tab to the tab bar for the new document.
> */
> -static Widget addTab(Widget folder, const char *string)
> +static Widget addTab(Widget folder, const char *string, int isNewTabTab)
> {
> Widget tooltipLabel, tab;
> - XmString s1;
> + XmString s1, s2;
>
> s1 = XmStringCreateSimple((char *)string);
> + if (isNewTabTab)
> + s2 = XmStringCreateSimple("New Document");
> + else
> + s2 = s1;
> tab = XtVaCreateManagedWidget("tab",
> xrwsBubbleButtonWidgetClass, folder,
> /* XmNmarginWidth, <default at nedit.c>, */
> /* XmNmarginHeight, <default at nedit.c>, */
> /* XmNalignment, <default at nedit.c>, */
> XmNlabelString, s1,
> - XltNbubbleString, s1,
> + XltNbubbleString, s2,
> XltNshowBubble, GetPrefToolTips(),
> XltNautoParkBubble, True,
> XltNslidingBubble, False,
> @@ -841,6 +846,8 @@ static Widget addTab(Widget folder, const char *string)
> /* XltNbubbleDuration, 8000,*/
> NULL);
> XmStringFree(s1);
> + if (isNewTabTab)
> + XmStringFree(s2);
>
> /* there's things to do as user click on the tab */
> XtAddEventHandler(tab, ButtonPressMask, False,
> @@ -864,6 +871,17 @@ static Widget addTab(Widget folder, const char *string)
> AddTabContextMenuAction(tab);
> #endif /* LESSTIF_VERSION */
>
> + if (!isNewTabTab) {
> + WidgetList tabList;
> + int tabCount;
> + Widget t;
> + XtVaGetValues(folder, XmNtabWidgetList, &tabList,
> + XmNtabCount, &tabCount, NULL);
> + t = tabList[tabCount - 1];
> + tabList[tabCount - 1] = tabList[tabCount - 2];
> + tabList[tabCount - 2] = t;
> + }
> +
> return tab;
> }
>
> @@ -915,7 +933,7 @@ void SortTabBar(WindowInfo *window)
> XtVaGetValues(window->tabBar, XmNtabWidgetList, &tabList,
> XmNtabCount, &tabCount, NULL);
>
> - for (i=0, j=0; i<tabCount && j<nDoc; i++) {
> + for (i=0, j=0; i<(tabCount-1) && j<nDoc; i++) {
> if (tabList[i]->core.being_destroyed)
> continue;
>
> @@ -2500,7 +2518,7 @@ static void saveYourselfCB(Widget w, Widget appShell, XtPointer callData)
> XtVaGetValues(topWin->tabBar, XmNtabWidgetList, &tabs,
> XmNtabCount, &tabCount, NULL);
>
> - for (i=0; i< tabCount; i++) {
> + for (i=0; i< (tabCount-1); i++) {
> win = TabToWindow(tabs[i]);
> if (win->filenameSet) {
> /* add filename */
> @@ -3441,7 +3459,7 @@ WindowInfo* CreateDocument(WindowInfo* shellWindow, const char* name)
> /* Set the requested hardware tab distance and useTabs in the text buffer */
> BufSetTabDistance(window->buffer, GetPrefTabDist(PLAIN_LANGUAGE_MODE));
> window->buffer->useTabs = GetPrefInsertTabs();
> - window->tab = addTab(window->tabBar, name);
> + window->tab = addTab(window->tabBar, name, False);
>
> /* add the window to the global window list, update the Windows menus */
> InvalidateWindowMenus();
> @@ -3514,7 +3532,7 @@ static WindowInfo *getNextTabWindow(WindowInfo *window, int direction,
> XtVaGetValues(win->tabBar, XmNtabWidgetList, &tabList,
> XmNtabCount, &tabCount, NULL);
>
> - for (i=0; i< tabCount; i++) {
> + for (i=0; i< (tabCount-1); i++) {
> tabs[tabTotalCount++] = tabList[i];
> }
> }
> @@ -3524,7 +3542,7 @@ static WindowInfo *getNextTabWindow(WindowInfo *window, int direction,
> XtVaGetValues(window->tabBar, XmNtabWidgetList, &tabList,
> XmNtabCount, &tabCount, NULL);
>
> - for (i=0; i< tabCount; i++) {
> + for (i=0; i< (tabCount-1); i++) {
> if (TabToWindow(tabList[i])) /* make sure tab is valid */
> tabs[tabTotalCount++] = tabList[i];
> }
> @@ -3572,7 +3590,7 @@ static int getTabPosition(Widget tab)
> XtVaGetValues(tabBar, XmNtabWidgetList, &tabList,
> XmNtabCount, &tabCount, NULL);
>
> - for (i=0; i< tabCount; i++) {
> + for (i=0; i< (tabCount-1); i++) {
> if (tab == tabList[i])
> return i;
> }
> @@ -4690,10 +4708,20 @@ static void raiseTabCB(Widget w, XtPointer clientData, XtPointer callData)
> XmLFolderCallbackStruct *cbs = (XmLFolderCallbackStruct *)callData;
> WidgetList tabList;
> Widget tab;
> + int tabCount;
>
> - XtVaGetValues(w, XmNtabWidgetList, &tabList, NULL);
> - tab = tabList[cbs->pos];
> - RaiseDocument(TabToWindow(tab));
> + XtVaGetValues(w, XmNtabWidgetList, &tabList, XmNtabCount, &tabCount, NULL);
> + if (cbs->pos < (tabCount-1)) {
> + tab = tabList[cbs->pos];
> + RaiseDocument(TabToWindow(tab));
> + } else {
> + WindowInfo *window = lastFocusDocument;
> + if (!window)
> + window = TabToWindow(tabList[cbs->pos - 2]);
> + EditNewFile(window, NULL, False, NULL, window->path, False);
> + CheckCloseDim();
> + cbs->allowActivate = 0;
> + }
> }
>
> static Widget containingPane(Widget w)
> --
> tg: (58cda00..) bw/newTabTab (depends on: master)
> --
> NEdit Discuss mailing list - Discuss at nedit.org
> http://www.nedit.org/mailman/listinfo/discuss
>
More information about the Discuss
mailing list