Let the desktop application rotate the screen

This commit is contained in:
Pierre Pronchery 2012-03-21 03:17:46 +00:00
parent 1157d3d4e2
commit 79daf44445
13 changed files with 397 additions and 132 deletions

View File

@ -35,6 +35,9 @@ dist:
$(PACKAGE)-$(VERSION)/include/Browser.h \
$(PACKAGE)-$(VERSION)/include/Makefile \
$(PACKAGE)-$(VERSION)/include/project.conf \
$(PACKAGE)-$(VERSION)/include/Browser/desktop.h \
$(PACKAGE)-$(VERSION)/include/Browser/Makefile \
$(PACKAGE)-$(VERSION)/include/Browser/project.conf \
$(PACKAGE)-$(VERSION)/po/Makefile \
$(PACKAGE)-$(VERSION)/po/gettext.sh \
$(PACKAGE)-$(VERSION)/po/POTFILES \

View File

@ -20,6 +20,7 @@
# include <gtk/gtk.h>
# include <Desktop.h>
# include "Browser/desktop.h"
/* Browser */

23
include/Browser/Makefile Normal file
View File

@ -0,0 +1,23 @@
PREFIX = /usr/local
DESTDIR =
RM ?= rm -f
LN ?= ln -f
MKDIR ?= mkdir -p
INSTALL ?= install
INCLUDEDIR= $(PREFIX)/include
all:
clean:
distclean: clean
install:
$(MKDIR) $(DESTDIR)$(PREFIX)/include/Desktop/Browser
$(INSTALL) -m 0644 -- desktop.h $(DESTDIR)$(PREFIX)/include/Desktop/Browser/desktop.h
uninstall:
$(RM) -- $(DESTDIR)$(PREFIX)/include/Desktop/Browser/desktop.h
.PHONY: all clean distclean install uninstall

71
include/Browser/desktop.h Normal file
View File

@ -0,0 +1,71 @@
/* $Id$ */
/* Copyright (c) 2012 Pierre Pronchery <khorben@defora.org> */
/* This file is part of DeforaOS Desktop Browser */
/* 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, version 3 of the License.
*
* 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, see <http://www.gnu.org/licenses/>. */
#ifndef DESKTOP_BROWSER_DESKTOP_H
# define DESKTOP_BROWSER_DESKTOP_H
# include <gtk/gtk.h>
# include <Desktop.h>
/* Desktop */
/* public */
/* types */
typedef enum _DesktopAlignment
{
DESKTOP_ALIGNMENT_VERTICAL = 0,
DESKTOP_ALIGNMENT_HORIZONTAL
} DesktopAlignment;
typedef enum _DesktopIcons
{
DESKTOP_ICONS_NONE = 0,
DESKTOP_ICONS_APPLICATIONS,
DESKTOP_ICONS_CATEGORIES,
DESKTOP_ICONS_FILES,
DESKTOP_ICONS_HOMESCREEN
} DesktopIcons;
# define DESKTOP_ICONS_LAST DESKTOP_ICONS_HOMESCREEN
# define DESKTOP_ICONS_COUNT (DESKTOP_ICONS_LAST + 1)
typedef enum _DesktopLayout
{
DESKTOP_LAYOUT_NORMAL = 0,
DESKTOP_LAYOUT_LANDSCAPE,
DESKTOP_LAYOUT_PORTRAIT,
DESKTOP_LAYOUT_ROTATE,
DESKTOP_LAYOUT_TOGGLE
} DesktopLayout;
typedef enum _DesktopMessage
{
DESKTOP_MESSAGE_SET_ALIGNMENT = 0,
DESKTOP_MESSAGE_SET_ICONS,
DESKTOP_MESSAGE_SET_LAYOUT,
DESKTOP_MESSAGE_SHOW
} DesktopMessage;
typedef enum _DesktopShow
{
DESKTOP_SHOW_SETTINGS = 0
} DesktopMessageShow;
/* constants */
# define DESKTOP_CLIENT_MESSAGE "DEFORAOS_DESKTOP_DESKTOP_CLIENT"
#endif /* !DESKTOP_BROWSER_DESKTOP_H */

View File

@ -0,0 +1,5 @@
includes=desktop.h
dist=Makefile
[desktop.h]
install=$(PREFIX)/include/Desktop/Browser

View File

@ -1,3 +1,4 @@
SUBDIRS = Browser
PREFIX = /usr/local
DESTDIR =
RM ?= rm -f
@ -7,17 +8,24 @@ INSTALL ?= install
INCLUDEDIR= $(PREFIX)/include
all:
all: subdirs
subdirs:
@for i in $(SUBDIRS); do (cd $$i && $(MAKE)) || exit; done
clean:
@for i in $(SUBDIRS); do (cd $$i && $(MAKE) clean) || exit; done
distclean: clean
distclean:
@for i in $(SUBDIRS); do (cd $$i && $(MAKE) distclean) || exit; done
install:
@for i in $(SUBDIRS); do (cd $$i && $(MAKE) install) || exit; done
$(MKDIR) $(DESTDIR)$(PREFIX)/include/Desktop
$(INSTALL) -m 0644 -- Browser.h $(DESTDIR)$(PREFIX)/include/Desktop/Browser.h
uninstall:
@for i in $(SUBDIRS); do (cd $$i && $(MAKE) uninstall) || exit; done
$(RM) -- $(DESTDIR)$(PREFIX)/include/Desktop/Browser.h
.PHONY: all clean distclean install uninstall
.PHONY: all subdirs clean distclean install uninstall

