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:
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!
- Create a new cursor with GdkCursor.
- Get the GdkWindow of the eventbox from it's window property.
- Set the cursor using GdkWindow::set_cursor.
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:
- Create the new cursor to be used when mouse is over the clickable link. You can explore other cursors defined here.
- Set the cursor for the two clickable links.
- 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
- How to change cursor over clickable GtkLabel - Part 2 - using image file?
- How to change cursor over clickable GtkLabel - Part 3 - using xpm data?
- How to launch external app in winxp without the flashing of cmd window?
- How to put a clickable link in GtkLabel - Part 1?
- How to put a clickable link in GtkLabel - Part 2?
- How to set up clickable link using GtkLinkButton - Part 1 - using signal clicked?
Read more...