Skip to content
This repository has been archived by the owner on Apr 3, 2024. It is now read-only.

one gtk_test::click leads to two clicked events #21

Open
liquidnight2 opened this issue Feb 19, 2019 · 4 comments
Open

one gtk_test::click leads to two clicked events #21

liquidnight2 opened this issue Feb 19, 2019 · 4 comments

Comments

@liquidnight2
Copy link

liquidnight2 commented Feb 19, 2019

I took the basic example https://github.com/gtk-rs/gtk-test/blob/master/tests/basic.rs and expanded it with an atomic counter and a loop with 10 executions. As we see later in the output, we get two closure evaluations, invoked by connect_clicked().

src/main.rs:

extern crate gtk;
extern crate gtk_test;

use std::sync::atomic::AtomicUsize;
use std::sync::atomic::Ordering;
use std::sync::Arc;

use gtk::Button;
use gtk::ButtonExt;
use gtk::ContainerExt;
use gtk::GtkWindowExt;
use gtk::Label;
use gtk::Orientation;
use gtk::Window;
use gtk::WindowType;
use gtk::WidgetExt;

fn main() {
    for _a in 0..12 {
        println!("===== TEST RUN  {} ", _a);
        button_with_counter();
    }
}

// without gedit on screen: works.
// with gedit on screen: doesnt work.
fn button_with_counter() {
    let click_counter = Arc::new(AtomicUsize::new(0));
    let ccc = click_counter.clone();

    gtk::init().unwrap();
    let window = Window::new(WindowType::Toplevel);
    let gbox = gtk::Box::new(Orientation::Vertical, 0);
    let label: gtk::Label = Label::new("button+counter");
    gbox.add(&label);

    let button1 = Button::new();
    button1.set_label(&"button-1");
    button1.connect_clicked(move |_| {
        println!(" button1 click received    ");
        (*ccc).fetch_add(1, Ordering::SeqCst);
    });

    gbox.add(&button1);
    window.add(&gbox);
    window.show_all();
    window.activate_focus();

    gtk_test::click(&button1);
    gtk_test::wait(300);

    let caw = (*click_counter).load(Ordering::SeqCst);
    println!(" counter after wait: {} ", caw);
    assert_eq!(1, caw);

    window.close();
    window.destroy();
    gtk::Inhibit(false);
}

Cargo.toml :

[package]
name = "gtktest-doppelclick"
version = "0.0.1"

[[bin]]
name = "doppelclick"
path = "src/main.rs"

[dependencies]
gtk-test = "0.2.0"

[dependencies.gtk]
 version = "0.5.0"
 features = ["v3_22"]

As result I get on my LinuxMint-19 VM:

===== TEST RUN 0
button1 click received
button1 click received
counter after wait: 2
thread 'main' panicked at 'assertion failed: (left == right)
left: 1,
right: 2', src/main.rs:54:5

On my gentoo host I get this result:

===== TEST RUN 0
button1 click received
counter after wait: 1
===== TEST RUN 1
button1 click received
counter after wait: 1
===== TEST RUN 2
button1 click received
button1 click received
counter after wait: 2
thread 'main' panicked at 'assertion failed: (left == right)
left: 1,
right: 2', src/main.rs:54:5
note: Run with RUST_BACKTRACE=1 for a backtrace.

Additional Hint:
On my gentoo host, i see a behaviour in 90% of the trials: {

  • when another gtk program is on the screen, the test fails
  • when no other gtk program is on the screen, the test works }
    For the remaining 10% of the trials I saw it either working continually, or not working.

Host System information:
Portage 2.3.51 (python 2.7.15-final-0, default/linux/amd64/17.0/desktop, gcc-6.4.0, glibc-2.27-r6, 4.17.8-gentoo x86_64)
System uname: Linux-4.17.8-gentoo-x86_64-AMD_A10-7870K
# rustup show
Default host: x86_64-unknown-linux-gnu
installed toolchains
stable-x86_64-unknown-linux-gnu
nightly-x86_64-unknown-linux-gnu
installed targets for active toolchain
i686-pc-windows-gnu
x86_64-pc-windows-gnu
x86_64-unknown-linux-gnu
active toolchain
stable-x86_64-unknown-linux-gnu (default)
rustc 1.32.0 (9fda7c223 2019-01-16)

VM System information:
Linux Mint 19 Cinnamon, Kernel 4.15
Installed package via console: libgtk-3-dev
# rustup show
Default host: x86_64-unknown-linux-gnu
rustc 1.32.0 (9fda7c223 2019-01-16)

@liquidnight2
Copy link
Author

Further information: that bug appears on my LinuxMint in conjunction with focus change of the active window. What I just see:

  • On a large console window or the console placed in center, the test doesnt work. Since LinuxMint places new applications somewhere centered on the screen.
  • On empty screen with small console window, it works.
  • If you open a small gedit window, it does not work.
  • if you had focused this test, and the console only, the focus switch is only between those two, and the test works again.

@GuillaumeGomez
Copy link
Member

You're not supposed to do anything while running those tests otherwise interactions might end in the wrong window. Otherwise, I was completely unable to get your error... :-/

@liquidnight2
Copy link
Author

liquidnight2 commented Feb 21, 2019

Yes I am aware that the test ist focus-sensitive and works when not disturbed. I confirm so far: in the console i type "cargo run" then i do nothing until the program has finished.

Mint VM

Occasional Fail

How did you try to replay the issue ? On your local machine ? What distro/gtk/windowmanager are you using ? Or a VM with a common linux ? Any hint how to get a better ability to make that replayable ? maybe Docker ?

@GuillaumeGomez
Copy link
Member

No VM and Linux mint 19. That's pretty much it...

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants