[PATCH]: menu doesn't appear on right info panel



Hello,

Attached is a patch to address this issue:
http://mail.gnome.org/archives/mc-devel/2004-January/msg00007.html

Changes introduced with rev. 1.22 of dialog.c can, under certain
conditions, break the next widget selection alogrithm. In the
past the routines `select_other_widget' and `dlg_select_widget'
used to loop until they find a widget that would accept the
focus i.e. one that accepts WIDGET_FOCUS messages. Currently it
could happen that the new `do_select_widget' would finish without
selecting a widget that accepts `WIDGET_FOCUS' messages. This
is the source of the problem described in the link above.

It is not immediatly clear, so I provide info from a debbuggin
session:

(gdb) p *h->current
$3 = {x = 0, y = 0, cols = 125, lines = 1, options = 4, dlg_id = 0, next = 0x1009baf0, prev = 0x100a02b0,
callback = 0x42d89a <menubar_callback>, mouse = 0x42d9d9 <menubar_event>, parent = 0x1009bab0}

(gdb) p *h->current->next
$4 = {x = 0, y = 0, cols = 62, lines = 48, options = 0, dlg_id = 1, next = 0x100adab0, prev = 0x100a03a0,
callback = 0x4417b9 <panel_callback>, mouse = 0x441f03 <panel_event>, parent = 0x1009bab0}

(gdb) p *h->current->next->next
$5 = {x = 62, y = 0, cols = 63, lines = 48, options = 0, dlg_id = 2, next = 0x100a0360, prev = 0x1009baf0,
callback = 0x422f57 <info_callback>, mouse = 0, parent = 0x1009bab0}

(gdb) p *h->current->next->next->next
$6 = {x = 0, y = 48, cols = 125, lines = 1, options = 0, dlg_id = 3, next = 0x1009fdd0, prev = 0x100adab0,
callback = 0x456a74 <label_callback>, mouse = 0, parent = 0x1009bab0}

(gdb) p *h->current->next->next->next->next
$7 = {x = 2, y = 49, cols = 123, lines = 1, options = 20, dlg_id = 4, next = 0x100a0260, prev = 0x100a0360,
callback = 0x40b598 <command_callback>, mouse = 0x458c91 <input_event>, parent = 0x1009bab0}

(gdb) p *h->current->next->next->next->next->next
$8 = {x = 0, y = 49, cols = 2, lines = 1, options = 0, dlg_id = 5, next = 0x100a02b0, prev = 0x1009fdd0,
callback = 0x456a74 <label_callback>, mouse = 0, parent = 0x1009bab0}

(gdb) p *h->current->next->next->next->next->next->next
$9 = {x = 0, y = 50, cols = 125, lines = 1, options = 2, dlg_id = 6, next = 0x100a03a0, prev = 0x100a0260,
callback = 0x45a092 <buttonbar_callback>, mouse = 0x45a3f7 <buttonbar_event>, parent = 0x1009bab0}
(gdb) p *h->current->next->next->next->next->next->next->next

$10 = {x = 0, y = 0, cols = 125, lines = 1, options = 4, dlg_id = 0, next = 0x1009baf0, prev = 0x100a02b0,
callback = 0x42d89a <menubar_callback>, mouse = 0x42d9d9 <menubar_event>, parent = 0x1009bab0}
(gdb)

Here is the list of all widgets of `midnight_dlg'. The current widget is
the menubar and we want to select as the next widget the info panel, which
doesn't accept WIDGET_FOCUS messages. In this case `do_select_widget'
keeps walking the widget list starting at the info view up to the
menbar (last in the list). There it decides that its job is done due
to this check:

  while (h->current != w0) {

Unfortunately it misses the left panel which would accept the WIDGET_FOCUS
message, while the old routine would keep walking.
Index: src/dialog.c
===================================================================
RCS file: /cvsroot/mc/mc/src/dialog.c,v
retrieving revision 1.26
diff -u -p -r1.26 dialog.c
--- src/dialog.c	24 Sep 2004 22:22:35 -0000	1.26
+++ src/dialog.c	26 Oct 2004 10:01:36 -0000
@@ -427,10 +427,7 @@ do_select_widget (Dlg_head *h, Widget *w
 	return;
 
     h->current = w;
-    while (h->current != w0) {
-	if (dlg_focus (h))
-	    break;
-
+    while (!dlg_focus (h)) {
 	switch (dir) {
 	case SELECT_NEXT:
 	    h->current = h->current->next;


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]