130. How to change cursor over clickable GtkLabel - Part 1 - using pre defined cursors?

Problem

You want to change the cursor when the mouse moves over the clickable links as shown below:

Original cursor:

Cursor when over a clickable link:

How to change cursor over clickable GtkLabel - Part 1 - using pre defined cursors?


Solution

Due to the lack of documentation (just take a look at the man page of GdkCursor), this one took me two nights to get it working!


Sample Code

1   
2   
3   
4   
5   
6   
7   
8   
9   
10   
11   
12   
13   
14   
15   
16   
17   
18   
19   
20   
21   
22   
23   
24   
25   
26   
27   
28   
29   
30   
31   
32   
33   
34   
35   
36   
37   
38   
39   
40   
41   
42   
43   
44   
46   
47   
48   
49   
50   
51   
52   
56   
57   
58   
59   
60   
61   
62   
63   
64   
65   
66   
67   
68   
71   
73   
74   
<?php
$window = new GtkWindow();
$window->set_size_request(400, 200);
$window->connect_simple('destroy', array('Gtk','main_quit'));
$window->add($vbox = new GtkVBox());

// displays a title
$title = new GtkLabel("Change cursor over clickable link\n".
"using php-gtk pre-defined cursors");
$title->modify_font(new PangoFontDescription("Times New Roman Italic 10"));
$title->modify_fg(Gtk::STATE_NORMAL, GdkColor::parse("#0000ff"));
$title->set_size_request(-1, 40);
$vbox->pack_start($title, 0, 0);
$vbox->pack_start(new GtkLabel());

$link1 = create_link("manual", "http://gtk.php.net/manual/en/gtkclasses.php");
$link2 = create_link("mailing list", "http://www.nabble.com/Php---GTK---General-f171.html");

$hbox = new GtkHBox();
$hbox->pack_start(new GtkLabel("reference: php-gtk2 "), false);
$hbox->pack_start($link1, false);
$hbox->pack_start(new GtkLabel(" and "), false);
$hbox->pack_start($link2, false);
$vbox->pack_start($hbox, false);
$vbox->pack_start(new GtkLabel());

$status = new GtkLabel();
$status->set_alignment(0, 0);
$vbox->pack_start($status, 0, 0);

// function to setup the link
function create_link($title, $url) {
    $label = new GtkLabel($title);
    $label->set_markup('<span color="blue"><u>'.$title."</u></span>");
    $eventbox = new GtkEventBox;
    $eventbox->add($label);
    $eventbox->connect('button-press-event', 'on_click', $title, $url);
    $eventbox->connect('enter-notify-event', 'on_enter', $title, $url);
    $eventbox->connect('leave-notify-event', 'on_leave', $title, $url);

    return $eventbox;
}

function on_click($widget, $event, $title, $url) {
    $shell = new COM('WScript.Shell'); // note 3
    $shell->Run('cmd /c start "" "' . $url . '"', 0, FALSE); // note 3
    unset($shell); // note 3
}

function on_enter($widget, $event, $title, $url) {
    global $status;
    $status->set_text($url);
}

function on_leave($widget, $event, $title, $url) {
    global $status;
    $status->set_text('');
}

$window->show_all();

$cursor = new GdkCursor(Gdk::DRAFT_LARGE); // note 1
$link1->window->set_cursor($cursor); // note 2
$link2->window->set_cursor($cursor); // note 2

Gtk::main();
?>

Output

As shown above.
 

Explanation

This example make use of the code in How to launch external app in winxp without the flashing of cmd window?.

What's new here:

  1. Create the new cursor to be used when mouse is over the clickable link. You can explore other cursors defined here.
  2. Set the cursor for the two clickable links.
  3. Note that if you're running this example on linux, please comment out these 3 lines and replace with the system command to launch your favorite browser.

Note

  • Take note of where the three lines are located (note 1 and 2). If you set the cursor before the widgets are realized, you will get "Fatal error: Call to a member function set_cursor() on a non-object."
  • We make use of pre-defined php-gtk cursors in this example. In the next article, I will show you how to set cursor using your own image.

Related Links

Add comment


Security code
Refresh