• Tag Archives C#
  • Some other lines of C# code

    This time I was looking for a way to get the rectangle of the widget and I found an old article with this C code:

    static void
    widget_get_rect_in_screen (GtkWidget *widget, GdkRectangle *r)
    {
      gint x,y,w,h;
      GdkRectangle extents;
      GdkWindow *window;
     
      window = gtk_widget_get_parent_window(widget); /* getting parent window */
      gdk_window_get_root_origin(window, &x,&y); /* parent's left-top screen coordinates */
      gdk_drawable_get_size(window, &w,&h); /* parent's width and height */
      gdk_window_get_frame_extents(window, &extents); /* parent's extents (including decorations) */
      r->x = x + (extents.width-w)/2 + widget->allocation.x; /* calculating x (assuming: left border size == right border size) */
      r->y = y + (extents.height-h)-(extents.width-w)/2 + widget->allocation.y; /* calculating y (assuming: left border size == right border size == bottom border size) */
      r->width = widget->allocation.width;
      r->height = widget->allocation.height;
    }

    I translated it to C#

      private Gdk.Rectangle getRectInScreen(Gtk.Widget widget)
      {
        int x, y, w, h;
        Gdk.Rectangle extents = new Gdk.Rectangle();
        Gdk.Window window;
        Gdk.Rectangle r;

        window = widget.ParentWindow;
        window.GetRootOrigin(out x, out y);
        window.GetSize(out w, out h);
        extents = window.FrameExtents;
        r.X = x + (extents.Width - w) / 2 + widget.Allocation.X;
        r.Y = y + (extents.Height - h) - (extents.Width - w) / 2 + widget.Allocation.Y;
        r.Width = widget.Allocation.Width;
        r.Height = widget.Allocation.Height;
       
        return r;
      }


  • È morto Dennis Ritchie

    Ho appena appreso che è morto Dennis Ritchie e questo mi rattrista un po’. Sono sicuro che la notizia non farà lo stesso rumore della morte di Jobs ma anche che il mondo dell’informatica deve ancora di più a quest’uomo. Senza di lui Ken Thompson e Brian Kerninghan non avremmo molte delle applicazioni e dei sistemi operativi che usiamo abitualmente.

    Grazie Dennis



  • gtksharp popup menu with title

    I’m studying monodevelop code more and more, and when I need to write a custom widget I get inspiration from what the good monodevelop developer worte down. This time the problem I need to solve was to have a popup menu with a title. So I ended up with the following solution.

    //
    // PopupMenu.cs
    //  
    // Author:
    //       Stefano Canepa <s .canepa@pentaengineering.it>
    //
    // Copyright (c) 2011, 2011 Penta Engineering s.r.l.
    //  
    // All rights reserved.
    // Redistribution and use in source and binary forms, with or without
    // modification, are permitted provided that the following conditions are met:
    //     * Redistributions of source code must retain the above copyright
    //       notice, this list of conditions and the following disclaimer.
    //     * Redistributions in binary form must reproduce the above copyright
    //       notice, this list of conditions and the following disclaimer in the
    //       documentation and/or other materials provided with the distribution.
    //     * Neither the name of the Penta Engineering s.r.l. nor the
    //       names of its contributors may be used to endorse or promote products
    //       derived from this software without specific prior written permission.
    //  
    // THIS SOFTWARE IS PROVIDED BY Penta Engineering s.r.l. ``AS IS'' AND ANY
    // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
    // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
    // DISCLAIMED. IN NO EVENT SHALL Penta Engineering s.r.l. BE LIABLE FOR ANY
    // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
    // (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
    // LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
    // ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
    // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
    // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

    using System;
    using Gtk;
    using Gdk;

    namespace GUI.Components
    {
      public class PopupMenuEntry : Gtk.EventBox
      {
        private string menuEntryLabelString;
        private Gtk.Label menuEntryLabel;
       
        public string MenuEntryLabelString
        {
          get {
            return this.menuEntryLabelString;
          }
        }
       
        public string Markup
        {
          set
          {
            menuEntryLabel.Markup = value;
          }
        }
       
        public PopupMenuEntry(string label) : base()
        {
          menuEntryLabel = new Label();
          menuEntryLabelString = label;
         
          BorderWidth = 2;
          menuEntryLabel.SetPadding(10,1);
          menuEntryLabel.UseMarkup = true;
          menuEntryLabel.Markup = "<span color=\"black\">" + menuEntryLabelString + "</span>";
          menuEntryLabel.Justify = Justification.Left;
       
          ModifyBg(Gtk.StateType.Normal, new Gdk.Color(242, 242, 242));
          ModifyFg(Gtk.StateType.Normal, new Gdk.Color(0, 0, 0));
          // Add(menuEntryLabel);
          Gtk.HBox h = new Gtk.HBox();
          h.PackStart(menuEntryLabel, false, false, 0);
          Add(h);
         
        }
      }
     
      public class PopupMenu : Gtk.Window
      {
        private static bool poppedUp;
        private static PopupMenu prevPopup;
        bool nudgeVertical = false;
        bool nudgeHorizontal = false;
       
        Gtk.VBox menuBox = new Gtk.VBox();
       
        public void Add(PopupMenuEntry menuEntryEvBox)
        {
          menuBox.PackStart(menuEntryEvBox, false, false, 0);

          menuEntryEvBox.ButtonPressEvent += delegate(object o, ButtonPressEventArgs args) {
            this.Destroy();
          };
          menuEntryEvBox.EnterNotifyEvent += delegate {
            menuEntryEvBox.ModifyBg(Gtk.StateType.Normal, new Gdk.Color(108, 149, 201));
            menuEntryEvBox.ModifyFg(Gtk.StateType.Normal, new Gdk.Color(255, 255, 255));
            menuEntryEvBox.Markup = "<span color=\"white\">" + menuEntryEvBox.MenuEntryLabelString + "</span>";

          };
          menuEntryEvBox.LeaveNotifyEvent += delegate {
            menuEntryEvBox.ModifyBg(Gtk.StateType.Normal, new Gdk.Color(242, 242, 242));
            menuEntryEvBox.ModifyFg(Gtk.StateType.Normal, new Gdk.Color(0, 0, 0));
            menuEntryEvBox.Markup = "<span color=\"black\">" + menuEntryEvBox.MenuEntryLabelString + "</span>";

          };
        }
       
        public void Popup()
        {
          if(poppedUp == false)
          {
            this.ShowAll();
            prevPopup = this;
            poppedUp = true;
          }
          else
          {
            prevPopup.Destroy();
            poppedUp = false;
          }
        }

        public PopupMenu(string title) : this()
        {
          Gtk.EventBox titleEvBox= new EventBox();
          titleEvBox.ModifyBg(Gtk.StateType.Normal, new  Gdk.Color(192, 192, 192));
          Gtk.Label titleLabel = new Label(title);
          titleLabel.SetPadding(0, 2);
          titleEvBox.Add(titleLabel);
         
          menuBox.Add(titleEvBox);
        }
       
       
        public PopupMenu() : base(Gtk.WindowType.Popup)
        {
         
          this.SkipPagerHint = true;
          this.SkipTaskbarHint = true;
          this.Decorated = false;
          this.BorderWidth = 1;
          this.AllowShrink = false;
          this.AllowGrow = false;
         
          //fake widget name for stupid theme engines
          this.Name = "gtk-tooltip";
          this.Title = "tooltip";

          Add(menuBox);
          ModifyBg(Gtk.StateType.Normal, new Gdk.Color(242, 242, 242));

          int x, y;
          Gdk.Screen.Default.Display.GetPointer(out x, out y);
          Move(x, y);
        }
       
        public bool NudgeVertical
        {
          get { return nudgeVertical; }
          set { nudgeVertical = value; }
        }

        public bool NudgeHorizontal
        {
          get { return nudgeHorizontal; }
          set { nudgeHorizontal = value; }
        }
       
        protected override bool OnExposeEvent(Gdk.EventExpose evnt)
        {
          int winWidth, winHeight;
          this.GetSize(out winWidth, out winHeight);
          Gtk.Style.PaintFlatBox(Style, this.GdkWindow, StateType.Normal,
                                 ShadowType.Out, evnt.Area, this,
                                 "tooltip", 0, 0, winWidth, winHeight);
          foreach(var child in this.Children)
            this.PropagateExpose(child, evnt);
          return false;
        }

        protected override void OnSizeAllocated(Gdk.Rectangle allocation)
        {
          if(nudgeHorizontal || nudgeVertical)
          {
            int x, y;
            this.GetPosition(out x, out y);
            int oldY = y, oldX = x;
            const int edgeGap = 2;
           
            Gdk.Rectangle geometry = Screen.GetMonitorGeometry(Screen.GetMonitorAtPoint(x, y));
            if(nudgeHorizontal)
            {
              if(allocation.Width < = geometry.Width && x + allocation.Width >= geometry.Width - edgeGap)
                x = geometry.Left + (geometry.Width - allocation.Height - edgeGap);
              if(x < = geometry.Left)
                x = geometry.Left;
            }
           
            if(nudgeVertical)
            {
              if(allocation.Height <= geometry.Height && y + allocation.Height >= geometry.Height - edgeGap)
                y = geometry.Top + (geometry.Height - allocation.Height - edgeGap);
              if(y < = geometry.Top)
                y = geometry.Top;
            }
           
            if(y != oldY || x != oldX)
              Move(x, y);
          }
         
          base.OnSizeAllocated(allocation);
        }
       
      }
    }

    This widget can be used as a popup menu. It needs to be improved but I publish to give others a starting point. The more important thinks to improve/implement are:
    1) selection highlighting needs to follow selected theme
    2) title should be setted out of the constructor, too
    3) separators need to be added

    If you use it please provide a little commend and if you improve it please public and link you new code.