









sudo apt-get install wmctrl
(defun darkroom-mode ()
(interactive)
(shell-command "wmctrl -r darkroom -badd,fullscreen")
(set-background-color "black")
(set-foreground-color "green")
(set-cursor-color "white")
(setq left-margin 10)
(menu-bar-mode -1)
(tool-bar-mode -1)
(scroll-bar-mode -1)
(transient-mark-mode 1)
(set-face-foreground 'region "black")
(set-face-background 'region "green")
(set-face-foreground 'mode-line "gray15")
(set-face-background 'mode-line "black")
(move-to-left-margin 0 1)
(auto-fill-mode)
(setq text-mode-hook 'darkroom-mode)
)
emacs -f darkroom-mode -title darkroom -fn -adobe-courier-medium-r-normal--25-180-100-100-m-150-iso8859-1 foo.txt


mkdir aedit
cd aedit
gedit main.cpp
/*
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 2
of the License, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
/*
This program is simply a sensory-deprivation themed text editor, for concentration purposes.
CTRL+SHIFT+BACKSPACE quits, CTRL+SHIFT+S saves. The first line is used as the filename.
Compile with -DSCROLL option to enable a vertical scrollbar.
*/
#include <gtk/gtk.h>
#include <gdk/gdkkeysyms.h>
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
void Destroy();
gboolean Accel(GtkAccelGroup *accel_group, GObject *acceleratable, guint keyval, GdkModifierType modifier);
void modify_cursor_color(GtkWidget *widget, GdkColor *color);
GtkWindow *window = NULL;
GtkWidget *scroll = NULL;
GtkWidget *edit = NULL;
/* the main program is given as a DLL when compiled for Windows to allow the main program to locate the GTK
runtimes before executing the program itself. This is irrelevant to any other platform. */
#ifdef _WIN32
#include <windows.h>
extern "C" __declspec(dllexport) int Main(int argc, char *argv[]){
#else
int main(int argc, char *argv[]){
#endif
gtk_init(&argc,&argv);
// create the window
window = (GtkWindow*)gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_fullscreen(window);
gtk_window_set_title(window,"Editor");
gtk_window_set_keep_above(window,true);
gtk_widget_set_size_request(GTK_WIDGET(window),600,400);
g_signal_connect(window,"delete_event",G_CALLBACK(Destroy),NULL);
edit = gtk_text_view_new();
//set the side margins for maximum readability
gtk_text_view_set_left_margin(GTK_TEXT_VIEW(edit),256);
gtk_text_view_set_right_margin(GTK_TEXT_VIEW(edit),256);
gtk_widget_set_name(edit,"GtkEditorView");
gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(edit),GTK_WRAP_WORD);
scroll = gtk_scrolled_window_new(NULL,NULL);
// simply add a scroll window to allow for convenient scrolling capabilities like the mouse wheel
gtk_container_add(GTK_CONTAINER(window),scroll);
((GtkScrolledWindow*)scroll)->hscrollbar_policy = GTK_POLICY_NEVER;
#ifdef SCROLL
((GtkScrolledWindow*)scroll)->vscrollbar_policy = GTK_POLICY_AUTOMATIC;
#else
((GtkScrolledWindow*)scroll)->vscrollbar_policy = GTK_POLICY_NEVER;
#endif
gtk_container_add(GTK_CONTAINER(scroll),edit);
GdkColor color;
gdk_color_parse("black",&color);
gtk_widget_modify_base(edit,GTK_STATE_NORMAL,&color);
gdk_color_parse("green",&color);
gtk_widget_modify_text(edit,GTK_STATE_NORMAL,&color);
gdk_color_parse("yellow",&color);
modify_cursor_color(edit,&color);
// set the font to monospace
GtkTextBuffer *buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(edit));
PangoFontDescription *font_desc = pango_font_description_from_string("Courier New,Monospace 12");
gtk_widget_modify_font(edit,font_desc);
pango_font_description_free(font_desc);
// if specified in the command prompt, attempt to open a file
if (argc > 1){
ifstream file(argv[1]);
if (file){
// prepend the file name on its own line for saving purposes
string body = argv[1];
body.append("\n");
while (file && file.peek() != EOF) body += file.get();
gtk_text_buffer_set_text(buffer,body.c_str(),body.length());
}
} else {
// if no file is specified, simply provide a quick introduction
string intro = "filename.txt\n\n"
"CTRL+SHIFT+BACKSPACE to quit (without saving)\n"
"CTRL+SHIFT+S to save (first line is used as filename)\n";
//Comment the next line if you don't want the initial text shown.
gtk_text_buffer_set_text(buffer,intro.c_str(),intro.length());
}
GtkAccelGroup *accel = gtk_accel_group_new();
GClosure *closure;
GdkModifierType CTRL_SHIFT = (GdkModifierType)(GDK_CONTROL_MASK | GDK_SHIFT_MASK);
// add the quit shortcut
closure = g_cclosure_new(G_CALLBACK(Accel),NULL,NULL);
gtk_accel_group_connect(accel,GDK_BackSpace,CTRL_SHIFT,(GtkAccelFlags)0,closure);
// add the save shortcut
closure = g_cclosure_new(G_CALLBACK(Accel),NULL,NULL);
gtk_accel_group_connect(accel,GDK_S,CTRL_SHIFT,(GtkAccelFlags)0,closure);
gtk_window_add_accel_group(window,accel);
gtk_widget_show_all(GTK_WIDGET(window));
// enter the main application loop
gtk_main();
return 0;
}
void Destroy(){
gtk_main_quit();
}
gboolean Accel(GtkAccelGroup *accel_group, GObject *acceleratable, guint keyval, GdkModifierType modifier){
if (keyval == GDK_BackSpace)
Destroy();
else if (keyval == GDK_S || keyval == GDK_s){
GtkTextIter start, end;
GtkTextBuffer *buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(edit));
gtk_text_buffer_get_start_iter(buffer,&start);
gtk_text_buffer_get_iter_at_line(buffer,&end,1);
gchar *line = gtk_text_buffer_get_slice(buffer,&start,&end,false);
if (!line) return true;
if (line[0]){
for (int i = 0; line[i] != 0; i++){
if (line[i] == '\b' || line[i] == '\r' || line[i] == '\n') line[i] = 0;
}
ofstream file(line);
start = end;
gtk_text_buffer_get_end_iter(buffer,&end);
gchar *body = gtk_text_buffer_get_slice(buffer,&start,&end,false);
file << body;
g_free(body);
file.close();
}
g_free(line);
}
return true;
}
/*
Thanks to gedit source:
A hack to change the cursor color (widget must be named!)
*/
void modify_cursor_color(GtkWidget *widget, GdkColor *color){
static const char cursor_color_rc[] =
"style \"editor\"\n"
"{\n"
"GtkTextView::cursor-color=\"#%04x%04x%04x\"\n"
"}\n"
"widget \"*.%s\" style : application \"editor\"\n";
const gchar *name;
gchar *rc_temp;
name = gtk_widget_get_name(widget);
if (!name) return;
if (color){
rc_temp = g_strdup_printf(cursor_color_rc,
color->red,
color->green,
color->blue,
name);
} else {
GtkRcStyle *rc_style;
rc_style = gtk_widget_get_modifier_style(widget);
rc_temp = g_strdup_printf(cursor_color_rc,
rc_style->text[GTK_STATE_NORMAL].red,
rc_style->text[GTK_STATE_NORMAL].green,
rc_style->text[GTK_STATE_NORMAL].blue,
name);
}
gtk_rc_parse_string(rc_temp);
gtk_widget_reset_rc_styles(widget);
g_free(rc_temp);
}
g++ -o editor main.cpp `pkg-config --cflags gtk+-2.0` `pkg-config --libs gtk+-2.0`
./editor
You are viewing a mobilized version of this site...
View original page here