View File

@ -1,3 +1,4 @@
subdirs=Browser
includes=Browser.h
dist=Makefile

View File

@ -42,8 +42,8 @@ delete: $(delete_OBJS)
$(CC) -o delete $(delete_OBJS) $(delete_LDFLAGS)
desktop_OBJS = desktop.o desktopicon.o
desktop_CFLAGS = $(CPPFLAGSF) $(CPPFLAGS) $(CFLAGSF) $(CFLAGS)
desktop_LDFLAGS = $(LDFLAGSF) $(LDFLAGS)
desktop_CFLAGS = $(CPPFLAGSF) $(CPPFLAGS) $(CFLAGSF) $(CFLAGS) `pkg-config --cflags xrandr`
desktop_LDFLAGS = $(LDFLAGSF) $(LDFLAGS) `pkg-config --libs xrandr`
desktop: $(desktop_OBJS)
$(CC) -o desktop $(desktop_OBJS) $(desktop_LDFLAGS)

View File

@ -34,7 +34,9 @@
#include <gtk/gtk.h>
#include <gdk/gdkx.h>
#include <X11/Xatom.h>
#include <X11/extensions/Xrandr.h>
#include <System.h>
#include "Browser/desktop.h"
#include "desktop.h"
#include "../config.h"
#define _(string) gettext(string)
@ -98,6 +100,8 @@ struct _Desktop
GtkWidget * pr_background;
GtkWidget * pr_background_how;
GtkWidget * pr_background_extend;
GtkWidget * pr_ilayout;
GtkWidget * pr_imonitor;
GtkWidget * pr_ibcolor;
GtkWidget * pr_ifcolor;
GtkWidget * pr_ifont;
@ -164,6 +168,20 @@ static const char * _desktop_hows[DESKTOP_HOW_COUNT] =
"tiled"
};
static const char * _desktop_icons_config[DESKTOP_ICONS_COUNT] =
{
"none", "applications", "categories", "files", "homescreen"
};
static const char * _desktop_icons[DESKTOP_ICONS_COUNT] =
{
N_("Do not draw icons"),
N_("Applications"),
N_("Categories"),
N_("Desktop contents"),
N_("Home screen")
};
/* prototypes */
static int _desktop_error(Desktop * desktop, char const * message,
@ -209,7 +227,7 @@ Desktop * desktop_new(DesktopPrefs * prefs)
/* set default foreground to white */
memset(&desktop->foreground, 0xff, sizeof(desktop->foreground));
desktop->prefs.alignment = DESKTOP_ALIGNMENT_VERTICAL;
desktop->prefs.layout = DESKTOP_LAYOUT_FILES;
desktop->prefs.icons = DESKTOP_ICONS_FILES;
desktop->prefs.monitor = -1;
if(prefs != NULL)
memcpy(&desktop->prefs, prefs, sizeof(*prefs));
@ -248,8 +266,6 @@ static gboolean _new_idle(gpointer data)
{
Desktop * desktop = data;
Config * config;
char const * p;
char * q;
#ifdef DEBUG
fprintf(stderr, "DEBUG: %s()\n", __func__);
@ -258,16 +274,9 @@ static gboolean _new_idle(gpointer data)
return FALSE;
_idle_background(desktop, config);
_idle_icons(desktop, config);
if(desktop->prefs.monitor < 0
&& (p = config_get(config, "icons", "monitor")) != NULL)
{
desktop->prefs.monitor = strtol(p, &q, 10);
if(p[0] == '\0' || *q != '\0')
desktop->prefs.monitor = -1;
}
config_delete(config);
_desktop_get_workarea(desktop);
desktop_set_layout(desktop, desktop->prefs.layout);
desktop_set_icons(desktop, desktop->prefs.icons);
return FALSE;
}
@ -296,8 +305,10 @@ static void _idle_icons(Desktop * desktop, Config * config)
{
GdkColor color;
char const * p;
char * q;
size_t i;
/* icons colors */
if((p = config_get(config, "icons", "background")) != NULL)
{
gdk_color_parse(p, &color);
@ -308,6 +319,7 @@ static void _idle_icons(Desktop * desktop, Config * config)
gdk_color_parse(p, &color);
desktop->foreground = color;
}
/* icons font */
if((p = config_get(config, "icons", "font")) != NULL)
desktop->font = pango_font_description_from_string(p);
for(i = 0; i < desktop->icon_cnt; i++)
@ -318,6 +330,34 @@ static void _idle_icons(Desktop * desktop, Config * config)
desktopicon_set_foreground(desktop->icon[i],
&desktop->foreground);
}
/* icons monitor */
if(desktop->prefs.monitor < 0
&& (p = config_get(config, "icons", "monitor")) != NULL)
{
desktop->prefs.monitor = strtol(p, &q, 10);
if(p[0] == '\0' || *q != '\0')
desktop->prefs.monitor = -1;
}
/* icons layout */
if(desktop->prefs.icons < 0
&& (p = config_get(config, "icons", "layout")) != NULL)
{
for(i = 0; i < DESKTOP_ICONS_COUNT; i++)
if(strcmp(_desktop_icons_config[i], p) == 0)
{
desktop->prefs.icons = i;
break;
}
}
if(desktop->prefs.icons < 0
|| desktop->prefs.icons >= DESKTOP_ICONS_COUNT)
desktop->prefs.icons = DESKTOP_ICONS_FILES;
/* icons alignment */
if(desktop->prefs.alignment < 0)
desktop->prefs.alignment = (desktop->prefs.icons
== DESKTOP_ICONS_FILES)
? DESKTOP_ALIGNMENT_VERTICAL
: DESKTOP_ALIGNMENT_HORIZONTAL;
}
static int _on_message(void * data, uint32_t value1, uint32_t value2,
@ -326,6 +366,7 @@ static int _on_message(void * data, uint32_t value1, uint32_t value2,
Desktop * desktop = data;
DesktopMessage message;
DesktopAlignment alignment;
DesktopIcons icons;
DesktopLayout layout;
switch((message = value1))
@ -334,6 +375,10 @@ static int _on_message(void * data, uint32_t value1, uint32_t value2,
alignment = value2;
desktop_set_alignment(desktop, alignment);
break;
case DESKTOP_MESSAGE_SET_ICONS:
icons = value2;
desktop_set_icons(desktop, icons);
break;
case DESKTOP_MESSAGE_SET_LAYOUT:
layout = value2;
desktop_set_layout(desktop, layout);
@ -393,7 +438,7 @@ static GdkFilterReturn _event_button_press(XButtonEvent * xbev,
return GDK_FILTER_CONTINUE;
}
/* ignore if not managing files */
if(desktop->prefs.layout != DESKTOP_LAYOUT_FILES)
if(desktop->prefs.icons != DESKTOP_ICONS_FILES)
return GDK_FILTER_CONTINUE;
desktop->menu = gtk_menu_new();
menuitem = gtk_image_menu_item_new_from_stock(GTK_STOCK_NEW, NULL);
@ -671,42 +716,42 @@ static void _alignment_vertical(Desktop * desktop)
}
/* desktop_set_layout */
static void _layout_delete(Desktop * desktop);
static int _layout_applications(Desktop * desktop);
static int _layout_categories(Desktop * desktop);
static int _layout_files(Desktop * desktop);
static void _layout_files_add_home(Desktop * desktop);
static int _layout_homescreen(Desktop * desktop);
static void _layout_set_categories(Desktop * desktop, gpointer data);
static void _layout_set_homescreen(Desktop * desktop, gpointer data);
/* desktop_set_icons */
static void _icons_delete(Desktop * desktop);
static int _icons_applications(Desktop * desktop);
static int _icons_categories(Desktop * desktop);
static int _icons_files(Desktop * desktop);
static void _icons_files_add_home(Desktop * desktop);
static int _icons_homescreen(Desktop * desktop);
static void _icons_set_categories(Desktop * desktop, gpointer data);
static void _icons_set_homescreen(Desktop * desktop, gpointer data);
void desktop_set_layout(Desktop * desktop, DesktopLayout layout)
void desktop_set_icons(Desktop * desktop, DesktopIcons icons)
{
_layout_delete(desktop);
desktop->prefs.layout = layout;
switch(layout)
_icons_delete(desktop);
desktop->prefs.icons = icons;
switch(icons)
{
case DESKTOP_LAYOUT_APPLICATIONS:
_layout_applications(desktop);
case DESKTOP_ICONS_APPLICATIONS:
_icons_applications(desktop);
break;
case DESKTOP_LAYOUT_CATEGORIES:
_layout_categories(desktop);
case DESKTOP_ICONS_CATEGORIES:
_icons_categories(desktop);
break;
case DESKTOP_LAYOUT_FILES:
_layout_files(desktop);
case DESKTOP_ICONS_FILES:
_icons_files(desktop);
break;
case DESKTOP_LAYOUT_HOMESCREEN:
_layout_homescreen(desktop);
case DESKTOP_ICONS_HOMESCREEN:
_icons_homescreen(desktop);
break;
case DESKTOP_LAYOUT_NONE:
case DESKTOP_ICONS_NONE:
/* nothing to do */
break;
}
desktop_refresh(desktop);
}
static void _layout_delete(Desktop * desktop)
static void _icons_delete(Desktop * desktop)
{
size_t i;
@ -723,7 +768,7 @@ static void _layout_delete(Desktop * desktop)
_desktop_categories[i].show = FALSE;
}
static int _layout_applications(Desktop * desktop)
static int _icons_applications(Desktop * desktop)
{
const char path[] = DATADIR "/applications";
struct stat st;
@ -737,10 +782,11 @@ static int _layout_applications(Desktop * desktop)
if(stat(desktop->path, &st) == 0)
if(!S_ISDIR(st.st_mode))
return desktop_error(NULL, strerror(ENOTDIR), 1);
/* FIXME list all applications otherwise? */
if(desktop->category != NULL)
{
desktopicon = desktopicon_new(desktop, _("Back"), NULL);
desktopicon_set_callback(desktopicon, _layout_set_categories,
desktopicon_set_callback(desktopicon, _icons_set_categories,
NULL);
desktopicon_set_immutable(desktopicon, TRUE);
icon = gtk_icon_theme_load_icon(desktop->theme, "back",
@ -752,15 +798,15 @@ static int _layout_applications(Desktop * desktop)
return 0;
}
static int _layout_categories(Desktop * desktop)
static int _icons_categories(Desktop * desktop)
{
DesktopIcon * desktopicon;
GdkPixbuf * icon;
desktop->category = NULL;
_layout_applications(desktop); /* XXX hack */
_icons_applications(desktop); /* XXX hack */
desktopicon = desktopicon_new(desktop, _("Back"), NULL);
desktopicon_set_callback(desktopicon, _layout_set_homescreen, NULL);
desktopicon_set_callback(desktopicon, _icons_set_homescreen, NULL);
desktopicon_set_first(desktopicon, TRUE);
desktopicon_set_immutable(desktopicon, TRUE);
icon = gtk_icon_theme_load_icon(desktop->theme, "back",
@ -771,7 +817,7 @@ static int _layout_categories(Desktop * desktop)
return 0;
}
static int _layout_files(Desktop * desktop)
static int _icons_files(Desktop * desktop)
{
const char path[] = "/" DESKTOP;
const char * file[] = { "gnome-fs-regular",
@ -798,7 +844,7 @@ static int _layout_files(Desktop * desktop)
desktop->folder = gtk_icon_theme_load_icon(
desktop->theme, *p,
DESKTOPICON_ICON_SIZE, 0, NULL);
_layout_files_add_home(desktop);
_icons_files_add_home(desktop);
desktop->path_cnt = strlen(desktop->home) + 1 + sizeof(path);
if((desktop->path = malloc(desktop->path_cnt)) == NULL)
return desktop_error(NULL, strerror(ENOTDIR), 1);
@ -814,7 +860,7 @@ static int _layout_files(Desktop * desktop)
return 0;
}
static void _layout_files_add_home(Desktop * desktop)
static void _icons_files_add_home(Desktop * desktop)
{
DesktopIcon * desktopicon;
GdkPixbuf * icon;
@ -834,7 +880,7 @@ static void _layout_files_add_home(Desktop * desktop)
desktopicon_set_icon(desktopicon, icon);
}
static int _layout_homescreen(Desktop * desktop)
static int _icons_homescreen(Desktop * desktop)
{
DesktopIcon * desktopicon;
GdkPixbuf * icon;
@ -852,7 +898,7 @@ static int _layout_homescreen(Desktop * desktop)
if((desktopicon = desktopicon_new(desktop, _("Applications"), NULL))
== NULL)
return desktop_error(NULL, error_get(), 1);
desktopicon_set_callback(desktopicon, _layout_set_categories, NULL);
desktopicon_set_callback(desktopicon, _icons_set_categories, NULL);
desktopicon_set_immutable(desktopicon, TRUE);
icon = gtk_icon_theme_load_icon(desktop->theme, "gnome-applications",
DESKTOPICON_ICON_SIZE, 0, NULL);
@ -869,20 +915,53 @@ static int _layout_homescreen(Desktop * desktop)
return 0;
}
static void _layout_set_categories(Desktop * desktop, gpointer data)
static void _icons_set_categories(Desktop * desktop, gpointer data)
{
#ifdef DEBUG
fprintf(stderr, "DEBUG: %s()\n", __func__);
#endif
desktop_set_layout(desktop, DESKTOP_LAYOUT_CATEGORIES);
desktop_set_icons(desktop, DESKTOP_ICONS_CATEGORIES);
}
static void _layout_set_homescreen(Desktop * desktop, gpointer data)
static void _icons_set_homescreen(Desktop * desktop, gpointer data)
{
#ifdef DEBUG
fprintf(stderr, "DEBUG: %s()\n", __func__);
#endif
desktop_set_layout(desktop, DESKTOP_LAYOUT_HOMESCREEN);
desktop_set_icons(desktop, DESKTOP_ICONS_HOMESCREEN);
}
/* desktop_set_layout */
void desktop_set_layout(Desktop * desktop, DesktopLayout layout)
{
XRRScreenConfiguration * sc;
Rotation r;
SizeID size;
sc = XRRGetScreenInfo(GDK_DISPLAY_XDISPLAY(desktop->display),
GDK_WINDOW_XWINDOW(desktop->root));
size = XRRConfigCurrentConfiguration(sc, &r);
switch(layout)
{
case DESKTOP_LAYOUT_NORMAL:
case DESKTOP_LAYOUT_LANDSCAPE:
r = RR_Rotate_0;
break;
case DESKTOP_LAYOUT_PORTRAIT:
r = RR_Rotate_90;
break;
case DESKTOP_LAYOUT_ROTATE:
r <<= 1;
r = (r > 16) ? 1 : r;
break;
case DESKTOP_LAYOUT_TOGGLE:
r = (r != RR_Rotate_0) ? RR_Rotate_0 : RR_Rotate_90;
break;
}
XRRSetScreenConfig(GDK_DISPLAY_XDISPLAY(desktop->display), sc,
GDK_WINDOW_XWINDOW(desktop->root), size, r,
CurrentTime);
}
@ -955,16 +1034,16 @@ void desktop_refresh(Desktop * desktop)
static int _current_loop(Desktop * desktop)
{
switch(desktop->prefs.layout)
switch(desktop->prefs.icons)
{
case DESKTOP_LAYOUT_APPLICATIONS:
case DESKTOP_ICONS_APPLICATIONS:
return _current_loop_applications(desktop);
case DESKTOP_LAYOUT_CATEGORIES:
case DESKTOP_ICONS_CATEGORIES:
return _current_loop_categories(desktop);
case DESKTOP_LAYOUT_FILES:
case DESKTOP_ICONS_FILES:
return _current_loop_files(desktop);
case DESKTOP_LAYOUT_HOMESCREEN:
case DESKTOP_LAYOUT_NONE:
case DESKTOP_ICONS_HOMESCREEN:
case DESKTOP_ICONS_NONE:
break; /* nothing to do */
}
return -1;
@ -1162,9 +1241,9 @@ static gboolean _current_done(Desktop * desktop)
{
size_t i = 0;
switch(desktop->prefs.layout)
switch(desktop->prefs.icons)
{
case DESKTOP_LAYOUT_CATEGORIES:
case DESKTOP_ICONS_CATEGORIES:
_done_categories(desktop);
break;
default:
@ -1233,7 +1312,7 @@ static void _done_categories_open(Desktop * desktop, gpointer data)
fprintf(stderr, "DEBUG: %s() \"%s\"\n", __func__, dc->name);
#endif
desktop->category = dc;
desktop_set_layout(desktop, DESKTOP_LAYOUT_APPLICATIONS);
desktop_set_icons(desktop, DESKTOP_ICONS_APPLICATIONS);
}
static gboolean _done_timeout(gpointer data)
@ -1444,6 +1523,7 @@ static int _desktop_get_workarea(Desktop * desktop)
desktop->workarea.width,
desktop->workarea.height);
#endif
desktop_icons_align(desktop);
return 0;
}
atom = gdk_x11_get_xatom_by_name("_NET_WORKAREA");
@ -1727,6 +1807,7 @@ static void _desktop_show_preferences(Desktop * desktop)
_preferences_background(desktop, notebook);
_preferences_icons(desktop, notebook);
_preferences_monitors(desktop, notebook);
_on_preferences_monitors_refresh(desktop);
gtk_box_pack_start(GTK_BOX(vbox), notebook, TRUE, TRUE, 0);
/* container */
_preferences_set(desktop);
@ -1814,10 +1895,33 @@ static void _preferences_icons(Desktop * desktop, GtkWidget * notebook)
GtkWidget * vbox2;
GtkWidget * hbox;
GtkWidget * label;
size_t i;
vbox2 = gtk_vbox_new(FALSE, 4);
gtk_container_set_border_width(GTK_CONTAINER(vbox2), 4);
group = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
/* icons */
hbox = gtk_hbox_new(FALSE, 0);
label = gtk_label_new(_("Layout: "));
gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
gtk_size_group_add_widget(group, label);
gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, TRUE, 0);
desktop->pr_ilayout = gtk_combo_box_new_text();
for(i = 0; i < sizeof(_desktop_icons) / sizeof(*_desktop_icons);
i++)
gtk_combo_box_append_text(GTK_COMBO_BOX(desktop->pr_ilayout),
_(_desktop_icons[i]));
gtk_box_pack_start(GTK_BOX(hbox), desktop->pr_ilayout, TRUE, TRUE, 0);
gtk_box_pack_start(GTK_BOX(vbox2), hbox, FALSE, TRUE, 0);
/* monitor */
hbox = gtk_hbox_new(FALSE, 0);
label = gtk_label_new(_("Monitor: "));
gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
gtk_size_group_add_widget(group, label);
gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, TRUE, 0);
desktop->pr_imonitor = gtk_combo_box_new_text();
gtk_box_pack_start(GTK_BOX(hbox), desktop->pr_imonitor, TRUE, TRUE, 0);
gtk_box_pack_start(GTK_BOX(vbox2), hbox, FALSE, TRUE, 0);
/* background color */
hbox = gtk_hbox_new(FALSE, 0);
label = gtk_label_new(_("Background color: "));
@ -1905,7 +2009,6 @@ static void _preferences_monitors(Desktop * desktop, GtkWidget * notebook)
/* updates */
g_signal_connect_swapped(desktop->pr_monitors, "changed", G_CALLBACK(
_on_preferences_monitors_changed), desktop);
_on_preferences_monitors_refresh(desktop);
gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox2, gtk_label_new(
_("Monitors")));
}
@ -1955,7 +2058,9 @@ static void _on_preferences_monitors_changed(gpointer data)
static void _on_preferences_monitors_refresh(gpointer data)
{
Desktop * desktop = data;
GtkTreeModel * model;
GtkTreeModel * model1;
GtkTreeModel * model2;
gint active;
#if GTK_CHECK_VERSION(2, 14, 0)
gint n;
gint i;
@ -1963,8 +2068,13 @@ static void _on_preferences_monitors_refresh(gpointer data)
char buf[32];
#endif
model = gtk_combo_box_get_model(GTK_COMBO_BOX(desktop->pr_monitors));
gtk_list_store_clear(GTK_LIST_STORE(model));
active = gtk_combo_box_get_active(GTK_COMBO_BOX(desktop->pr_imonitor));
model1 = gtk_combo_box_get_model(GTK_COMBO_BOX(desktop->pr_imonitor));
model2 = gtk_combo_box_get_model(GTK_COMBO_BOX(desktop->pr_monitors));
gtk_list_store_clear(GTK_LIST_STORE(model1));
gtk_list_store_clear(GTK_LIST_STORE(model2));
gtk_combo_box_append_text(GTK_COMBO_BOX(desktop->pr_imonitor),
_("Default monitor"));
gtk_combo_box_append_text(GTK_COMBO_BOX(desktop->pr_monitors),
_("Whole screen"));
#if GTK_CHECK_VERSION(2, 14, 0)
@ -1973,11 +2083,14 @@ static void _on_preferences_monitors_refresh(gpointer data)
{
snprintf(buf, sizeof(buf), _("Monitor %d"), i);
name = gdk_screen_get_monitor_plug_name(desktop->screen, i);
gtk_combo_box_append_text(GTK_COMBO_BOX(desktop->pr_imonitor),
(name != NULL) ? name : buf);
gtk_combo_box_append_text(GTK_COMBO_BOX(desktop->pr_monitors),
(name != NULL) ? name : buf);
g_free(name);
}
#endif
gtk_combo_box_set_active(GTK_COMBO_BOX(desktop->pr_imonitor), active);
gtk_combo_box_set_active(GTK_COMBO_BOX(desktop->pr_monitors), 0);
}
@ -2008,6 +2121,7 @@ static void _on_preferences_apply(gpointer data)
char * p;
char const * q;
int i;
char buf[12];
/* XXX not very efficient */
g_idle_add(_new_idle, desktop);
@ -2029,6 +2143,10 @@ static void _on_preferences_apply(gpointer data)
desktop->pr_background_extend)) ? "1" : "0";
config_set(config, "background", "extend", p);
/* icons */
i = gtk_combo_box_get_active(GTK_COMBO_BOX(desktop->pr_ilayout));
if(i >= 0 && i < DESKTOP_ICONS_COUNT)
config_set(config, "icons", "layout", _desktop_icons_config[i]);
desktop->prefs.icons = i; /* applied by _new_idle() */
gtk_color_button_get_color(GTK_COLOR_BUTTON(desktop->pr_ibcolor),
&color);
p = gdk_color_to_string(&color);
@ -2041,6 +2159,10 @@ static void _on_preferences_apply(gpointer data)
g_free(p);
q = gtk_font_button_get_font_name(GTK_FONT_BUTTON(desktop->pr_ifont));
config_set(config, "icons", "font", q);
i = gtk_combo_box_get_active(GTK_COMBO_BOX(desktop->pr_imonitor));
snprintf(buf, sizeof(buf), "%d", i - 1);
config_set(config, "icons", "monitor", buf);
desktop->prefs.monitor = i - 1;
/* XXX code duplication */
if((p = string_new_append(desktop->home, "/" DESKTOPRC, NULL)) != NULL)
{
@ -2101,12 +2223,19 @@ static void _preferences_set(Desktop * desktop)
{
Config * config;
String const * p;
String * q;
String const * filename = NULL;
GdkColor color = { 0, 0, 0, 0 };
int how;
gboolean extend = FALSE;
size_t i;
int j;
/* FIXME:
* - cache the current configuration within the Desktop class
* - apply the configuration values to the widgets
* - no longer prepend an empty line in configuration files when there
* are no values in the default section */
if((config = _desktop_get_config(desktop)) != NULL)
{
/* background */
@ -2128,6 +2257,16 @@ static void _preferences_set(Desktop * desktop)
if((p = config_get(config, "background", "extend")) != NULL)
extend = strtol(p, NULL, 10) ? TRUE : FALSE;
/* icons */
how = DESKTOP_ICONS_FILES;
if((p = config_get(config, "icons", "layout")) != NULL)
for(i = 0; i < DESKTOP_ICONS_COUNT; i++)
if(strcmp(_desktop_icons_config[i], p) == 0)
{
how = i;
break;
}
gtk_combo_box_set_active(GTK_COMBO_BOX(desktop->pr_ilayout),
how);
if((p = config_get(config, "icons", "background")) != NULL
&& gdk_color_parse(p, &color) == TRUE)
gtk_color_button_set_color(GTK_COLOR_BUTTON(
@ -2139,8 +2278,25 @@ static void _preferences_set(Desktop * desktop)
if((p = config_get(config, "icons", "font")) != NULL)
gtk_font_button_set_font_name(GTK_FONT_BUTTON(
desktop->pr_ifont), p);
if((p = config_get(config, "icons", "monitor")) != NULL)
{
j = strtol(p, &q, 10);
if(p[0] == '\0' || *q != '\0' || j < 0)
j = -1;
gtk_combo_box_set_active(GTK_COMBO_BOX(
desktop->pr_imonitor), j + 1);
}
config_delete(config);
}
else
{
gtk_combo_box_set_active(GTK_COMBO_BOX(
desktop->pr_background_how), 0);
gtk_combo_box_set_active(GTK_COMBO_BOX(desktop->pr_ilayout),
DESKTOP_ICONS_FILES);
gtk_combo_box_set_active(GTK_COMBO_BOX(desktop->pr_imonitor),
0);
}
if(filename != NULL)
gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(
desktop->pr_background), filename);
@ -2174,36 +2330,35 @@ int main(int argc, char * argv[])
int o;
Desktop * desktop;
DesktopPrefs prefs;
int alignment = -1;
char * p;
setlocale(LC_ALL, "");
bindtextdomain(PACKAGE, LOCALEDIR);
textdomain(PACKAGE);
memset(&prefs, 0, sizeof(prefs));
prefs.layout = DESKTOP_LAYOUT_FILES;
prefs.alignment = -1;
prefs.icons = -1;
prefs.monitor = -1;
gtk_init(&argc, &argv);
while((o = getopt(argc, argv, "HVacfhm:n")) != -1)
switch(o)
{
case 'H':
alignment = DESKTOP_ALIGNMENT_HORIZONTAL;
prefs.alignment = DESKTOP_ALIGNMENT_HORIZONTAL;
break;
case 'V':
alignment = DESKTOP_ALIGNMENT_VERTICAL;
prefs.alignment = DESKTOP_ALIGNMENT_VERTICAL;
break;
case 'a':
prefs.layout = DESKTOP_LAYOUT_APPLICATIONS;
prefs.icons = DESKTOP_ICONS_APPLICATIONS;
break;
case 'c':
prefs.layout = DESKTOP_LAYOUT_CATEGORIES;
prefs.icons = DESKTOP_ICONS_CATEGORIES;
break;
case 'f':
prefs.layout = DESKTOP_LAYOUT_FILES;
prefs.icons = DESKTOP_ICONS_FILES;
break;
case 'h':
prefs.layout = DESKTOP_LAYOUT_HOMESCREEN;
prefs.icons = DESKTOP_ICONS_HOMESCREEN;
break;
case 'm':
prefs.monitor = strtol(optarg, &p, 0);
@ -2211,18 +2366,13 @@ int main(int argc, char * argv[])
return _usage();
break;
case 'n':
prefs.layout = DESKTOP_LAYOUT_NONE;
prefs.icons = DESKTOP_ICONS_NONE;
break;
default:
return _usage();
}
if(optind < argc)
return _usage();
if(alignment < 0)
alignment = (prefs.layout == DESKTOP_LAYOUT_FILES)
? DESKTOP_ALIGNMENT_VERTICAL
: DESKTOP_ALIGNMENT_HORIZONTAL;
prefs.alignment = alignment;
if((desktop = desktop_new(&prefs)) == NULL)
{
gtk_main();

View File

@ -1,5 +1,5 @@
/* $Id$ */
/* Copyright (c) 2011 Pierre Pronchery <khorben@defora.org> */
/* Copyright (c) 2011-2012 Pierre Pronchery <khorben@defora.org> */
/* This file is part of DeforaOS Desktop Browser */
/* 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
@ -20,6 +20,7 @@
# include <gtk/gtk.h>
# include <Desktop.h>
# include "Desktop.h"
# include "desktopicon.h"
@ -35,47 +36,14 @@ typedef struct _DesktopIcon DesktopIcon;
typedef struct _Desktop Desktop;
# endif
typedef enum _DesktopAlignment
{
DESKTOP_ALIGNMENT_VERTICAL = 0,
DESKTOP_ALIGNMENT_HORIZONTAL
} DesktopAlignment;
typedef enum _DesktopLayout
{
DESKTOP_LAYOUT_NONE = 0,
DESKTOP_LAYOUT_APPLICATIONS,
DESKTOP_LAYOUT_CATEGORIES,
DESKTOP_LAYOUT_FILES,
DESKTOP_LAYOUT_HOMESCREEN
} DesktopLayout;
# define DESKTOP_LAYOUT_LAST DESKTOP_LAYOUT_HOMESCREEN
# define DESKTOP_LAYOUT_COUNT (DESKTOP_LAYOUT_LAST + 1)
typedef enum _DesktopMessage
{
DESKTOP_MESSAGE_SET_ALIGNMENT = 0,
DESKTOP_MESSAGE_SET_LAYOUT,
DESKTOP_MESSAGE_SHOW
} DesktopMessage;
typedef enum _DesktopShow
{
DESKTOP_SHOW_SETTINGS = 0
} DesktopMessageShow;
typedef struct _DesktopPrefs
{
DesktopAlignment alignment;
DesktopLayout layout;
int alignment;
int icons;
int monitor;
} DesktopPrefs;
/* constants */
# define DESKTOP_CLIENT_MESSAGE "DEFORAOS_DESKTOP_DESKTOP_CLIENT"
/* functions */
Desktop * desktop_new(DesktopPrefs * prefs);
void desktop_delete(Desktop * desktop);
@ -89,6 +57,7 @@ Mime * desktop_get_mime(Desktop * desktop);
GtkIconTheme * desktop_get_theme(Desktop * desktop);
void desktop_set_alignment(Desktop * desktop, DesktopAlignment alignment);
void desktop_set_icons(Desktop * desktop, DesktopIcons icons);
void desktop_set_layout(Desktop * desktop, DesktopLayout layout);
/* useful */

View File

@ -22,7 +22,7 @@
#include <libintl.h>
#include <gtk/gtk.h>
#include <Desktop.h>
#include "desktop.h"
#include "Browser/desktop.h"
#include "../config.h"
#define _(string) gettext(string)
@ -42,9 +42,13 @@
/* usage */
static int _usage(void)
{
fputs(_("Usage: desktopctl [-H|-S|-V|-a|-c|-f|-h|-n]\n"
fputs(_("Usage: desktopctl [-H|-L|-P|-R|-S|-T|-V|-a|-c|-f|-h|-n]\n"
" -H Place icons horizontally\n"
" -L Rotate screen to landscape mode\n"
" -P Rotate screen to portrait mode\n"
" -R Rotate screen\n"
" -S Display or change settings\n"
" -T Toggle screen rotation\n"
" -V Place icons vertically\n"
" -a Display the applications registered\n"
" -c Sort the applications registered by category\n"
@ -66,7 +70,7 @@ int main(int argc, char * argv[])
bindtextdomain(PACKAGE, LOCALEDIR);
textdomain(PACKAGE);
gtk_init(&argc, &argv);
while((o = getopt(argc, argv, "HSVacfhn")) != -1)
while((o = getopt(argc, argv, "HLPRSVacfhn")) != -1)
switch(o)
{
case 'H':
@ -75,12 +79,36 @@ int main(int argc, char * argv[])
action = DESKTOP_MESSAGE_SET_ALIGNMENT;
what = DESKTOP_ALIGNMENT_HORIZONTAL;
break;
case 'L':
if(action != -1)
return _usage();
action = DESKTOP_MESSAGE_SET_LAYOUT;
what = DESKTOP_LAYOUT_LANDSCAPE;
break;
case 'P':
if(action != -1)
return _usage();
action = DESKTOP_MESSAGE_SET_LAYOUT;
what = DESKTOP_LAYOUT_PORTRAIT;
break;
case 'R':
if(action != -1)
return _usage();
action = DESKTOP_MESSAGE_SET_LAYOUT;
what = DESKTOP_LAYOUT_ROTATE;
break;
case 'S':
if(action != -1)
return _usage();
action = DESKTOP_MESSAGE_SHOW;
what = DESKTOP_SHOW_SETTINGS;
break;
case 'T':
if(action != -1)
return _usage();
action = DESKTOP_MESSAGE_SET_LAYOUT;
what = DESKTOP_LAYOUT_TOGGLE;
break;
case 'V':
if(action != -1)
return _usage();
@ -90,32 +118,32 @@ int main(int argc, char * argv[])
case 'a':
if(action != -1)
return _usage();
action = DESKTOP_MESSAGE_SET_LAYOUT;
what = DESKTOP_LAYOUT_APPLICATIONS;
action = DESKTOP_MESSAGE_SET_ICONS;
what = DESKTOP_ICONS_APPLICATIONS;
break;
case 'c':
if(action != -1)
return _usage();
action = DESKTOP_MESSAGE_SET_LAYOUT;
what = DESKTOP_LAYOUT_CATEGORIES;
action = DESKTOP_MESSAGE_SET_ICONS;
what = DESKTOP_ICONS_CATEGORIES;
break;
case 'f':
if(action != -1)
return _usage();
action = DESKTOP_MESSAGE_SET_LAYOUT;
what = DESKTOP_LAYOUT_FILES;
action = DESKTOP_MESSAGE_SET_ICONS;
what = DESKTOP_ICONS_FILES;
break;
case 'h':
if(action != -1)
return _usage();
action = DESKTOP_MESSAGE_SET_LAYOUT;
what = DESKTOP_LAYOUT_HOMESCREEN;
action = DESKTOP_MESSAGE_SET_ICONS;
what = DESKTOP_ICONS_HOMESCREEN;
break;
case 'n':
if(action != -1)
return _usage();
action = DESKTOP_MESSAGE_SET_LAYOUT;
what = DESKTOP_LAYOUT_NONE;
action = DESKTOP_MESSAGE_SET_ICONS;
what = DESKTOP_ICONS_NONE;
break;
default:
return _usage();

View File

@ -1,5 +1,5 @@
/* $Id$ */
/* Copyright (c) 2012 Pierre Pronchery <khorben@defora.org> */
/* Copyright (c) 2010-2012 Pierre Pronchery <khorben@defora.org> */
/* This file is part of DeforaOS Desktop Browser */
/* 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
@ -26,6 +26,7 @@
#include <gtk/gtk.h>
#include <gdk/gdkkeysyms.h>
#include <System.h>
#include "Browser/desktop.h"
#include "desktopicon.h"
#include "../config.h"
#define _(string) gettext(string)
@ -434,6 +435,9 @@ void desktopicon_set_updated(DesktopIcon * desktopicon, gboolean updated)
/* desktopicon_move */
void desktopicon_move(DesktopIcon * desktopicon, int x, int y)
{
#ifdef DEBUG
fprintf(stderr, "DEBUG: %s(%d, %d)\n", __func__, x, y);
#endif
gtk_window_move(GTK_WINDOW(desktopicon->window), x, y);
}

View File

@ -35,6 +35,8 @@ install=$(BINDIR)
[desktop]
type=binary
sources=desktop.c,desktopicon.c
cflags=`pkg-config --cflags xrandr`
ldflags=`pkg-config --libs xrandr`
install=$(BINDIR)
[desktop.c]