Anyone have any ideas? I still can't figure out why the column sizes go to
0.

Thank you.

On Tue, Dec 18, 2018, 13:40 Mitko Haralanov <voidtra...@gmail.com wrote:

> This is Gtk3:
> gtk3-3.22.26-2.fc27.x86_64
>
> On Tue, Dec 18, 2018 at 1:14 PM Luca Bacci via gtk-list <
> gtk-list@gnome.org> wrote:
>
>> Is it Gtk2 or Gtk3, which version exactly?
>>
>>
>> Il giorno mar 18 dic 2018 alle ore 18:47 Mitko Haralanov via gtk-list <
>> gtk-list@gnome.org> ha scritto:
>>
>>> I mistakenly replied only to Luca!! Forwarding to the list.
>>>
>>> (Sorry, Luca, my bad)
>>> - Mitko
>>>
>>> ---------- Forwarded message ---------
>>> From: Mitko Haralanov <voidtra...@gmail.com>
>>> Date: Tue, Dec 18, 2018 at 9:37 AM
>>> Subject: Re: Emitting signals from threads
>>> To: Luca Bacci <luca.bacci...@gmail.com>
>>>
>>>
>>> I found something that is different between the two cases - button click
>>> with signals and without.
>>>
>>> Using the code from the link that Luca posted, I decided to print the
>>> size of each column when a button press is received. As it turns out, the
>>> width of the columns is different in the two cases:
>>>
>>> Without thread signals:
>>> column[0](193) = 0 -> 193
>>> cell[0] = min->109, natural->109
>>> column[1](66) = 193 -> 259
>>> cell[0] = min->20, natural->20
>>> cell[1] = min->16, natural->16
>>> cell[2] = min->35, natural->35
>>> column[2](36) = 259 -> 295
>>> cell[0] = min->16, natural->16
>>> x = 105.872116, y = 259.547516
>>>
>>> (x and y are the coordinates of the button press event)
>>>
>>> With thread signals:
>>> column[0](0) = 0 -> 0
>>> cell[0] = min->135, natural->135
>>> column[1](66) = 0 -> 66
>>> cell[0] = min->20, natural->20
>>> cell[1] = min->16, natural->16
>>> cell[2] = min->35, natural->35
>>> column[2](36) = 66 -> 102
>>> cell[0] = min->16, natural->16
>>> x = 113.528488, y = 158.563782
>>>
>>> As you can see, the width of the first column is 0 when the signals are
>>> being emitted. As expected, if I were to click very close to the left
>>> border of the widget, the edit dialog does not get triggered as the x
>>> coordinate falls within column 1:
>>>
>>> column[0](0) = 0 -> 0
>>> cell[0] = min->135, natural->135
>>> column[1](66) = 0 -> 66
>>> cell[0] = min->20, natural->20
>>> cell[1] = min->16, natural->16
>>> cell[2] = min->35, natural->35
>>> column[2](36) = 66 -> 102
>>> cell[0] = min->16, natural->16
>>> x = 21.247330, y = 181.310333
>>>
>>> I could use the cell renderer width if the column width is 0 but that
>>> seems unreliable since the cell renderer width is not the same as the
>>> column and it's also not static.
>>>
>>> On Tue, Dec 18, 2018 at 8:23 AM Mitko Haralanov <voidtra...@gmail.com>
>>> wrote:
>>>
>>>> I am not posting the complete function because there is a lot of
>>>> irrelevant code. I am also not interested in the specific cell renderer but
>>>> rather the row on which the click occurred.
>>>>
>>>> tatic gboolean on_button_press_event(GtkWidget *widget,
>>>>       GdkEvent *event,
>>>>       gpointer data)
>>>> {
>>>> GtkTreeView *treeview = GTK_TREE_VIEW(widget);
>>>> GdkEventButton *button = (GdkEventButton *)event;
>>>> GtkTreeModel *model;
>>>> GtkTreePath *path;
>>>> GtkTreeIter iter;
>>>> GtkTreeViewColumn *column;
>>>> GtkScopeProjectEditDialog *dialog;
>>>> GtkScopeProjectEditData *pdata, fill;
>>>> GtkScopeProject *project;
>>>> guint response, index;
>>>> gboolean ret = FALSE;
>>>>
>>>> if (button->type != GDK_BUTTON_PRESS ||
>>>>     !gtk_tree_view_get_path_at_pos(treeview, button->x, button->y,
>>>>    &path, &column, NULL, NULL))
>>>> return FALSE;
>>>>
>>>> index = GPOINTER_TO_UINT(g_object_get_data(G_OBJECT(column), "index"));
>>>> if (index != TREEVIEW_COLUMN_EDIT)
>>>> goto done;
>>>> model = gtk_tree_view_get_model(treeview);
>>>> if (!gtk_tree_model_get_iter(model, &iter, path))
>>>> goto done;
>>>> gtk_tree_model_get(model, &iter, PROJECT_COLUMN_OBJ, &project, -1);
>>>>         ...
>>>>
>>>> The issue is that the column which is returned by
>>>> gtk_tree_view_get_path_at_pos() is different depending on whether thread
>>>> signals are being emitted vs not. I have verified that the button press
>>>> coordinates are the same (button->x and button->y have the same values in
>>>> both cases).
>>>>
>>>>
>>>> On Tue, Dec 18, 2018 at 5:24 AM Luca Bacci <luca.bacci...@gmail.com>
>>>> wrote:
>>>>
>>>>> Hi Mitko! Can you post here the code for the button-press event
>>>>> handler?
>>>>> It should more or less follow the code here:
>>>>> http://scentric.net/tutorial/sec-misc-get-renderer-from-click.html
>>>>>
>>>>> Luca
>>>>>
>>>>> Il giorno lun 17 dic 2018 alle ore 20:28 Mitko Haralanov via gtk-list <
>>>>> gtk-list@gnome.org> ha scritto:
>>>>>
>>>>>> Hi,
>>>>>>
>>>>>> In my application, I want to be able to update a treeview from a
>>>>>> separate thread. Each treeview row was a column that is a progress bar. 
>>>>>> The
>>>>>> progress to be displayed is generated by a separate thread as to not 
>>>>>> block
>>>>>> the UI.
>>>>>>
>>>>>> Since GTK is not thread-safe, the way the application is written is
>>>>>> that the thread, when it needs to emit a signal, will prepare the signal
>>>>>> data and then call g_main_context_invoke_full(NULL, cb, data, ...) in 
>>>>>> order
>>>>>> to be able to call g_singal_emit() in the global default context thread.
>>>>>> The signal handler updates the tree model, which in turn updates the tree
>>>>>> view.
>>>>>>
>>>>>> For the most part this works with one big, ugly exception - the same
>>>>>> treeview has a column, which is supposed to open the item's Edit dialog
>>>>>> when clicked. So, naturally, I have a button-press handler connected to 
>>>>>> the
>>>>>> treeview, which launches the Edit dialog when the button press occurs in
>>>>>> the correct column.
>>>>>>
>>>>>> However, when an update is running and the thread is continuously
>>>>>> emitting signals, clicking on *any* column of *any* of the other items
>>>>>> opens the Edit dialog. The treeview behaves as if the items in it have 
>>>>>> only
>>>>>> one column.
>>>>>>
>>>>>> Every example or document that I have seen in relation to signals
>>>>>> from threads says to emit the signal from a g_idle_add() handler. 
>>>>>> However,
>>>>>> g_main_context_invoke_full(NULL, ...) should be the same as calling
>>>>>> g_idle_add().
>>>>>>
>>>>>> Can someone shed some light into what might be happening?
>>>>>>
>>>>>> Thank you.
>>>>>>
>>>>>>
>>>>>> _______________________________________________
>>>>>> gtk-list mailing list
>>>>>> gtk-list@gnome.org
>>>>>> https://mail.gnome.org/mailman/listinfo/gtk-list
>>>>>>
>>>>> _______________________________________________
>>> gtk-list mailing list
>>> gtk-list@gnome.org
>>> https://mail.gnome.org/mailman/listinfo/gtk-list
>>>
>> _______________________________________________
>> gtk-list mailing list
>> gtk-list@gnome.org
>> https://mail.gnome.org/mailman/listinfo/gtk-list
>>
>
_______________________________________________
gtk-list mailing list
gtk-list@gnome.org
https://mail.gnome.org/mailman/listinfo/gtk-list

Reply via email to