#include "phluid.h"
#include "debug.h"

void
drag_client(Client * c, int mouse_x, int mouse_y)
{
  XEvent ev;
  Client *exposed;
  int startx, starty;

  startx = c->x;
  starty = c->y;

  /* XGrabServer(disp); */
#ifdef DEBUG
  fprintf(stdout, "in drag_client: %d,%d\n", mouse_x, mouse_y);
#endif

  for (;;) {
    XMaskEvent(disp, ButtonReleaseMask | PointerMotionMask | ExposureMask, &ev);
    switch (ev.type) {
      case MotionNotify:
#ifdef DEBUG
        fprintf(stdout, "got MotionNotify: %d,%d\n", ev.xmotion.x_root,
                ev.xmotion.y_root);
#endif
        c->x = startx + (ev.xmotion.x_root - mouse_x);
        c->y = starty + (ev.xmotion.y_root - mouse_y);
#ifdef DEBUG
        fprintf(stdout, "c->x, c->y: %d,%d\n", c->x, c->y);
#endif

        if (!MOVE_AFTER_DRAG) {
          XMoveWindow(disp, c->frame, c->x, c->y);
          XFlush(disp);
          if (!SEND_CONFIGURE_AFTER_DRAG)
            icccm_send_configure_event(c);
        }
        break;
      case ButtonRelease:
        /* XUngrabServer(disp); */
        return;
      case Expose:
        exposed = find_client_by_frame(ev.xexpose.window);
        if (exposed) {
          exposed->updates =
              imlib_update_append_rect(exposed->updates, ev.xexpose.x,
                                       ev.xexpose.y, ev.xexpose.width,
                                       ev.xexpose.height);
          redraw_client(exposed);
        }
        break;
    }
  }
}

void
shade_client(Client * c)
{
  if(!c->shaded) {
    c->shaded = 1;
    XResizeWindow(disp, c->frame, c->width, TITLEBAR_HEIGHT);
    c->ignore_unmap++;
    XUnmapWindow(disp, c->window);
    icccm_set_state(c, IconicState);
  } else {
    c->shaded = 0;
    XMapWindow(disp, c->window);
    XResizeWindow(disp, c->frame, c->width, c->height + TITLEBAR_HEIGHT);
    icccm_set_state(c, NormalState);
  }
}

void
iconify_client(Client * c)
{
  if(c->visible) {
    c->visible = 0;
    c->ignore_unmap += 2;
    XUnmapWindow(disp, c->frame);
    XUnmapWindow(disp, c->window);
    icccm_set_state(c, IconicState);
  } else {
    c->visible = 1;
    XMapWindow(disp, c->window);
    XMapWindow(disp, c->frame);
    icccm_set_state(c, NormalState);
  }
}


syntax highlighted by Code2HTML, v. 0.9.1