On 4 July 2011 15:02, walter tallent <w41...@yahoo.com> wrote:
> Hi.
> I know I'm coming late to this party, but if you're packing the button  into 
> the
> tab, it's a child of that notebook page.  Can't you retrieve  the page you're 
> on
> by simply calling gtk_notebook_page_num () with the  button passed in as the
> child during the button's clicked signal  handler?  Then you pass the returned
> page number to  gtk_notebook_remove_page ().  This way you'll always remove 
> the
> correct  page, and it doesn't matter if the user brings that page to the front
> first or not.
>
> Or is there something I've overlooked?
> walter
>
>
>
> ________________________________
> From: Bill C <bi...@netspace.net.au>
> To: gtk-app-devel-list@gnome.org
> Sent: Sun, July 3, 2011 3:54:13 PM
> Subject: Re: Help with closing a notebook page (GTK2)
>
> On 04/07/11 06:26, Neil Munro wrote:
>> On 3 July 2011 19:31, Thomas  Bollmeier<tbollme...@web.de>  wrote:
>>>> ----Ursprüngliche Nachricht-----
>>>> Von: "Neil Munro"<neilmu...@gmail.com>
>>>> Gesendet: 02.07.2011 23:40:02
>>>> An: gtk-app-devel-list@gnome.org
>>>> Betreff: Help with closing a notebook page (GTK2)
>>>>
>>>> Hi, I have used pygtk before so I am familiar with some of the basic
>>>> concepts of gtk, but this is my first attempt with an actual gtk+ C
>>>> application and I have run into a few issues.
>>>>
>>>> I have a notebook that I wish to have a close button on the page tabs
>>>> that when clicked closes the tabs.
>>>>
>>>> I know that it's a bit off a faf to do as you don't know the page
>>>> prior to the event. So you have to dynamically detect which tab is
>>>> being closed by using a tab child widget.
>>>>
>>>> Now I believe I have done this in code, except it always returns -1
>>>> which then firmly tells me I have done something wrong.
>>>>
>>>> I have attached the code for your reference in the hopes that someone
>>>> shall be able to point out my no doubt simple mistake.
>>>>
>>>> Many thanks in advance,
>>>> Neil Munro
>>> I faced a similar problem when I wrote an editor for the first version of my
>>>gobjectcreator tool some time ago. It was
>>> implemented in PyGTK - nevertheless it should work in C as well. The 
>>> solution
>>>may not be elegant but it
>>> worked:
>>> I registered a handler for the "clicked"-signal of the close button within 
>>> the
>>>tab label widget (a GtkHBox).
>>> Within the handler implementation I looped over all pages of the notebook 
>>> and
>>>checked whether the button instance
>>> in the page label was identical to the sender instance of the 
>>> "clicked"-signal.
>>>If yes then I had to remove the
>>> corresponding page.
>>> You can find the code example here:
>>>
>>>https://github.com/ThomasBollmeier/GObjectCreator/blob/master/gobject_creator/ui/documents_view.py
>>>y
>>>
>>> (see lines 342ff. and 378ff. respectively)
>>>
>>> Hope that helps.
>>>
>>> Regards,
>>> Thomas
>>>
>>>
>>>
>>> ___________________________________________________________
>>> Schon gehört? WEB.DE hat einen genialen Phishing-Filter in die
>>> Toolbar eingebaut! http://produkte.web.de/go/toolbar
>>>
>> Thanks to this and Bills suggestion the correct page closes, but I
>> need to determine a way to re-calculate the page as soon as a tab is
>> closed, am sure I will figure something out, but thanks for the
>> patience and help!
>> _______________________________________________
>> gtk-app-devel-list mailing list
>> gtk-app-devel-list@gnome.org
>> http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list
> Hi Neil
>
> Yes the page numbers can change when a page is closed, so you cant use
> original page numbers directly to switch pages.
>
> I think I redesigned so that I did not use page numbers. Let the user
> switch pages and process the page the user is working with.  Ensure the
> user cant delete pages that are prior to a page you want to reference
> directly.  As Thomas said...  Not totally elegant.
>
> Rgds Bill
> _______________________________________________
> gtk-app-devel-list mailing list
> gtk-app-devel-list@gnome.org
> http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list
> _______________________________________________
> gtk-app-devel-list mailing list
> gtk-app-devel-list@gnome.org
> http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list
>

Well I have a method to correctly get the tab page, it might not be
the best way but it's what came naturally to me, I am having issues
with the memory management. Now I understand the principle of linked
lists/memory management etc but I have only previously created small
test programs, nothing inside a real program, so am having trouble
applying theory to practical.

Below is the function I am writing, I am aware I am not freeing any
memory yet, but some tabs wont close even after I have supposedly
adjusted the linked list, so I am at a loss as to how I am to make
this work, any help would be appreciated!

static void Close( GtkWidget *widget, struct data *tmp )
{
        // Re-configure linked list to reflect new tab positions
        struct node *ptr = head;
        struct node *prev = ptr;

        g_print( "Old list!\n\n" );     

        ptr = head;

        while( ptr->Next != NULL )
        {
                if( ptr == tmp->Ptr )
                {
                        g_print( "Ptr->Page to remove: %d\n", ptr->Page );
                        // Close page
                        gtk_notebook_remove_page( GTK_NOTEBOOK( tmp->Notebook 
), tmp->Page );
                        g_print( "Removing node... " );
                        prev = ptr->Prev;
                        ptr = ptr->Next;
                        prev->Next = ptr;
                        ptr->Prev = prev;
                        g_print( "Done!\n" );
                }

                else
                        ptr = ptr->Next;
        }       

        ptr = head;
        gint i = 0;
        
        //while( ptr->Next != NULL )
        for( i = 0; i < gtk_notebook_get_n_pages( tmp->Notebook ); i++ )
        {
                g_print( "Page was: %d\n", ptr->Page );
                ptr->Page = i;
                g_print( "Page is: %d\n", ptr->Page );
                ptr = ptr->Next;
        }
}

If you need more of the code you can check out git://gitorious.org/x2/x2.git

I am also looking at the examples people have given me, but it's slow
going to understand other people's code.

Thanks,
Neil Munro
_______________________________________________
gtk-app-devel-list mailing list
gtk-app-devel-list@gnome.org
http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list

Reply via email to