Esempio n. 1
0
std::vector<display::mode> display::modes() const
{
	std::vector<display::mode> result;
	if (randr.is_available)
	{
		XRRScreenResources* sr = XRRGetScreenResources(g_display, g_root);
		XRRCrtcInfo* ci = XRRGetCrtcInfo(g_display, sr, crtc);
		XRROutputInfo* oi = XRRGetOutputInfo(g_display, sr, output);

		for (int i = 0; i < oi->nmode; ++i)
		{
			XRRModeInfo const* mi = mode_info(sr, oi->modes[i]);
			if (mi && !(mi->modeFlags & RR_Interlace))
			{
				result.emplace_back(make_mode(mi, ci));
			}
		}

		XRRFreeOutputInfo(oi);
		XRRFreeCrtcInfo(ci);
		XRRFreeScreenResources(sr);

		std::sort(result.begin(), result.end());
		result.erase(std::unique(result.begin(), result.end()), result.end());
	}
	else
	{
		result.emplace_back(current_mode());
	}
	return result;
}
Esempio n. 2
0
static int gdlm_lock(struct gfs2_glock *gl, unsigned int req_state,
		     unsigned int flags)
{
	struct lm_lockstruct *ls = &gl->gl_sbd->sd_lockstruct;
	int req;
	u32 lkf;
	char strname[GDLM_STRNAME_BYTES] = "";

	req = make_mode(req_state);
	lkf = make_flags(gl, flags, req);
	gfs2_glstats_inc(gl, GFS2_LKS_DCOUNT);
	gfs2_sbstats_inc(gl, GFS2_LKS_DCOUNT);
	if (gl->gl_lksb.sb_lkid) {
		gfs2_update_request_times(gl);
	} else {
		memset(strname, ' ', GDLM_STRNAME_BYTES - 1);
		strname[GDLM_STRNAME_BYTES - 1] = '\0';
		gfs2_reverse_hex(strname + 7, gl->gl_name.ln_type);
		gfs2_reverse_hex(strname + 23, gl->gl_name.ln_number);
		gl->gl_dstamp = ktime_get_real();
	}
	/*
	 * Submit the actual lock request.
	 */

	return dlm_lock(ls->ls_dlm, req, &gl->gl_lksb, lkf, strname,
			GDLM_STRNAME_BYTES - 1, 0, gdlm_ast, gl, gdlm_bast);
}
Esempio n. 3
0
SANE_Status
sane_get_parameters (SANE_Handle handle, SANE_Parameters *params)
{
  Tamarack_Scanner *s = handle;

  if (!s->scanning) {
    double width, height, dpi;
    

    memset (&s->params, 0, sizeof (s->params));
    
    width  = SANE_UNFIX (s->val[OPT_BR_X].w - s->val[OPT_TL_X].w);
    height = SANE_UNFIX (s->val[OPT_BR_Y].w - s->val[OPT_TL_Y].w);
    dpi    = SANE_UNFIX (s->val[OPT_RESOLUTION].w);
    s->mode = make_mode (s->val[OPT_MODE].s);
    DBG(1, "got mode '%s' -> %d.\n", s->val[OPT_MODE].s, s->mode);
    /* make best-effort guess at what parameters will look like once
       scanning starts.  */
    if (dpi > 0.0 && width > 0.0 && height > 0.0) {
      double dots_per_mm = dpi / MM_PER_INCH;
      
      s->params.pixels_per_line = width * dots_per_mm;
      s->params.lines = height * dots_per_mm;
    }
    if ((s->mode == THRESHOLDED) || (s->mode == DITHERED)) {
      s->params.format = SANE_FRAME_GRAY;
      s->params.bytes_per_line = (s->params.pixels_per_line + 7) / 8;
      s->params.depth = 1;
    } else if (s->mode == GREYSCALE) {
      s->params.format = SANE_FRAME_GRAY;
      s->params.bytes_per_line = s->params.pixels_per_line;
      s->params.depth = 8;
    } else {
      s->params.format = SANE_FRAME_RED + s->pass;
      s->params.bytes_per_line = s->params.pixels_per_line;
      s->params.depth = 8;
    }
    s->pass = 0;
  } else {
    if (s->mode == TRUECOLOR)
      s->params.format = SANE_FRAME_RED + s->pass;
  }

  s->params.last_frame =  (s->mode != TRUECOLOR) || (s->pass == 2);
  
  if (params)
    *params = s->params;

  DBG(1, "Got parameters: format:%d, ppl: %d, bpl:%d, depth:%d, "
	   "last %d pass %d\n", 
	   s->params.format, s->params.pixels_per_line, 
	   s->params.bytes_per_line, s->params.depth, 
	   s->params.last_frame, s->pass);
  return SANE_STATUS_GOOD;
}
Esempio n. 4
0
static int gdlm_lock(struct gfs2_glock *gl, unsigned int req_state,
		     unsigned int flags)
{
	struct lm_lockstruct *ls = &gl->gl_sbd->sd_lockstruct;
	int req;
	u32 lkf;

	req = make_mode(req_state);
	lkf = make_flags(gl->gl_lksb.sb_lkid, flags, req);

	/*
	 * Submit the actual lock request.
	 */

	return dlm_lock(ls->ls_dlm, req, &gl->gl_lksb, lkf, gl->gl_strname,
			GDLM_STRNAME_BYTES - 1, 0, gdlm_ast, gl, gdlm_bast);
}
Esempio n. 5
0
display::mode display::current_mode() const
{
	if (randr.is_available)
	{
		XRRScreenResources* sr = XRRGetScreenResources(g_display, g_root);
		XRRCrtcInfo* ci =  XRRGetCrtcInfo(g_display, sr, crtc);

		XRRModeInfo const* mi = mode_info(sr, ci->mode);
		display::mode const result = make_mode(mi, ci);

		XRRFreeCrtcInfo(ci);
		XRRFreeScreenResources(sr);

		return result;
	}
	else
	{
		return display::mode(DisplayWidth(g_display, g_screen), DisplayHeight(g_display, g_screen),
			DefaultDepth(g_display, g_screen), 0);
	}
}
Esempio n. 6
0
static unsigned int gdlm_lock(struct gfs2_glock *gl,
                              unsigned int req_state, unsigned int flags)
{
    struct lm_lockstruct *ls = &gl->gl_sbd->sd_lockstruct;
    int error;
    int req;
    u32 lkf;

    gl->gl_req = req_state;
    req = make_mode(req_state);
    lkf = make_flags(gl->gl_lksb.sb_lkid, flags, req);

    /*
     * Submit the actual lock request.
     */

    error = dlm_lock(ls->ls_dlm, req, &gl->gl_lksb, lkf, gl->gl_strname,
                     GDLM_STRNAME_BYTES - 1, 0, gdlm_ast, gl, gdlm_bast);
    if (error == -EAGAIN)
        return 0;
    if (error)
        return LM_OUT_ERROR;
    return LM_OUT_ASYNC;
}
Esempio n. 7
0
SANE_Status
sane_start (SANE_Handle handle)
{
  Tamarack_Scanner *s = handle;
  SANE_Status status;
  int fds[2];

  /* First make sure we have a current parameter set.  Some of the
     parameters will be overwritten below, but that's OK.  */
  status = sane_get_parameters (s, 0);

  if (status != SANE_STATUS_GOOD)
      return status;

  if (s->fd < 0) {
    /* translate options into s->mode for convenient access: */
    s->mode = make_mode (s->val[OPT_MODE].s);

    if (s->mode == TRUECOLOR)
      {
	if (s->val[OPT_PREVIEW].w && s->val[OPT_GRAY_PREVIEW].w) {
	  /* Force gray-scale mode when previewing.  */
	  s->mode = GREYSCALE;
	  s->params.format = SANE_FRAME_GRAY;
	  s->params.bytes_per_line = s->params.pixels_per_line;
	  s->params.last_frame = SANE_TRUE;
	}
      }
    
    status = sanei_scsi_open (s->hw->sane.name, &s->fd, sense_handler, 0);
    if (status != SANE_STATUS_GOOD) {
      DBG(1, "open: open of %s failed: %s\n",
	  s->hw->sane.name, sane_strstatus (status));
      return status;
    }
  }

  status = wait_ready (s->fd);
  if (status != SANE_STATUS_GOOD) {
    DBG(1, "open: wait_ready() failed: %s\n", sane_strstatus (status));
    goto stop_scanner_and_return;
  }

  status = scan_area_and_windows (s);
  if (status != SANE_STATUS_GOOD) {
    DBG(1, "open: set scan area command failed: %s\n",
	sane_strstatus (status));
    goto stop_scanner_and_return;
  }

  status = mode_select (s);
  if (status != SANE_STATUS_GOOD)
    goto stop_scanner_and_return;
    
  s->scanning = SANE_TRUE;

  status = start_scan (s);
  if (status != SANE_STATUS_GOOD)
    goto stop_scanner_and_return;

  status = get_image_status (s);
  if (status != SANE_STATUS_GOOD)
    goto stop_scanner_and_return;

  s->line = 0;

  if (pipe (fds) < 0)
    return SANE_STATUS_IO_ERROR;

  s->pipe = fds[0];
  s->reader_pipe = fds[1];
  s->reader_pid = sanei_thread_begin (reader_process, (void *) s);

  if (sanei_thread_is_forked()) close (s->reader_pipe);

  return SANE_STATUS_GOOD;

stop_scanner_and_return:
  do_cancel (s);
  return status;
}
Esempio n. 8
0
SANE_Status
sane_control_option (SANE_Handle handle, SANE_Int option,
		     SANE_Action action, void *val, SANE_Int *info)
{
  Tamarack_Scanner *s = handle;
  SANE_Status status;
  SANE_Word cap;

  if (info)
    *info = 0;

  if (s->scanning)
    return SANE_STATUS_DEVICE_BUSY;

  if (option >= NUM_OPTIONS)
    return SANE_STATUS_INVAL;

  cap = s->opt[option].cap;

  if (!SANE_OPTION_IS_ACTIVE (cap))
    return SANE_STATUS_INVAL;

  if (action == SANE_ACTION_GET_VALUE) {
    switch (option) {
      /* word options: */
    case OPT_PREVIEW:
    case OPT_GRAY_PREVIEW:
    case OPT_RESOLUTION:
    case OPT_TL_X:
    case OPT_TL_Y:
    case OPT_BR_X:
    case OPT_BR_Y:
    case OPT_NUM_OPTS:
    case OPT_TRANS:
    case OPT_BRIGHTNESS:
    case OPT_CONTRAST:
    case OPT_THRESHOLD:
#if 0
    case OPT_CUSTOM_GAMMA:
#endif
      *(SANE_Word *) val = s->val[option].w;
      return SANE_STATUS_GOOD;

#if 0
      /* word-array options: */
    case OPT_GAMMA_VECTOR:
    case OPT_GAMMA_VECTOR_R:
    case OPT_GAMMA_VECTOR_G:
    case OPT_GAMMA_VECTOR_B:
      memcpy (val, s->val[option].wa, s->opt[option].size);
      return SANE_STATUS_GOOD;
#endif

      /* string options: */
    case OPT_MODE:
      strcpy (val, s->val[option].s);
      return SANE_STATUS_GOOD;
    }
  } else if (action == SANE_ACTION_SET_VALUE) {
    if (!SANE_OPTION_IS_SETTABLE (cap))
      return SANE_STATUS_INVAL;

    status = constrain_value (s, option, val, info);
    if (status != SANE_STATUS_GOOD)
      return status;
    
    switch (option)
      {
	/* (mostly) side-effect-free word options: */
      case OPT_RESOLUTION:
      case OPT_TL_X:
      case OPT_TL_Y:
      case OPT_BR_X:
      case OPT_BR_Y:
	if (info)
	  *info |= SANE_INFO_RELOAD_PARAMS;
	/* fall through */
      case OPT_PREVIEW:
      case OPT_GRAY_PREVIEW:
      case OPT_BRIGHTNESS:
      case OPT_CONTRAST:
      case OPT_THRESHOLD:
      case OPT_TRANS:
	s->val[option].w = *(SANE_Word *) val;
	return SANE_STATUS_GOOD;

#if 0
	/* side-effect-free word-array options: */
      case OPT_GAMMA_VECTOR:
      case OPT_GAMMA_VECTOR_R:
      case OPT_GAMMA_VECTOR_G:
      case OPT_GAMMA_VECTOR_B:
	memcpy (s->val[option].wa, val, s->opt[option].size);
	return SANE_STATUS_GOOD;

	/* options with side-effects: */

      case OPT_CUSTOM_GAMMA:
	w = *(SANE_Word *) val;
	if (w == s->val[OPT_CUSTOM_GAMMA].w)
	  return SANE_STATUS_GOOD;		/* no change */

	s->val[OPT_CUSTOM_GAMMA].w = w;
	if (w) {
	  s->mode = make_mode (s->val[OPT_MODE].s);

	  if (s->mode == GREYSCALE) {
	    s->opt[OPT_GAMMA_VECTOR].cap &= ~SANE_CAP_INACTIVE;
	  } else if (s->mode == TRUECOLOR) {
	    s->opt[OPT_GAMMA_VECTOR].cap   &= ~SANE_CAP_INACTIVE;
	    s->opt[OPT_GAMMA_VECTOR_R].cap &= ~SANE_CAP_INACTIVE;
	    s->opt[OPT_GAMMA_VECTOR_G].cap &= ~SANE_CAP_INACTIVE;
	    s->opt[OPT_GAMMA_VECTOR_B].cap &= ~SANE_CAP_INACTIVE;
	  }
	} else {
	  s->opt[OPT_GAMMA_VECTOR].cap   |= SANE_CAP_INACTIVE;
	  s->opt[OPT_GAMMA_VECTOR_R].cap |= SANE_CAP_INACTIVE;
	  s->opt[OPT_GAMMA_VECTOR_G].cap |= SANE_CAP_INACTIVE;
	  s->opt[OPT_GAMMA_VECTOR_B].cap |= SANE_CAP_INACTIVE;
	}
	if (info)
	  *info |= SANE_INFO_RELOAD_OPTIONS;
	return SANE_STATUS_GOOD;
#endif

      case OPT_MODE:
	{

	  if (s->val[option].s)
	    free (s->val[option].s);
	  s->val[option].s = strdup (val);

	  s->mode = make_mode (s->val[OPT_MODE].s);

	  if (info)
	    *info |= SANE_INFO_RELOAD_OPTIONS | SANE_INFO_RELOAD_PARAMS;

	  s->opt[OPT_BRIGHTNESS].cap |= SANE_CAP_INACTIVE;
	  s->opt[OPT_CONTRAST].cap   |= SANE_CAP_INACTIVE;
	  s->opt[OPT_THRESHOLD].cap  |= SANE_CAP_INACTIVE;
#if 0
	  s->opt[OPT_CUSTOM_GAMMA].cap |= SANE_CAP_INACTIVE;
	  s->opt[OPT_GAMMA_VECTOR].cap |= SANE_CAP_INACTIVE;
	  s->opt[OPT_GAMMA_VECTOR_R].cap |= SANE_CAP_INACTIVE;
	  s->opt[OPT_GAMMA_VECTOR_G].cap |= SANE_CAP_INACTIVE;
	  s->opt[OPT_GAMMA_VECTOR_B].cap |= SANE_CAP_INACTIVE;
#endif


	  if (strcmp (val, SANE_VALUE_SCAN_MODE_LINEART) == 0) 
	    s->opt[OPT_THRESHOLD].cap  &= ~SANE_CAP_INACTIVE;
	  else {
	    s->opt[OPT_BRIGHTNESS].cap &= ~SANE_CAP_INACTIVE;
	    s->opt[OPT_CONTRAST].cap   &= ~SANE_CAP_INACTIVE;
	  }
#if 0
	  if (!binary)
	    s->opt[OPT_CUSTOM_GAMMA].cap &= ~SANE_CAP_INACTIVE;

	  if (s->val[OPT_CUSTOM_GAMMA].w) {
	    if (strcmp (val, SANE_VALUE_SCAN_MODE_GRAY) == 0)
	      s->opt[OPT_GAMMA_VECTOR].cap &= ~SANE_CAP_INACTIVE;
	    else if (strcmp (val, SANE_VALUE_SCAN_MODE_COLOR) == 0) {
	      s->opt[OPT_GAMMA_VECTOR].cap   &= ~SANE_CAP_INACTIVE;
	      s->opt[OPT_GAMMA_VECTOR_R].cap &= ~SANE_CAP_INACTIVE;
	      s->opt[OPT_GAMMA_VECTOR_G].cap &= ~SANE_CAP_INACTIVE;
	      s->opt[OPT_GAMMA_VECTOR_B].cap &= ~SANE_CAP_INACTIVE;
	    }
	  }
#endif
	  return SANE_STATUS_GOOD;
	}
      }
    }
  return SANE_STATUS_INVAL;
}