Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public class ExtendedMenuItem : Gtk.MenuItem
- {
- public Gtk.EventBox container;
- const string style = "
- * {
- padding: 0px;
- margin: 0px;
- -GtkWidget-focus-padding: 0;
- -GtkMenuItem-horizontal-padding: 0;
- -GtkMenu-vertical-padding: 0px;
- -GtkMenuItem-arrow-scaling: 0.0;
- border-width: 0px;
- background-image: none;
- -unico-border-width: 0px;
- -unico-outer-stroke-width: 0px;
- -unico-inner-stroke-width: 0px;
- -unico-glow-radius: 0;
- }";
- public ExMenuItem ()
- {
- container = new Gtk.EventBox ();
- container.margin_right = 12;
- var css = new Gtk.CssProvider ();
- try {
- css.load_from_data (style, -1);
- } catch (Error e) { warning (e.message); }
- get_style_context ().add_provider (css, 20000);
- add (container);
- show_all ();
- container.realize.connect (() => {
- var event = new Gdk.Event (Gdk.EventType.FOCUS_CHANGE);
- container.grab_focus ();
- event.focus_change.type = Gdk.EventType.FOCUS_CHANGE;
- event.focus_change.window = (Gdk.Window)container.get_window ().ref ();
- event.focus_change.in = 1;
- //event.free ();
- });
- }
- public override bool button_press_event (Gdk.EventButton event)
- {
- if (container.get_window () != null)
- container.get_window ().raise ();
- if (!container.has_focus)
- container.grab_focus ();
- var new_event = Gdk.EventButton ();
- new_event.type = event.type;
- new_event.window = event.window;
- new_event.send_event = event.send_event;
- new_event.time = event.time;
- new_event.x = event.x;
- new_event.y = event.y;
- new_event.state = event.state;
- new_event.button = event.button;
- new_event.device = event.device;
- new_event.x_root = event.x_root;
- new_event.y_root = event.y_root;
- var children = container.get_window ().get_children ();
- foreach (var child in children) {
- if (child == null)
- continue;
- new_event.window = child;
- int winx, winy;
- child.get_origin (out winx, out winy);
- int newx = (int)event.x_root - winx;
- int newy = (int)event.y_root - winy;
- if (newx >= 0 && newy >= 0 && newx < child.get_width () && newy < child.get_height ()) {
- new_event.x = newx;
- new_event.y = newy;
- container.button_press_event (new_event);
- }
- }
- return true;
- }
- public override bool button_release_event (Gdk.EventButton e)
- {
- container.button_release_event (e);
- return true;
- }
- }
- public static void main (string [] args)
- {
- Gtk.init (ref args);
- var w = new Gtk.Window ();
- var e = new Gtk.EventBox ();
- var m = new Gtk.Menu ();
- var i = new ExtendedMenuItem ();
- var b = new Gtk.Box (Gtk.Orientation.VERTICAL, 12);
- var n = new Granite.Widgets.StaticNotebook ();
- b.pack_start (n);
- n.set_size_request (300, 200);
- n.append_page (new Gtk.Image.from_icon_name ("document-export", Gtk.IconSize.DIALOG), new Gtk.Label ("A"));
- n.append_page (new Gtk.Image.from_icon_name ("document-save", Gtk.IconSize.DIALOG), new Gtk.Label ("A"));
- n.append_page (new Gtk.Image.from_icon_name ("document-import", Gtk.IconSize.DIALOG), new Gtk.Label ("A"));
- i.container.add (b);
- m.add (i);
- w.add (e);
- e.button_press_event.connect ((e) => {
- m.popup (null, null, null, e.button, e.time);
- m.show_all ();
- return true;
- });
- w.show_all ();
- Gtk.main ();
- }
Add Comment
Please, Sign In to add comment