Module Subtlext::Subtle

Module for interaction with the window manager

Public class methods

colors → Hash

Get an array of all Colors.

1 Subtlext::Subtle.colors
2 => { :fg_panel => #<Subtlext::Color:xxx> }
[show source]
VALUE
subextSubtleSingColors(VALUE self)
{
  int i;
  unsigned long ncolors = 0, *colors = NULL;
  VALUE meth = Qnil, klass = Qnil, hash = Qnil;
  const char *names[] = {
    "title_fg",           "title_bg",             "title_bo_top",
    "title_bo_right",     "title_bo_bottom",      "title_bo_left",
    "views_fg",           "views_bg",             "views_bo_top",
    "views_bo_right",     "views_bo_bottom",      "views_bo_left",
    "focus_fg",           "focus_bg",             "focus_bo_top",
    "focus_bo_right",     "focus_bo_bottom",      "focus_bo_left",
    "urgent_fg",          "urgent_bg",            "urgent_bo_top",
    "urgent_bo_right",    "urgent_bo_bottom",     "urgent_bo_left",
    "occupied_fg",        "occupied_bg",          "occupied_bo_top",
    "occupied_bo_right",  "occupied_bo_bottom",   "occupied_bo_left",
    "sublets_fg",         "sublets_bg",           "sublets_bo_top",
    "sublets_bo_right",   "sublets_bo_bottom",    "sublets_bo_left",
    "separator_fg",       "separator_bg",         "separator_bo_top",
    "separator_bo_right", "separator_bo_bottom",  "separator_bo_left",
    "client_active",      "client_inactive",
    "panel_top",          "panel_bottom",
    "stipple",            "background"
  };

  subextSubtlextConnect(NULL); ///< Implicit open connection

  /* Fetch data */
  meth  = rb_intern("new");
  klass = rb_const_get(mod, rb_intern("Color"));
  hash  = rb_hash_new();

  /* Check result */
  if((colors = (unsigned long *)subSharedPropertyGet(display,
      DefaultRootWindow(display), XA_CARDINAL,
      XInternAtom(display, "SUBTLE_COLORS", False), &ncolors)))
    {
      for(i = 0; i < ncolors && i < LENGTH(names); i++)
        {
          VALUE c = rb_funcall(klass, meth, 1, LONG2NUM(colors[i]));

          rb_hash_aset(hash, CHAR2SYM(names[i]), c);
        }

      free(colors);
    }

  return hash;
}
display → String

Get the display name.

1 subtle.display
2 => ":0"
[show source]
VALUE
subextSubtleSingDisplayReader(VALUE self)
{
  subextSubtlextConnect(NULL); ///< Implicit open connection

  return rb_str_new2(DisplayString(display));
}
display=(string) → nil

Set the display name.

1 subtle.display = ":0"
2 => nil
[show source]
VALUE
subextSubtleSingDisplayWriter(VALUE self,
  VALUE display_string)
{
  /* Explicit open connection */
  subextSubtlextConnect(T_STRING == rb_type(display_string) ?
    RSTRING_PTR(display_string) : NULL);

  return Qnil;
}
Font → String or nil

Get the font used in subtle.

1 Subtlext::Subtle.font
2 => "-*-*-medium-*-*-*-14-*-*-*-*-*-*-*"
[show source]
VALUE
subextSubtleSingFont(VALUE self)
{
  char *prop = NULL;
  VALUE font = Qnil;

  subextSubtlextConnect(NULL); ///< Implicit open connection

  /* Get results */
  if((prop = subSharedPropertyGet(display, DefaultRootWindow(display),
      XInternAtom(display, "UTF8_STRING", False),
      XInternAtom(display, "SUBTLE_FONT", False),
      NULL)))
    {
      font = rb_str_new2(prop);

      free(prop);
    }

  return font;
}
quit → nil

Force Subtle to exit.

1 subtle.reload
2 => nil
[show source]
VALUE
subextSubtleSingQuit(VALUE self)
{
  return SubtleSend("SUBTLE_QUIT");
}
reload → nil

Force Subtle to reload config and sublets.

1 subtle.reload
2 => nil
[show source]
VALUE
subextSubtleSingReload(VALUE self)
{
  return SubtleSend("SUBTLE_RELOAD");
}
render → nil

Force Subtle to render screen panels.

1 subtle.reload
2 => nil
[show source]
VALUE
subextSubtleSingRender(VALUE self)
{
  return SubtleSend("SUBTLE_RENDER");
}
restart → nil

Force Subtle to restart.

1 subtle.restart
2 => nil
[show source]
VALUE
subextSubtleSingRestart(VALUE self)
{
  return SubtleSend("SUBTLE_RESTART");
}
running? → true or false

Whether a subtle instance on current display is running.

1 subtle.running?
2 => true
3 
4 subtle.running?
5 => false
[show source]
VALUE
subextSubtleSingAskRunning(VALUE self)
{
  char *version = NULL;
  Window *support = NULL;
  VALUE running = Qfalse;

  subextSubtlextConnect(NULL); ///< Implicit open connection

  /* Get supporting window */
  if((support = (Window *)subSharedPropertyGet(display,
      DefaultRootWindow(display), XA_WINDOW, XInternAtom(display,
      "_NET_SUPPORTING_WM_CHECK", False), NULL)))
    {
      /* Get version property */
      if((version = subSharedPropertyGet(display, *support, XInternAtom(display,
          "UTF8_STRING", False), XInternAtom(display, "SUBTLE_VERSION", False),
          NULL)))
        {
          running = Qtrue;

          free(version);
        }

      free(support);
    }

  return running;
}
select_window → Fixnum

Select a window and get the window id of it.

1 select_window
2 => 8388617
[show source]
VALUE
subextSubtleSingSelect(VALUE self)
{
  int i, format = 0, buttons = 0;
  unsigned int nwins = 0;
  unsigned long nitems = 0, bytes = 0;
  unsigned char *data = NULL;
  XEvent event;
  Window win = None;
  Atom type = None, rtype = None;
  Window wroot = None, parent = None, root = None, *wins = NULL;
  Cursor cursor = None;

  subextSubtlextConnect(NULL); ///< Implicit open connection

  root   = DefaultRootWindow(display);
  cursor = XCreateFontCursor(display, XC_cross);
  type   = XInternAtom(display, "WM_STATE", True);

  /* Grab pointer */
  if(XGrabPointer(display, root, False, ButtonPressMask|ButtonReleaseMask,
      GrabModeSync, GrabModeAsync, root, cursor, CurrentTime))
    {
      XFreeCursor(display, cursor);

      return Qnil;
    }

  /* Select a window */
  while(None == win || 0 != buttons)
    {
      XAllowEvents(display, SyncPointer, CurrentTime);
      XWindowEvent(display, root, ButtonPressMask|ButtonReleaseMask, &event);

      switch(event.type)
        {
          case ButtonPress:
            if(None == win)
              win = event.xbutton.subwindow ? event.xbutton.subwindow : root; ///< Sanitize
            buttons++;
            break;
          case ButtonRelease:
            if(0 < buttons) buttons--;
            break;
        }
      }

  /* Find children with WM_STATE atom */
  XQueryTree(display, win, &wroot, &parent, &wins, &nwins);

  for(i = 0; i < nwins; i++)
    {
      if(Success == XGetWindowProperty(display, wins[i], type, 0, 0, False,
          AnyPropertyType, &rtype, &format, &nitems, &bytes, &data))
        {
          if(data)
            {
              XFree(data);
              data = NULL;
            }

          if(type == rtype)
            {
              win = wins[i];

              break;
            }
        }
    }

  if(wins) XFree(wins);
  XFreeCursor(display, cursor);
  XUngrabPointer(display, CurrentTime);

  XSync(display, False); ///< Sync all changes

  return None != win ? LONG2NUM(win) : Qnil;
}