2007-12-30 16:41:49 +00:00
|
|
|
/***************************************************************************
|
|
|
|
|
|
|
|
gdesktop.cpp
|
|
|
|
|
|
|
|
(c) 2004-2006 - Daniel Campos Fernández <dcamposf@gmail.com>
|
|
|
|
|
|
|
|
Gtkmae "GTK+ made easy" classes
|
|
|
|
|
|
|
|
Realizado para la Junta de Extremadura.
|
|
|
|
Consejería de Educación Ciencia y Tecnología.
|
|
|
|
Proyecto gnuLinEx
|
|
|
|
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
|
|
it under the terms of the GNU General Public License as published by
|
|
|
|
the Free Software Foundation; either version 1, or (at your option)
|
|
|
|
any later version.
|
|
|
|
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
GNU General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
|
along with this program; if not, write to the Free Software
|
|
|
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
|
|
|
|
|
|
***************************************************************************/
|
|
|
|
|
|
|
|
#include "widgets.h"
|
|
|
|
#include "widgets_private.h"
|
2008-06-26 09:49:06 +00:00
|
|
|
#include "gb.form.font.h"
|
2007-12-30 16:41:49 +00:00
|
|
|
|
|
|
|
#ifndef GAMBAS_DIRECTFB
|
|
|
|
#ifdef GDK_WINDOWING_X11
|
|
|
|
#include <gdk/gdkx.h>
|
|
|
|
#include <X11/X.h>
|
|
|
|
#include <X11/Xlib.h>
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#include "gapplication.h"
|
|
|
|
#include "gmainwindow.h"
|
|
|
|
#include "gdesktop.h"
|
|
|
|
|
|
|
|
/***********************************************************************
|
|
|
|
|
|
|
|
Cursor
|
|
|
|
|
|
|
|
************************************************************************/
|
|
|
|
|
|
|
|
gCursor::gCursor(gPicture *pic,int px,int py)
|
|
|
|
{
|
|
|
|
GdkPixbuf *buf;
|
|
|
|
GdkDisplay *dp=gdk_display_get_default();
|
|
|
|
|
|
|
|
x=px;
|
|
|
|
y=py;
|
|
|
|
|
|
|
|
cur=NULL;
|
|
|
|
if (!pic) return;
|
|
|
|
if (!pic->pic) return;
|
|
|
|
|
|
|
|
if (pic->width()<=x) x=pic->width()-1;
|
|
|
|
if (pic->height()<=y) y=pic->height()-1;
|
|
|
|
|
|
|
|
buf=pic->getPixbuf();
|
|
|
|
cur=gdk_cursor_new_from_pixbuf(dp,buf,x,y);
|
|
|
|
g_object_unref(buf);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
gCursor::gCursor(gCursor *cursor)
|
|
|
|
{
|
|
|
|
cur=NULL;
|
|
|
|
if (!cursor) return;
|
|
|
|
if (!cursor->cur) return;
|
|
|
|
|
|
|
|
cur=cursor->cur;
|
|
|
|
x=cursor->x;
|
|
|
|
y=cursor->y;
|
|
|
|
if (cur) gdk_cursor_ref(cur);
|
|
|
|
}
|
|
|
|
|
|
|
|
gCursor::~gCursor()
|
|
|
|
{
|
|
|
|
if (cur) gdk_cursor_unref(cur);
|
|
|
|
}
|
|
|
|
|
|
|
|
int gCursor::left()
|
|
|
|
{
|
|
|
|
return x;
|
|
|
|
}
|
|
|
|
|
|
|
|
int gCursor::top()
|
|
|
|
{
|
|
|
|
return y;
|
|
|
|
}
|
|
|
|
|
|
|
|
/***********************************************************************
|
|
|
|
|
|
|
|
Desktop
|
|
|
|
|
|
|
|
************************************************************************/
|
|
|
|
|
|
|
|
gControl *gDesktop::_active_control = NULL;
|
|
|
|
gFont *gDesktop::_desktop_font = NULL;
|
|
|
|
int gDesktop::_desktop_scale = 0;
|
|
|
|
|
|
|
|
bool gDesktop::rightToLeft()
|
|
|
|
{
|
|
|
|
return gtk_widget_get_default_direction() == GTK_TEXT_DIR_RTL;
|
|
|
|
}
|
|
|
|
|
|
|
|
void gDesktop::init()
|
|
|
|
{
|
|
|
|
_desktop_font = new gFont();
|
|
|
|
_desktop_scale = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void gDesktop::exit()
|
|
|
|
{
|
|
|
|
gFont::assign(&_desktop_font);
|
|
|
|
}
|
|
|
|
|
|
|
|
gFont* gDesktop::font()
|
|
|
|
{
|
|
|
|
if (!_desktop_font) gDesktop::init();
|
|
|
|
return _desktop_font;
|
|
|
|
}
|
|
|
|
|
|
|
|
void gDesktop::setFont(gFont *ft)
|
|
|
|
{
|
2008-03-17 15:04:36 +00:00
|
|
|
gFont::set(&_desktop_font, ft->copy());
|
2007-12-30 16:41:49 +00:00
|
|
|
_desktop_scale = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*gControl* gDesktop::activeControl()
|
|
|
|
{
|
|
|
|
gControl *test, *curr=NULL;
|
|
|
|
GList *iter=gControl::controlList();
|
|
|
|
|
|
|
|
if (!iter) return NULL;
|
|
|
|
|
|
|
|
iter=g_list_first(iter);
|
|
|
|
while (iter)
|
|
|
|
{
|
|
|
|
test=(gControl*)iter->data;
|
|
|
|
if (test->hasFocus())
|
|
|
|
{
|
|
|
|
curr=test;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
iter=iter->next;
|
|
|
|
}
|
|
|
|
|
|
|
|
return curr;
|
|
|
|
|
|
|
|
}*/
|
|
|
|
|
|
|
|
void gDesktop::setActiveControl(gControl *control)
|
|
|
|
{
|
|
|
|
_active_control = control;
|
|
|
|
}
|
|
|
|
|
|
|
|
gMainWindow* gDesktop::activeWindow()
|
|
|
|
{
|
|
|
|
return gMainWindow::_active ? gMainWindow::_active->topLevel() : NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
gColor gDesktop::buttonfgColor()
|
|
|
|
{
|
|
|
|
GtkStyle *st = gt_get_style("GtkButton", GTK_TYPE_BUTTON);
|
|
|
|
|
|
|
|
if (!st) return 0;
|
|
|
|
return get_gdk_color(&st->fg[GTK_STATE_NORMAL]);
|
|
|
|
}
|
|
|
|
|
|
|
|
gColor gDesktop::buttonbgColor()
|
|
|
|
{
|
|
|
|
GtkStyle *st = gt_get_style("GtkButton", GTK_TYPE_BUTTON);
|
|
|
|
|
|
|
|
if (!st) return 0xC0C0C0;
|
|
|
|
return get_gdk_color(&st->bg[GTK_STATE_NORMAL]);
|
|
|
|
}
|
|
|
|
|
|
|
|
gColor gDesktop::fgColor()
|
|
|
|
{
|
|
|
|
GtkStyle *st = gt_get_style("GtkEntry", GTK_TYPE_ENTRY);
|
|
|
|
|
|
|
|
if (!st) return 0;
|
|
|
|
return get_gdk_color(&st->fg[GTK_STATE_NORMAL]);
|
|
|
|
}
|
|
|
|
|
|
|
|
gColor gDesktop::bgColor()
|
|
|
|
{
|
|
|
|
GtkStyle *st = gt_get_style("GtkLayout", GTK_TYPE_LAYOUT);
|
|
|
|
|
|
|
|
if (!st) return 0xC0C0C0;
|
|
|
|
return get_gdk_color(&st->bg[GTK_STATE_NORMAL]);
|
|
|
|
}
|
|
|
|
|
|
|
|
gColor gDesktop::textfgColor()
|
|
|
|
{
|
|
|
|
GtkStyle *st = gt_get_style("GtkEntry", GTK_TYPE_ENTRY);
|
|
|
|
|
|
|
|
if (!st) return 0;
|
|
|
|
return get_gdk_color(&st->text[GTK_STATE_NORMAL]);
|
|
|
|
}
|
|
|
|
|
|
|
|
gColor gDesktop::textbgColor()
|
|
|
|
{
|
|
|
|
GtkStyle *st = gt_get_style("GtkEntry", GTK_TYPE_ENTRY);
|
|
|
|
|
|
|
|
if (!st) return 0xFFFFFF;
|
|
|
|
return get_gdk_color(&st->base[GTK_STATE_NORMAL]);
|
|
|
|
}
|
|
|
|
|
|
|
|
gColor gDesktop::selfgColor()
|
|
|
|
{
|
|
|
|
GtkStyle *st = gt_get_style("GtkEntry", GTK_TYPE_ENTRY);
|
|
|
|
|
|
|
|
if (!st) return 0XFFFFFF;
|
|
|
|
return get_gdk_color(&st->text[GTK_STATE_SELECTED]);
|
|
|
|
}
|
|
|
|
|
|
|
|
gColor gDesktop::selbgColor()
|
|
|
|
{
|
|
|
|
GtkStyle *st = gt_get_style("GtkEntry", GTK_TYPE_ENTRY);
|
|
|
|
|
|
|
|
if (!st) return 0x0000FF;
|
|
|
|
return get_gdk_color(&st->base[GTK_STATE_SELECTED]);
|
|
|
|
}
|
|
|
|
|
|
|
|
int gDesktop::height()
|
|
|
|
{
|
|
|
|
return gdk_screen_get_height(gdk_screen_get_default ());
|
|
|
|
}
|
|
|
|
|
|
|
|
int gDesktop::width()
|
|
|
|
{
|
|
|
|
return gdk_screen_get_width(gdk_screen_get_default ());
|
|
|
|
}
|
|
|
|
|
|
|
|
int gDesktop::resolution()
|
|
|
|
{
|
|
|
|
int d_pix=gdk_screen_get_width(gdk_screen_get_default());
|
|
|
|
int d_mm=gdk_screen_get_width_mm(gdk_screen_get_default());
|
|
|
|
|
|
|
|
return (int)(d_pix*25.4)/d_mm;
|
|
|
|
}
|
|
|
|
|
|
|
|
int gDesktop::scale()
|
|
|
|
{
|
|
|
|
PangoLanguage *lng=NULL;
|
|
|
|
PangoContext* ct=gdk_pango_context_get();
|
|
|
|
GtkStyle *sty=gtk_widget_get_default_style();
|
|
|
|
PangoFontDescription *ft=sty->font_desc;
|
|
|
|
PangoFontMetrics* fm;
|
|
|
|
int val;
|
|
|
|
|
|
|
|
if (!_desktop_scale)
|
|
|
|
{
|
|
|
|
if (getenv("LANG"))
|
|
|
|
lng = pango_language_from_string(getenv("LANG"));
|
|
|
|
|
|
|
|
fm = pango_context_get_metrics (ct,ft,lng);
|
|
|
|
|
2008-06-26 09:49:06 +00:00
|
|
|
val = 1 + (pango_font_metrics_get_ascent(fm) + pango_font_metrics_get_descent(fm)) / PANGO_SCALE;
|
|
|
|
val = GET_DESKTOP_SCALE(val);
|
2007-12-30 16:41:49 +00:00
|
|
|
|
|
|
|
pango_font_metrics_unref(fm);
|
|
|
|
g_object_unref(G_OBJECT(ct));
|
|
|
|
|
|
|
|
if (!val) val = 1;
|
|
|
|
_desktop_scale = val;
|
|
|
|
}
|
|
|
|
|
|
|
|
return _desktop_scale;
|
|
|
|
}
|
|
|
|
|
|
|
|
gPicture* gDesktop::grab()
|
|
|
|
{
|
|
|
|
return Grab_gdkWindow(gdk_get_default_root_window());
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|